aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/TODO4
-rw-r--r--lib/arel/algebra/relations/operations/join.rb10
-rw-r--r--spec/arel/engines/memory/integration/joins/cross_engine_spec.rb39
3 files changed, 40 insertions, 13 deletions
diff --git a/doc/TODO b/doc/TODO
index 901d6ab13f..61ff24f4a0 100644
--- a/doc/TODO
+++ b/doc/TODO
@@ -1,9 +1,10 @@
todo:
-- cross-engine joins
+- fix AR again
- blocks for joins
- fix sql insertions
- implement mnesia adapter
+- CLEANUP!!!!!
- rename externalize to derived.
- deal with table tests in algebra
- fix grouping
@@ -94,6 +95,7 @@ done:
- result sets should be array relations
- fix AR
- insertions for in memory
+- cross-engine joins
icebox:
- #bind in Attribute and Expression should be doing a descend?
diff --git a/lib/arel/algebra/relations/operations/join.rb b/lib/arel/algebra/relations/operations/join.rb
index 695f360b51..02a8fa629d 100644
--- a/lib/arel/algebra/relations/operations/join.rb
+++ b/lib/arel/algebra/relations/operations/join.rb
@@ -2,7 +2,7 @@ module Arel
class Join < Relation
attributes :relation1, :relation2, :predicates
deriving :==
- delegate :engine, :name, :to => :relation1
+ delegate :name, :to => :relation1
hash_on :relation1
def initialize(relation1, relation2 = Nil.instance, *predicates)
@@ -31,6 +31,10 @@ module Arel
def join?
true
end
+
+ def engine
+ relation1.engine != relation2.engine ? Memory::Engine.new : relation1.engine
+ end
end
class InnerJoin < Join; end
@@ -39,6 +43,10 @@ module Arel
def attributes
relation1.externalize.attributes
end
+
+ def engine
+ relation1.engine
+ end
end
class Relation
diff --git a/spec/arel/engines/memory/integration/joins/cross_engine_spec.rb b/spec/arel/engines/memory/integration/joins/cross_engine_spec.rb
index dd923ee6eb..4862300052 100644
--- a/spec/arel/engines/memory/integration/joins/cross_engine_spec.rb
+++ b/spec/arel/engines/memory/integration/joins/cross_engine_spec.rb
@@ -14,17 +14,34 @@ module Arel
.insert(@photos[:id] => 1, @photos[:user_id] => 1, @photos[:camera_id] => 6) \
.insert(@photos[:id] => 2, @photos[:user_id] => 2, @photos[:camera_id] => 42)
end
-
- it 'joins across engines' do
- @users \
- .join(@photos) \
- .on(@users[:id].eq(@photos[:user_id])) \
- .project(@users[:name], @photos[:camera_id]) \
- .let do |relation|
- relation.call.should == [
- Row.new(relation, ['bryan', '6']),
- Row.new(relation, ['emilio', '42'])
- ]
+
+ describe 'when the in memory relation is on the left' do
+ it 'joins across engines' do
+ @users \
+ .join(@photos) \
+ .on(@users[:id].eq(@photos[:user_id])) \
+ .project(@users[:name], @photos[:camera_id]) \
+ .let do |relation|
+ relation.call.should == [
+ Row.new(relation, ['bryan', '6']),
+ Row.new(relation, ['emilio', '42'])
+ ]
+ end
+ end
+ end
+
+ describe 'when the in memory relation is on the right' do
+ it 'joins across engines' do
+ @photos \
+ .join(@users) \
+ .on(@users[:id].eq(@photos[:user_id])) \
+ .project(@users[:name], @photos[:camera_id]) \
+ .let do |relation|
+ relation.call.should == [
+ Row.new(relation, ['bryan', '6']),
+ Row.new(relation, ['emilio', '42'])
+ ]
+ end
end
end
end