aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2010-08-13 18:28:38 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2010-08-13 18:28:38 -0700
commit9fc70e22f9bf7df8485b90b3d7e4a5c58cb0ebbb (patch)
treea237455c0390c59b9b8a7fabb2b811141c4d76d9
parent3eeed18e0cb71f5a56995c2d6a67eff0af618deb (diff)
downloadrails-9fc70e22f9bf7df8485b90b3d7e4a5c58cb0ebbb.tar.gz
rails-9fc70e22f9bf7df8485b90b3d7e4a5c58cb0ebbb.tar.bz2
rails-9fc70e22f9bf7df8485b90b3d7e4a5c58cb0ebbb.zip
insert manager implements "insert"
-rw-r--r--lib/arel/insert_manager.rb11
-rw-r--r--lib/arel/select_manager.rb8
-rw-r--r--lib/arel/visitors/dot.rb22
-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