class Sequel::SQL::BooleanExpression
Subclass of ComplexExpression
where the expression results in a boolean value in SQL
.
Public Class Methods
Source
# File lib/sequel/sql.rb 1084 def self.from_value_pairs(pairs, op=:AND, negate=false) 1085 pairs = pairs.map{|l,r| from_value_pair(l, r)} 1086 pairs.map!{|ce| invert(ce)} if negate 1087 pairs.length == 1 ? pairs[0] : new(op, *pairs) 1088 end
Take pairs of values (e.g. a hash or array of two element arrays) and converts it to a BooleanExpression
. The operator and args used depends on the case of the right (2nd) argument:
- 0..10
-
left >= 0 AND left <= 10
- 1,2
-
left IN (1,2)
-
- nil
-
left IS NULL
- true
-
left IS TRUE
- false
-
left IS FALSE
- /as/
-
left ~ ‘as’
- :blah
-
left = blah
- ‘blah’
-
left = ‘blah’
If multiple arguments are given, they are joined with the op given (AND by default, OR possible). If negate is set to true, all subexpressions are inverted before used. Therefore, the following expressions are equivalent:
~from_value_pairs(hash) from_value_pairs(hash, :OR, true)
Source
# File lib/sequel/sql.rb 1143 def self.invert(ce) 1144 case ce 1145 when BooleanExpression 1146 case op = ce.op 1147 when :AND, :OR 1148 BooleanExpression.new(OPERATOR_INVERSIONS[op], *ce.args.map{|a| BooleanExpression.invert(a)}) 1149 when :IN, :"NOT IN" 1150 BooleanExpression.new(OPERATOR_INVERSIONS[op], *ce.args.dup) 1151 else 1152 if ce.args.length == 2 1153 case ce.args[1] 1154 when Function, LiteralString, PlaceholderLiteralString 1155 # Special behavior to not push down inversion in this case because doing so 1156 # can result in incorrect behavior for ANY/SOME/ALL operators. 1157 BooleanExpression.new(:NOT, ce) 1158 else 1159 BooleanExpression.new(OPERATOR_INVERSIONS[op], *ce.args.dup) 1160 end 1161 else 1162 BooleanExpression.new(OPERATOR_INVERSIONS[op], *ce.args.dup) 1163 end 1164 end 1165 when StringExpression, NumericExpression 1166 raise(Sequel::Error, "cannot invert #{ce.inspect}") 1167 when Constant 1168 CONSTANT_INVERSIONS[ce] || raise(Sequel::Error, "cannot invert #{ce.inspect}") 1169 else 1170 BooleanExpression.new(:NOT, ce) 1171 end 1172 end
Invert the expression, if possible. If the expression cannot be inverted, raise an error. An inverted expression should match everything that the uninverted expression did not match, and vice-versa, except for possible issues with SQL
NULL (i.e. 1 == NULL is NULL and 1 != NULL is also NULL).
BooleanExpression.invert(:a) # NOT "a"
Private Class Methods
Source
# File lib/sequel/sql.rb 1091 def self.from_value_pair(l, r) 1092 case r 1093 when Range 1094 unless r.begin.nil? 1095 begin_expr = new(:>=, l, r.begin) 1096 end 1097 unless r.end.nil? 1098 end_expr = new(r.exclude_end? ? :< : :<=, l, r.end) 1099 end 1100 if begin_expr 1101 if end_expr 1102 new(:AND, begin_expr, end_expr) 1103 else 1104 begin_expr 1105 end 1106 elsif end_expr 1107 end_expr 1108 else 1109 new(:'=', 1, 1) 1110 end 1111 when ::Array 1112 r = r.dup.freeze unless r.frozen? 1113 new(:IN, l, r) 1114 when ::String 1115 r = r.dup.freeze unless r.frozen? 1116 new(:'=', l, r) 1117 when ::Sequel::Dataset 1118 new(:IN, l, r) 1119 when NegativeBooleanConstant 1120 new(:"IS NOT", l, r.constant) 1121 when BooleanConstant 1122 new(:IS, l, r.constant) 1123 when NilClass, TrueClass, FalseClass 1124 new(:IS, l, r) 1125 when Regexp 1126 StringExpression.like(l, r) 1127 when DelayedEvaluation 1128 Sequel.delay{|ds| from_value_pair(l, r.call(ds))} 1129 when Dataset::PlaceholderLiteralizer::Argument 1130 r.transform{|v| from_value_pair(l, v)} 1131 else 1132 new(:'=', l, r) 1133 end 1134 end
Return a BooleanExpression
based on the right side of the pair.
Public Instance Methods
Source
# File lib/sequel/sql.rb 1175 def &(ce) 1176 BooleanExpression.new(:AND, self, ce) 1177 end
Always use an AND operator for & on BooleanExpressions
Source
# File lib/sequel/sql.rb 1180 def |(ce) 1181 BooleanExpression.new(:OR, self, ce) 1182 end
Always use an OR operator for | on BooleanExpressions
Source
# File lib/sequel/sql.rb 1185 def sql_boolean 1186 self 1187 end
Return self instead of creating a new object to save on memory.