picky 2.5.2 → 2.6.0

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.
Files changed (255) hide show
  1. data/lib/picky/adapters/rack/base.rb +23 -0
  2. data/lib/picky/adapters/rack/live_parameters.rb +33 -0
  3. data/lib/picky/adapters/rack/query.rb +65 -0
  4. data/lib/picky/adapters/rack.rb +30 -0
  5. data/lib/picky/application.rb +5 -5
  6. data/lib/picky/backend/backend.rb +108 -0
  7. data/lib/picky/backend/file/basic.rb +101 -0
  8. data/lib/picky/backend/file/json.rb +34 -0
  9. data/lib/picky/backend/file/marshal.rb +34 -0
  10. data/lib/picky/backend/file/text.rb +56 -0
  11. data/lib/picky/backend/files.rb +30 -0
  12. data/lib/picky/backend/redis/basic.rb +85 -0
  13. data/lib/picky/backend/redis/list_hash.rb +49 -0
  14. data/lib/picky/backend/redis/string_hash.rb +40 -0
  15. data/lib/picky/backend/redis.rb +40 -0
  16. data/lib/picky/calculations/location.rb +57 -0
  17. data/lib/picky/categories.rb +62 -0
  18. data/lib/picky/categories_indexed.rb +93 -0
  19. data/lib/picky/categories_indexing.rb +12 -0
  20. data/lib/picky/category.rb +127 -0
  21. data/lib/picky/category_indexed.rb +64 -0
  22. data/lib/picky/category_indexing.rb +145 -0
  23. data/lib/picky/{internals/ext → ext}/maybe_compile.rb +0 -0
  24. data/lib/picky/{internals/ext → ext}/ruby19/extconf.rb +0 -0
  25. data/lib/picky/{internals/ext → ext}/ruby19/performant.c +0 -0
  26. data/lib/picky/{internals/extensions → extensions}/array.rb +0 -0
  27. data/lib/picky/extensions/class.rb +11 -0
  28. data/lib/picky/{internals/extensions → extensions}/hash.rb +0 -0
  29. data/lib/picky/{internals/extensions → extensions}/module.rb +0 -0
  30. data/lib/picky/{internals/extensions → extensions}/object.rb +0 -0
  31. data/lib/picky/{internals/extensions → extensions}/symbol.rb +0 -0
  32. data/lib/picky/frontend_adapters/rack.rb +146 -0
  33. data/lib/picky/generators/aliases.rb +3 -3
  34. data/lib/picky/generators/base.rb +15 -0
  35. data/lib/picky/generators/partial/default.rb +5 -0
  36. data/lib/picky/generators/partial/none.rb +31 -0
  37. data/lib/picky/generators/partial/strategy.rb +25 -0
  38. data/lib/picky/generators/partial/substring.rb +118 -0
  39. data/lib/picky/generators/partial_generator.rb +15 -0
  40. data/lib/picky/generators/similarity/default.rb +7 -0
  41. data/lib/picky/generators/similarity/double_metaphone.rb +28 -0
  42. data/lib/picky/generators/similarity/metaphone.rb +28 -0
  43. data/lib/picky/generators/similarity/none.rb +31 -0
  44. data/lib/picky/generators/similarity/phonetic.rb +65 -0
  45. data/lib/picky/generators/similarity/soundex.rb +28 -0
  46. data/lib/picky/generators/similarity/strategy.rb +9 -0
  47. data/lib/picky/generators/similarity_generator.rb +15 -0
  48. data/lib/picky/generators/strategy.rb +14 -0
  49. data/lib/picky/generators/weights/default.rb +7 -0
  50. data/lib/picky/generators/weights/logarithmic.rb +39 -0
  51. data/lib/picky/generators/weights/strategy.rb +9 -0
  52. data/lib/picky/generators/weights_generator.rb +15 -0
  53. data/lib/picky/{internals/helpers → helpers}/measuring.rb +0 -0
  54. data/lib/picky/index/base.rb +119 -104
  55. data/lib/picky/index/base_indexed.rb +27 -0
  56. data/lib/picky/index/base_indexing.rb +119 -0
  57. data/lib/picky/index/memory.rb +6 -18
  58. data/lib/picky/index/redis.rb +6 -18
  59. data/lib/picky/indexed/bundle/base.rb +110 -0
  60. data/lib/picky/indexed/bundle/memory.rb +91 -0
  61. data/lib/picky/indexed/bundle/redis.rb +45 -0
  62. data/lib/picky/indexed/wrappers/bundle/calculation.rb +35 -0
  63. data/lib/picky/indexed/wrappers/bundle/location.rb +42 -0
  64. data/lib/picky/indexed/wrappers/bundle/wrapper.rb +43 -0
  65. data/lib/picky/indexed/wrappers/category/location.rb +25 -0
  66. data/lib/picky/indexed/wrappers/exact_first.rb +55 -0
  67. data/lib/picky/{internals/indexers → indexers}/base.rb +0 -0
  68. data/lib/picky/{internals/indexers → indexers}/parallel.rb +0 -0
  69. data/lib/picky/{internals/indexers → indexers}/serial.rb +0 -0
  70. data/lib/picky/{internals/indexers → indexers}/solr.rb +0 -0
  71. data/lib/picky/indexes.rb +73 -0
  72. data/lib/picky/indexes_indexed.rb +29 -0
  73. data/lib/picky/indexes_indexing.rb +49 -0
  74. data/lib/picky/indexing/bundle/base.rb +212 -0
  75. data/lib/picky/indexing/bundle/memory.rb +25 -0
  76. data/lib/picky/indexing/bundle/redis.rb +24 -0
  77. data/lib/picky/indexing/bundle/super_base.rb +61 -0
  78. data/lib/picky/indexing/wrappers/category/location.rb +25 -0
  79. data/lib/picky/interfaces/live_parameters.rb +8 -8
  80. data/lib/picky/loader.rb +89 -95
  81. data/lib/picky/{internals/performant.rb → performant.rb} +0 -0
  82. data/lib/picky/query/allocation.rb +84 -0
  83. data/lib/picky/query/allocations.rb +114 -0
  84. data/lib/picky/query/combination.rb +76 -0
  85. data/lib/picky/query/combinations/base.rb +70 -0
  86. data/lib/picky/query/combinations/memory.rb +48 -0
  87. data/lib/picky/query/combinations/redis.rb +86 -0
  88. data/lib/picky/query/indexes.rb +195 -0
  89. data/lib/picky/query/qualifiers.rb +76 -0
  90. data/lib/picky/query/token.rb +198 -0
  91. data/lib/picky/query/tokens.rb +103 -0
  92. data/lib/picky/{internals/query → query}/weights.rb +0 -0
  93. data/lib/picky/results.rb +1 -1
  94. data/lib/picky/search.rb +6 -6
  95. data/lib/picky/{internals/solr → solr}/schema_generator.rb +0 -0
  96. data/lib/picky/sources/db.rb +7 -7
  97. data/lib/picky/sources/wrappers/location.rb +2 -2
  98. data/lib/picky/tokenizers/base.rb +224 -0
  99. data/lib/picky/tokenizers/index.rb +30 -0
  100. data/lib/picky/tokenizers/location.rb +49 -0
  101. data/lib/picky/tokenizers/query.rb +55 -0
  102. data/lib/tasks/index.rake +4 -3
  103. data/lib/tasks/try.rake +2 -2
  104. data/spec/lib/{internals/adapters → adapters}/rack/base_spec.rb +1 -1
  105. data/spec/lib/{internals/adapters → adapters}/rack/live_parameters_spec.rb +1 -1
  106. data/spec/lib/{internals/adapters → adapters}/rack/query_spec.rb +1 -1
  107. data/spec/lib/application_spec.rb +3 -3
  108. data/spec/lib/{internals/index → backend}/file/basic_spec.rb +1 -1
  109. data/spec/lib/{internals/index → backend}/file/json_spec.rb +1 -1
  110. data/spec/lib/{internals/index → backend}/file/marshal_spec.rb +1 -1
  111. data/spec/lib/{internals/index → backend}/file/text_spec.rb +1 -1
  112. data/spec/lib/{internals/index → backend}/files_spec.rb +3 -3
  113. data/spec/lib/{internals/index → backend}/redis/basic_spec.rb +1 -1
  114. data/spec/lib/{internals/index → backend}/redis/list_hash_spec.rb +1 -1
  115. data/spec/lib/{internals/index → backend}/redis/string_hash_spec.rb +1 -1
  116. data/spec/lib/{internals/index → backend}/redis_spec.rb +11 -5
  117. data/spec/lib/{internals/calculations → calculations}/location_spec.rb +1 -1
  118. data/spec/lib/{internals/indexed/categories_spec.rb → categories_indexed_spec.rb} +10 -10
  119. data/spec/lib/{internals/indexed/category_spec.rb → category_indexed_spec.rb} +12 -12
  120. data/spec/lib/{internals/indexing/category_spec.rb → category_indexing_spec.rb} +10 -10
  121. data/spec/lib/{internals/cores_spec.rb → cores_spec.rb} +0 -0
  122. data/spec/lib/{internals/extensions → extensions}/array_spec.rb +0 -0
  123. data/spec/lib/{internals/extensions → extensions}/hash_spec.rb +0 -0
  124. data/spec/lib/{internals/extensions → extensions}/module_spec.rb +0 -0
  125. data/spec/lib/{internals/extensions → extensions}/object_spec.rb +0 -0
  126. data/spec/lib/{internals/extensions → extensions}/symbol_spec.rb +0 -0
  127. data/spec/lib/{internals/frontend_adapters → frontend_adapters}/rack_spec.rb +10 -10
  128. data/spec/lib/generators/aliases_spec.rb +3 -3
  129. data/spec/lib/{internals/generators → generators}/cacher_strategy_spec.rb +1 -1
  130. data/spec/lib/{internals/generators → generators}/partial/default_spec.rb +3 -3
  131. data/spec/lib/{internals/generators → generators}/partial/none_spec.rb +2 -2
  132. data/spec/lib/{internals/generators → generators}/partial/substring_spec.rb +1 -1
  133. data/spec/lib/{internals/generators → generators}/partial_generator_spec.rb +3 -3
  134. data/spec/lib/{internals/generators → generators}/similarity/double_metaphone_spec.rb +1 -1
  135. data/spec/lib/{internals/generators → generators}/similarity/metaphone_spec.rb +1 -1
  136. data/spec/lib/{internals/generators → generators}/similarity/none_spec.rb +1 -1
  137. data/spec/lib/{internals/generators → generators}/similarity/phonetic_spec.rb +1 -1
  138. data/spec/lib/{internals/generators → generators}/similarity/soundex_spec.rb +1 -1
  139. data/spec/lib/{internals/generators → generators}/similarity_generator_spec.rb +2 -2
  140. data/spec/lib/{internals/generators → generators}/weights/logarithmic_spec.rb +1 -1
  141. data/spec/lib/{internals/generators → generators}/weights_generator_spec.rb +5 -5
  142. data/spec/lib/{internals/helpers → helpers}/measuring_spec.rb +0 -0
  143. data/spec/lib/{internals/indexed/index_spec.rb → index/base_indexed_spec.rb} +5 -5
  144. data/spec/lib/{internals/indexing/index_spec.rb → index/base_indexing_spec.rb} +6 -19
  145. data/spec/lib/index/base_spec.rb +10 -53
  146. data/spec/lib/{internals/indexed → indexed}/bundle/memory_spec.rb +5 -5
  147. data/spec/lib/{internals/indexed → indexed}/bundle/redis_spec.rb +4 -4
  148. data/spec/lib/{internals/indexed → indexed}/wrappers/bundle/calculation_spec.rb +1 -1
  149. data/spec/lib/{internals/indexed → indexed}/wrappers/bundle/wrapper_spec.rb +1 -1
  150. data/spec/lib/{internals/indexed → indexed}/wrappers/exact_first_spec.rb +7 -7
  151. data/spec/lib/{internals/indexers → indexers}/base_spec.rb +0 -0
  152. data/spec/lib/{internals/indexers → indexers}/parallel_spec.rb +0 -0
  153. data/spec/lib/{internals/indexers → indexers}/serial_spec.rb +0 -0
  154. data/spec/lib/indexes_class_spec.rb +30 -0
  155. data/spec/lib/{indexed/indexes_spec.rb → indexes_indexed_spec.rb} +1 -1
  156. data/spec/lib/{indexing/indexes_spec.rb → indexes_indexing_spec.rb} +8 -8
  157. data/spec/lib/{internals/indexing/indexes_spec.rb → indexes_spec.rb} +15 -12
  158. data/spec/lib/{internals/indexing → indexing}/bundle/memory_partial_generation_speed_spec.rb +4 -4
  159. data/spec/lib/{internals/indexing → indexing}/bundle/memory_spec.rb +3 -3
  160. data/spec/lib/{internals/indexing → indexing}/bundle/redis_spec.rb +3 -3
  161. data/spec/lib/{internals/indexing → indexing}/bundle/super_base_spec.rb +2 -2
  162. data/spec/lib/{internals/interfaces → interfaces}/live_parameters_spec.rb +0 -0
  163. data/spec/lib/query/allocation_spec.rb +1 -1
  164. data/spec/lib/query/allocations_spec.rb +1 -1
  165. data/spec/lib/query/combination_spec.rb +5 -5
  166. data/spec/lib/query/combinations/base_spec.rb +1 -1
  167. data/spec/lib/query/combinations/memory_spec.rb +1 -1
  168. data/spec/lib/query/combinations/redis_spec.rb +1 -1
  169. data/spec/lib/query/indexes_spec.rb +1 -1
  170. data/spec/lib/query/qualifiers_spec.rb +4 -4
  171. data/spec/lib/query/token_spec.rb +3 -3
  172. data/spec/lib/query/tokens_spec.rb +32 -32
  173. data/spec/lib/search_spec.rb +5 -5
  174. data/spec/lib/{internals/solr → solr}/schema_generator_spec.rb +0 -0
  175. data/spec/lib/sources/db_spec.rb +4 -8
  176. data/spec/lib/sources/wrappers/location_spec.rb +1 -1
  177. data/spec/lib/{internals/tokenizers → tokenizers}/base_spec.rb +1 -1
  178. data/spec/lib/{internals/tokenizers → tokenizers}/index_spec.rb +1 -1
  179. data/spec/lib/{internals/tokenizers → tokenizers}/query_spec.rb +1 -1
  180. metadata +214 -215
  181. data/lib/picky/aliases.rb +0 -4
  182. data/lib/picky/index_bundle.rb +0 -48
  183. data/lib/picky/indexed/indexes.rb +0 -59
  184. data/lib/picky/indexing/indexes.rb +0 -87
  185. data/lib/picky/internals/adapters/rack/base.rb +0 -27
  186. data/lib/picky/internals/adapters/rack/live_parameters.rb +0 -37
  187. data/lib/picky/internals/adapters/rack/query.rb +0 -69
  188. data/lib/picky/internals/adapters/rack.rb +0 -34
  189. data/lib/picky/internals/calculations/location.rb +0 -59
  190. data/lib/picky/internals/frontend_adapters/rack.rb +0 -150
  191. data/lib/picky/internals/generators/base.rb +0 -19
  192. data/lib/picky/internals/generators/partial/default.rb +0 -7
  193. data/lib/picky/internals/generators/partial/none.rb +0 -35
  194. data/lib/picky/internals/generators/partial/strategy.rb +0 -29
  195. data/lib/picky/internals/generators/partial/substring.rb +0 -122
  196. data/lib/picky/internals/generators/partial_generator.rb +0 -19
  197. data/lib/picky/internals/generators/similarity/default.rb +0 -9
  198. data/lib/picky/internals/generators/similarity/double_metaphone.rb +0 -32
  199. data/lib/picky/internals/generators/similarity/metaphone.rb +0 -32
  200. data/lib/picky/internals/generators/similarity/none.rb +0 -35
  201. data/lib/picky/internals/generators/similarity/phonetic.rb +0 -69
  202. data/lib/picky/internals/generators/similarity/soundex.rb +0 -32
  203. data/lib/picky/internals/generators/similarity/strategy.rb +0 -11
  204. data/lib/picky/internals/generators/similarity_generator.rb +0 -19
  205. data/lib/picky/internals/generators/strategy.rb +0 -18
  206. data/lib/picky/internals/generators/weights/default.rb +0 -9
  207. data/lib/picky/internals/generators/weights/logarithmic.rb +0 -43
  208. data/lib/picky/internals/generators/weights/strategy.rb +0 -11
  209. data/lib/picky/internals/generators/weights_generator.rb +0 -19
  210. data/lib/picky/internals/index/backend.rb +0 -112
  211. data/lib/picky/internals/index/file/basic.rb +0 -105
  212. data/lib/picky/internals/index/file/json.rb +0 -38
  213. data/lib/picky/internals/index/file/marshal.rb +0 -38
  214. data/lib/picky/internals/index/file/text.rb +0 -60
  215. data/lib/picky/internals/index/files.rb +0 -34
  216. data/lib/picky/internals/index/redis/basic.rb +0 -89
  217. data/lib/picky/internals/index/redis/list_hash.rb +0 -53
  218. data/lib/picky/internals/index/redis/string_hash.rb +0 -44
  219. data/lib/picky/internals/index/redis.rb +0 -44
  220. data/lib/picky/internals/indexed/bundle/base.rb +0 -114
  221. data/lib/picky/internals/indexed/bundle/memory.rb +0 -95
  222. data/lib/picky/internals/indexed/bundle/redis.rb +0 -49
  223. data/lib/picky/internals/indexed/categories.rb +0 -140
  224. data/lib/picky/internals/indexed/category.rb +0 -111
  225. data/lib/picky/internals/indexed/index.rb +0 -63
  226. data/lib/picky/internals/indexed/wrappers/bundle/calculation.rb +0 -37
  227. data/lib/picky/internals/indexed/wrappers/bundle/location.rb +0 -44
  228. data/lib/picky/internals/indexed/wrappers/bundle/wrapper.rb +0 -45
  229. data/lib/picky/internals/indexed/wrappers/category/location.rb +0 -27
  230. data/lib/picky/internals/indexed/wrappers/exact_first.rb +0 -59
  231. data/lib/picky/internals/indexing/bundle/base.rb +0 -216
  232. data/lib/picky/internals/indexing/bundle/memory.rb +0 -29
  233. data/lib/picky/internals/indexing/bundle/redis.rb +0 -28
  234. data/lib/picky/internals/indexing/bundle/super_base.rb +0 -65
  235. data/lib/picky/internals/indexing/category.rb +0 -153
  236. data/lib/picky/internals/indexing/index.rb +0 -142
  237. data/lib/picky/internals/indexing/wrappers/category/location.rb +0 -27
  238. data/lib/picky/internals/query/allocation.rb +0 -88
  239. data/lib/picky/internals/query/allocations.rb +0 -118
  240. data/lib/picky/internals/query/combination.rb +0 -80
  241. data/lib/picky/internals/query/combinations/base.rb +0 -74
  242. data/lib/picky/internals/query/combinations/memory.rb +0 -52
  243. data/lib/picky/internals/query/combinations/redis.rb +0 -90
  244. data/lib/picky/internals/query/indexes.rb +0 -199
  245. data/lib/picky/internals/query/qualifiers.rb +0 -82
  246. data/lib/picky/internals/query/token.rb +0 -202
  247. data/lib/picky/internals/query/tokens.rb +0 -109
  248. data/lib/picky/internals/shared/category.rb +0 -52
  249. data/lib/picky/internals/tokenizers/base.rb +0 -228
  250. data/lib/picky/internals/tokenizers/index.rb +0 -34
  251. data/lib/picky/internals/tokenizers/location.rb +0 -54
  252. data/lib/picky/internals/tokenizers/query.rb +0 -59
  253. data/lib/picky/internals.rb +0 -2
  254. data/spec/lib/aliases_spec.rb +0 -9
  255. data/spec/lib/index_bundle_spec.rb +0 -69
