diff options
author | Bryan Helmkamp <bryan@brynary.com> | 2009-05-17 16:14:28 -0400 |
---|---|---|
committer | Bryan Helmkamp <bryan@brynary.com> | 2009-05-17 16:14:28 -0400 |
commit | 44743bed5568b3065e4f9da7972e3ea1d0d9e728 (patch) | |
tree | a94ba2e964e516e47c7e48e2c746747f6a3f0acd | |
parent | 7a51983efc50c8f9092785b1b586f8884dedc01a (diff) | |
download | rails-44743bed5568b3065e4f9da7972e3ea1d0d9e728.tar.gz rails-44743bed5568b3065e4f9da7972e3ea1d0d9e728.tar.bz2 rails-44743bed5568b3065e4f9da7972e3ea1d0d9e728.zip |
joining across engines in either direction
Conflicts:
spec/arel/engines/memory/integration/joins/cross_engine_spec.rb
-rw-r--r-- | doc/TODO | 4 | ||||
-rw-r--r-- | lib/arel/algebra/relations/operations/join.rb | 10 | ||||
-rw-r--r-- | spec/arel/engines/memory/integration/joins/cross_engine_spec.rb | 39 |
3 files changed, 40 insertions, 13 deletions
@@ -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 |