1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/lib/arel/nodes/node.rb
Aaron Patterson 93d72131bc add the casting node to the AST at build time
If we add the casting node to the ast at build time, then we can avoid
doing the lookup at visit time.
2014-03-24 16:26:09 -07:00

58 lines
1.4 KiB
Ruby

module Arel
module Nodes
###
# Abstract base class for all AST nodes
class Node
include Arel::FactoryMethods
include Enumerable
if $DEBUG
def _caller
@caller
end
def initialize
@caller = caller.dup
end
end
###
# Factory method to create a Nodes::Not node that has the recipient of
# the caller as a child.
def not
Nodes::Not.new self
end
###
# Factory method to create a Nodes::Grouping node that has an Nodes::Or
# node as a child.
def or right
Nodes::Grouping.new Nodes::Or.new(self, right)
end
###
# Factory method to create an Nodes::And node.
def and right
Nodes::And.new [self, right]
end
# FIXME: this method should go away. I don't like people calling
# to_sql on non-head nodes. This forces us to walk the AST until we
# can find a node that has a "relation" member.
#
# Maybe we should just use `Table.engine`? :'(
def to_sql engine = Table.engine
engine.connection.visitor.accept self
end
# Iterate through AST, nodes will be yielded depth-first
def each &block
return enum_for(:each) unless block_given?
::Arel::Visitors::DepthFirst.new(block).accept self
end
def cast_reference?; false; end # :nodoc:
end
end
end