From e573a9ea468d748cf0ebd1a70521c1589efda23e Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Thu, 12 Aug 2010 21:21:20 -0700 Subject: limits are added --- lib/arel/nodes.rb | 3 ++- lib/arel/nodes/select.rb | 13 ------------- lib/arel/nodes/select_core.rb | 13 +++++++++++++ lib/arel/nodes/select_statement.rb | 13 +++++++++++++ lib/arel/table.rb | 4 ++++ lib/arel/tree_manager.rb | 21 ++++++++++++++------- lib/arel/visitors/to_sql.rb | 9 ++++++++- 7 files changed, 54 insertions(+), 22 deletions(-) delete mode 100644 lib/arel/nodes/select.rb create mode 100644 lib/arel/nodes/select_core.rb create mode 100644 lib/arel/nodes/select_statement.rb (limited to 'lib/arel') diff --git a/lib/arel/nodes.rb b/lib/arel/nodes.rb index 53c17a8cca..5db177d53d 100644 --- a/lib/arel/nodes.rb +++ b/lib/arel/nodes.rb @@ -1,3 +1,4 @@ require 'arel/nodes/equality' require 'arel/nodes/sql_literal' -require 'arel/nodes/select' +require 'arel/nodes/select_core' +require 'arel/nodes/select_statement' diff --git a/lib/arel/nodes/select.rb b/lib/arel/nodes/select.rb deleted file mode 100644 index 8f68adbcd5..0000000000 --- a/lib/arel/nodes/select.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Arel - module Nodes - class Select - attr_reader :froms, :projections, :wheres - - def initialize - @froms = [] - @projections = [] - @wheres = [] - end - end - end -end diff --git a/lib/arel/nodes/select_core.rb b/lib/arel/nodes/select_core.rb new file mode 100644 index 0000000000..39145de697 --- /dev/null +++ b/lib/arel/nodes/select_core.rb @@ -0,0 +1,13 @@ +module Arel + module Nodes + class SelectCore + attr_reader :froms, :projections, :wheres + + def initialize + @froms = [] + @projections = [] + @wheres = [] + end + end + end +end diff --git a/lib/arel/nodes/select_statement.rb b/lib/arel/nodes/select_statement.rb new file mode 100644 index 0000000000..122f6275fe --- /dev/null +++ b/lib/arel/nodes/select_statement.rb @@ -0,0 +1,13 @@ +module Arel + module Nodes + class SelectStatement + attr_reader :cores + attr_accessor :limit + + def initialize cores = [SelectCore.new] + @cores = cores + @limit = nil + end + end + end +end diff --git a/lib/arel/table.rb b/lib/arel/table.rb index 0ab39f134d..7933c8c1a4 100644 --- a/lib/arel/table.rb +++ b/lib/arel/table.rb @@ -10,6 +10,10 @@ module Arel @engine = engine end + def where expression + TreeManager.new(@engine).from(self).where expression + end + def columns @engine.connection.columns(@name, "#{@name} Columns").map do |column| Attributes.for(column).new self, column.name, column diff --git a/lib/arel/tree_manager.rb b/lib/arel/tree_manager.rb index b111ca9557..e92092d6e1 100644 --- a/lib/arel/tree_manager.rb +++ b/lib/arel/tree_manager.rb @@ -1,31 +1,38 @@ module Arel class TreeManager def initialize engine - @engine = engine - @statement_list = [] + @engine = engine + @selects = [] # default to Select - @statement_list << Nodes::Select.new + @stmt = Nodes::SelectStatement.new + @core = @stmt.cores.last + @selects << @stmt end def from table - @statement_list.last.froms << table + @core.froms << table self end def project projection - @statement_list.last.projections << projection + @core.projections << projection self end def where expr - @statement_list.last.wheres << expr + @core.wheres << expr + self + end + + def take limit + @stmt.limit = limit self end def to_sql viz = Visitors::ToSql.new @engine - viz.accept @statement_list.last + viz.accept @stmt end end end diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index bb2a4d07e8..44a585698f 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -12,7 +12,14 @@ module Arel end private - def visit_Arel_Nodes_Select o + def visit_Arel_Nodes_SelectStatement o + [ + o.cores.map { |x| visit x }.join, + ("LIMIT #{o.limit}" if o.limit) + ].compact.join ' ' + end + + def visit_Arel_Nodes_SelectCore o [ "SELECT #{o.projections.map { |x| visit x }.join ', '}", "FROM #{o.froms.map { |x| visit x }.join ', ' }", -- cgit v1.2.3