dm-redis-adapter 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
1
  require 'redis/connection/hiredis'
2
2
  require 'redis'
3
3
  require 'base64'
4
+ require 'dm-core'
4
5
 
5
6
  module DataMapper
6
7
  module Adapters
@@ -16,8 +17,9 @@ module DataMapper
16
17
  #
17
18
  # @api semipublic
18
19
  def create(resources)
20
+ storage_name = resources.first.model.storage_name
19
21
  resources.each do |resource|
20
- initialize_serial(resource, @redis.incr("#{resource.model.to_s.downcase}:#{redis_key_for(resource.model)}:serial"))
22
+ initialize_serial(resource, @redis.incr("#{storage_name}:#{redis_key_for(resource.model)}:serial"))
21
23
  @redis.sadd(key_set_for(resource.model), resource.key.join)
22
24
  end
23
25
  update_attributes(resources)
@@ -36,9 +38,10 @@ module DataMapper
36
38
  #
37
39
  # @api semipublic
38
40
  def read(query)
41
+ storage_name = query.model.storage_name
39
42
  records = records_for(query)
40
43
  records.each do |record|
41
- record_data = @redis.hgetall("#{query.model.to_s.downcase}:#{record[redis_key_for(query.model)]}")
44
+ record_data = @redis.hgetall("#{storage_name}:#{record[redis_key_for(query.model)]}")
42
45
 
43
46
  query.fields.each do |property|
44
47
  next if query.model.key.include?(property)
@@ -89,11 +92,12 @@ module DataMapper
89
92
  #
90
93
  # @api semipublic
91
94
  def delete(collection)
95
+ storage_name = collection.query.model.storage_name
92
96
  collection.each do |record|
93
- @redis.del("#{collection.query.model.to_s.downcase}:#{record[redis_key_for(collection.query.model)]}")
97
+ @redis.del("#{storage_name}:#{record[redis_key_for(collection.query.model)]}")
94
98
  @redis.srem(key_set_for(collection.query.model), record[redis_key_for(collection.query.model)])
95
99
  record.model.properties.select {|p| p.index}.each do |p|
96
- @redis.srem("#{collection.query.model.to_s.downcase}:#{p.name}:#{encode(record[p.name])}", record[redis_key_for(collection.query.model)])
100
+ @redis.srem("#{storage_name}:#{p.name}:#{encode(record[p.name])}", record[redis_key_for(collection.query.model)])
97
101
  end
98
102
  end
99
103
  end
@@ -108,12 +112,13 @@ module DataMapper
108
112
  #
109
113
  # @api private
110
114
  def update_attributes(resources)
115
+ storage_name = resources.first.model.storage_name
111
116
  resources.each do |resource|
112
117
  model = resource.model
113
118
  attributes = resource.dirty_attributes
114
119
 
115
120
  resource.model.properties.select {|p| p.index}.each do |property|
116
- @redis.sadd("#{resource.model.to_s.downcase}:#{property.name}:#{encode(resource[property.name.to_s])}", resource.key.first.to_s)
121
+ @redis.sadd("#{storage_name}:#{property.name}:#{encode(resource[property.name.to_s])}", resource.key.first.to_s)
117
122
  end
118
123
 
119
124
  properties_to_set = []
@@ -129,7 +134,7 @@ module DataMapper
129
134
  end
130
135
  end
131
136
 
132
- hash_key = "#{resource.model.to_s.downcase}:#{resource.key.join}"
137
+ hash_key = "#{storage_name}:#{resource.key.join}"
133
138
  properties_to_del.each {|prop| @redis.hdel(hash_key, prop) }
134
139
  @redis.hmset(hash_key, *properties_to_set) unless properties_to_set.empty?
135
140
  end
@@ -176,7 +181,11 @@ module DataMapper
176
181
  #
177
182
  # @api private
178
183
  def perform_query(query, operand)
184
+ storage_name = query.model.storage_name
185
+
179
186
  matched_records = []
187
+ #p 'query: ' + query.inspect
188
+ #p 'operand: ' + operand.inspect
180
189
 
181
190
  if operand.is_a?(DataMapper::Query::Conditions::NotOperation)
