soulheart 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/soulheart/base.rb +15 -6
- data/lib/soulheart/loader.rb +15 -11
- data/lib/soulheart/matcher.rb +34 -25
- data/lib/soulheart/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c3a5a5f5c2e5fdce0a5270fa703ab31a72196a1
|
4
|
+
data.tar.gz: 96bad6202e435d62d9b25b32b1a7c96b333f8fe3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8a67e56e9c167a820f0bba16d1437e5f84be7f971629f548939a17598cdbf32b07ff15542bb4d5b869448d0539634bbacc9502a781e2ce4d0c547dbdd541b89
|
7
|
+
data.tar.gz: 24d1d651a927629d63d06a1ea4d3038d056d9555d2baf6820dd4292d505d4174009495856801c69b76af9b9e17cb0d049a5d4227e32b07a4ef6a92708e5956a2
|
data/lib/soulheart/base.rb
CHANGED
@@ -8,7 +8,7 @@ module Soulheart
|
|
8
8
|
Soulheart.redis
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def cache_duration
|
12
12
|
10 * 60 # Setting to 10 minutes, but making it possible to edit down the line
|
13
13
|
end
|
14
14
|
|
@@ -16,13 +16,22 @@ module Soulheart
|
|
16
16
|
ENV['RACK_ENV'] != 'test' ? 'soulheart:' : 'soulheart_test:'
|
17
17
|
end
|
18
18
|
|
19
|
+
def sorted_category_array
|
20
|
+
redis.smembers(categories_id).map { |c| normalize(c) }.uniq.sort
|
21
|
+
end
|
22
|
+
|
23
|
+
def combinatored_category_array
|
24
|
+
1.upto(sorted_category_array.size).
|
25
|
+
flat_map { |n| sorted_category_array.combination(n).
|
26
|
+
map { |el| el.join('') } }
|
27
|
+
end
|
28
|
+
|
19
29
|
def set_category_combos_array
|
20
30
|
redis.expire category_combos_id, 0
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
ar
|
31
|
+
array = combinatored_category_array
|
32
|
+
array.last.replace('all')
|
33
|
+
redis.sadd category_combos_id, array
|
34
|
+
array
|
26
35
|
end
|
27
36
|
|
28
37
|
def category_combos_id
|
data/lib/soulheart/loader.rb
CHANGED
@@ -67,7 +67,7 @@ module Soulheart
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
-
def
|
70
|
+
def clean_hash(item)
|
71
71
|
fail ArgumentError, 'Items must have text' unless item['text']
|
72
72
|
default_items_hash(item.delete('text'), item.delete('category'))
|
73
73
|
.tap { |i| i['data'].merge!(item.delete('data')) if item['data'] }
|
@@ -75,17 +75,21 @@ module Soulheart
|
|
75
75
|
.merge item
|
76
76
|
end
|
77
77
|
|
78
|
-
def
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
item.keys.select{ |k| !%w(category priority term aliases data).include?(k) }.each do |key|
|
83
|
-
item['data'].merge!({"#{key}" => item.delete(key)})
|
84
|
-
end
|
85
|
-
unless redis.smembers(categories_id).include?(item['category'])
|
86
|
-
redis.sadd categories_id, item['category']
|
87
|
-
end
|
78
|
+
def clean(item)
|
79
|
+
item = clean_hash(item)
|
80
|
+
item.keys.select{ |k| !%w(category priority term aliases data).include?(k) }.each do |key|
|
81
|
+
item['data'].merge!({"#{key}" => item.delete(key)})
|
88
82
|
end
|
83
|
+
unless redis.smembers(categories_id).include?(item['category'])
|
84
|
+
redis.sadd categories_id, item['category']
|
85
|
+
end
|
86
|
+
item
|
87
|
+
end
|
88
|
+
|
89
|
+
def add_item(item, category_base_id=nil, cleaned=false)
|
90
|
+
item = clean(item) unless cleaned
|
91
|
+
category_base_id ||= category_id(item['category'])
|
92
|
+
|
89
93
|
priority = (-item['priority'])
|
90
94
|
redis.pipelined do
|
91
95
|
redis.zadd(no_query_id(category_base_id), priority, item['term']) # Add to master set for queryless searches
|
data/lib/soulheart/matcher.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
module Soulheart
|
2
2
|
class Matcher < Base
|
3
3
|
def initialize(params = {})
|
4
|
-
|
5
|
-
clean_opts
|
4
|
+
set_clean_opts(params)
|
6
5
|
end
|
7
6
|
|
8
7
|
attr_accessor :opts
|
@@ -17,17 +16,28 @@ module Soulheart
|
|
17
16
|
}
|
18
17
|
end
|
19
18
|
|
19
|
+
def sort_categories(categories)
|
20
|
+
return [] if categories.empty?
|
21
|
+
categories = categories.split(/,|\+/) unless categories.is_a?(Array)
|
22
|
+
categories = categories.map { |s| normalize(s) }.uniq.sort
|
23
|
+
categories = [] if categories.length == redis.scard(categories_id)
|
24
|
+
categories
|
25
|
+
end
|
26
|
+
|
20
27
|
def clean_opts
|
21
|
-
|
22
|
-
@opts['categories'] = @opts['categories'].split(/,|\+/) unless @opts['categories'].is_a?(Array)
|
23
|
-
@opts['categories'] = @opts['categories'].map { |s| normalize(s) }.uniq.sort
|
24
|
-
@opts['categories'] = [] if @opts['categories'].length == redis.scard(categories_id)
|
25
|
-
end
|
28
|
+
@opts['categories'] = sort_categories(@opts['categories'])
|
26
29
|
@opts['q'] = normalize(@opts['q']).split(' ') unless @opts['q'].is_a?(Array)
|
27
30
|
# .reject{ |i| i && i.length > 0 } .split(' ').reject{ Soulmate.stop_words.include?(w) }
|
28
31
|
@opts
|
29
32
|
end
|
30
33
|
|
34
|
+
def set_clean_opts(params)
|
35
|
+
@opts = self.class.default_params_hash.merge params
|
36
|
+
clean_opts
|
37
|
+
@cachekey = cache_id_from_opts
|
38
|
+
@cid = category_id_from_opts
|
39
|
+
end
|
40
|
+
|
31
41
|
def categories_string
|
32
42
|
@opts['categories'].empty? ? 'all' : @opts['categories'].join('')
|
33
43
|
end
|
@@ -40,32 +50,31 @@ module Soulheart
|
|
40
50
|
"#{cache_id(categories_string)}#{@opts['q'].join(':')}"
|
41
51
|
end
|
42
52
|
|
43
|
-
def interkeys_from_opts
|
53
|
+
def interkeys_from_opts
|
44
54
|
# If there isn't a query, we use a special key in redis
|
45
|
-
@opts['q'].empty? ? [no_query_id(cid)] : @opts['q'].map { |w| "#{cid}#{w}" }
|
55
|
+
@opts['q'].empty? ? [no_query_id(@cid)] : @opts['q'].map { |w| "#{@cid}#{w}" }
|
46
56
|
end
|
47
57
|
|
48
|
-
def
|
49
|
-
cachekey
|
50
|
-
|
58
|
+
def cache_it_because
|
59
|
+
redis.zinterstore(@cachekey, interkeys_from_opts)
|
60
|
+
redis.expire(@cachekey, cache_duration) # cache_duration is set in base.rb
|
61
|
+
end
|
51
62
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
63
|
+
def matching_hashes(ids)
|
64
|
+
return [] unless ids.size > 0
|
65
|
+
results = redis.hmget(results_hashes_id, *ids)
|
66
|
+
results = results.reject(&:nil?) # handle cached results for ids which have since been deleted
|
67
|
+
results.map { |r| MultiJson.decode(r) }
|
68
|
+
end
|
69
|
+
|
70
|
+
def matches
|
71
|
+
cache_it_because if !@opts['cache'] || !redis.exists(@cachekey) || redis.exists(@cachekey) == 0
|
57
72
|
offset = (@opts['page'].to_i - 1) * @opts['per_page'].to_i
|
58
73
|
limit = @opts['per_page'].to_i + offset - 1
|
59
74
|
|
60
75
|
limit = 0 if limit < 0
|
61
|
-
ids = redis.zrange(cachekey, offset, limit) # Using 'ids', even though keys are now terms
|
62
|
-
|
63
|
-
results = redis.hmget(results_hashes_id, *ids)
|
64
|
-
results = results.reject(&:nil?) # handle cached results for ids which have since been deleted
|
65
|
-
results.map { |r| MultiJson.decode(r) }
|
66
|
-
else
|
67
|
-
[]
|
68
|
-
end
|
76
|
+
ids = redis.zrange(@cachekey, offset, limit) # Using 'ids', even though keys are now terms
|
77
|
+
matching_hashes(ids)
|
69
78
|
end
|
70
79
|
end
|
71
80
|
end
|
data/lib/soulheart/version.rb
CHANGED