diff options
-rw-r--r-- | lib/arel/insert_manager.rb | 11 | ||||
-rw-r--r-- | lib/arel/select_manager.rb | 8 | ||||
-rw-r--r-- | lib/arel/visitors/dot.rb | 22 | ||||
-rw-r--r-- | spec/arel/insert_manager_spec.rb (renamed from spec/arel/insert_manager.rb) | 26 | ||||
-rw-r--r-- | spec/arel/select_manager_spec.rb (renamed from spec/arel/select_manager.rb) | 0 |
5 files changed, 61 insertions, 6 deletions
diff --git a/lib/arel/insert_manager.rb b/lib/arel/insert_manager.rb index d6c663a9c4..accabb4377 100644 --- a/lib/arel/insert_manager.rb +++ b/lib/arel/insert_manager.rb @@ -12,5 +12,16 @@ module Arel def columns; @head.columns end def values; @head.values end + + def insert fields + return if fields.empty? + + @head.relation ||= fields.first.first.relation + + fields.each do |column, value| + @head.columns << column + @head.values << value + end + end end end diff --git a/lib/arel/select_manager.rb b/lib/arel/select_manager.rb index c9484295d8..1728311d59 100644 --- a/lib/arel/select_manager.rb +++ b/lib/arel/select_manager.rb @@ -26,9 +26,11 @@ module Arel self end - def insert stuff - viz = Visitors::Dot.new - puts viz.accept stuff + # FIXME: this method should go away + def insert values + im = InsertManager.new @engine + im.insert values + raise end end end diff --git a/lib/arel/visitors/dot.rb b/lib/arel/visitors/dot.rb index 6fd2728839..4620920484 100644 --- a/lib/arel/visitors/dot.rb +++ b/lib/arel/visitors/dot.rb @@ -28,6 +28,17 @@ module Arel end private + def visit_Arel_Nodes_SelectCore o + visit_edge o, "froms" + visit_edge o, "projections" + visit_edge o, "wheres" + end + + def visit_Arel_Nodes_SelectStatement o + visit_edge o, "cores" + visit_edge o, "limit" + end + def visit_Arel_Table o visit_edge o, "name" end @@ -47,9 +58,14 @@ module Arel alias :visit_NilClass :visit_String def visit_Hash o - o.each_with_index do |(k,v),i| - edge("key_#{i}") { visit k } - edge("value_#{i}") { visit v } + o.each_with_index do |pair, i| + edge("pair_#{i}") { visit pair } + end + end + + def visit_Array o + o.each_with_index do |x,i| + edge(i) { visit x } end end diff --git a/spec/arel/insert_manager.rb b/spec/arel/insert_manager_spec.rb index fae776a39d..073c9c30cb 100644 --- a/spec/arel/insert_manager.rb +++ b/spec/arel/insert_manager_spec.rb @@ -8,6 +8,32 @@ module Arel end end + describe 'insert' do + it 'takes a list of lists' do + table = Table.new(:users) + manager = Arel::InsertManager.new Table.engine + manager.into table + manager.insert [[table[:id], 1], [table[:name], 'aaron']] + manager.to_sql.should be_like %{ + INSERT INTO "users" ("users"."id", "users"."name") VALUES (1, 'aaron') + } + end + + it 'defaults the table' do + table = Table.new(:users) + manager = Arel::InsertManager.new Table.engine + manager.insert [[table[:id], 1], [table[:name], 'aaron']] + manager.to_sql.should be_like %{ + INSERT INTO "users" ("users"."id", "users"."name") VALUES (1, 'aaron') + } + end + + it 'takes an empty list' do + manager = Arel::InsertManager.new Table.engine + manager.insert [] + end + end + describe 'into' do it 'takes an engine' do manager = Arel::InsertManager.new Table.engine diff --git a/spec/arel/select_manager.rb b/spec/arel/select_manager_spec.rb index 928db49c52..928db49c52 100644 --- a/spec/arel/select_manager.rb +++ b/spec/arel/select_manager_spec.rb |