Class: Sequel::SQL::ComplexExpression
- Inherits:
-
Expression
- Object
- Expression
- Sequel::SQL::ComplexExpression
- Includes:
- AliasMethods, CastMethods, OrderMethods, 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 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.
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 |
# File 'lib/sequel/sql.rb', line 213 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
206 207 208 |
# File 'lib/sequel/sql.rb', line 206 def args @args end |
#op ⇒ Object (readonly)
The operator symbol for this object
203 204 205 |
# File 'lib/sequel/sql.rb', line 203 def op @op end |
Instance Method Details
#sql_boolean ⇒ Object
Return a BooleanExpression with the same op and args.
1152 1153 1154 |
# File 'lib/sequel/sql.rb', line 1152 def sql_boolean BooleanExpression.new(self.op, *self.args) end |
#sql_number ⇒ Object
Return a NumericExpression with the same op and args.
1157 1158 1159 |
# File 'lib/sequel/sql.rb', line 1157 def sql_number NumericExpression.new(self.op, *self.args) end |
#sql_string ⇒ Object
Return a StringExpression with the same op and args.
1162 1163 1164 |
# File 'lib/sequel/sql.rb', line 1162 def sql_string StringExpression.new(self.op, *self.args) end |