182
191
  subject = operand.first.subject
@@ -197,6 +206,9 @@ module DataMapper
197
206
  subject = subject.child_key.first
198
207
  end
199
208
 
209
+ #p 'subject: ' + subject.inspect
210
+ #p 'value: ' + value.inspect
211
+
200
212
  if query.model.key.include?(subject)
201
213
  if operand.is_a?(DataMapper::Query::Conditions::NotOperation)
202
214
  @redis.smembers(key_set_for(query.model)).each do |key|
@@ -228,7 +240,7 @@ module DataMapper
228
240
  end
229
241
  else # worst case, loop through each record and match
230
242
  @redis.smembers(key_set_for(query.model)).each do |key|
231
- if operand.matches?(subject.typecast(@redis.hget("#{query.model.to_s.downcase}:#{key}", subject.name)))
243
+ if operand.matches?(subject.typecast(@redis.hget("#{storage_name}:#{key}", subject.name)))
232
244
  matched_records << {redis_key_for(query.model) => key}
233
245
  end
234
246
  end
@@ -257,7 +269,7 @@ module DataMapper
257
269
  # The string key for the :all set
258
270
  # @api private
259
271
  def key_set_for(model)
260
- "#{model.to_s.downcase}:#{redis_key_for(model)}:all"
272
+ "#{model.storage_name}:#{redis_key_for(model)}:all"
261
273
  end
262
274
 
263
275
  ##
@@ -267,7 +279,7 @@ module DataMapper
267
279
  # Array of id's of all members for an indexed field
268
280
  # @api private
269
281
  def find_indexed_matches(subject, value)
270
- @redis.smembers("#{subject.model.to_s.downcase}:#{subject.name}:#{encode(value)}").map {|id| id.to_i}
282
+ @redis.smembers("#{subject.model.storage_name}:#{subject.name}:#{encode(value)}").map {|id| id.to_i}
271
283
  end
272
284
 
273
285
  ##
@@ -6,6 +6,8 @@ describe DataMapper::Adapters::RedisAdapter do
6
6
  :adapter => "redis",
7
7
  :db => 15
8
8
  })
9
+ @redis = Redis.new(:db => 15)
10
+ @redis.flushdb
9
11
  end
10
12
 
11
13
  it "should allow has n :through" do
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataMapper::Adapters::RedisAdapter do
4
+ before(:all) do
5
+ @adapter = DataMapper.setup(:default, {
6
+ :adapter => "redis",
7
+ :db => 15
8
+ })
9
+ @repository = DataMapper.repository(@adapter.name)
10
+ @redis = Redis.new(:db => 15)
11
+ end
12
+ describe 'Inheritance' do
13
+
14
+ before :all do
15
+ module MINT
16
+ class Person
17
+ include DataMapper::Resource
18
+
19
+ property :name, String
20
+ property :job, String, :length => 1..255
21
+ property :classtype, Discriminator
22
+ property :id, Serial
23
+ end
24
+
25
+ class Male < Person; end
26
+ class Father < Male; end
27
+ class Son < Male; end
28
+
29
+ class Woman < Person; end
30
+ class Mother < Woman; end
31
+ class Daughter < Woman; end
32
+ end
33
+ DataMapper.finalize
34
+
35
+ end
36
+
37
+ it 'should select all women, mothers, and daughters based on Woman query' do
38
+
39
+ w = MINT::Woman.create(:name => "woman")
40
+ m = MINT::Mother.create(:name => "mother")
41
+ d = MINT::Daughter.create(:name => "daughter")
42
+
43
+ r = MINT::Woman.all
44
+ r.to_set.should == [w,m,d].to_set
45
+ r.size.should == [w,m,d].size
46
+ end
47
+
48
+ it 'should select all women, mothers, and daughters based on Person query' do
49
+ w = MINT::Woman.create(:name => "woman")
50
+ m = MINT::Mother.create(:name => "mother")
51
+ d = MINT::Daughter.create(:name => "daughter")
52
+ p = MINT::Person.all
53
+ p.to_set.should == [w,m,d].to_set
54
+ p.size.should == [w,m,d].size
55
+ end
56
+
57
+ it 'should select all mothers' do
58
+ w = MINT::Woman.create(:name => "woman")
59
+ m = MINT::Mother.create(:name => "mother")
60
+ d = MINT::Daughter.create(:name => "daughter")
61
+
62
+ mo = MINT::Mother.all
63
+ mo.to_set.should == [m].to_set
64
+ mo.size.should == [m].size
65
+ end
66
+
67
+ end
68
+ after(:each) do
69
+ @redis.flushdb
70
+ end
71
+ end
@@ -26,17 +26,17 @@ describe DataMapper::Adapters::RedisAdapter do
26
26
 
