1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

adding a grouping node

This commit is contained in:
Aaron Patterson 2010-09-15 09:26:01 -07:00
parent 188fc7a464
commit ed6192c55b
7 changed files with 54 additions and 15 deletions

View file

@ -1,3 +1,4 @@
require 'arel/nodes/node'
require 'arel/nodes/binary'
require 'arel/nodes/equality'
require 'arel/nodes/not_equal'
@ -29,6 +30,7 @@ require 'arel/nodes/unqualified_column'
require 'arel/nodes/table_alias'
require 'arel/nodes/join'
require 'arel/nodes/group'
require 'arel/nodes/grouping'
require 'arel/nodes/inner_join'
require 'arel/nodes/outer_join'
require 'arel/nodes/string_join'

View file

@ -1,6 +1,6 @@
module Arel
module Nodes
class Binary
class Binary < Arel::Nodes::Node
attr_accessor :left, :right
def initialize left, right
@ -8,14 +8,6 @@ module Arel
@right = right
end
def or right
Nodes::Or.new self, right
end
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.

View file

@ -0,0 +1,21 @@
module Arel
module Nodes
class Grouping < Arel::Nodes::Node
attr_accessor :expr
def initialize expression
@expr = expression
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
viz = Visitors::ToSql.new Table.engine
viz.accept self
end
end
end
end

20
lib/arel/nodes/node.rb Normal file
View file

@ -0,0 +1,20 @@
module Arel
module Nodes
###
# Abstract base class for all AST nodes
class Node
###
# 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
end
end
end

View file

@ -84,6 +84,10 @@ module Arel
def visit_Arel_Nodes_Lock o
end
def visit_Arel_Nodes_Grouping o
"(#{visit o.expr})"
end
def visit_Arel_Nodes_Group o
visit o.expr
end

View file

@ -34,8 +34,8 @@ module Arel
left = attr.eq(10)
right = attr.eq(11)
node = left.or right
check node.left.should == left
check node.right.should == right
check node.expr.left.should == left
check node.expr.right.should == right
end
end

View file

@ -7,12 +7,12 @@ module Arel
left = attr.eq(10)
right = attr.eq(11)
node = left.or right
check node.left.should == left
check node.right.should == right
check node.expr.left.should == left
check node.expr.right.should == right
oror = node.or(right)
check oror.left == node
check oror.right == right
check oror.expr.left == node
check oror.expr.right == right
end
end
end