aboutsummaryrefslogtreecommitdiffstats
path: root/lib/arel
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2010-08-12 16:19:54 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2010-08-12 16:19:54 -0700
commit16e7273245473bb6466a79a38702a52387bab44d (patch)
treee6958fb5be8980927d9ab1cbabfe100f8c90dad9 /lib/arel
parentd827d6e9ee10fa0906b7b3cfd191e6f9ac5d6b08 (diff)
downloadrails-16e7273245473bb6466a79a38702a52387bab44d.tar.gz
rails-16e7273245473bb6466a79a38702a52387bab44d.tar.bz2
rails-16e7273245473bb6466a79a38702a52387bab44d.zip
full sql statement generation
Diffstat (limited to 'lib/arel')
-rw-r--r--lib/arel/nodes.rb1
-rw-r--r--lib/arel/nodes/select.rb13
-rw-r--r--lib/arel/tree_manager.rb31
-rw-r--r--lib/arel/visitors/to_sql.rb12
4 files changed, 57 insertions, 0 deletions
diff --git a/lib/arel/nodes.rb b/lib/arel/nodes.rb
index 07a687405f..53c17a8cca 100644
--- a/lib/arel/nodes.rb
+++ b/lib/arel/nodes.rb
@@ -1,2 +1,3 @@
require 'arel/nodes/equality'
require 'arel/nodes/sql_literal'
+require 'arel/nodes/select'
diff --git a/lib/arel/nodes/select.rb b/lib/arel/nodes/select.rb
new file mode 100644
index 0000000000..8f68adbcd5
--- /dev/null
+++ b/lib/arel/nodes/select.rb
@@ -0,0 +1,13 @@
+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/tree_manager.rb b/lib/arel/tree_manager.rb
new file mode 100644
index 0000000000..b111ca9557
--- /dev/null
+++ b/lib/arel/tree_manager.rb
@@ -0,0 +1,31 @@
+module Arel
+ class TreeManager
+ def initialize engine
+ @engine = engine
+ @statement_list = []
+
+ # default to Select
+ @statement_list << Nodes::Select.new
+ end
+
+ def from table
+ @statement_list.last.froms << table
+ self
+ end
+
+ def project projection
+ @statement_list.last.projections << projection
+ self
+ end
+
+ def where expr
+ @statement_list.last.wheres << expr
+ self
+ end
+
+ def to_sql
+ viz = Visitors::ToSql.new @engine
+ viz.accept @statement_list.last
+ end
+ end
+end
diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb
index ba92ca7ef1..bb2a4d07e8 100644
--- a/lib/arel/visitors/to_sql.rb
+++ b/lib/arel/visitors/to_sql.rb
@@ -12,6 +12,18 @@ module Arel
end
private
+ def visit_Arel_Nodes_Select o
+ [
+ "SELECT #{o.projections.map { |x| visit x }.join ', '}",
+ "FROM #{o.froms.map { |x| visit x }.join ', ' }",
+ ("WHERE #{o.wheres.map { |x| visit x }.join ' AND ' }" unless o.wheres.blank?)
+ ].compact.join ' '
+ end
+
+ def visit_Arel_Table o
+ quote_table_name o.name
+ end
+
def visit_Arel_Nodes_Equality o
"#{visit o.left} = #{visit o.right}"
end