aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/arel/nodes/delete_statement.rb5
-rw-r--r--lib/arel/nodes/insert_statement.rb6
-rw-r--r--lib/arel/nodes/select_core.rb7
-rw-r--r--lib/arel/nodes/select_statement.rb5
-rw-r--r--lib/arel/nodes/update_statement.rb6
-rw-r--r--lib/arel/tree_manager.rb5
-rw-r--r--spec/arel/insert_manager_spec.rb11
-rw-r--r--spec/arel/nodes/delete_statement_spec.rb17
-rw-r--r--spec/arel/nodes/insert_statement_spec.rb22
-rw-r--r--spec/arel/nodes/select_core_spec.rb23
-rw-r--r--spec/arel/nodes/select_statement_spec.rb16
-rw-r--r--spec/arel/nodes/update_statement_spec.rb22
-rw-r--r--spec/arel/select_manager_spec.rb11
-rw-r--r--spec/arel/update_manager_spec.rb12
-rw-r--r--spec/spec_helper.rb1
-rw-r--r--spec/support/shared/tree_manager_shared.rb9
16 files changed, 178 insertions, 0 deletions
diff --git a/lib/arel/nodes/delete_statement.rb b/lib/arel/nodes/delete_statement.rb
index 54bf513c2b..b65177af05 100644
--- a/lib/arel/nodes/delete_statement.rb
+++ b/lib/arel/nodes/delete_statement.rb
@@ -7,6 +7,11 @@ module Arel
@from = nil
@wheres = []
end
+
+ def initialize_copy other
+ super
+ @wheres = @wheres.map { |o| o.clone }
+ end
end
end
end
diff --git a/lib/arel/nodes/insert_statement.rb b/lib/arel/nodes/insert_statement.rb
index ed601aa841..8c6e1234d0 100644
--- a/lib/arel/nodes/insert_statement.rb
+++ b/lib/arel/nodes/insert_statement.rb
@@ -8,6 +8,12 @@ module Arel
@columns = []
@values = []
end
+
+ def initialize_copy other
+ super
+ @columns = @columns.map { |o| o.clone }
+ @values = @values.map { |o| o.clone }
+ end
end
end
end
diff --git a/lib/arel/nodes/select_core.rb b/lib/arel/nodes/select_core.rb
index 39145de697..7ebdab315d 100644
--- a/lib/arel/nodes/select_core.rb
+++ b/lib/arel/nodes/select_core.rb
@@ -8,6 +8,13 @@ module Arel
@projections = []
@wheres = []
end
+
+ def initialize_copy other
+ super
+ @froms = @froms.map { |o| o.clone }
+ @projections = @projections.map { |o| o.clone }
+ @wheres = @wheres.map { |o| o.clone }
+ end
end
end
end
diff --git a/lib/arel/nodes/select_statement.rb b/lib/arel/nodes/select_statement.rb
index 122f6275fe..50fef776f6 100644
--- a/lib/arel/nodes/select_statement.rb
+++ b/lib/arel/nodes/select_statement.rb
@@ -8,6 +8,11 @@ module Arel
@cores = cores
@limit = nil
end
+
+ def initialize_copy other
+ super
+ @cores = @cores.map { |o| o.clone }
+ end
end
end
end
diff --git a/lib/arel/nodes/update_statement.rb b/lib/arel/nodes/update_statement.rb
index 9f069cddb3..27e3e4e6ac 100644
--- a/lib/arel/nodes/update_statement.rb
+++ b/lib/arel/nodes/update_statement.rb
@@ -8,6 +8,12 @@ module Arel
@wheres = []
@values = []
end
+
+ def initialize_copy other
+ super
+ @wheres = @wheres.map { |o| o.clone }
+ @values = @values.map { |o| o.clone }
+ end
end
end
end
diff --git a/lib/arel/tree_manager.rb b/lib/arel/tree_manager.rb
index d2027bedfa..24df5e0c09 100644
--- a/lib/arel/tree_manager.rb
+++ b/lib/arel/tree_manager.rb
@@ -15,5 +15,10 @@ module Arel
viz = Visitors::ToSql.new @engine
viz.accept @head
end
+
+ def initialize_copy other
+ super
+ @head = @head.clone
+ end
end
end
diff --git a/spec/arel/insert_manager_spec.rb b/spec/arel/insert_manager_spec.rb
index 14cb749b25..ed0725e79d 100644
--- a/spec/arel/insert_manager_spec.rb
+++ b/spec/arel/insert_manager_spec.rb
@@ -110,5 +110,16 @@ module Arel
}
end
end
+
+ describe "TreeManager" do
+ subject do
+ table = Table.new(:users)
+ Arel::InsertManager.new(Table.engine).tap do |manager|
+ manager.insert [[table[:id], nil]]
+ end
+ end
+
+ it_should_behave_like "TreeManager"
+ end
end
end
diff --git a/spec/arel/nodes/delete_statement_spec.rb b/spec/arel/nodes/delete_statement_spec.rb
new file mode 100644
index 0000000000..dd43b70d35
--- /dev/null
+++ b/spec/arel/nodes/delete_statement_spec.rb
@@ -0,0 +1,17 @@
+require 'spec_helper'
+
+describe Arel::Nodes::SelectStatement do
+ describe "#clone" do
+ it "clones where" do
+ statement = Arel::Nodes::DeleteStatement.new
+ statement.wheres = %w[a b c]
+
+ statement.wheres.each_with_index do |o, j|
+ o.should_receive(:clone).and_return("#{o}#{j}")
+ end
+
+ dolly = statement.clone
+ dolly.wheres.should == %w[a0 b1 c2]
+ end
+ end
+end
diff --git a/spec/arel/nodes/insert_statement_spec.rb b/spec/arel/nodes/insert_statement_spec.rb
new file mode 100644
index 0000000000..644e3fb192
--- /dev/null
+++ b/spec/arel/nodes/insert_statement_spec.rb
@@ -0,0 +1,22 @@
+require 'spec_helper'
+
+describe Arel::Nodes::InsertStatement do
+ describe "#clone" do
+ it "clones columns and values" do
+ statement = Arel::Nodes::InsertStatement.new
+ statement.columns = %w[a b c]
+ statement.values = %w[x y z]
+
+ statement.columns.each_with_index do |o, j|
+ o.should_receive(:clone).and_return("#{o}#{j}")
+ end
+ statement.values.each_with_index do |o, j|
+ o.should_receive(:clone).and_return("#{o}#{j}")
+ end
+
+ dolly = statement.clone
+ dolly.columns.should == %w[a0 b1 c2]
+ dolly.values.should == %w[x0 y1 z2]
+ end
+ end
+end
diff --git a/spec/arel/nodes/select_core_spec.rb b/spec/arel/nodes/select_core_spec.rb
new file mode 100644
index 0000000000..cf717a3904
--- /dev/null
+++ b/spec/arel/nodes/select_core_spec.rb
@@ -0,0 +1,23 @@
+require 'spec_helper'
+
+describe Arel::Nodes::SelectCore do
+ describe "#clone" do
+ it "clones froms, projections and wheres" do
+ core = Arel::Nodes::SelectCore.new
+ core.instance_variable_set "@froms", %w[a b c]
+ core.instance_variable_set "@projections", %w[d e f]
+ core.instance_variable_set "@wheres", %w[g h i]
+
+ [:froms, :projections, :wheres].each do |array_attr|
+ core.send(array_attr).each_with_index do |o, j|
+ o.should_receive(:clone).and_return("#{o}#{j}")
+ end
+ end
+
+ dolly = core.clone
+ dolly.froms.should == %w[a0 b1 c2]
+ dolly.projections.should == %w[d0 e1 f2]
+ dolly.wheres.should == %w[g0 h1 i2]
+ end
+ end
+end
diff --git a/spec/arel/nodes/select_statement_spec.rb b/spec/arel/nodes/select_statement_spec.rb
new file mode 100644
index 0000000000..a024710c78
--- /dev/null
+++ b/spec/arel/nodes/select_statement_spec.rb
@@ -0,0 +1,16 @@
+require 'spec_helper'
+
+describe Arel::Nodes::SelectStatement do
+ describe "#clone" do
+ it "clones cores" do
+ statement = Arel::Nodes::SelectStatement.new %w[a b c]
+
+ statement.cores.each_with_index do |o, j|
+ o.should_receive(:clone).and_return("#{o}#{j}")
+ end
+
+ dolly = statement.clone
+ dolly.cores.should == %w[a0 b1 c2]
+ end
+ end
+end
diff --git a/spec/arel/nodes/update_statement_spec.rb b/spec/arel/nodes/update_statement_spec.rb
new file mode 100644
index 0000000000..8cbca1fd73
--- /dev/null
+++ b/spec/arel/nodes/update_statement_spec.rb
@@ -0,0 +1,22 @@
+require 'spec_helper'
+
+describe Arel::Nodes::UpdateStatement do
+ describe "#clone" do
+ it "clones wheres and values" do
+ statement = Arel::Nodes::UpdateStatement.new
+ statement.wheres = %w[a b c]
+ statement.values = %w[x y z]
+
+ statement.wheres.each_with_index do |o, j|
+ o.should_receive(:clone).and_return("#{o}#{j}")
+ end
+ statement.values.each_with_index do |o, j|
+ o.should_receive(:clone).and_return("#{o}#{j}")
+ end
+
+ dolly = statement.clone
+ dolly.wheres.should == %w[a0 b1 c2]
+ dolly.values.should == %w[x0 y1 z2]
+ end
+ end
+end
diff --git a/spec/arel/select_manager_spec.rb b/spec/arel/select_manager_spec.rb
index 331d9714a7..bf4ce2e13f 100644
--- a/spec/arel/select_manager_spec.rb
+++ b/spec/arel/select_manager_spec.rb
@@ -208,5 +208,16 @@ module Arel
manager.to_sql.should be_like 'SELECT "users"."id" FROM "users"'
end
end
+
+ describe "TreeManager" do
+ subject do
+ table = Table.new :users
+ Arel::SelectManager.new(Table.engine).tap do |manager|
+ manager.from(table).project(table['id'])
+ end
+ end
+
+ it_should_behave_like "TreeManager"
+ end
end
end
diff --git a/spec/arel/update_manager_spec.rb b/spec/arel/update_manager_spec.rb
index e70ae2cef3..016b6f69b1 100644
--- a/spec/arel/update_manager_spec.rb
+++ b/spec/arel/update_manager_spec.rb
@@ -73,5 +73,17 @@ module Arel
um.where(table[:id].eq(1)).should == um
end
end
+
+ describe "TreeManager" do
+ subject do
+ table = Table.new :users
+ Arel::UpdateManager.new(Table.engine).tap do |manager|
+ manager.table table
+ manager.where table[:id].eq(1)
+ end
+ end
+
+ it_should_behave_like "TreeManager"
+ end
end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 12cbe0170e..4ea3071515 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -5,6 +5,7 @@ require 'arel'
require 'support/matchers/be_like'
require 'support/check'
+Dir[File.join(File.dirname(__FILE__),'support/shared/*')].each { |f| require f }
if adapter = ENV['ADAPTER']
require "support/connections/#{adapter}_connection.rb"
diff --git a/spec/support/shared/tree_manager_shared.rb b/spec/support/shared/tree_manager_shared.rb
new file mode 100644
index 0000000000..48b561e1fb
--- /dev/null
+++ b/spec/support/shared/tree_manager_shared.rb
@@ -0,0 +1,9 @@
+shared_examples_for "TreeManager" do
+ describe "clone" do
+ it "clones the insert statement" do
+ subject.instance_variable_get("@head").should_receive(:clone).and_return(:foo) # TODO: ick.
+ dolly = subject.clone
+ dolly.instance_variable_get("@head").should == :foo
+ end
+ end
+end