From ed6192c55b8e77b60e4203dc30ae056f222a1499 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Wed, 15 Sep 2010 09:26:01 -0700 Subject: adding a grouping node --- lib/arel/nodes/binary.rb | 10 +--------- lib/arel/nodes/grouping.rb | 21 +++++++++++++++++++++ lib/arel/nodes/node.rb | 20 ++++++++++++++++++++ 3 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 lib/arel/nodes/grouping.rb create mode 100644 lib/arel/nodes/node.rb (limited to 'lib/arel/nodes') diff --git a/lib/arel/nodes/binary.rb b/lib/arel/nodes/binary.rb index 3cd9583e79..090468adfa 100644 --- a/lib/arel/nodes/binary.rb +++ b/lib/arel/nodes/binary.rb @@ -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. diff --git a/lib/arel/nodes/grouping.rb b/lib/arel/nodes/grouping.rb new file mode 100644 index 0000000000..0af1df1f7a --- /dev/null +++ b/lib/arel/nodes/grouping.rb @@ -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 diff --git a/lib/arel/nodes/node.rb b/lib/arel/nodes/node.rb new file mode 100644 index 0000000000..fd5ea410ea --- /dev/null +++ b/lib/arel/nodes/node.rb @@ -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 -- cgit v1.2.3