From d827d6e9ee10fa0906b7b3cfd191e6f9ac5d6b08 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Thu, 12 Aug 2010 15:40:58 -0700 Subject: to_sql visitor started --- lib/arel/nodes/equality.rb | 5 +++++ lib/arel/table.rb | 2 ++ lib/arel/visitors/to_sql.rb | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 lib/arel/visitors/to_sql.rb (limited to 'lib/arel') diff --git a/lib/arel/nodes/equality.rb b/lib/arel/nodes/equality.rb index 11383b1d89..d778380054 100644 --- a/lib/arel/nodes/equality.rb +++ b/lib/arel/nodes/equality.rb @@ -7,6 +7,11 @@ module Arel @left = left @right = right end + + def to_sql + viz = Visitors::ToSql.new left.relation.engine + viz.accept self + end end end end diff --git a/lib/arel/table.rb b/lib/arel/table.rb index 78b3ea9933..0ab39f134d 100644 --- a/lib/arel/table.rb +++ b/lib/arel/table.rb @@ -3,6 +3,8 @@ module Arel @engine = nil class << self; attr_accessor :engine; end + attr_reader :name, :engine + def initialize name, engine = Table.engine @name = name @engine = engine diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb new file mode 100644 index 0000000000..ba92ca7ef1 --- /dev/null +++ b/lib/arel/visitors/to_sql.rb @@ -0,0 +1,38 @@ +module Arel + module Visitors + class ToSql + def initialize engine + @engine = engine + @connection = nil + end + + def accept object + @connection = @engine.connection + visit object + end + + private + def visit_Arel_Nodes_Equality o + "#{visit o.left} = #{visit o.right}" + end + + def visit_Arel_Attributes_Integer o + "#{quote_table_name o.relation.name}.#{quote_column_name o.name}" + end + + def visit_Fixnum o; o end + + def visit object + send :"visit_#{object.class.name.gsub('::', '_')}", object + end + + def quote_table_name name + @connection.quote_table_name name + end + + def quote_column_name name + @connection.quote_column_name name + end + end + end +end -- cgit v1.2.3