picky 4.6.3 → 4.6.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/lib/performant.c +4 -4
  2. data/lib/picky/analyzer.rb +6 -3
  3. data/lib/picky/backends/backend.rb +40 -0
  4. data/lib/picky/backends/file/json.rb +4 -0
  5. data/lib/picky/backends/file.rb +1 -25
  6. data/lib/picky/backends/memory/json.rb +4 -0
  7. data/lib/picky/backends/memory.rb +1 -29
  8. data/lib/picky/backends/redis/directly_manipulable.rb +15 -7
  9. data/lib/picky/backends/redis.rb +91 -92
  10. data/lib/picky/backends/sqlite/basic.rb +6 -0
  11. data/lib/picky/bundle.rb +12 -10
  12. data/lib/picky/categories_indexing.rb +0 -13
  13. data/lib/picky/category.rb +24 -21
  14. data/lib/picky/category_indexing.rb +8 -22
  15. data/lib/picky/constants.rb +0 -1
  16. data/lib/picky/generators/aliases.rb +2 -0
  17. data/lib/picky/generators/partial.rb +27 -0
  18. data/lib/picky/generators/similarity.rb +27 -0
  19. data/lib/picky/generators/weights.rb +32 -0
  20. data/lib/picky/helpers/identification.rb +18 -0
  21. data/lib/picky/helpers/indexing.rb +16 -0
  22. data/lib/picky/index.rb +6 -0
  23. data/lib/picky/index_indexing.rb +9 -21
  24. data/lib/picky/indexes_indexing.rb +5 -14
  25. data/lib/picky/loader.rb +204 -199
  26. data/lib/picky/query/indexes.rb +12 -1
  27. data/lib/picky/search.rb +1 -0
  28. data/lib/picky/source.rb +23 -0
  29. data/lib/picky/tokenizer.rb +35 -13
  30. data/spec/functional/facets_spec.rb +1 -1
  31. data/spec/functional/remap_qualifiers_spec.rb +43 -0
  32. data/spec/functional/tokenizer_spec.rb +1 -1
  33. data/spec/lib/api/search/boost_spec.rb +1 -1
  34. data/spec/lib/category_spec.rb +1 -4
  35. data/spec/lib/generators/partial_spec.rb +58 -0
  36. data/spec/lib/generators/similarity_spec.rb +59 -0
  37. data/spec/lib/generators/weights_spec.rb +68 -0
  38. data/spec/lib/index_indexing_spec.rb +2 -4
  39. data/spec/lib/index_spec.rb +6 -0
  40. data/spec/lib/pool_spec.rb +39 -35
  41. data/spec/lib/sinatra_spec.rb +2 -2
  42. data/spec/lib/source_spec.rb +63 -0
  43. data/spec/lib/tokenizer_spec.rb +64 -2
  44. metadata +20 -20
  45. data/lib/picky/api/category/partial.rb +0 -26
  46. data/lib/picky/api/category/similarity.rb +0 -26
  47. data/lib/picky/api/category/weight.rb +0 -28
  48. data/lib/picky/api/source.rb +0 -35
  49. data/lib/picky/api/tokenizer.rb +0 -37
  50. data/lib/picky/deployment.rb +0 -211
  51. data/spec/lib/api/category/partial_spec.rb +0 -49
  52. data/spec/lib/api/category/similarity_spec.rb +0 -50
  53. data/spec/lib/api/category/weight_spec.rb +0 -55
  54. data/spec/lib/api/source_spec.rb +0 -68
  55. data/spec/lib/api/tokenizer_spec.rb +0 -42
@@ -0,0 +1,27 @@
1
+ module Picky
2
+
3
+ module Generators
4
+
5
+ module Partial
6
+ extend Helpers::Identification
7
+
8
+ def self.from thing, index_name = nil, category_name = nil
9
+ return Default unless thing
10
+
11
+ if thing.respond_to? :each_partial
12
+ thing
13
+ else
14
+ raise <<-ERROR
15
+ partial options #{identifier_for(index_name, category_name)}should be either
16
+ * for example a Partial::Substring.new(from: m, to: n), Partial::Postfix.new(from: n), Partial::Infix.new(min: m, max: n) etc.
17
+ or
18
+ * an object that responds to #each_partial(str_or_sym) and yields each partial
19
+ ERROR
20
+ end
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,27 @@
1
+ module Picky
2
+
3
+ module Generators
4
+
5
+ module Similarity
6
+ extend Helpers::Identification
7
+
8
+ def self.from thing, index_name = nil, category_name = nil
9
+ return Default unless thing
10
+
11
+ if thing.respond_to?(:encode) && thing.respond_to?(:prioritize)
12
+ thing
13
+ else
14
+ raise <<-ERROR
15
+ similarity options #{identifier_for(index_name, category_name)}should be either
16
+ * for example a Similarity::Phonetic.new(n), Similarity::Metaphone.new(n), Similarity::DoubleMetaphone.new(n) etc.
17
+ or
18
+ * an object that responds to #encode(text) => encoded_text and #prioritize(array_of_encoded, encoded)
19
+ ERROR
20
+ end
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,32 @@
1
+ module Picky
2
+
3
+ module Generators
4
+
5
+ module Weights
6
+ extend Helpers::Identification
7
+
8
+ # Factory method to return a fitting
9
+ # weight handling thing for the given thing.
10
+ #
11
+ def self.from thing, index_name = nil, category_name = nil
12
+ return Default unless thing
13
+
14
+ if thing.respond_to? :weight_for
15
+ thing
16
+ elsif thing.respond_to? :to_int
17
+ Logarithmic.new thing
18
+ else
19
+ raise <<-ERROR
20
+ weight options #{identifier_for(index_name, category_name)}should be either
21
+ * for example a Weights::Logarithmic.new, Weights::Constant.new(int = 0), Weights::Dynamic.new(&block) etc.
22
+ or
23
+ * an object that responds to #weight_for(amount_of_ids_for_token) => float
24
+ ERROR
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,18 @@
1
+ module Picky
2
+
3
+ module Helpers
4
+
5
+ module Identification
6
+
7
+ def identifier_for index_name = nil, category_name = nil
8
+ specifics = ""
9
+ specifics << index_name.to_s if index_name
10
+ specifics << ":#{category_name}" if category_name
11
+ specifics = "for #{specifics} " unless specifics.empty?
12
+ end
13
+
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -7,10 +7,26 @@ module Picky
7
7
 
