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 1375 def initialize(name, *args) 1376 _initialize(name, args, OPTS) 1377 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 1387 def *(ce=(arg=false;nil)) 1388 if arg == false 1389 raise Error, "Cannot apply * to functions with arguments" unless args.empty? 1390 with_opts(:"*"=>true) 1391 else 1392 super(ce) 1393 end 1394 end
Return a new function with DISTINCT
before the method arguments.
Sequel.function(:count, :col).distinct # count(DISTINCT col)
# File lib/sequel/sql.rb 1399 def distinct 1400 with_opts(:distinct=>true) 1401 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 1407 def filter(*args, &block) 1408 if args.length == 1 1409 args = args.first 1410 else 1411 args.freeze 1412 end 1413 1414 with_opts(:filter=>args, :filter_block=>block) 1415 end
Return a function which will use LATERAL when literalized:
Sequel.function(:foo, :col).lateral # LATERAL foo(col)
# File lib/sequel/sql.rb 1420 def lateral 1421 with_opts(:lateral=>true) 1422 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 1428 def order(*args) 1429 with_opts(:order=>args.freeze) 1430 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 1436 def over(window=OPTS) 1437 raise Error, "function already has a window applied to it" if opts[:over] 1438 window = Window.new(window) unless window.is_a?(Window) 1439 with_opts(:over=>window) 1440 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 1446 def quoted 1447 with_opts(:quoted=>true) 1448 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 1454 def unquoted 1455 with_opts(:quoted=>false) 1456 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 1462 def with_ordinality 1463 with_opts(:with_ordinality=>true) 1464 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 1471 def within_group(*expressions) 1472 with_opts(:within_group=>expressions.freeze) 1473 end
Private Instance Methods
Set name, args, and opts
# File lib/sequel/sql.rb 1480 def _initialize(name, args, opts) 1481 @name = name 1482 @args = args.freeze 1483 @opts = opts.freeze 1484 freeze 1485 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 137 def inspect_new_method 138 :new! 139 end
Return a new function call with the given opts merged into the current opts.
# File lib/sequel/sql.rb 1488 def with_opts(opts) 1489 self.class.new!(name, args, @opts.merge(opts)) 1490 end