picky 2.7.0 → 3.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) hide show
  1. data/lib/picky/adapters/rack/base.rb +20 -16
  2. data/lib/picky/adapters/rack/live_parameters.rb +28 -24
  3. data/lib/picky/adapters/rack/search.rb +67 -0
  4. data/lib/picky/adapters/rack.rb +27 -23
  5. data/lib/picky/application.rb +246 -236
  6. data/lib/picky/backend/base.rb +115 -119
  7. data/lib/picky/backend/file/basic.rb +102 -98
  8. data/lib/picky/backend/file/json.rb +27 -23
  9. data/lib/picky/backend/file/marshal.rb +32 -28
  10. data/lib/picky/backend/file/text.rb +45 -41
  11. data/lib/picky/backend/files.rb +19 -15
  12. data/lib/picky/backend/redis/basic.rb +76 -72
  13. data/lib/picky/backend/redis/list_hash.rb +40 -36
  14. data/lib/picky/backend/redis/string_hash.rb +30 -26
  15. data/lib/picky/backend/redis.rb +32 -28
  16. data/lib/picky/bundle.rb +82 -57
  17. data/lib/{bundling.rb → picky/bundling.rb} +0 -0
  18. data/lib/picky/calculations/location.rb +51 -47
  19. data/lib/picky/categories.rb +60 -56
  20. data/lib/picky/categories_indexed.rb +73 -82
  21. data/lib/picky/categories_indexing.rb +12 -8
  22. data/lib/picky/category.rb +109 -120
  23. data/lib/picky/category_indexed.rb +39 -41
  24. data/lib/picky/category_indexing.rb +123 -125
  25. data/lib/picky/character_substituters/west_european.rb +32 -26
  26. data/lib/{constants.rb → picky/constants.rb} +0 -0
  27. data/lib/picky/cores.rb +96 -92
  28. data/lib/{deployment.rb → picky/deployment.rb} +0 -0
  29. data/lib/picky/frontend_adapters/rack.rb +133 -118
  30. data/lib/picky/generators/aliases.rb +5 -3
  31. data/lib/picky/generators/base.rb +11 -7
  32. data/lib/picky/generators/partial/default.rb +7 -3
  33. data/lib/picky/generators/partial/none.rb +24 -20
  34. data/lib/picky/generators/partial/strategy.rb +20 -16
  35. data/lib/picky/generators/partial/substring.rb +94 -90
  36. data/lib/picky/generators/partial_generator.rb +11 -7
  37. data/lib/picky/generators/similarity/default.rb +9 -5
  38. data/lib/picky/generators/similarity/double_metaphone.rb +20 -16
  39. data/lib/picky/generators/similarity/metaphone.rb +20 -16
  40. data/lib/picky/generators/similarity/none.rb +23 -19
  41. data/lib/picky/generators/similarity/phonetic.rb +49 -45
  42. data/lib/picky/generators/similarity/soundex.rb +20 -16
  43. data/lib/picky/generators/similarity/strategy.rb +10 -6
  44. data/lib/picky/generators/similarity_generator.rb +11 -7
  45. data/lib/picky/generators/strategy.rb +14 -10
  46. data/lib/picky/generators/weights/default.rb +9 -5
  47. data/lib/picky/generators/weights/logarithmic.rb +30 -26
  48. data/lib/picky/generators/weights/strategy.rb +10 -6
  49. data/lib/picky/generators/weights_generator.rb +11 -7
  50. data/lib/picky/helpers/measuring.rb +20 -16
  51. data/lib/picky/indexed/bundle/base.rb +39 -37
  52. data/lib/picky/indexed/bundle/memory.rb +68 -64
  53. data/lib/picky/indexed/bundle/redis.rb +73 -69
  54. data/lib/picky/indexed/wrappers/bundle/calculation.rb +26 -22
  55. data/lib/picky/indexed/wrappers/bundle/location.rb +30 -26
  56. data/lib/picky/indexed/wrappers/bundle/wrapper.rb +36 -32
  57. data/lib/picky/indexed/wrappers/category/location.rb +17 -13
  58. data/lib/picky/indexed/wrappers/exact_first.rb +46 -42
  59. data/lib/picky/indexers/base.rb +26 -22
  60. data/lib/picky/indexers/parallel.rb +62 -58
  61. data/lib/picky/indexers/serial.rb +41 -37
  62. data/lib/picky/indexes/index.rb +400 -0
  63. data/lib/picky/indexes/index_indexed.rb +24 -0
  64. data/lib/picky/indexes/index_indexing.rb +138 -0
  65. data/lib/picky/indexes/memory.rb +20 -0
  66. data/lib/picky/indexes/redis.rb +20 -0
  67. data/lib/picky/indexes.rb +68 -61
  68. data/lib/picky/indexes_indexed.rb +16 -12
  69. data/lib/picky/indexes_indexing.rb +41 -37
  70. data/lib/picky/indexing/bundle/base.rb +216 -205
  71. data/lib/picky/indexing/bundle/memory.rb +16 -11
  72. data/lib/picky/indexing/bundle/redis.rb +14 -12
  73. data/lib/picky/indexing/wrappers/category/location.rb +17 -13
  74. data/lib/picky/interfaces/live_parameters.rb +159 -154
  75. data/lib/picky/loader.rb +267 -304
  76. data/lib/picky/loggers/search.rb +20 -13
  77. data/lib/picky/no_source_specified_exception.rb +7 -3
  78. data/lib/picky/performant.rb +6 -2
  79. data/lib/picky/query/allocation.rb +71 -67
  80. data/lib/picky/query/allocations.rb +99 -94
  81. data/lib/picky/query/combination.rb +70 -66
  82. data/lib/picky/query/combinations/base.rb +56 -52
  83. data/lib/picky/query/combinations/memory.rb +36 -32
  84. data/lib/picky/query/combinations/redis.rb +66 -62
  85. data/lib/picky/query/indexes.rb +175 -160
  86. data/lib/picky/query/qualifier_category_mapper.rb +43 -0
  87. data/lib/picky/query/token.rb +165 -172
  88. data/lib/picky/query/tokens.rb +86 -82
  89. data/lib/picky/query/weights.rb +44 -48
  90. data/lib/picky/query.rb +5 -1
  91. data/lib/picky/rack/harakiri.rb +51 -47
  92. data/lib/picky/results.rb +81 -77
  93. data/lib/picky/search.rb +169 -158
  94. data/lib/picky/sinatra.rb +34 -0
  95. data/lib/picky/sources/base.rb +73 -70
  96. data/lib/picky/sources/couch.rb +61 -57
  97. data/lib/picky/sources/csv.rb +68 -64
  98. data/lib/picky/sources/db.rb +139 -135
  99. data/lib/picky/sources/delicious.rb +52 -48
  100. data/lib/picky/sources/mongo.rb +68 -63
  101. data/lib/picky/sources/wrappers/base.rb +20 -16
  102. data/lib/picky/sources/wrappers/location.rb +37 -33
  103. data/lib/picky/statistics.rb +46 -43
  104. data/lib/picky/tasks.rb +3 -0
  105. data/lib/picky/tokenizers/base.rb +192 -187
  106. data/lib/picky/tokenizers/index.rb +25 -21
  107. data/lib/picky/tokenizers/location.rb +33 -29
  108. data/lib/picky/tokenizers/query.rb +49 -43
  109. data/lib/picky.rb +21 -13
  110. data/lib/tasks/application.rake +1 -1
  111. data/lib/tasks/index.rake +3 -3
  112. data/lib/tasks/routes.rake +1 -1
  113. data/lib/tasks/server.rake +1 -1
  114. data/spec/lib/adapters/rack/base_spec.rb +1 -1
  115. data/spec/lib/adapters/rack/live_parameters_spec.rb +1 -1
  116. data/spec/lib/adapters/rack/query_spec.rb +1 -1
  117. data/spec/lib/application_spec.rb +39 -32
  118. data/spec/lib/backend/file/basic_spec.rb +2 -2
  119. data/spec/lib/backend/file/json_spec.rb +2 -2
  120. data/spec/lib/backend/file/marshal_spec.rb +2 -2
  121. data/spec/lib/backend/file/text_spec.rb +1 -1
  122. data/spec/lib/backend/files_spec.rb +14 -24
  123. data/spec/lib/backend/redis/basic_spec.rb +2 -2
  124. data/spec/lib/backend/redis/list_hash_spec.rb +3 -3
  125. data/spec/lib/backend/redis/string_hash_spec.rb +3 -3
  126. data/spec/lib/backend/redis_spec.rb +20 -13
  127. data/spec/lib/calculations/location_spec.rb +1 -1
  128. data/spec/lib/categories_indexed_spec.rb +16 -34
  129. data/spec/lib/category_indexed_spec.rb +9 -27
  130. data/spec/lib/category_indexing_spec.rb +2 -3
  131. data/spec/lib/category_spec.rb +10 -10
  132. data/spec/lib/character_substituters/west_european_spec.rb +6 -5
  133. data/spec/lib/cores_spec.rb +17 -17
  134. data/spec/lib/extensions/symbol_spec.rb +15 -1
  135. data/spec/lib/frontend_adapters/rack_spec.rb +20 -20
  136. data/spec/lib/generators/aliases_spec.rb +3 -3
  137. data/spec/lib/generators/cacher_strategy_spec.rb +1 -1
  138. data/spec/lib/generators/partial/default_spec.rb +3 -3
  139. data/spec/lib/generators/partial/none_spec.rb +2 -2
  140. data/spec/lib/generators/partial/substring_spec.rb +1 -1
  141. data/spec/lib/generators/partial_generator_spec.rb +3 -3
  142. data/spec/lib/generators/similarity/double_metaphone_spec.rb +1 -1
  143. data/spec/lib/generators/similarity/metaphone_spec.rb +1 -1
  144. data/spec/lib/generators/similarity/none_spec.rb +1 -1
  145. data/spec/lib/generators/similarity/phonetic_spec.rb +1 -1
  146. data/spec/lib/generators/similarity/soundex_spec.rb +1 -1
  147. data/spec/lib/generators/similarity_generator_spec.rb +2 -2
  148. data/spec/lib/generators/weights/logarithmic_spec.rb +1 -1
  149. data/spec/lib/generators/weights_generator_spec.rb +1 -1
  150. data/spec/lib/helpers/measuring_spec.rb +2 -2
  151. data/spec/lib/indexed/bundle/memory_spec.rb +6 -6
  152. data/spec/lib/indexed/bundle/redis_spec.rb +4 -4
  153. data/spec/lib/indexed/wrappers/bundle/calculation_spec.rb +2 -3
  154. data/spec/lib/indexed/wrappers/bundle/wrapper_spec.rb +2 -2
  155. data/spec/lib/indexed/wrappers/exact_first_spec.rb +5 -5
  156. data/spec/lib/indexers/base_spec.rb +1 -1
  157. data/spec/lib/indexers/parallel_spec.rb +1 -1
  158. data/spec/lib/indexers/serial_spec.rb +1 -1
  159. data/spec/lib/{index/base_indexed_spec.rb → indexes/index_indexed_spec.rb} +3 -3
  160. data/spec/lib/{index/base_indexing_spec.rb → indexes/index_indexing_spec.rb} +19 -2
  161. data/spec/lib/{index/base_spec.rb → indexes/index_spec.rb} +6 -25
  162. data/spec/lib/{index → indexes}/redis_spec.rb +1 -1
  163. data/spec/lib/indexes_class_spec.rb +2 -2
  164. data/spec/lib/indexes_indexed_spec.rb +1 -1
  165. data/spec/lib/indexes_indexing_spec.rb +1 -1
  166. data/spec/lib/indexes_spec.rb +1 -1
  167. data/spec/lib/indexing/bundle/base_spec.rb +7 -5
  168. data/spec/lib/indexing/bundle/memory_partial_generation_speed_spec.rb +4 -4
  169. data/spec/lib/indexing/bundle/memory_spec.rb +15 -15
  170. data/spec/lib/indexing/bundle/redis_spec.rb +9 -9
  171. data/spec/lib/interfaces/live_parameters_spec.rb +5 -5
  172. data/spec/lib/loader_spec.rb +17 -19
  173. data/spec/lib/loggers/search_spec.rb +2 -2
  174. data/spec/lib/query/allocation_spec.rb +1 -1
  175. data/spec/lib/query/allocations_spec.rb +1 -1
  176. data/spec/lib/query/combination_spec.rb +4 -4
  177. data/spec/lib/query/combinations/base_spec.rb +1 -1
  178. data/spec/lib/query/combinations/memory_spec.rb +1 -1
  179. data/spec/lib/query/combinations/redis_spec.rb +1 -1
  180. data/spec/lib/query/indexes_spec.rb +7 -2
  181. data/spec/lib/query/qualifier_category_mapper_spec.rb +34 -0
  182. data/spec/lib/query/token_spec.rb +32 -53
  183. data/spec/lib/query/tokens_spec.rb +30 -35
  184. data/spec/lib/query/weights_spec.rb +16 -16
  185. data/spec/lib/rack/harakiri_spec.rb +5 -5
  186. data/spec/lib/results_spec.rb +1 -1
  187. data/spec/lib/search_spec.rb +24 -22
  188. data/spec/lib/sinatra_spec.rb +36 -0
  189. data/spec/lib/sources/base_spec.rb +1 -1
  190. data/spec/lib/sources/couch_spec.rb +9 -9
  191. data/spec/lib/sources/csv_spec.rb +7 -7
  192. data/spec/lib/sources/db_spec.rb +2 -2
  193. data/spec/lib/sources/delicious_spec.rb +5 -5
  194. data/spec/lib/sources/mongo_spec.rb +7 -7
  195. data/spec/lib/sources/wrappers/base_spec.rb +2 -2
  196. data/spec/lib/sources/wrappers/location_spec.rb +1 -1
  197. data/spec/lib/statistics_spec.rb +1 -1
  198. data/spec/lib/tokenizers/base_spec.rb +2 -2
  199. data/spec/lib/tokenizers/index_spec.rb +1 -1
  200. data/spec/lib/tokenizers/query_spec.rb +1 -1
  201. metadata +30 -30
  202. data/lib/picky/adapters/rack/query.rb +0 -65
  203. data/lib/picky/index/base.rb +0 -409
  204. data/lib/picky/index/base_indexed.rb +0 -29
  205. data/lib/picky/index/base_indexing.rb +0 -127
  206. data/lib/picky/index/memory.rb +0 -16
  207. data/lib/picky/index/redis.rb +0 -16
  208. data/lib/picky/query/qualifiers.rb +0 -76
  209. data/lib/picky/query/solr.rb +0 -60
  210. data/lib/picky/signals.rb +0 -8
  211. data/lib/picky-tasks.rb +0 -6
  212. data/lib/tasks/spec.rake +0 -11
  213. data/spec/lib/query/qualifiers_spec.rb +0 -31