8
8
  include Measuring
9
9
 
10
+ # Runs the block and logs a few infos regarding the time it took.
11
+ #
10
12
  def timed_indexing scheduler, &block
11
13
  Picky.logger.info "Picky is indexing using #{scheduler.fork? ? 'multiple processes' : 'a single process'}: "
12
14
  Picky.logger.info " Done in #{timed(&block).round}s.\n"
13
15
  end
16
+
17
+ # Indexing works the same way, always:
18
+ # * Prepare the scheduler.
19
+ # * Cache the scheduler.
20
+ #
21
+ def index scheduler = Scheduler.new
22
+ timed_indexing scheduler do
23
+ prepare scheduler
24
+ scheduler.finish
25
+
26
+ cache scheduler
27
+ scheduler.finish
28
+ end
29
+ end
14
30
 
15
31
  end
16
32
  end
data/lib/picky/index.rb CHANGED
@@ -178,6 +178,12 @@ module Picky
178
178
 
179
179
  new_category
180
180
  end
181
+
182
+ # The directory used by this index.
183
+ #
184
+ def directory
185
+ @directory ||= ::File.join(PICKY_ROOT, 'index', PICKY_ENVIRONMENT, name.to_s)
186
+ end
181
187
 
182
188
  # Make this category range searchable with a fixed range. If you need other
183
189
  # ranges, define another category with a different range value.
@@ -3,10 +3,6 @@ module Picky
3
3
  #
4
4
  #
5
5
  class Index
6
-
7
- include API::Tokenizer
8
- include API::Source
9
-
10
6
  include Helpers::Indexing
11
7
 
12
8
  # Delegators for indexing.
@@ -20,19 +16,7 @@ module Picky
20
16
  # Parameters are the exact same as for indexing.
21
17
  #
22
18
  def indexing options = {}
23
- @tokenizer = extract_tokenizer options
24
- end
25
-
26
- #
27
- #
28
- def index scheduler = Scheduler.new
29
- timed_indexing scheduler do
30
- prepare scheduler
31
- scheduler.finish
32
-
33
- cache scheduler
34
- scheduler.finish
35
- end
19
+ @tokenizer = Tokenizer.from options
36
20
  end
37
21
 
38
22
  # Calling prepare on an index will call prepare
@@ -46,9 +30,7 @@ module Picky
46
30
  check_source_empty
47
31
  prepare_in_parallel scheduler
48
32
  else
49
- with_data_snapshot do
50
- categories.prepare scheduler
51
- end
33
+ with_data_snapshot { categories.prepare scheduler }
52
34
  end
53
35
  end
54
36
 
@@ -98,7 +80,13 @@ module Picky
98
80
  #
99
81
  def source some_source = nil, &block
100
82
  some_source ||= block
101
- some_source ? (@source = extract_source(some_source)) : unblock_source
83
+ some_source ? (@source = Source.from(some_source, false, name)) : unblock_source
84
+ end
85
+ # Get the actual source if it is wrapped in a time
86
+ # capsule, i.e. a block/lambda.
87
+ #
88
+ def unblock_source
89
+ @source.respond_to?(:call) ? @source.call : @source
102
90
  end
103
91
 
104
92
  # Define a key_format on the index.
@@ -5,14 +5,17 @@ module Picky
5
5
  class Indexes
6
6
 
7
7
  extend Helpers::Indexing
8
+ include Helpers::Indexing
8
9
 
9
10
  instance_delegate :clear,
10
11
  :tokenizer
11
12
 
12
- each_delegate :clear,
13
+ each_delegate :cache,
14
+ :clear,
15
+ :prepare,
13
16
  :to => :indexes
14
17
 
15
- #
18
+ # Overrides index from the helper.
16
19
  #
17
20
  def self.index scheduler = Scheduler.new
18
21
  timed_indexing scheduler do
@@ -20,18 +23,6 @@ module Picky
20
23
  end
21
24
  end
22
25
 
23
- #
24
- #
25
- def index scheduler = Scheduler.new
26
- indexes.each { |index| index.prepare scheduler }
27
- scheduler.finish
28
-
29
- # timed_exclaim "Tokenizing finished, generating data for indexes from tokenized data."
30
-
31
- indexes.each { |index| index.cache scheduler }
32
- scheduler.finish
33
- end
34
-
35
26
  #
36
27
  #
37
28
  def tokenizer