From d10acb4ab9c40fc3348e33cadba14bf4f103ff14 Mon Sep 17 00:00:00 2001 From: Stefan Date: Mon, 17 Jun 2013 20:43:53 +0300 Subject: [PATCH] Use HASH KEY instead of id for ids in indexes. --- lib/dynamoid/indexes/index.rb | 10 +++++----- spec/app/models/message.rb | 3 +++ spec/dynamoid/indexes/index_spec.rb | 30 +++++++++++++++++++++++------ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/lib/dynamoid/indexes/index.rb b/lib/dynamoid/indexes/index.rb index 37efdd3..29a1cde 100644 --- a/lib/dynamoid/indexes/index.rb +++ b/lib/dynamoid/indexes/index.rb @@ -83,19 +83,19 @@ def save(obj) return true if values[:hash_value].blank? || (!values[:range_value].nil? && values[:range_value].blank?) existing = Dynamoid::Adapter.read(self.table_name, values[:hash_value], { :range_key => values[:range_value] }) ids = ((existing and existing[:ids]) or Set.new) - Dynamoid::Adapter.write(self.table_name, {:id => values[:hash_value], :ids => ids.merge([obj.id]), :range => values[:range_value]}) + Dynamoid::Adapter.write(self.table_name, {:id => values[:hash_value], :ids => ids.merge([obj.hash_key]), :range => values[:range_value]}) end - # Delete an object from this index, preserving existing ids if there are any, and failing gracefully if for some reason the + # Delete an object from this index, preserving existing ids if there are any, and failing gracefully if for some reason the # index doesn't already have this object in it. # - # @since 0.2.0 + # @since 0.2.0 def delete(obj, changed_attributes = false) values = values(obj, changed_attributes) return true if values[:hash_value].blank? || (!values[:range_value].nil? && values[:range_value].blank?) existing = Dynamoid::Adapter.read(self.table_name, values[:hash_value], { :range_key => values[:range_value]}) - return true unless existing && existing[:ids] && existing[:ids].include?(obj.id) - Dynamoid::Adapter.write(self.table_name, {:id => values[:hash_value], :ids => (existing[:ids] - Set[obj.id]), :range => values[:range_value]}) + return true unless existing && existing[:ids] && existing[:ids].include?(obj.hash_key) + Dynamoid::Adapter.write(self.table_name, {:id => values[:hash_value], :ids => (existing[:ids] - Set[obj.hash_key]), :range => values[:range_value]}) end end diff --git a/spec/app/models/message.rb b/spec/app/models/message.rb index 4c499ef..f6c3fe3 100644 --- a/spec/app/models/message.rb +++ b/spec/app/models/message.rb @@ -6,4 +6,7 @@ class Message range :time, :datetime field :text + field :subject + + index :subject, :range_key => :time end diff --git a/spec/dynamoid/indexes/index_spec.rb b/spec/dynamoid/indexes/index_spec.rb index a126ecd..5b4edd3 100644 --- a/spec/dynamoid/indexes/index_spec.rb +++ b/spec/dynamoid/indexes/index_spec.rb @@ -69,24 +69,42 @@ Dynamoid::Adapter.read("dynamoid_tests_index_user_names", 'Josh')[:ids].should == Set['test123'] end - it 'saves an object to the index it is associated with with a range' do + it 'saves an object to the index it is associated with a range' do @index = Dynamoid::Indexes::Index.new(User, :name, :range_key => :last_logged_in_at) @user = User.create(:name => 'Josh', :last_logged_in_at => @time) - + @index.save(@user) - + Dynamoid::Adapter.read("dynamoid_tests_index_user_last_logged_in_ats_and_names", 'Josh', :range_key => @time.to_f)[:ids].should == Set[@user.id] end - + + it 'saves an object with another HASH than id to the index' do + @index = Dynamoid::Indexes::Index.new(Message, :subject, :range_key => :time) + @message = Message.create(:subject => 'Hello!', :time => @time.to_f, :message_id => 100) + + @index.save(@message) + Dynamoid::Adapter.read("dynamoid_tests_index_message_subjects_and_times", 'Hello!', :range_key => @time.to_f)[:ids].should == Set[@message.message_id] + end + it 'deletes an object from the index it is associated with' do @index = Dynamoid::Indexes::Index.new(User, :name) @user = User.create(:name => 'Josh', :password => 'test123', :last_logged_in_at => @time, :id => 'test123') - + @index.save(@user) @index.delete(@user) - + Dynamoid::Adapter.read("dynamoid_tests_index_user_names", 'Josh')[:ids].should be_nil end + + it 'deletes an object with another HASH than id from the index it is associated with' do + @index = Dynamoid::Indexes::Index.new(Message, :subject, :range_key => :time) + @message = Message.create(:subject => 'Hello!', :time => @time.to_f, :message_id => 100) + + @index.save(@message) + @index.delete(@message) + + Dynamoid::Adapter.read("dynamoid_tests_index_message_subjects_and_times", 'Hello!', :range_key => @time.to_f)[:ids].should be_nil + end it 'updates an object by removing it from its previous index and adding it to its new one' do @index = Dynamoid::Indexes::Index.new(User, :name)