From 9301c94cfd79cc42bb93479cd4d92865ae4c069a Mon Sep 17 00:00:00 2001 From: Sebastian Feuerstack Date: Sun, 5 Feb 2012 22:26:23 -0200 Subject: [PATCH] - inheritance based querys are working --- lib/dm-redis-adapter/adapter.rb | 22 +++++++++++++++++--- spec/dm_redis_inheritenance_spec.rb | 32 +++++++++++++++-------------- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/lib/dm-redis-adapter/adapter.rb b/lib/dm-redis-adapter/adapter.rb index 2afb68a..07fe1fc 100644 --- a/lib/dm-redis-adapter/adapter.rb +++ b/lib/dm-redis-adapter/adapter.rb @@ -40,7 +40,7 @@ def read(query) records.each do |record| record[:model] = query.model.to_s.downcase if not record[:model] - record_data = @redis.hgetall("#{record[:model]}:#{record[redis_key_for(query.model)]}") + record_data = @redis.hgetall("#{record[:model]}:#{record[redis_key_for(query.model)]}") query.fields.each do |property| next if query.model.key.include?(property) @@ -158,8 +158,24 @@ def records_for(query) keys = [] if query.conditions.nil? - @redis.smembers(key_set_for(query.model)).each do |key| - keys << {redis_key_for(query.model) => key.to_i} + + # there might be a datamapper bug, which results in a condition==nil if an inheritance based query is + # performed on the base class - we handle this by collecting and querying all descendants - which is slow + # but works + + if query.model.properties.discriminator + descendants = query.model.descendants + descendants.each do |d| + @redis.smembers(key_set_for(d)).each do |key| + keys << {:model => d.to_s.downcase,redis_key_for(d) => key.to_i} + end + end + + ## end of dirty fix <--- + else + @redis.smembers(key_set_for(query.model)).each do |key| + keys << {redis_key_for(query.model) => key.to_i} + end end else query.conditions.operands.each do |operand| diff --git a/spec/dm_redis_inheritenance_spec.rb b/spec/dm_redis_inheritenance_spec.rb index 8eb0063..5a8e141 100644 --- a/spec/dm_redis_inheritenance_spec.rb +++ b/spec/dm_redis_inheritenance_spec.rb @@ -12,13 +12,13 @@ describe 'Inheritance' do before :all do - + module MINT class Person include DataMapper::Resource property :name, String property :job, String, :length => 1..255 - property :type, Discriminator + property :classtype, Discriminator property :id, Serial end @@ -29,35 +29,37 @@ class Son < Male; end class Woman < Person; end class Mother < Woman; end class Daughter < Woman; end - + end DataMapper.finalize + end it 'should select all women, mothers, and daughters based on Woman query' do - w = Woman.create(:name => "woman") - m = Mother.create(:name => "mother") - d = Daughter.create(:name => "daughter") - r = Woman.all + w = MINT::Woman.create(:name => "woman") + m = MINT::Mother.create(:name => "mother") + d = MINT::Daughter.create(:name => "daughter") + + r = MINT::Woman.all r.to_set.should == [w,m,d].to_set r.size.should == [w,m,d].size end it 'should select all women, mothers, and daughters based on Person query' do - w = Woman.create(:name => "woman") - m = Mother.create(:name => "mother") - d = Daughter.create(:name => "daughter") - p = Person.all + w = MINT::Woman.create(:name => "woman") + m = MINT::Mother.create(:name => "mother") + d = MINT::Daughter.create(:name => "daughter") + p = MINT::Person.all p.to_set.should == [w,m,d].to_set p.size.should == [w,m,d].size end it 'should select all mothers' do - w = Woman.create(:name => "woman") - m = Mother.create(:name => "mother") - d = Daughter.create(:name => "daughter") + w = MINT::Woman.create(:name => "woman") + m = MINT::Mother.create(:name => "mother") + d = MINT::Daughter.create(:name => "daughter") - mo = Mother.all + mo = MINT::Mother.all mo.to_set.should == [m].to_set mo.size.should == [m].size end