Class | Sequel::SQL::VirtualRow |
In: |
lib/sequel/sql.rb
|
Parent: | BasicObject |
The purpose of this class is to allow the easy creation of SQL identifiers and functions without relying on methods defined on Symbol. This is useful if another library defines the methods defined by Sequel, or if you are running on ruby 1.9.
An instance of this class is yielded to the block supplied to filter, order, and select. If the block doesn‘t take an argument, the block is instance_evaled in the context of a new instance of this class.
VirtualRow uses method_missing to return Identifiers, QualifiedIdentifiers, Functions, or WindowFunctions, depending on how it is called. If a block is not given, creates one of the following objects:
If a block is given, it returns either a Function or WindowFunction, depending on the first argument to the method. Note that the block is currently not called by the code, though this may change in a future version. If the first argument is:
Examples:
ds = DB[:t] # Argument yielded to block ds.filter{|r| r.name < 2} # SELECT * FROM t WHERE (name < 2) # Block without argument (instance_eval) ds.filter{name < 2} # SELECT * FROM t WHERE (name < 2) # Qualified identifiers ds.filter{table__column + 1 < 2} # SELECT * FROM t WHERE ((table.column + 1) < 2) # Functions ds.filter{is_active(1, 'arg2')} # SELECT * FROM t WHERE is_active(1, 'arg2') ds.select{version{}} # SELECT version() FROM t ds.select{count(:*){}} # SELECT count(*) FROM t ds.select{count(:distinct, col1){}} # SELECT count(DISTINCT col1) FROM t # Window Functions ds.select{rank(:over){}} # SELECT rank() OVER () FROM t ds.select{count(:over, :*=>true){}} # SELECT count(*) OVER () FROM t ds.select{sum(:over, :args=>col1, :partition=>col2, :order=>col3){}} # SELECT sum(col1) OVER (PARTITION BY col2 ORDER BY col3) FROM t
WILDCARD | = | LiteralString.new('*').freeze |
QUESTION_MARK | = | LiteralString.new('?').freeze |
COMMA_SEPARATOR | = | LiteralString.new(', ').freeze |
DOUBLE_UNDERSCORE | = | '__'.freeze |
Return Identifiers, QualifiedIdentifiers, Functions, or WindowFunctions, depending on arguments and whether a block is provided. Does not currently call the block. See the class level documentation.
# File lib/sequel/sql.rb, line 939 939: def method_missing(m, *args, &block) 940: if block 941: if args.empty? 942: Function.new(m) 943: else 944: case arg = args.shift 945: when :* 946: Function.new(m, WILDCARD) 947: when :distinct 948: Function.new(m, PlaceholderLiteralString.new("DISTINCT #{args.map{QUESTION_MARK}.join(COMMA_SEPARATOR)}", args)) 949: when :over 950: opts = args.shift || {} 951: fun_args = ::Kernel.Array(opts[:*] ? WILDCARD : opts[:args]) 952: WindowFunction.new(Function.new(m, *fun_args), Window.new(opts)) 953: else 954: raise Error, 'unsupported VirtualRow method argument used with block' 955: end 956: end 957: elsif args.empty? 958: table, column = m.to_s.split(DOUBLE_UNDERSCORE, 2) 959: column ? QualifiedIdentifier.new(table, column) : Identifier.new(m) 960: else 961: Function.new(m, *args) 962: end 963: end