Class: Sequel::SQL::ComplexExpression
- Inherits:
-
Expression
- Object
- Expression
- Sequel::SQL::ComplexExpression
- Includes:
- AliasMethods, CastMethods, OrderMethods, PatternMatchMethods, SubscriptMethods
- Defined in:
- lib/sequel/sql.rb,
lib/sequel/sql.rb,
lib/sequel/sql.rb,
lib/sequel/extensions/eval_inspect.rb
Overview
Represents a complex SQL expression, with a given operator and one or more attributes (which may also be ComplexExpressions, forming a tree). This class is the backbone of Sequel’s ruby expression DSL.
This is an abstract class that is not that useful by itself. The subclasses BooleanExpression, NumericExpression, and StringExpression define the behavior of the DSL via operators.
Direct Known Subclasses
Constant Summary collapse
- OPERTATOR_INVERSIONS =
A hash of the opposite for each operator symbol, used for inverting objects.
{:AND => :OR, :OR => :AND, :< => :>=, :> => :<=, :<= => :>, :>= => :<, :'=' => :'!=' , :'!=' => :'=', :LIKE => :'NOT LIKE', :'NOT LIKE' => :LIKE, :~ => :'!~', :'!~' => :~, :IN => :'NOT IN', :'NOT IN' => :IN, :IS => :'IS NOT', :'IS NOT' => :IS, :'~*' => :'!~*', :'!~*' => :'~*', :NOT => :NOOP, :NOOP => :NOT, :ILIKE => :'NOT ILIKE', :'NOT ILIKE'=>:ILIKE}
- MATHEMATICAL_OPERATORS =
Standard mathematical operators used in
NumericMethods [:+, :-, :/, :*]
- BITWISE_OPERATORS =
Bitwise mathematical operators used in
NumericMethods [:&, :|, :^, :<<, :>>, :%]
- EQUALITY_OPERATORS =
Operators that check for equality
[:'=', :'!=']
- INEQUALITY_OPERATORS =
Inequality operators used in
InequalityMethods [:<, :>, :<=, :>=]
- BOOLEAN_OPERATOR_METHODS =
Hash of ruby operator symbols to SQL operators, used in
BooleanMethods {:& => :AND, :| =>:OR}
- IN_OPERATORS =
Operators that use IN/NOT IN for inclusion/exclusion
[:IN, :'NOT IN']
- IS_OPERATORS =
Operators that use IS, used for special casing to override literal true/false values
[:IS, :'IS NOT']
- REGEXP_OPERATORS =
Operators that do pattern matching via regular expressions
[:~, :'!~', :'~*', :'!~*']
- LIKE_OPERATORS =
Operators that do pattern matching via LIKE
[:LIKE, :'NOT LIKE', :ILIKE, :'NOT ILIKE']
- TWO_ARITY_OPERATORS =
Operator symbols that take exactly two arguments
EQUALITY_OPERATORS + INEQUALITY_OPERATORS + IS_OPERATORS + IN_OPERATORS + REGEXP_OPERATORS + LIKE_OPERATORS
- N_ARITY_OPERATORS =
Operator symbols that take one or more arguments
[:AND, :OR, :'||'] + MATHEMATICAL_OPERATORS + BITWISE_OPERATORS
- ONE_ARITY_OPERATORS =
Operator symbols that take only a single argument
[:NOT, :NOOP, :'B~']
- CUSTOM_EXPRESSIONS =
Custom expressions that may have different syntax on different databases
[:extract]
- CONSTANT_INVERSIONS =
A hash of the opposite for each constant, used for inverting constants.
{Constants::TRUE=>Constants::FALSE, Constants::FALSE=>Constants::TRUE, Constants::NULL=>Constants::NOTNULL, Constants::NOTNULL=>Constants::NULL}
Instance Attribute Summary collapse
-
#args ⇒ Object
readonly
An array of args for this object.
-
#op ⇒ Object
readonly
The operator symbol for this object.
Instance Method Summary collapse
-
#initialize(op, *args) ⇒ ComplexExpression
constructor
Set the operator symbol and arguments for this object to the ones given.
-
#sql_boolean ⇒ Object
Return a BooleanExpression with the same op and args.
-
#sql_number ⇒ Object
Return a NumericExpression with the same op and args.
-
#sql_string ⇒ Object
Return a StringExpression with the same op and args.
Methods included from SubscriptMethods
Methods included from PatternMatchMethods
Methods included from OrderMethods
Methods included from CastMethods
#cast, #cast_numeric, #cast_string
Methods included from AliasMethods
Methods inherited from Expression
#==, attr_reader, #eql?, #hash, inherited, #inspect, #lit, #sql_literal
Constructor Details
#initialize(op, *args) ⇒ ComplexExpression
Set the operator symbol and arguments for this object to the ones given. Convert all args that are hashes or arrays of two element arrays to BooleanExpressions, other than the second arg for an IN/NOT IN operator. Raise an Error if the operator doesn’t allow boolean input and a boolean argument is given. Raise an Error if the wrong number of arguments for a given operator is used.
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |
# File 'lib/sequel/sql.rb', line 215 def initialize(op, *args) orig_args = args args = args.map{|a| Sequel.condition_specifier?(a) ? SQL::BooleanExpression.from_value_pairs(a) : a} case op when *N_ARITY_OPERATORS raise(Error, "The #{op} operator requires at least 1 argument") unless args.length >= 1 old_args = args.map{|a| a.is_a?(self.class) && a.op == :NOOP ? a.args.first : a} args = [] old_args.each{|a| a.is_a?(self.class) && a.op == op ? args.concat(a.args) : args.push(a)} when *TWO_ARITY_OPERATORS raise(Error, "The #{op} operator requires precisely 2 arguments") unless args.length == 2 # With IN/NOT IN, even if the second argument is an array of two element arrays, # don't convert it into a boolean expression, since it's definitely being used # as a value list. args[1] = orig_args[1] if IN_OPERATORS.include?(op) when *ONE_ARITY_OPERATORS raise(Error, "The #{op} operator requires a single argument") unless args.length == 1 when *CUSTOM_EXPRESSIONS # nothing else raise(Error, "Invalid operator #{op}") end @op = op @args = args end |
Instance Attribute Details
#args ⇒ Object (readonly)
An array of args for this object
208 209 210 |
# File 'lib/sequel/sql.rb', line 208 def args @args end |
#op ⇒ Object (readonly)
The operator symbol for this object
205 206 207 |
# File 'lib/sequel/sql.rb', line 205 def op @op end |
Instance Method Details
#sql_boolean ⇒ Object
Return a BooleanExpression with the same op and args.
1187 1188 1189 |
# File 'lib/sequel/sql.rb', line 1187 def sql_boolean BooleanExpression.new(self.op, *self.args) end |
#sql_number ⇒ Object
Return a NumericExpression with the same op and args.
1192 1193 1194 |
# File 'lib/sequel/sql.rb', line 1192 def sql_number NumericExpression.new(self.op, *self.args) end |
#sql_string ⇒ Object
Return a StringExpression with the same op and args.
1197 1198 1199 |
# File 'lib/sequel/sql.rb', line 1197 def sql_string StringExpression.new(self.op, *self.args) end |