@@ -1,22 +1,26 @@
1
- module Backend
1
+ module Picky
2
2
 
3
- class Files < Base
3
+ module Backend
4
4
 
5
- def initialize bundle_name, category
6
- super bundle_name, category
5
+ class Files < Base
7
6
 
8
- # Note: We marshal the similarity, as the
9
- # Yajl json lib cannot load symbolized
10
- # values, just keys.
11
- #
12
- @inverted = File::JSON.new category.index_path(bundle_name, :inverted)
13
- @weights = File::JSON.new category.index_path(bundle_name, :weights)
14
- @similarity = File::Marshal.new category.index_path(bundle_name, :similarity)
15
- @configuration = File::JSON.new category.index_path(bundle_name, :configuration)
16
- end
7
+ def initialize bundle
8
+ super bundle
9
+
10
+ # Note: We marshal the similarity, as the
11
+ # Yajl json lib cannot load symbolized
12
+ # values, just keys.
13
+ #
14
+ @inverted = File::JSON.new bundle.index_path(:inverted)
15
+ @weights = File::JSON.new bundle.index_path(:weights)
16
+ @similarity = File::Marshal.new bundle.index_path(:similarity)
17
+ @configuration = File::JSON.new bundle.index_path(:configuration)
18
+ end
19
+
20
+ def to_s
21
+ "#{self.class}(#{[@inverted, @weights, @similarity, @configuration].join(', ')})"
22
+ end
17
23
 
