Permalink
Browse files

joining across engines in either direction

Conflicts:

	spec/arel/engines/memory/integration/joins/cross_engine_spec.rb
  • Loading branch information...
1 parent 7a51983 commit 44743bed5568b3065e4f9da7972e3ea1d0d9e728 @brynary brynary committed May 17, 2009
View
@@ -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?
@@ -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 @@ def externalizable?
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 @@ class StringJoin < Join
def attributes
relation1.externalize.attributes
end
+
+ def engine
+ relation1.engine
+ end
end
class Relation
@@ -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

0 comments on commit 44743be

Please sign in to comment.