class Bmg::Sql::Processor::Where

Public Class Methods

new(predicate, builder) click to toggle source
Calls superclass method Bmg::Sql::Processor::new
# File lib/bmg/sql/processor/where.rb, line 6
def initialize(predicate, builder)
  super(builder)
  @predicate = predicate
end

Public Instance Methods

on_select_exp(sexpr) click to toggle source
# File lib/bmg/sql/processor/where.rb, line 22
def on_select_exp(sexpr)
  if sexpr.group_by_clause || sexpr.has_computed_attributes?
    sexpr = builder.from_self(sexpr)
    call(sexpr)
  else
    pred = @predicate.rename(sexpr.desaliaser(true))
    if sexpr.where_clause
      sexpr_p = Predicate.new(sexpr.where_clause.predicate)
      sexpr.with_update(:where_clause, [ :where_clause, (sexpr_p & pred).sexpr ])
    else
      sexpr.with_insert(4, [ :where_clause, pred.sexpr ])
    end
  end
end
on_union(sexpr) click to toggle source
# File lib/bmg/sql/processor/where.rb, line 11
def on_union(sexpr)
  non_falsy = sexpr[2..-1].reject{|expr| falsy?(expr) }
  if non_falsy.empty?
    apply(sexpr.head_expr)
  elsif non_falsy.size == 1
    apply(non_falsy.first)
  else
    [sexpr[0], sexpr[1]] + non_falsy.map{|nf| apply(nf) }
  end
end

Private Instance Methods

falsy?(sexpr) click to toggle source
# File lib/bmg/sql/processor/where.rb, line 39
def falsy?(sexpr)
  return false unless sexpr.respond_to?(:predicate)
  return false if sexpr.predicate.nil?
  left  = Predicate.new(Predicate::Grammar.sexpr(sexpr.predicate)).unqualify
  right = Predicate.new(Predicate::Grammar.sexpr(@predicate.sexpr)).unqualify
  return (left & right).contradiction?
end