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 1386 def initialize(name, *args) 1387 _initialize(name, args, OPTS) 1388 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 1398 def *(ce=(arg=false;nil)) 1399 if arg == false 1400 raise Error, "Cannot apply * to functions with arguments" unless args.empty? 1401 with_opts(:"*"=>true) 1402 else 1403 super(ce) 1404 end 1405 end
Return a new function with DISTINCT before the method arguments.
Sequel.function(:count, :col).distinct # count(DISTINCT col)
# File lib/sequel/sql.rb 1410 def distinct 1411 with_opts(:distinct=>true) 1412 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 1418 def filter(*args, &block) 1419 if args.length == 1 1420 args = args.first 1421 else 1422 args.freeze 1423 end 1424 1425 with_opts(:filter=>args, :filter_block=>block) 1426 end
Return a function which will use LATERAL when literalized:
Sequel.function(:foo, :col).lateral # LATERAL foo(col)
# File lib/sequel/sql.rb 1431 def lateral 1432 with_opts(:lateral=>true) 1433 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 1439 def order(*args) 1440 with_opts(:order=>args.freeze) 1441 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 1447 def over(window=OPTS) 1448 raise Error, "function already has a window applied to it" if opts[:over] 1449 window = Window.new(window) unless window.is_a?(Window) 1450 with_opts(:over=>window) 1451 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 1457 def quoted 1458 with_opts(:quoted=>true) 1459 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 1465 def unquoted 1466 with_opts(:quoted=>false) 1467 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 1473 def with_ordinality 1474 with_opts(:with_ordinality=>true) 1475 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 1482 def within_group(*expressions) 1483 with_opts(:within_group=>expressions.freeze) 1484 end
Private Instance Methods
Set name, args, and opts
# File lib/sequel/sql.rb 1491 def _initialize(name, args, opts) 1492 @name = name 1493 @args = args.freeze 1494 @opts = opts.freeze 1495 freeze 1496 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 141 def inspect_new_method 142 :new! 143 end
Return a new function call with the given opts merged into the current opts.
# File lib/sequel/sql.rb 1499 def with_opts(opts) 1500 self.class.new!(name, args, @opts.merge(opts)) 1501 end