18
- def to_s
19
- "#{self.class}(#{[@prepared, @inverted, @weights, @similarity, @configuration].join(', ')})"
20
24
  end
21
25
 
22
26
  end
@@ -1,89 +1,93 @@
1
- module Backend
1
+ module Picky
2
2
 
3
- class Redis
3
+ module Backend
4
4
 
5
- # Redis Backend Accessor.
6
- #
7
- # Provides necessary helper methods for its
8
- # subclasses.
9
- # Not directly useable, as it does not provide
10
- # dump/load methods.
11
- #
12
- class Basic
5
+ class Redis
13
6
 
14
- attr_reader :namespace, :backend
15
-
16
- # An index cache takes a path, without file extension,
17
- # which will be provided by the subclasses.
7
+ # Redis Backend Accessor.
8
+ #
9
+ # Provides necessary helper methods for its
10
+ # subclasses.
11
+ # Not directly useable, as it does not provide
12
+ # dump/load methods.
18
13
  #
19
- def initialize namespace
20
- @namespace = namespace
14
+ class Basic
15
+
16
+ attr_reader :namespace, :backend
21
17
 
22
- # TODO Turn this inside out such that people can pass in
23
- # their own Redis instance.
18
+ # An index cache takes a path, without file extension,
19
+ # which will be provided by the subclasses.
24
20
  #
