diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2011-04-21 15:28:21 -0500 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2011-04-21 15:28:21 -0500 |
commit | cae83ce964b9919b890bb7fa6f920a536e6b5425 (patch) | |
tree | c0d11479ee90c9ead48cef7a3db1e297ee333489 | |
parent | 885a3acb1ce183189b8628f14fa834b3e1ba39ec (diff) | |
download | rails-cae83ce964b9919b890bb7fa6f920a536e6b5425.tar.gz rails-cae83ce964b9919b890bb7fa6f920a536e6b5425.tar.bz2 rails-cae83ce964b9919b890bb7fa6f920a536e6b5425.zip |
adding a DISTINCT node
-rw-r--r-- | lib/arel/nodes/select_core.rb | 17 | ||||
-rw-r--r-- | lib/arel/nodes/unary.rb | 6 | ||||
-rw-r--r-- | lib/arel/visitors/to_sql.rb | 5 | ||||
-rw-r--r-- | test/nodes/test_select_core.rb | 37 |
4 files changed, 44 insertions, 21 deletions
diff --git a/lib/arel/nodes/select_core.rb b/lib/arel/nodes/select_core.rb index 7f577e0a05..bee0a5930c 100644 --- a/lib/arel/nodes/select_core.rb +++ b/lib/arel/nodes/select_core.rb @@ -2,15 +2,18 @@ module Arel module Nodes class SelectCore < Arel::Nodes::Node attr_accessor :top, :projections, :wheres, :groups - attr_accessor :having, :source + attr_accessor :having, :source, :set_quantifier def initialize - @source = JoinSource.new nil - @top = nil - @projections = [] - @wheres = [] - @groups = [] - @having = nil + @source = JoinSource.new nil + @top = nil + + # http://savage.net.au/SQL/sql-92.bnf.html#set%20quantifier + @set_quantifier = nil + @projections = [] + @wheres = [] + @groups = [] + @having = nil end def from diff --git a/lib/arel/nodes/unary.rb b/lib/arel/nodes/unary.rb index 1c834913fa..e6e40e6b13 100644 --- a/lib/arel/nodes/unary.rb +++ b/lib/arel/nodes/unary.rb @@ -23,5 +23,11 @@ module Arel }.each do |name| const_set(name, Class.new(Unary)) end + + class Distinct < Unary + def initialize expr = nil + super + end + end end end diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index 061e46a436..6aba31d94d 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -125,6 +125,7 @@ key on UpdateManager using UpdateManager#key= [ "SELECT", (visit(o.top) if o.top), + (visit(o.set_quantifier) if o.set_quantifier), "#{o.projections.map { |x| visit x }.join ', '}", visit(o.source), ("WHERE #{o.wheres.map { |x| visit x }.join ' AND ' }" unless o.wheres.empty?), @@ -137,6 +138,10 @@ key on UpdateManager using UpdateManager#key= visit o.expr end + def visit_Arel_Nodes_Distinct o + 'DISTINCT' + end + def visit_Arel_Nodes_With o "WITH #{o.children.map { |x| visit x }.join(', ')}" end diff --git a/test/nodes/test_select_core.rb b/test/nodes/test_select_core.rb index 884d86e21f..47f85aee8a 100644 --- a/test/nodes/test_select_core.rb +++ b/test/nodes/test_select_core.rb @@ -1,22 +1,31 @@ require 'helper' -describe Arel::Nodes::SelectCore do - describe "#clone" do - it "clones froms, projections and wheres" do - core = Arel::Nodes::SelectCore.new - core.froms = %w[a b c] - core.projections = %w[d e f] - core.wheres = %w[g h i] +module Arel + module Nodes + class TestSelectCore < MiniTest::Unit::TestCase + def test_clone + core = Arel::Nodes::SelectCore.new + core.froms = %w[a b c] + core.projections = %w[d e f] + core.wheres = %w[g h i] - dolly = core.clone + dolly = core.clone - dolly.froms.must_equal core.froms - dolly.projections.must_equal core.projections - dolly.wheres.must_equal core.wheres + dolly.froms.must_equal core.froms + dolly.projections.must_equal core.projections + dolly.wheres.must_equal core.wheres - dolly.froms.wont_be_same_as core.froms - dolly.projections.wont_be_same_as core.projections - dolly.wheres.wont_be_same_as core.wheres + dolly.froms.wont_be_same_as core.froms + dolly.projections.wont_be_same_as core.projections + dolly.wheres.wont_be_same_as core.wheres + end + + def test_set_quantifier + core = Arel::Nodes::SelectCore.new + core.set_quantifier = Arel::Nodes::Distinct.new + viz = Arel::Visitors::ToSql.new Table.engine + assert_match 'DISTINCT', viz.accept(core) + end end end end |