class ArelHash::NodeFactory

Public Class Methods

new(table) click to toggle source

@param [Arel::Table] table the arel table to work on

# File lib/arel_hash/node_factory.rb, line 4
def initialize(table)
  @table = table
end

Public Instance Methods

create_node(hash) click to toggle source

@param [Hash<Symbol, Hash<Symbol, Object>>] hash a hash, which is a serialization of an Arel::Node

# File lib/arel_hash/node_factory.rb, line 9
def create_node(hash)
  operator, value = ArelHash.singleton_tuple!(hash)
  do_create_node(operator, value)
end

Private Instance Methods

create_and_node(values) click to toggle source
# File lib/arel_hash/node_factory.rb, line 57
def create_and_node(values)
  join_nodes(create_node_collection(values), :and)
end
create_collection_node(operator, value) click to toggle source
# File lib/arel_hash/node_factory.rb, line 24
def create_collection_node(operator, value)
  if operator == :or
    create_or_node(value)
  elsif operator == :and
    create_and_node(value)
  end
end
create_node_collection(values) click to toggle source
# File lib/arel_hash/node_factory.rb, line 71
def create_node_collection(values)
  values.map { |v| create_node(v) }.uniq
end
create_or_node(values) click to toggle source
# File lib/arel_hash/node_factory.rb, line 61
def create_or_node(values)
  join_nodes(create_node_collection(values), :or) || ZERO_RESULTS_NODE
end
create_predication_node(predicate, attribute_value_hash) click to toggle source
# File lib/arel_hash/node_factory.rb, line 32
def create_predication_node(predicate, attribute_value_hash)
  first, last = ArelHash.singleton_tuple!(attribute_value_hash).map { |v| wrap_operand(v) }
  first.send(*expand_meta_predicates(predicate, last))
end
do_create_node(operator, value) click to toggle source
# File lib/arel_hash/node_factory.rb, line 16
def do_create_node(operator, value)
  if %i(or and).include?(operator)
    create_collection_node(operator, value)
  else
    create_predication_node(operator, value)
  end
end
expand_meta_predicates(predicate, value) click to toggle source
# File lib/arel_hash/node_factory.rb, line 37
def expand_meta_predicates(predicate, value)
  # TODO: support ALL
  if (predicate=predicate.to_s).end_with?('_any') && value.is_a?(Arel::Attributes::Attribute)
    predicate = predicate[0...-4]
    value = Nodes::Any.new(value)
  end
  return predicate.to_sym, value
end
join_nodes(node_collection, operator) click to toggle source
# File lib/arel_hash/node_factory.rb, line 65
def join_nodes(node_collection, operator)
  node_collection.reduce(nil) do |m, node|
    (m && node) ? m.send(operator, node) : node
  end
end
wrap_operand(operand) click to toggle source
# File lib/arel_hash/node_factory.rb, line 46
def wrap_operand(operand)
  case operand
  when Symbol then
    @table[operand]
  when Array then
    operand.map { |o| wrap_operand(o) }
  else
    Nodes::build_quoted(operand).extend Arel::Predications
  end
end