27
27
  it "should save the id of the resource in a set" do
28
28
  h = Hooloovoo.create
29
- @redis.smembers("hooloovoo:id:all").should == [h.id.to_s]
29
+ @redis.smembers("hooloovoos:id:all").should == [h.id.to_s]
30
30
  end
31
31
 
32
32
  it "should save indexed fields in a set by Base64 encoding the value" do
33
33
  h = Hooloovoo.create(:shade => '336699')
34
- @redis.smembers("hooloovoo:shade:MzM2Njk5").should == [h.id.to_s]
34
+ @redis.smembers("hooloovoos:shade:MzM2Njk5").should == [h.id.to_s]
35
35
  end
36
36
 
37
37
  it "should create a hash of properties for the resource" do
38
38
  h = Hooloovoo.create(:iq => '4069')
39
- @redis.hmget("hooloovoo:#{h.id}", 'iq').should == ['4069']
39
+ @redis.hmget("hooloovoos:#{h.id}", 'iq').should == ['4069']
40
40
  end
41
41
  end
42
42
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-redis-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.5.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-07 00:00:00.000000000 -08:00
12
+ date: 2012-02-08 00:00:00.000000000 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: dm-core
17
- requirement: &70176713790760 !ruby/object:Gem::Requirement
17
+ requirement: &70343134239820 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 1.2.0
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70176713790760
25
+ version_requirements: *70343134239820
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: dm-types
28
- requirement: &70176713790280 !ruby/object:Gem::Requirement
28
+ requirement: &70343134210860 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 1.2.0
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *70176713790280
36
+ version_requirements: *70343134210860
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: hiredis
39
- requirement: &70176713789800 !ruby/object:Gem::Requirement
39
+ requirement: &70343134209560 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 0.3.0
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *70176713789800
47
+ version_requirements: *70343134209560
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: redis
50
- requirement: &70176713789320 !ruby/object:Gem::Requirement
50
+ requirement: &70343134205940 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ~>
@@ -55,7 +55,7 @@ dependencies:
55
55
  version: '2.2'
56
56
  type: :runtime
57
57
  prerelease: false
58
- version_requirements: *70176713789320
58
+ version_requirements: *70343134205940
59
59
  description: DataMapper adapter for the Redis key-value database
60
60
  email: whoahbot@gmail.com
61
61
  executables: []
@@ -71,6 +71,7 @@ files:
71
71
  - lib/dm-redis-adapter/spec/setup.rb
72
72
  - spec/dm_redis_associations_spec.rb
73
73
  - spec/dm_redis_finding_spec.rb
74
+ - spec/dm_redis_inheritenance_spec.rb
74
75
  - spec/dm_redis_spec.rb
75
76
  - spec/dm_redis_validations_spec.rb
76
77
  - spec/spec_helper.rb
@@ -89,6 +90,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
89
90
  - - ! '>='
90
91
  - !ruby/object:Gem::Version
91
92
  version: '0'
93
+ segments:
94
+ - 0
95
+ hash: 4147115164932724252
92
96
  required_rubygems_version: !ruby/object:Gem::Requirement
93
97
  none: false
94
98
  requirements:
@@ -104,6 +108,7 @@ summary: DataMapper adapter for the Redis key-value database
104
108
  test_files:
105
109
  - spec/dm_redis_associations_spec.rb
106
110
  - spec/dm_redis_finding_spec.rb
111
+ - spec/dm_redis_inheritenance_spec.rb
107
112
  - spec/dm_redis_spec.rb
108
113
  - spec/dm_redis_validations_spec.rb
109
114
  - spec/spec_helper.rb