commendo 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4fb3a3f98e3846e5f75d884630c3735ed57f62b1
4
- data.tar.gz: 3944a25fc941e55a343b5201bf40ef77fbef08fb
3
+ metadata.gz: d5d32053e7810788416b8a9d1c42937bff79462b
4
+ data.tar.gz: aa65282bdfbe68311fdc140fcbbe59dabc029c92
5
5
  SHA512:
6
- metadata.gz: fe3b6ea17ed10adc4ae2ffa12e7179d305970b4c8bf0d100671df8b6f800b7ffa042291c57a8d1c4d62550490654c245134f3f18c2f1733cfa0ca829018defcb
7
- data.tar.gz: 7d01cc0c741ca514992e57b44c3defdc1a8d3de5db26f486eae3ef9bd1de62f8823974c6350178ae725bc0b61698f7cc9fdd4f1705f085a1b4799db3654c3276
6
+ metadata.gz: 316b145f9abc4370d0e621e2e374ae9105fe61f9f647b150a1acca82b4818be46bd994eac011cba57d6560bf8c8e5430d0b6a7e09634c313ea09723cd2f35662
7
+ data.tar.gz: f9d134bf294c9abd189af50400948d4dc2fed55e5fb925e3f39cc714fa6090cc4c67bac3dd896e0c40bcde730549deebe4b3525d9ec520c6432882beec0e7afa
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ # 0.0.5 / 2014-03-31
2
+ * [FEATURE] Can now accept array of resources and return combined similarity scores
3
+
1
4
  # 0.0.4 / 2014-03-31
2
5
  * [FEATURE] Similarity score pushed down into redis using two different approaches depending on size of set
3
6
 
@@ -68,8 +68,17 @@ module Commendo
68
68
  end
69
69
 
70
70
  def similar_to(resource)
71
- similar_resources = redis.zrevrange(similarity_key(resource), 0, -1, with_scores: true)
72
-
71
+ if resource.kind_of? Array
72
+ keys = resource.map do |res|
73
+ similarity_key(res)
74
+ end
75
+ tmp_key = "#{key_base}:tmp:#{SecureRandom.uuid}"
76
+ redis.zunionstore(tmp_key, keys)
77
+ similar_resources = redis.zrevrange(tmp_key, 0, -1, with_scores: true)
78
+ redis.del(tmp_key)
79
+ else
80
+ similar_resources = redis.zrevrange(similarity_key(resource), 0, -1, with_scores: true)
81
+ end
73
82
  similar_resources.map do |resource|
74
83
  {resource: resource[0], similarity: resource[1].to_f}
75
84
  end
@@ -1,3 +1,3 @@
1
1
  module Commendo
2
- VERSION = '0.0.4'
2
+ VERSION = '0.0.5'
3
3
  end
@@ -95,7 +95,21 @@ module Commendo
95
95
  end
96
96
 
97
97
  def test_calculate_yields_after_each
98
- skip
98
+ redis = Redis.new(db: 15)
99
+ redis.flushdb
100
+ key_base = 'CommendoTests'
101
+ cs = ContentSet.new(redis, key_base)
102
+ (3..23).each do |group|
103
+ (3..23).each do |res|
104
+ cs.add_by_group(group, res) if res % group == 0
105
+ end
106
+ end
107
+ expected_keys = ['CommendoTests:resources:3', 'CommendoTests:resources:4', 'CommendoTests:resources:5', 'CommendoTests:resources:6', 'CommendoTests:resources:7', 'CommendoTests:resources:8', 'CommendoTests:resources:9', 'CommendoTests:resources:10', 'CommendoTests:resources:11', 'CommendoTests:resources:12', 'CommendoTests:resources:13', 'CommendoTests:resources:14', 'CommendoTests:resources:15', 'CommendoTests:resources:16', 'CommendoTests:resources:17', 'CommendoTests:resources:18', 'CommendoTests:resources:19', 'CommendoTests:resources:20', 'CommendoTests:resources:21', 'CommendoTests:resources:22', 'CommendoTests:resources:23']
108
+ actual_keys = []
109
+ cs.calculate_similarity { |key, index, total|
110
+ actual_keys << key
111
+ }
112
+ assert_equal expected_keys.sort, actual_keys.sort
99
113
  end
100
114
 
101
115
  def test_calculate_deletes_old_values_first
@@ -221,6 +235,65 @@ module Commendo
221
235
 
222
236
  end
223
237
 
238
+ def test_recommends_for_many
239
+ redis = Redis.new(db: 15)
240
+ redis.flushdb
241
+ ts = TagSet.new(redis, 'CommendoTests:tags')
242
+ cs = ContentSet.new(redis, 'CommendoTests', ts)
243
+ (3..23).each do |group|
244
+ (3..23).each do |res|
245
+ cs.add(res, group) if res % group == 0
246
+ ts.add(res, 'mod3') if res.modulo(3).zero?
247
+ ts.add(res, 'mod4') if res.modulo(4).zero?
248
+ ts.add(res, 'mod5') if res.modulo(5).zero?
249
+ end
250
+ end
251
+ cs.calculate_similarity
252
+ expected = [
253
+ {resource: '18', similarity: 1.333},
254
+ {resource: '3', similarity: 1.25},
255
+ {resource: '6', similarity: 0.833},
256
+ {resource: '12', similarity: 0.7},
257
+ {resource: '21', similarity: 0.667},
258
+ {resource: '15', similarity: 0.667},
259
+ {resource: '9', similarity: 0.533},
260
+ {resource: '4', similarity: 0.25},
261
+ {resource: '8', similarity: 0.2},
262
+ {resource: '16', similarity: 0.167},
263
+ {resource: '20', similarity: 0.143}
264
+ ]
265
+ actual = cs.similar_to([12, 6, 9])
266
+ assert_equal expected, actual
267
+ #, include: ['mod4'], exclude: ['mod3', 'mod5']
268
+ end
269
+
270
+ def test_recommends_for_many_applies_filters
271
+ redis = Redis.new(db: 15)
272
+ redis.flushdb
273
+ ts = TagSet.new(redis, 'CommendoTests:tags')
274
+ cs = ContentSet.new(redis, 'CommendoTests', ts)
275
+ (3..23).each do |group|
276
+ (3..23).each do |res|
277
+ cs.add(res, group) if res % group == 0
278
+ ts.add(res, 'mod3') if res.modulo(3).zero?
279
+ ts.add(res, 'mod4') if res.modulo(4).zero?
280
+ ts.add(res, 'mod5') if res.modulo(5).zero?
281
+ end
282
+ end
283
+ cs.calculate_similarity
284
+ actual = cs.filtered_similar_to([12, 6, 9], include: ['mod4'], exclude: ['mod3', 'mod5'])
285
+ refute contains_resource('6', actual)
286
+ refute contains_resource('18', actual)
287
+ assert contains_resource('4', actual)
288
+ refute contains_resource('3', actual)
289
+ refute contains_resource('9', actual)
290
+ assert contains_resource('8', actual)
291
+ refute contains_resource('21', actual)
292
+ assert contains_resource('16', actual)
293
+ refute contains_resource('15', actual)
294
+ refute contains_resource('20', actual)
295
+ end
296
+
224
297
  def similar_to(cs, resource, similar)
225
298
  contains_resource(similar, cs.similar_to(resource))
226
299
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: commendo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Styles