@@ -1,34 +0,0 @@
1
- module Internals
2
-
3
- module Index
4
-
5
- class Files < Backend
6
-
7
- def initialize bundle_name, category
8
- super bundle_name, category
9
-
10
- # Note: We marshal the similarity, as the
11
- # Yajl json lib cannot load symbolized
12
- # values, just keys.
13
- #
14
- @index = File::JSON.new category.index_path(bundle_name, :index)
15
- @weights = File::JSON.new category.index_path(bundle_name, :weights)
16
- @similarity = File::Marshal.new category.index_path(bundle_name, :similarity)
17
- @configuration = File::JSON.new category.index_path(bundle_name, :configuration)
18
- end
19
-
20
- def to_s
21
- <<-FILES
22
- Files:
23
- #{"Index: #{@index}".indented_to_s}
24
- #{"Weights: #{@weights}".indented_to_s}
25
- #{"Similarity: #{@similarity}".indented_to_s}
26
- #{"Config: #{@configuration}".indented_to_s}
27
- FILES
28
- end
29
-
30
- end
31
-
32
- end
33
-
34
- end
@@ -1,89 +0,0 @@
1
- module Internals
2
-
3
- module Index
4
-
5
- class Redis
6
-
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.
13
- #
14
- class Basic
15
-
16
- attr_reader :namespace, :backend
17
-
18
- # An index cache takes a path, without file extension,
19
- # which will be provided by the subclasses.
20
- #
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.
33
- #
34
- def load
35
- # Nothing.
36
- end
37
- # We do not use Redis to retrieve data.
38
- #
39
- def retrieve
40
- # Nothing.
41
- end
42
-
43
- # Redis does not backup.
44
- #
45
- def backup
46
- # Nothing.
47
- end
48
-
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
- #
60
-
61
- # Is this cache suspiciously small?
62
- #
63
- def cache_small?
64
- size < 1
65
- end
66
- # Is the cache ok?
67
- #
68
- # A small cache is still ok.
69
- #
70
- def cache_ok?
71
- size > 0
72
- end
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
82
-
83
- end
84
-
85
- end
86
-
87
- end
88
-
89
- end
@@ -1,53 +0,0 @@
1
- module Internals
2
-
3
- module Index
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
20
- end
21
- end
22
-
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
33
- end
34
-
35
- # Get a collection.
36
- #
37
- def collection sym
38
- backend.lrange "#{namespace}:#{sym}", 0, -1
39
- end
40
-
41
- # Get a single value.
42
- #
43
- def member sym
44
- raise "Can't retrieve a single value from a Redis ListHash. Use Index::Redis::StringHash."
45
- end
46
-
47
- end
48
-
49
- end
50
-
51
- end
52
-
53
- end
@@ -1,44 +0,0 @@
1
- module Internals
2
-
3
- module Index
4
-
5
- class Redis
6
-
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
18
- end
19
-
20
- # Clears the hash.
21
- #
22
- def clear
23
- backend.del namespace
24
- end
25
-
26
- # Get a collection.
27
- #
28
- def collection sym
29
- raise "Can't retrieve a collection from a StringHash. Use Index::Redis::ListHash."
30
- end
31
-
32
- # Get a single value.
33
- #
34
- def member sym
35
- backend.hget namespace, sym
36
- end
37
-
38
- end
39
-
40
- end
41
-
42
- end
43
-
44
- end
@@ -1,44 +0,0 @@
1
- module Internals
2
-
3
- module Index
4
-
5
- # TODO Needs a reconnect to be run after forking.
6
- #
7
- class Redis < Backend
8
-
9
- def initialize bundle_name, category
10
- super bundle_name, category
11
-
12
- # Refine a few Redis "types".
13
- #
14
- @index = Redis::ListHash.new "#{category.identifier}:#{bundle_name}:index"
15
- @weights = Redis::StringHash.new "#{category.identifier}:#{bundle_name}:weights"
16
- @similarity = Redis::ListHash.new "#{category.identifier}:#{bundle_name}:similarity"
17
- @configuration = Redis::StringHash.new "#{category.identifier}:#{bundle_name}:configuration"
18
- end
19
-
20
- # Delegate to the right collection.
21
- #
22
- def ids sym
23
- index.collection sym
24
- end
25
-
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
33
-
34
- # Delegate to a member value.
35
- #
36
- def setting sym
37
- configuration.member sym
38
- end
39
-
40
- end
41
-
42
- end
43
-
44
- end
@@ -1,114 +0,0 @@
1
- module Internals
2
-
3
- module Indexed # :nodoc:all
4
-
5
- # A Bundle is a number of indexes
6
- # per [index, category] combination.
7
- #
8
- # At most, there are three indexes:
9
- # * *core* index (always used)
10
- # * *weights* index (always used)
11
- # * *similarity* index (used with similarity)
12
- #
13
- # In Picky, indexing is separated from the index
14
- # handling itself through a parallel structure.
15
- #
16
- # Both use methods provided by this base class, but
17
- # have very different goals:
18
- #
19
- # * *Indexing*::*Bundle* is just concerned with creating index files
20
- # and providing helper functions to e.g. check the indexes.
21
- #
22
- # * *Index*::*Bundle* is concerned with loading these index files into
23
- # memory and looking up search data as fast as possible.
24
- #
25
- module Bundle
26
-
27
- class Base
28
-
29
- attr_reader :identifier, :configuration
30
- attr_accessor :similarity_strategy
31
- attr_accessor :index, :weights, :similarity, :configuration
32
-
33
- delegate :[], :to => :configuration
34
- delegate :size, :to => :index
35
-
36
- def initialize name, category, similarity_strategy
37
- @identifier = "#{category.identifier}:#{name}"
38
-
39
- @index = {}
40
- @weights = {}
41
- @similarity = {}
42
-
43
- @similarity_strategy = similarity_strategy
44
- end
45
-
46
- # Get a list of similar texts.
47
- #
48
- # Note: Does not return itself.
49
- #
50
- def similar text
51
- code = similarity_strategy.encoded text
52
- similar_codes = code && @similarity[code]
53
- similar_codes.delete text if similar_codes
54
- similar_codes || []
55
- end
56
-
57
- # Loads all indexes.
58
- #
59
- def load
60
- load_index
61
- load_weights
62
- load_similarity
63
- load_configuration
64
- end
65
-
66
- # Loads the core index.
67
- #
68
- def load_index
69
- # No loading needed.
70
- end
71
- # Loads the weights index.
72
- #
73
- def load_weights
74
- # No loading needed.
75
- end
76
- # Loads the similarity index.
77
- #
78
- def load_similarity
79
- # No loading needed.
80
- end
81
- # Loads the configuration.
82
- #
83
- def load_configuration
84
- # No loading needed.
85
- end
86
-
87
- # Loads the core index.
88
- #
89
- def clear_index
90
- # No loading needed.
91
- end
92
- # Loads the weights index.
93
- #
94
- def clear_weights
95
- # No loading needed.
96
- end
97
- # Loads the similarity index.
98
- #
99
- def clear_similarity
100
- # No loading needed.
101
- end
102
- # Loads the configuration.
103
- #
104
- def clear_configuration
105
- # No loading needed.
106
- end
107
-
108
- end
109
-
110
- end
111
-
112
- end
113
-
114
- end
@@ -1,95 +0,0 @@
1
- module Internals
2
-
3
- # encoding: utf-8
4
- #
5
- module Indexed # :nodoc:all
6
-
7
- #
8
- #
9
- module Bundle
10
-
11
- # This is the _actual_ index (based on memory).
12
- #
13
- # Handles exact/partial index, weights index, and similarity index.
14
- #
15
- # Delegates file handling and checking to an *Indexed*::*Files* object.
16
- #
17
- class Memory < Base
18
-
19
- delegate :[], :to => :configuration
20
-
21
- def initialize name, configuration, *args
22
- super name, configuration, *args
23
-
24
- @configuration = {} # A hash with config options.
25
-
26
- @backend = Internals::Index::Files.new name, configuration
27
- end
28
-
29
- def to_s
30
- <<-MEMORY
31
- Memory
32
- #{@backend.indented_to_s}
33
- MEMORY
34
- end
35
-
36
- # Get the ids for the given symbol.
37
- #
38
- def ids sym
39
- @index[sym] || []
40
- end
41
- # Get a weight for the given symbol.
42
- #
43
- def weight sym
44
- @weights[sym]
45
- end
46
-
47
- # Loads the core index.
48
- #
49
- def load_index
50
- self.index = @backend.load_index
51
- end
52
- # Loads the weights index.
53
- #
54
- def load_weights
55
- self.weights = @backend.load_weights
56
- end
57
- # Loads the similarity index.
58
- #
59
- def load_similarity
60
- self.similarity = @backend.load_similarity
61
- end
62
- # Loads the configuration.
63
- #
64
- def load_configuration
65
- self.configuration = @backend.load_configuration
66
- end
67
-
68
- # Loads the core index.
69
- #
70
- def clear_index
71
- self.index = {}
72
- end
73
- # Loads the weights index.
74
- #
75
- def clear_weights
76
- self.weights = {}
77
- end
78
- # Loads the similarity index.
79
- #
80
- def clear_similarity
81
- self.similarity = {}
82
- end
83
- # Loads the configuration.
84
- #
85
- def clear_configuration
86
- self.configuration = {}
87
- end
88
-
89
- end
90
-
91
- end
92
-
93
- end
94
-
95
- end
@@ -1,49 +0,0 @@
1
- module Internals
2
-
3
- # encoding: utf-8
4
- #
5
- module Indexed # :nodoc:all
6
-
7
- #
8
- #
9
- module Bundle
10
-
11
- # This is the _actual_ index (based on Redis).
12
- #
13
- # Handles exact/partial index, weights index, and similarity index.
14
- #
15
- class Redis < Base
16
-
17
- def initialize name, category, *args
18
- super name, category, *args
19
-
20
- @backend = Internals::Index::Redis.new name, category
21
- end
22
-
23
- # Get the ids for the given symbol.
24
- #
25
- # Ids are an array of string values in Redis.
26
- #
27
- def ids sym
28
- @backend.ids sym
29
- end
30
- # Get a weight for the given symbol.
31
- #
32
- # A weight is a string value in Redis. TODO Convert?
33
- #
34
- def weight sym
35
- @backend.weight sym
36
- end
37
- # Settings of this bundle can be accessed via [].
38
- #
39
- def [] sym
40
- @backend.setting sym
41
- end
42
-
43
- end
44
-
45
- end
46
-
47
- end
48
-
49
- end
@@ -1,140 +0,0 @@
1
- module Internals
2
-
3
- module Indexed
4
-
5
- class Categories
6
-
7
- attr_reader :categories, :category_hash, :ignore_unassigned_tokens
8
-
9
- each_delegate :load_from_cache,
10
- :analyze,
11
- :to => :categories
12
-
13
- # A list of indexed categories.
14
- #
15
- # Options:
16
- # * ignore_unassigned_tokens: Ignore the given token if it cannot be matched to a category.
17
- # The default behaviour is that if a token does not match to
18
- # any category, the query will not return anything (since a
19
- # single token cannot be matched). If you set this option to
20
- # true, any token that cannot be matched to a category will be
21
- # simply ignored.
22
- # Use this if only a few matched words are important, like for
23
- # example of the query "Jonathan Myers 86455 Las Cucarachas"
24
- # you only want to match the zipcode, to have the search engine
25
- # display advertisements on the side for the zipcode.
26
- # Nifty! :)
27
- #
28
- def initialize options = {}
29
- clear
30
-
31
- @ignore_unassigned_tokens = options[:ignore_unassigned_tokens] || false
32
- end
33
-
34
- def to_s
35
- categories.indented_to_s
36
- end
37
-
38
- # Clears both the array of categories and the hash of categories.
39
- #
40
- def clear
41
- @categories = []
42
- @category_hash = {}
43
- end
44
-
45
- # Add the given category to the list of categories.
46
- #
47
- def << category
48
- categories << category
49
- category_hash[category.name] = category
50
- end
51
-
52
- # Return all possible combinations for the given token.
53
- #
54
- # This checks if it needs to also search through similar
55
- # tokens, if for example, the token is one with ~.
56
- # If yes, it puts together all solutions.
57
- #
58
- def possible_combinations_for token
59
- token.similar? ? similar_possible_for(token) : possible_for(token)
60
- end
61
- # Gets all similar tokens and puts together the possible combinations
62
- # for each found similar token.
63
- #
64
- def similar_possible_for token
65
- # Get as many tokens as necessary
66
- #
67
- tokens = similar_tokens_for token
68
- # possible combinations
69
- #
70
- inject_possible_for tokens
71
- end
72
- def similar_tokens_for token
73
- text = token.text
74
- categories.inject([]) do |result, category|
75
- next_token = token
76
- # Note: We could also break off here if not all the available
77
- # similars are needed.
78
- # Wait for a concrete case that needs this before taking
79
- # action.
80
- #
81
- while next_token = next_token.next_similar_token(category)
82
- result << next_token if next_token && next_token.text != text
83
- end
84
- result
85
- end
86
- end
87
- def inject_possible_for tokens
88
- tokens.inject([]) do |result, token|
89
- possible = possible_categories token
90
- result + possible_for(token, possible)
91
- end
92
- end
93
-
94
- # Returns possible Combinations for the token.
95
- #
96
- # Note: The preselected_categories param is an optimization.
97
- #
98
- # Note: Returns [] if no categories matched (will produce no result).
99
- # Returns nil if this token needs to be removed from the query.
100
- # (Also none of the categories matched, but the ignore unassigned
101
- # tokens option is true)
102
- #
103
- def possible_for token, preselected_categories = nil
104
- possible = (preselected_categories || possible_categories(token)).inject([]) do |combinations, category|
105
- combination = category.combination_for token
106
- combination ? combinations << combination : combinations
107
- end
108
- # This is an optimization to mark tokens that are ignored.
109
- #
110
- return if ignore_unassigned_tokens && possible.empty?
111
- possible # wrap in combinations
112
- end
113
- # This returns the possible categories for this token.
114
- # If the user has already preselected a category for this token,
115
- # like "artist:moby", if not just return all for the given token,
116
- # since all are possible.
117
- #
118
- # Note: Once I thought this was called too often. But it is not (18.01.2011).
119
- #
120
- def possible_categories token
121
- user_defined_categories(token) || categories
122
- end
123
- # This returns the array of categories if the user has defined
124
- # an existing category.
125
- #
126
- # Note: Returns nil if the user did not define one
127
- # or [] if he/she has defined a non-existing one.
128
- #
129
- def user_defined_categories token
130
- names = token.user_defined_category_names
131
- names && names.map do |name|
132
- category_hash[name]
133
- end.compact
134
- end
135
-
136
- end
137
-
138
- end
139
-
140
- end