class Bmg::Sql::Processor::Merge

Public Class Methods

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

Public Instance Methods

on_except(sexpr)
Alias for: on_nonjoin_exp
on_intersect(sexpr)
Alias for: on_nonjoin_exp
on_nonjoin_exp(sexpr) click to toggle source
# File lib/bmg/sql/processor/merge.rb, line 25
def on_nonjoin_exp(sexpr)
  left_attrs  = sexpr.to_attr_list.map(&:to_s).sort
  right_attrs = @right.to_attr_list.map(&:to_s).sort
  unless left_attrs == right_attrs
    raise "Operands are not union compatible: #{left_attrs.inspect} vs. #{right_attrs.inspect}"
  end

  reordered = Reorder.new(sexpr.to_attr_list, builder).call(@right)
  if @right.with_exp?
    [ :with_exp,
      reordered.with_spec,
      [ @kind, modifier, sexpr, reordered.select_exp ] ]
  elsif sexpr.first == @kind && sexpr.set_quantifier == modifier
    sexpr.dup + [ reordered ]
  else
    [ @kind, modifier, sexpr, reordered ]
  end
end
on_select_exp(sexpr)
Alias for: on_nonjoin_exp
on_union(sexpr)
Alias for: on_nonjoin_exp
on_with_exp(sexpr) click to toggle source
# File lib/bmg/sql/processor/merge.rb, line 13
def on_with_exp(sexpr)
  if @right.with_exp?
    reordered = Reorder.new(sexpr.to_attr_list, builder).call(@right)
    main = [ @kind, modifier, sexpr.select_exp, reordered.select_exp ]
    merge_with_exps(sexpr, reordered, main)
  else
    [ :with_exp,
      sexpr.with_spec,
      apply(sexpr.last) ]
  end
end

Private Instance Methods

modifier() click to toggle source
# File lib/bmg/sql/processor/merge.rb, line 50
def modifier
  @all ? builder.all : builder.distinct
end