25
- # TODO Make the :db a real option.
21
+ def initialize namespace
22
+ @namespace = namespace
23
+
24
+ # TODO Turn this inside out such that people can pass in
25
+ # their own Redis instance.
26
+ #
27
+ # TODO Make the :db a real option.
28
+ #
29
+ @backend = ::Redis.new :db => 15
30
+ end
31
+
32
+ # Does nothing.
26
33
  #
27
- @backend = ::Redis.new :db => 15
28
- end
29
-
30
- # Does nothing.
31
- #
32
- def load
33
- # Nothing.
34
- end
35
- # We do not use Redis to retrieve data.
36
- #
37
- def retrieve
38
- # Nothing.
39
- end
34
+ def load
35
+ # Nothing.
36
+ end
37
+ # We do not use Redis to retrieve data.
38
+ #
39
+ def retrieve
40
+ # Nothing.
41
+ end
40
42
 
41
- # Redis does not backup.
42
- #
43
- def backup
44
- # Nothing.
45
- end
43
+ # Redis does not backup.
44
+ #
45
+ def backup
46
+ # Nothing.
47
+ end
46
48
 
47
- # Deletes the Redis index namespace.
48
- #
49
- def delete
50
- # Not implemented here.
51
- # Note: backend.flushdb might be the way to go,
52
- # but since we cannot delete by key pattern,
53
- # we don't do anything.
54
- end
49
+ # Deletes the Redis index namespace.
50
+ #
51
+ def delete
52
+ # Not implemented here.
53
+ # Note: backend.flushdb might be the way to go,
54
+ # but since we cannot delete by key pattern,
55
+ # we don't do anything.
56
+ end
57
+
58
+ # Checks.
59
+ #
55
60
 
56
- # Checks.
57
- #
61
+ # Is this cache suspiciously small?
62
+ #
63
+ def cache_small?
64
+ size < 1
65
+ end
58
66
 
59
- # Is this cache suspiciously small?
60
- #
61
- def cache_small?
62
- size < 1
63
- end
67
+ # Is the cache ok?
68
+ #
69
+ # A small cache is still ok.
70
+ #
71
+ def cache_ok?
72
+ size > 0
73
+ end
64
74
 
65
- # Is the cache ok?
66
- #
67
- # A small cache is still ok.
68
- #
69
- def cache_ok?
70
- size > 0
71
- end
75
+ # Extracts the size of the file in Bytes.
76
+ #
77
+ # Note: This is a very forgiving implementation.
78
+ # But as long as Redis does not implement
79
+ # DBSIZE KEYPATTERN, we are stuck with this.
80
+ #
81
+ def size
82
+ backend.dbsize
83
+ end
72
84
 
73
- # Extracts the size of the file in Bytes.
74
- #
75
- # Note: This is a very forgiving implementation.
76
- # But as long as Redis does not implement
77
- # DBSIZE KEYPATTERN, we are stuck with this.
78
- #
79
- def size
80
- backend.dbsize
81
- end
85
+ #
86
+ #
87
+ def to_s
88
+ "#{self.class}(#{namespace}:*)"
89
+ end
82
90
 
83
- #
84
- #
85
- def to_s
86
- "#{self.class}(#{namespace}:*)"
87
91
  end
88
92
 
89
93
  end
@@ -1,45 +1,49 @@
1
- module Backend
2
-
3
- class Redis
4
-
5
- class ListHash < Basic
6
-
7
- # Writes the hash into Redis.
8
- #
9
- def dump hash
10
- clear
11
- hash.each_pair do |key, values|
12
- redis_key = "#{namespace}:#{key}"
13
- i = 0
14
- values.each do |value|
15
- i += 1
16
- backend.zadd redis_key, i, value
1
+ module Picky
2
+
3
+ module Backend
4
+
5
+ class Redis
6
+
7
+ class ListHash < Basic
8
+
9
+ # Writes the hash into Redis.
10
+ #
11
+ def dump hash
12
+ clear
13
+ hash.each_pair do |key, values|
14
+ redis_key = "#{namespace}:#{key}"
15
+ i = 0
16
+ values.each do |value|
17
+ i += 1
18
+ backend.zadd redis_key, i, value
19
+ end
17
20
  end
