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:
parent
188fc7a464
commit
ed6192c55b
7 changed files with 54 additions and 15 deletions
|
@ -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'
|
||||
|
|
|
@ -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.
|
||||
|
|
21
lib/arel/nodes/grouping.rb
Normal file
21
lib/arel/nodes/grouping.rb
Normal 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
20
lib/arel/nodes/node.rb
Normal 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
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue