aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/arel/nodes.rb3
-rw-r--r--lib/arel/nodes/select_core.rb (renamed from lib/arel/nodes/select.rb)2
-rw-r--r--lib/arel/nodes/select_statement.rb13
-rw-r--r--lib/arel/table.rb4
-rw-r--r--lib/arel/tree_manager.rb21
-rw-r--r--lib/arel/visitors/to_sql.rb9
6 files changed, 42 insertions, 10 deletions
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_core.rb
index 8f68adbcd5..39145de697 100644
--- a/lib/arel/nodes/select.rb
+++ b/lib/arel/nodes/select_core.rb
@@ -1,6 +1,6 @@
module Arel
module Nodes
- class Select
+ class SelectCore
attr_reader :froms, :projections, :wheres
def initialize
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 ', ' }",