18
21
  end
19
- end
20
22
 
21
- # Clear the index for this list.
22
- #
23
- # Note: Perhaps we can use a server only command.
24
- # This is not the optimal way to do it.
25
- #
26
- def clear
27
- redis_key = "#{namespace}:*"
28
- backend.keys(redis_key).each do |key|
29
- backend.del key
23
+ # Clear the index for this list.
24
+ #
25
+ # Note: Perhaps we can use a server only command.
26
+ # This is not the optimal way to do it.
27
+ #
28
+ def clear
29
+ redis_key = "#{namespace}:*"
30
+ backend.keys(redis_key).each do |key|
31
+ backend.del key
32
+ end
30
33
  end
31
- end
32
34
 
33
- # Get a collection.
34
- #
35
- def collection key
36
- backend.zrange "#{namespace}:#{key}", 0, -1
37
- end
35
+ # Get a collection.
36
+ #
37
+ def collection key
38
+ backend.zrange "#{namespace}:#{key}", 0, -1
39
+ end
40
+
41
+ # Get a single value.
42
+ #
43
+ def member key
44
+ raise "Can't retrieve single value :#{key} from a Redis ListHash. Use Indexes::Redis::StringHash."
45
+ end
38
46
 
39
- # Get a single value.
40
- #
41
- def member key
42
- raise "Can't retrieve single value :#{key} from a Redis ListHash. Use Index::Redis::StringHash."
43
47
  end
44
48
 
45
49
  end
@@ -1,36 +1,40 @@
1
- module Backend
1
+ module Picky
2
2
 
3
- class Redis
3
+ module Backend
4
4
 
5
- class StringHash < Basic
5
+ class Redis
6
6
 
7
- # Writes the hash into Redis.
8
- #
9
- # Note: We could use multi, but it did not help.
10
- #
11
- def dump hash
12
- clear
13
- hash.each_pair do |key, value|
14
- backend.hset namespace, key, value
7
+ class StringHash < Basic
8
+
9
+ # Writes the hash into Redis.
10
+ #
11
+ # Note: We could use multi, but it did not help.
12
+ #
13
+ def dump hash
14
+ clear
15
+ hash.each_pair do |key, value|
16
+ backend.hset namespace, key, value
17
+ end
15
18
  end
16
- end
17
19
 
18
- # Clears the hash.
19
- #
20
- def clear
21
- backend.del namespace
22
- end
20
+ # Clears the hash.
21
+ #
22
+ def clear
23
+ backend.del namespace
24
+ end
23
25
 
24
- # Get a collection.
25
- #
26
- def collection key
27
- raise "Can't retrieve collection for :#{key} from a StringHash. Use Index::Redis::ListHash."
28
- end
26
+ # Get a collection.
27
+ #
28
+ def collection key
29
+ raise "Can't retrieve collection for :#{key} from a StringHash. Use Indexes::Redis::ListHash."
30
+ end
31
+
32
+ # Get a single value.
33
+ #
34
+ def member key
35
+ backend.hget namespace, key
36
+ end
29
37
 
30
- # Get a single value.
31
- #
32
- def member key
33
- backend.hget namespace, key
34
38
  end
35
39
 
36
40
  end
@@ -1,38 +1,42 @@
1
- module Backend
1
+ module Picky
2
2
 
3
- #
4
- #
5
- class Redis < Base
3
+ module Backend
6
4
 
7
- def initialize bundle_name, category
8
- super bundle_name, category
5
+ #
6
+ #
7
+ class Redis < Base
8
+
9
+ def initialize bundle
10
+ super bundle
11
+
12
+ # Refine a few Redis "types".
13
+ #
14
+ @inverted = Redis::ListHash.new "#{bundle.identifier}:inverted"
15
+ @weights = Redis::StringHash.new "#{bundle.identifier}:weights"
16
+ @similarity = Redis::ListHash.new "#{bundle.identifier}:similarity"
17
+ @configuration = Redis::StringHash.new "#{bundle.identifier}:configuration"
18
+ end
9
19
 
10
- # Refine a few Redis "types".
20
+ # Delegate to the right collection.
11
21
  #
