Class | Sequel::SQL::BooleanExpression |
In: |
lib/sequel/sql.rb
|
Parent: | ComplexExpression |
Subclass of ComplexExpression where the expression results in a boolean value in SQL.
Take pairs of values (e.g. a hash or array of arrays of two pairs) and converts it to a BooleanExpression. The operator and args used depends on the case of the right (2nd) argument:
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)
# File lib/sequel/sql.rb, line 442 442: def self.from_value_pairs(pairs, op=:AND, negate=false) 443: pairs = pairs.collect do |l,r| 444: ce = case r 445: when Range 446: new(:AND, new(:>=, l, r.begin), new(r.exclude_end? ? :< : :<=, l, r.end)) 447: when Array, ::Sequel::Dataset, SQLArray 448: new(:IN, l, r) 449: when NilClass, TrueClass, FalseClass 450: new(:IS, l, r) 451: when Regexp 452: StringExpression.like(l, r) 453: else 454: new('=''=', l, r) 455: end 456: negate ? invert(ce) : ce 457: end 458: pairs.length == 1 ? pairs.at(0) : new(op, *pairs) 459: 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).
# File lib/sequel/sql.rb, line 465 465: def self.invert(ce) 466: case ce 467: when BooleanExpression 468: case op = ce.op 469: when :AND, :OR 470: BooleanExpression.new(OPERTATOR_INVERSIONS[op], *ce.args.collect{|a| BooleanExpression.invert(a)}) 471: else 472: BooleanExpression.new(OPERTATOR_INVERSIONS[op], *ce.args.dup) 473: end 474: when StringExpression, NumericExpression 475: raise(Sequel::Error, "cannot invert #{ce.inspect}") 476: else 477: BooleanExpression.new(:NOT, ce) 478: end 479: end