提交 ed6192c5 编写于 作者: A Aaron Patterson

adding a grouping node

上级 188fc7a4
require 'arel/nodes/node'
require 'arel/nodes/binary'
require 'arel/nodes/equality'
require 'arel/nodes/not_equal'
......@@ -29,6 +30,7 @@
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'
......
module Arel
module Nodes
class Binary
class Binary < Arel::Nodes::Node
attr_accessor :left, :right
def initialize left, right
......@@ -8,14 +8,6 @@ def initialize left, right
@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.
......
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
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
......@@ -84,6 +84,10 @@ def visit_Arel_Nodes_Offset o
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
......
......@@ -34,8 +34,8 @@ module Nodes
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
......
......@@ -7,12 +7,12 @@ module Nodes
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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册