class Sequel::SQL::Function
Represents an SQL
function call.
Constants
- COMMA_ARRAY
- DISTINCT
- WILDCARD
Attributes
The array of arguments to pass to the function (may be blank)
The SQL
function to call
Options for this function
Public Class Methods
Set the name and args for the function
# File lib/sequel/sql.rb 1379 def initialize(name, *args) 1380 _initialize(name, args, OPTS) 1381 end
Public Instance Methods
If no arguments are given, return a new function with the wildcard prepended to the arguments.
Sequel.function(:count).* # count(*)
# File lib/sequel/sql.rb 1391 def *(ce=(arg=false;nil)) 1392 if arg == false 1393 raise Error, "Cannot apply * to functions with arguments" unless args.empty? 1394 with_opts(:"*"=>true) 1395 else 1396 super(ce) 1397 end 1398 end
Return a new function with DISTINCT
before the method arguments.
Sequel.function(:count, :col).distinct # count(DISTINCT col)
# File lib/sequel/sql.rb 1403 def distinct 1404 with_opts(:distinct=>true) 1405 end
Return a new function with FILTER added to it, for filtered aggregate functions:
Sequel.function(:foo, :col).filter(a: 1) # foo(col) FILTER (WHERE (a = 1))
# File lib/sequel/sql.rb 1411 def filter(*args, &block) 1412 if args.length == 1 1413 args = args.first 1414 else 1415 args.freeze 1416 end 1417 1418 with_opts(:filter=>args, :filter_block=>block) 1419 end
Return a function which will use LATERAL when literalized:
Sequel.function(:foo, :col).lateral # LATERAL foo(col)
# File lib/sequel/sql.rb 1424 def lateral 1425 with_opts(:lateral=>true) 1426 end
Return a new function where the function will be ordered. Only useful for aggregate functions that are order dependent.
Sequel.function(:foo, :a).order(:a, Sequel.desc(:b)) # foo(a ORDER BY a, b DESC)
# File lib/sequel/sql.rb 1432 def order(*args) 1433 with_opts(:order=>args.freeze) 1434 end
Return a new function with an OVER clause (making it a window function). See Sequel::SQL::Window
for the list of options over
can receive.
Sequel.function(:row_number).over(partition: :col) # row_number() OVER (PARTITION BY col)
# File lib/sequel/sql.rb 1440 def over(window=OPTS) 1441 raise Error, "function already has a window applied to it" if opts[:over] 1442 window = Window.new(window) unless window.is_a?(Window) 1443 with_opts(:over=>window) 1444 end
Return a new function where the function name will be quoted if the database supports quoted functions:
Sequel.function(:foo).quoted # "foo"()
# File lib/sequel/sql.rb 1450 def quoted 1451 with_opts(:quoted=>true) 1452 end
Return a new function where the function name will not be quoted even if the database supports quoted functions:
Sequel[:foo][:bar].function.unquoted # foo.bar()
# File lib/sequel/sql.rb 1458 def unquoted 1459 with_opts(:quoted=>false) 1460 end
Return a new function that will use WITH ORDINALITY to also return a row number for every row the function returns:
Sequel.function(:foo).with_ordinality # foo() WITH ORDINALITY
# File lib/sequel/sql.rb 1466 def with_ordinality 1467 with_opts(:with_ordinality=>true) 1468 end
Return a new function that uses WITHIN GROUP ordered by the given expression, useful for ordered-set and hypothetical-set aggregate functions:
Sequel.function(:rank, :a).within_group(:b, :c) # rank(a) WITHIN GROUP (ORDER BY b, c)
# File lib/sequel/sql.rb 1475 def within_group(*expressions) 1476 with_opts(:within_group=>expressions.freeze) 1477 end
Private Instance Methods
Set name, args, and opts
# File lib/sequel/sql.rb 1484 def _initialize(name, args, opts) 1485 @name = name 1486 @args = args.freeze 1487 @opts = opts.freeze 1488 freeze 1489 end
Function
uses a new! method for creating functions with options, since Function.new
does not allow for an options hash.
# File lib/sequel/extensions/eval_inspect.rb 139 def inspect_new_method 140 :new! 141 end
Return a new function call with the given opts merged into the current opts.
# File lib/sequel/sql.rb 1492 def with_opts(opts) 1493 self.class.new!(name, args, @opts.merge(opts)) 1494 end