12
- @inverted = Redis::ListHash.new "#{category.identifier}:#{bundle_name}:inverted"
13
- @weights = Redis::StringHash.new "#{category.identifier}:#{bundle_name}:weights"
14
- @similarity = Redis::ListHash.new "#{category.identifier}:#{bundle_name}:similarity"
15
- @configuration = Redis::StringHash.new "#{category.identifier}:#{bundle_name}:configuration"
16
- end
22
+ def ids sym
23
+ inverted.collection sym
24
+ end
17
25
 
18
- # Delegate to the right collection.
19
- #
20
- def ids sym
21
- inverted.collection sym
22
- end
26
+ # Delegate to the right member value.
27
+ #
28
+ # Note: Converts to float.
29
+ #
30
+ def weight sym
31
+ weights.member(sym).to_f
32
+ end
23
33
 
24
- # Delegate to the right member value.
25
- #
26
- # Note: Converts to float.
27
- #
28
- def weight sym
29
- weights.member(sym).to_f
30
- end
34
+ # Delegate to a member value.
35
+ #
36
+ def setting sym
37
+ configuration.member sym
38
+ end
31
39
 
32
- # Delegate to a member value.
33
- #
34
- def setting sym
35
- configuration.member sym
36
40
  end
37
41
 
38
42
  end
data/lib/picky/bundle.rb CHANGED
@@ -1,62 +1,87 @@
1
- # A Bundle is a number of indexes
2
- # per [index, category] combination.
3
- #
4
- # At most, there are three indexes:
5
- # * *core* index (always used)
6
- # * *weights* index (always used)
7
- # * *similarity* index (used with similarity)
8
- #
9
- # In Picky, indexing is separated from the index
10
- # handling itself through a parallel structure.
11
- #
12
- # Both use methods provided by this base class, but
13
- # have very different goals:
14
- #
15
- # * *Indexing*::*Bundle*::*Base* is just concerned with creating index
16
- # files / redis entries and providing helper functions to e.g. check
17
- # the indexes.
18
- #
19
- # * *Index*::*Bundle*::*Base* is concerned with loading these index files into
20
- # memory / redis and looking up search data as fast as possible.
21
- #
22
- class Bundle
23
-
24
- attr_reader :identifier,
25
- :files
26
- attr_accessor :inverted,
27
- :weights,
28
- :similarity,
29
- :configuration,
30
- :similarity_strategy
31
-
32
- delegate :clear, :to => :inverted
33
- delegate :[], :[]=, :to => :configuration
34
-
35
- def initialize name, category, similarity_strategy
36
- @identifier = "#{category.identifier}:#{name}"
37
- @files = Backend::Files.new name, category
38
-
39
- @inverted = {}
40
- @weights = {}
41
- @similarity = {}
42
- @configuration = {} # A hash with config options.
43
-
44
- @similarity_strategy = similarity_strategy
45
- end
46
-
47
- # Get a list of similar texts.
1
+ module Picky
2
+ # A Bundle is a number of indexes
3
+ # per [index, category] combination.
48
4
  #
49
- # Note: Does not return itself.
5
+ # At most, there are three indexes:
6
+ # * *core* index (always used)
7
+ # * *weights* index (always used)
8
+ # * *similarity* index (used with similarity)
50
9
  #
51
- def similar text
52
- code = similarity_strategy.encoded text
53
- similar_codes = code && @similarity[code]
54
- similar_codes.delete text if similar_codes
55
- similar_codes || []
56
- end
10
+ # In Picky, indexing is separated from the index
11
+ # handling itself through a parallel structure.
12
+ #
13
+ # Both use methods provided by this base class, but
14
+ # have very different goals:
15
+ #
16
+ # * *Indexing*::*Bundle*::*Base* is just concerned with creating index
17
+ # files / redis entries and providing helper functions to e.g. check
18
+ # the indexes.
19
+ #
20
+ # * *Index*::*Bundle*::*Base* is concerned with loading these index files into
21
+ # memory / redis and looking up search data as fast as possible.
22
+ #
23
+ class Bundle
57
24
 
58
- def to_s
59
- "#{self.class}(#{identifier}, #{files})"
60
- end
25
+ attr_reader :name,
26
+ :category
27
+
28
+ attr_accessor :inverted,
29
+ :weights,
30
+ :similarity,
31
+ :configuration,
32
+ :similarity_strategy
61
33
 
