Method: Sequel::SQL::BooleanExpression.invert

Defined in:
lib/sequel/sql.rb

.invert(ce) ⇒ Object

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"


592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
# File 'lib/sequel/sql.rb', line 592

def self.invert(ce)
  case ce
  when BooleanExpression
    case op = ce.op
    when :AND, :OR
      BooleanExpression.new(OPERTATOR_INVERSIONS[op], *ce.args.collect{|a| BooleanExpression.invert(a)})
    else
      BooleanExpression.new(OPERTATOR_INVERSIONS[op], *ce.args.dup)
    end
  when StringExpression, NumericExpression
    raise(Sequel::Error, "cannot invert #{ce.inspect}")
  when Constant
    CONSTANT_INVERSIONS[ce] || raise(Sequel::Error, "cannot invert #{ce.inspect}")
  else
    BooleanExpression.new(:NOT, ce)
  end
end