34
+ delegate :clear, :to => :inverted
35
+ delegate :[], :[]=, :to => :configuration
36
+ delegate :index_directory, :to => :category
37
+
38
+ def initialize name, category, similarity_strategy, options = {}
39
+ @name = name
40
+ @category = category
41
+
42
+ @inverted = {}
43
+ @weights = {}
44
+ @similarity = {}
45
+ @configuration = {} # A hash with config options.
46
+
47
+ @similarity_strategy = similarity_strategy
48
+ end
49
+ def identifier
50
+ "#{category.identifier}:#{name}"
51
+ end
52
+
53
+ # Get a list of similar texts.
54
+ #
55
+ # Note: Does not return itself.
56
+ #
57
+ def similar text
58
+ code = similarity_strategy.encoded text
59
+ similar_codes = code && @similarity[code]
60
+ similar_codes.delete text if similar_codes
61
+ similar_codes || []
62
+ end
63
+
64
+ # If a key format is set, use it, else delegate to the category.
65
+ #
66
+ def key_format
67
+ @key_format || @category.key_format
68
+ end
69
+
70
+ # Path and partial filename of a specific subindex.
71
+ #
72
+ # Subindexes are:
73
+ # * inverted index
74
+ # * weights index
75
+ # * partial index
76
+ # * similarity index
77
+ #
78
+ def index_path type
79
+ ::File.join index_directory, "#{category.name}_#{name}_#{type}"
80
+ end
81
+
82
+ def to_s
83
+ "#{self.class}(#{identifier})"
84
+ end
85
+
86
+ end
62
87
  end
File without changes
@@ -1,55 +1,59 @@
1
- module Calculations # :nodoc:all
2
-
3
- # A location calculation recalculates a 1-d location
4
- # to the Picky internal 1-d "grid".
5
- #
6
- # For example, if you have a location x == 12.3456,
7
- # it will be recalculated into 3, if the minimum is 9
8
- # and the gridlength is 1.
9
- #
10
- class Location
11
-
12
- attr_reader :minimum, :precision, :grid
13
-
14
- def initialize user_grid, precision = nil
15
- @user_grid = user_grid
16
- @precision = precision || 1
17
- @grid = @user_grid / (@precision + 0.5)
18
- end
19
-
20
- def minimum= minimum
21
- # Add a margin of 1 user grid.
22
- #
23
- minimum -= @user_grid
24
-
25
- # Add plus 1 grid so that the index key never falls on 0.
26
- # Why? to_i maps by default to 0.
27
- #
28
- minimum -= @grid
1
+ module Picky
29
2
 
30
- @minimum = minimum
31
- end
3
+ module Calculations # :nodoc:all
32
4
 
5
+ # A location calculation recalculates a 1-d location
6
+ # to the Picky internal 1-d "grid".
33
7
  #
8
+ # For example, if you have a location x == 12.3456,
9
+ # it will be recalculated into 3, if the minimum is 9
10
+ # and the gridlength is 1.
34
11
  #
35
- def add_margin length
36
- @minimum -= length
37
- end
12
+ class Location
13
+
14
+ attr_reader :minimum, :precision, :grid
15
+
16
+ def initialize user_grid, precision = nil
17
+ @user_grid = user_grid
18
+ @precision = precision || 1
19
+ @grid = @user_grid / (@precision + 0.5)
20
+ end
21
+
22
+ def minimum= minimum
23
+ # Add a margin of 1 user grid.
24
+ #
25
+ minimum -= @user_grid
26
+
27
+ # Add plus 1 grid so that the index key never falls on 0.
28
+ # Why? to_i maps by default to 0.
29
+ #
30
+ minimum -= @grid
31
+
32
+ @minimum = minimum
33
+ end
34
+
35
+ #
36
+ #
37
+ def add_margin length
38
+ @minimum -= length
39
+ end
40
+
41
+ #
42
+ #
43
+ def recalculated_range location
44
+ range recalculate(location)
45
+ end
46
+ #
47
+ #
48
+ def range around_location
49
+ (around_location - @precision)..(around_location + @precision)
50
+ end
51
+ #
52
+ #
53
+ def recalculate location
54
+ ((location - @minimum) / @grid).floor
55
+ end
38
56
 
39
- #
40
- #
41
- def recalculated_range location
42
- range recalculate(location)
43
- end
44
- #
45
- #
46
- def range around_location
47
- (around_location - @precision)..(around_location + @precision)
48
- end
49
- #
50
- #
51
- def recalculate location
52
- ((location - @minimum) / @grid).floor
53
57
  end
54
58
 
55
59
  end