picky 3.6.16 → 4.0.0pre1
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.
- data/lib/picky/application.rb +1 -1
- data/lib/picky/backends/backend.rb +2 -0
- data/lib/picky/backends/memory.rb +14 -7
- data/lib/picky/backends/{memory → prepared}/text.rb +10 -4
- data/lib/picky/backends/redis/directly_manipulable.rb +3 -5
- data/lib/picky/backends/redis/list.rb +5 -1
- data/lib/picky/backends/sqlite/basic.rb +4 -2
- data/lib/picky/bundle.rb +6 -7
- data/lib/picky/bundle_indexed.rb +2 -2
- data/lib/picky/bundle_realtime.rb +8 -7
- data/lib/picky/categories.rb +0 -1
- data/lib/picky/categories_indexing.rb +14 -0
- data/lib/picky/category.rb +3 -5
- data/lib/picky/category_indexed.rb +2 -5
- data/lib/picky/category_indexing.rb +28 -16
- data/lib/picky/constants.rb +3 -1
- data/lib/picky/frontend_adapters/rack.rb +2 -2
- data/lib/picky/generators/similarity/phonetic.rb +6 -14
- data/lib/picky/generators/strategy.rb +1 -1
- data/lib/picky/generators/weights/runtime.rb +2 -2
- data/lib/picky/helpers/indexing.rb +20 -0
- data/lib/picky/index.rb +7 -10
- data/lib/picky/index_indexed.rb +1 -8
- data/lib/picky/index_indexing.rb +44 -42
- data/lib/picky/indexers/base.rb +5 -6
- data/lib/picky/indexers/parallel.rb +35 -32
- data/lib/picky/indexers/serial.rb +38 -15
- data/lib/picky/indexes_indexed.rb +0 -7
- data/lib/picky/indexes_indexing.rb +16 -19
- data/lib/picky/loader.rb +6 -4
- data/lib/picky/query/allocation.rb +7 -2
- data/lib/picky/query/combination.rb +1 -1
- data/lib/picky/query/indexes.rb +1 -1
- data/lib/picky/query/indexes_check.rb +12 -14
- data/lib/picky/query/token.rb +33 -15
- data/lib/picky/results/exact_first.rb +53 -0
- data/lib/picky/scheduler.rb +43 -0
- data/lib/picky/search.rb +0 -2
- data/lib/picky/sources/csv.rb +2 -3
- data/lib/picky/sources/db.rb +4 -3
- data/lib/picky/sources/mongo.rb +1 -1
- data/lib/picky/tokenizer.rb +0 -4
- data/lib/picky/wrappers/bundle/location.rb +1 -1
- data/lib/picky.rb +2 -2
- data/lib/tasks/index.rake +13 -14
- data/spec/functional/backends/file_spec.rb +2 -4
- data/spec/functional/backends/memory_spec.rb +2 -2
- data/spec/functional/backends/redis_spec.rb +1 -1
- data/spec/functional/exact_first_spec.rb +24 -4
- data/spec/functional/realtime_spec.rb +7 -3
- data/spec/lib/application_spec.rb +30 -30
- data/spec/lib/backends/backend_spec.rb +25 -27
- data/spec/lib/backends/{memory → prepared}/text_spec.rb +1 -1
- data/spec/lib/category_indexing_spec.rb +1 -1
- data/spec/lib/extensions/symbol_spec.rb +1 -1
- data/spec/lib/generators/similarity/phonetic_spec.rb +46 -0
- data/spec/lib/index_indexed_spec.rb +5 -5
- data/spec/lib/index_indexing_spec.rb +13 -12
- data/spec/lib/index_spec.rb +8 -8
- data/spec/lib/indexers/base_spec.rb +5 -6
- data/spec/lib/indexers/parallel_spec.rb +10 -10
- data/spec/lib/indexes_indexed_spec.rb +1 -7
- data/spec/lib/indexes_indexing_spec.rb +10 -5
- data/spec/lib/query/indexes_check_spec.rb +44 -15
- data/spec/lib/query/indexes_spec.rb +11 -11
- data/spec/lib/query/token_spec.rb +10 -0
- data/spec/lib/{indexed/wrappers → results}/exact_first_spec.rb +18 -21
- data/spec/lib/scheduler_spec.rb +92 -0
- metadata +45 -34
- data/lib/picky/cores.rb +0 -127
- data/lib/picky/tokenizers/location.rb +0 -53
- data/lib/picky/wrappers/category/exact_first.rb +0 -94
- data/spec/lib/cores_spec.rb +0 -185
data/lib/picky/application.rb
CHANGED
@@ -200,7 +200,7 @@ module Picky
|
|
200
200
|
Loader.load_user 'app' # Sinatra appfile.
|
201
201
|
Loader.load_user 'app/application' # Standard Picky appfile.
|
202
202
|
finalize_apps
|
203
|
-
exclaim "
|
203
|
+
exclaim "Loaded Picky application(s) with environment '#{PICKY_ENVIRONMENT}' in #{PICKY_ROOT} on Ruby #{RUBY_VERSION}."
|
204
204
|
end
|
205
205
|
|
206
206
|
# Finalize the subclass as soon as it
|
@@ -4,35 +4,40 @@ module Picky
|
|
4
4
|
|
5
5
|
class Memory < Backend
|
6
6
|
|
7
|
-
# Returns an object that on #initial, #load returns
|
7
|
+
# Returns an object that on #initial, #load returns
|
8
|
+
# an object that responds to:
|
8
9
|
# [:token] # => [id, id, id, id, id] (an array of ids)
|
9
10
|
#
|
10
11
|
def create_inverted bundle
|
11
12
|
extract_lambda_or(inverted, bundle) ||
|
12
13
|
JSON.new(bundle.index_path(:inverted))
|
13
14
|
end
|
14
|
-
# Returns an object that on #initial, #load returns
|
15
|
+
# Returns an object that on #initial, #load returns
|
16
|
+
# an object that responds to:
|
15
17
|
# [:token] # => 1.23 (a weight)
|
16
18
|
#
|
17
19
|
def create_weights bundle
|
18
20
|
extract_lambda_or(weights, bundle) ||
|
19
21
|
JSON.new(bundle.index_path(:weights))
|
20
22
|
end
|
21
|
-
# Returns an object that on #initial, #load returns
|
23
|
+
# Returns an object that on #initial, #load returns
|
24
|
+
# an object that responds to:
|
22
25
|
# [:encoded] # => [:original, :original] (an array of original symbols this similarity encoded thing maps to)
|
23
26
|
#
|
24
27
|
def create_similarity bundle
|
25
28
|
extract_lambda_or(similarity, bundle) ||
|
26
29
|
Marshal.new(bundle.index_path(:similarity))
|
27
30
|
end
|
28
|
-
# Returns an object that on #initial, #load returns
|
31
|
+
# Returns an object that on #initial, #load returns
|
32
|
+
# an object that responds to:
|
29
33
|
# [:key] # => value (a value for this config key)
|
30
34
|
#
|
31
35
|
def create_configuration bundle
|
32
36
|
extract_lambda_or(configuration, bundle) ||
|
33
37
|
JSON.new(bundle.index_path(:configuration))
|
34
38
|
end
|
35
|
-
# Returns an object that on #initial, #load returns
|
39
|
+
# Returns an object that on #initial, #load returns
|
40
|
+
# an object that responds to:
|
36
41
|
# [id] # => [:sym1, :sym2]
|
37
42
|
#
|
38
43
|
def create_realtime bundle
|
@@ -50,8 +55,10 @@ module Picky
|
|
50
55
|
# Note: Uses a C-optimized intersection routine (in performant.c)
|
51
56
|
# for speed and memory efficiency.
|
52
57
|
#
|
53
|
-
# Note: In the memory based version we ignore the amount and
|
54
|
-
#
|
58
|
+
# Note: In the memory based version we ignore the amount and
|
59
|
+
# offset hints.
|
60
|
+
# We cannot use the information to speed up the algorithm,
|
61
|
+
# unfortunately.
|
55
62
|
#
|
56
63
|
def ids combinations, _, _
|
57
64
|
# Get the ids for each combination.
|
@@ -2,13 +2,19 @@ module Picky
|
|
2
2
|
|
3
3
|
module Backends
|
4
4
|
|
5
|
-
class
|
5
|
+
class Prepared
|
6
6
|
|
7
7
|
# Index data dumped in the text format.
|
8
8
|
#
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
class Text
|
10
|
+
|
11
|
+
include Helpers::File
|
12
|
+
|
13
|
+
attr_reader :cache_path
|
14
|
+
|
15
|
+
def initialize cache_path, options = {}
|
16
|
+
@cache_path = "#{cache_path}.prepared.#{extension}"
|
17
|
+
end
|
12
18
|
|
13
19
|
# Uses the extension "txt".
|
14
20
|
#
|
@@ -14,7 +14,7 @@ module Picky
|
|
14
14
|
list.key = key
|
15
15
|
end
|
16
16
|
|
17
|
-
#
|
17
|
+
# THINK Current implementation is very brittle.
|
18
18
|
#
|
19
19
|
@@append_index = 0
|
20
20
|
def << value
|
@@ -23,7 +23,7 @@ module Picky
|
|
23
23
|
backend[key]
|
24
24
|
end
|
25
25
|
|
26
|
-
#
|
26
|
+
# THINK Current implementation is very brittle.
|
27
27
|
#
|
28
28
|
@@unshift_index = 0
|
29
29
|
def unshift value
|
@@ -34,9 +34,7 @@ module Picky
|
|
34
34
|
|
35
35
|
def delete value
|
36
36
|
result = super value
|
37
|
-
if result
|
38
|
-
backend.client.zrem "#{backend.namespace}:#{key}", value # TODO if super(value) ?
|
39
|
-
end
|
37
|
+
backend.client.zrem "#{backend.namespace}:#{key}", value if result
|
40
38
|
result
|
41
39
|
end
|
42
40
|
end
|
@@ -54,6 +54,8 @@ module Picky
|
|
54
54
|
|
55
55
|
# Set a single list.
|
56
56
|
#
|
57
|
+
# TODO We should optimize this by only adding. Maybe only add the difference?
|
58
|
+
#
|
57
59
|
def []= key, values
|
58
60
|
redis_key = "#{namespace}:#{key}"
|
59
61
|
i = 0
|
@@ -62,7 +64,9 @@ module Picky
|
|
62
64
|
client.zadd redis_key, i, value
|
63
65
|
end
|
64
66
|
|
65
|
-
|
67
|
+
# We need to return the whole list.
|
68
|
+
#
|
69
|
+
self[key]
|
66
70
|
end
|
67
71
|
|
68
72
|
end
|
@@ -67,9 +67,11 @@ module Picky
|
|
67
67
|
self
|
68
68
|
end
|
69
69
|
|
70
|
+
# Drops the table and creates it anew.
|
71
|
+
#
|
72
|
+
# THINK Could this be replaced by a truncate (DELETE FROM) statement?
|
73
|
+
#
|
70
74
|
def truncate_db
|
71
|
-
# TODO Could this be replaced by a truncate statement?
|
72
|
-
#
|
73
75
|
drop_table
|
74
76
|
create_table
|
75
77
|
end
|
data/lib/picky/bundle.rb
CHANGED
@@ -47,15 +47,13 @@ module Picky
|
|
47
47
|
@name = name
|
48
48
|
@category = category
|
49
49
|
|
50
|
-
# TODO Tidy up a bit.
|
51
|
-
#
|
52
|
-
@key_format = options.delete :key_format
|
53
|
-
@backend = options.delete :backend
|
54
|
-
|
55
50
|
@weights_strategy = weights_strategy
|
56
51
|
@partial_strategy = partial_strategy
|
57
52
|
@similarity_strategy = similarity_strategy
|
58
53
|
|
54
|
+
@key_format = options.delete :key_format
|
55
|
+
@backend = options.delete :backend
|
56
|
+
|
59
57
|
reset_backend
|
60
58
|
end
|
61
59
|
def identifier
|
@@ -106,7 +104,7 @@ module Picky
|
|
106
104
|
@inverted = @backend_inverted.empty
|
107
105
|
end
|
108
106
|
def empty_weights
|
109
|
-
#
|
107
|
+
# THINK about this. Perhaps the strategies should implement the backend methods?
|
110
108
|
#
|
111
109
|
@weights = @weights_strategy.saved?? @backend_weights.empty : @weights_strategy
|
112
110
|
end
|
@@ -126,7 +124,8 @@ module Picky
|
|
126
124
|
#
|
127
125
|
def similar text
|
128
126
|
code = similarity_strategy.encoded text
|
129
|
-
|
127
|
+
return [] unless code
|
128
|
+
similar_codes = @similarity[code]
|
130
129
|
if similar_codes.blank?
|
131
130
|
[] # Return a simple array.
|
132
131
|
else
|
data/lib/picky/bundle_indexed.rb
CHANGED
@@ -20,8 +20,8 @@ module Picky
|
|
20
20
|
#
|
21
21
|
# Returns a (potentially empty) array of ids.
|
22
22
|
#
|
23
|
-
#
|
24
|
-
#
|
23
|
+
# Note: If the backend wants to return a special
|
24
|
+
# enumerable, the backend should do so.
|
25
25
|
#
|
26
26
|
def ids sym_or_string
|
27
27
|
@inverted[sym_or_string] || []
|
@@ -47,8 +47,6 @@ module Picky
|
|
47
47
|
#
|
48
48
|
str_or_syms << str_or_sym
|
49
49
|
|
50
|
-
# TODO Introduce a new method?
|
51
|
-
#
|
52
50
|
ids = @inverted[str_or_sym] ||= []
|
53
51
|
ids.send where, id
|
54
52
|
end
|
@@ -68,8 +66,6 @@ module Picky
|
|
68
66
|
|
69
67
|
# Add string/symbol to similarity index.
|
70
68
|
#
|
71
|
-
# TODO Probably where makes no sense here. Should have its own order.
|
72
|
-
#
|
73
69
|
def add_similarity str_or_sym, where = :unshift
|
74
70
|
if encoded = self.similarity_strategy.encoded(str_or_sym)
|
75
71
|
similars = @similarity[encoded] ||= []
|
@@ -77,7 +73,11 @@ module Picky
|
|
77
73
|
# Not completely correct, as others will also be affected, but meh.
|
78
74
|
#
|
79
75
|
similars.delete str_or_sym if similars.include? str_or_sym
|
80
|
-
similars
|
76
|
+
similars << str_or_sym
|
77
|
+
|
78
|
+
# Uses the sort order of the strategy.
|
79
|
+
#
|
80
|
+
self.similarity_strategy.sort similars, str_or_sym
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
@@ -91,9 +91,10 @@ module Picky
|
|
91
91
|
|
92
92
|
# Builds the realtime mapping.
|
93
93
|
#
|
94
|
-
# Note: Experimental feature.
|
94
|
+
# Note: Experimental feature. Might be removed in 4.0.
|
95
95
|
#
|
96
|
-
# TODO Subset of #add. Rewrite.
|
96
|
+
# TODO Subset of #add. Rewrite, optimize.
|
97
|
+
# THINK Maybe load it and just replace the arrays with the corresponding ones.
|
97
98
|
#
|
98
99
|
def build_realtime
|
99
100
|
clear_realtime
|
data/lib/picky/categories.rb
CHANGED
@@ -2,11 +2,25 @@ module Picky
|
|
2
2
|
|
3
3
|
class Categories
|
4
4
|
|
5
|
+
include Helpers::Indexing
|
6
|
+
|
5
7
|
each_delegate :cache,
|
6
8
|
:clear,
|
7
9
|
:prepare,
|
8
10
|
:to => :categories
|
9
11
|
|
12
|
+
# First prepares all categories,
|
13
|
+
# then caches all categories.
|
14
|
+
#
|
15
|
+
def index scheduler = Scheduler.new
|
16
|
+
timed_indexing scheduler do
|
17
|
+
categories.prepare scheduler
|
18
|
+
scheduler.finish
|
19
|
+
|
20
|
+
categories.cache scheduler
|
21
|
+
scheduler.finish
|
22
|
+
end
|
23
|
+
end
|
10
24
|
end
|
11
25
|
|
12
26
|
end
|
data/lib/picky/category.rb
CHANGED
@@ -55,7 +55,7 @@ module Picky
|
|
55
55
|
@partial = Bundle.new :partial, self, weights, partial, no_similarity, options
|
56
56
|
end
|
57
57
|
|
58
|
-
@prepared = Backends::
|
58
|
+
@prepared = Backends::Prepared::Text.new prepared_index_path
|
59
59
|
end
|
60
60
|
|
61
61
|
# Indexes and loads the category.
|
@@ -70,7 +70,7 @@ module Picky
|
|
70
70
|
def dump
|
71
71
|
exact.dump
|
72
72
|
partial.dump
|
73
|
-
timed_exclaim %Q{"#{identifier}":
|
73
|
+
timed_exclaim %Q{ "#{identifier}": Dumped -> #{index_directory.gsub("#{PICKY_ROOT}/", '')}/#{name}_*.}
|
74
74
|
end
|
75
75
|
|
76
76
|
# Returns the backend.
|
@@ -121,14 +121,12 @@ module Picky
|
|
121
121
|
# Note: If you don't use it with the block, do not forget to close it.
|
122
122
|
#
|
123
123
|
def prepared_index_file &block
|
124
|
-
@prepared_index_file ||= Backends::
|
124
|
+
@prepared_index_file ||= Backends::Prepared::Text.new prepared_index_path
|
125
125
|
@prepared_index_file.open &block
|
126
126
|
end
|
127
127
|
|
128
128
|
# The index directory for this category.
|
129
129
|
#
|
130
|
-
# TODO Push down into files? Yes.
|
131
|
-
#
|
132
130
|
def index_directory
|
133
131
|
@index_directory ||= "#{PICKY_ROOT}/index/#{PICKY_ENVIRONMENT}/#{@index.name}"
|
134
132
|
end
|
@@ -7,14 +7,11 @@ module Picky
|
|
7
7
|
# Loads the index from cache.
|
8
8
|
#
|
9
9
|
def load
|
10
|
-
timed_exclaim %Q{"#{identifier}": Loading index from cache.}
|
11
|
-
clear_realtime #
|
10
|
+
timed_exclaim %Q{ "#{identifier}": Loading index from cache.}
|
11
|
+
clear_realtime # THINK Should we really explicitly clear the realtime? Or should it just be loaded?
|
12
12
|
exact.load
|
13
13
|
partial.load
|
14
14
|
end
|
15
|
-
# TODO Remove in 4.0.
|
16
|
-
#
|
17
|
-
alias reload load
|
18
15
|
|
19
16
|
# Gets the weight for this token's text.
|
20
17
|
#
|
@@ -4,6 +4,8 @@ module Picky
|
|
4
4
|
#
|
5
5
|
class Category
|
6
6
|
|
7
|
+
include Helpers::Indexing
|
8
|
+
|
7
9
|
attr_reader :exact,
|
8
10
|
:partial
|
9
11
|
|
@@ -11,18 +13,37 @@ module Picky
|
|
11
13
|
#
|
12
14
|
# This one should be used by users.
|
13
15
|
#
|
14
|
-
def index
|
15
|
-
|
16
|
-
|
16
|
+
def index scheduler = Scheduler.new
|
17
|
+
timed_indexing scheduler do
|
18
|
+
prepare scheduler
|
19
|
+
scheduler.finish
|
20
|
+
|
21
|
+
cache scheduler
|
22
|
+
scheduler.finish
|
23
|
+
end
|
17
24
|
end
|
18
25
|
|
19
26
|
# Indexes, creates the "prepared_..." file.
|
20
27
|
#
|
21
|
-
def prepare
|
28
|
+
def prepare scheduler = Scheduler.new
|
22
29
|
categories = Categories.new
|
23
30
|
categories << self
|
24
31
|
with_data_snapshot do
|
25
|
-
|
32
|
+
scheduler.schedule do
|
33
|
+
indexer.prepare categories, scheduler
|
34
|
+
nil # TODO Needed so procrastinate is happy. Remove in 4.0.
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Generates all caches for this category.
|
40
|
+
#
|
41
|
+
def cache scheduler = Scheduler.new
|
42
|
+
scheduler.schedule do
|
43
|
+
empty
|
44
|
+
retrieve
|
45
|
+
dump
|
46
|
+
nil # TODO Needed so procrastinate is happy. Remove in 4.0.
|
26
47
|
end
|
27
48
|
end
|
28
49
|
|
@@ -45,15 +66,6 @@ module Picky
|
|
45
66
|
end
|
46
67
|
end
|
47
68
|
|
48
|
-
# Generates all caches for this category.
|
49
|
-
#
|
50
|
-
def cache
|
51
|
-
empty
|
52
|
-
retrieve
|
53
|
-
dump
|
54
|
-
clear_realtime # TODO To call or not to call, that is the question.
|
55
|
-
end
|
56
|
-
|
57
69
|
# Retrieves the prepared index data into the indexes and
|
58
70
|
# generates the necessary derived indexes.
|
59
71
|
#
|
@@ -109,8 +121,8 @@ module Picky
|
|
109
121
|
|
110
122
|
# Clears the caches.
|
111
123
|
#
|
112
|
-
#
|
113
|
-
#
|
124
|
+
# THINK about the semantics of clear.
|
125
|
+
# Is a delete even needed or is it clear+dump?
|
114
126
|
#
|
115
127
|
def clear
|
116
128
|
exact.clear
|
data/lib/picky/constants.rb
CHANGED
@@ -90,8 +90,8 @@ module Picky
|
|
90
90
|
# Note: Rack-mount already handles the 404.
|
91
91
|
#
|
92
92
|
STATUSES = {
|
93
|
-
200 => lambda { |_| [200, { 'Content-Type' => 'text/html', 'Content-Length' => '0' }, [
|
94
|
-
404 => lambda { |_| [404, { 'Content-Type' => 'text/html', 'Content-Length' => '0' }, [
|
93
|
+
200 => lambda { |_| [200, { 'Content-Type' => 'text/html', 'Content-Length' => '0' }, [EMPTY_STRING]] },
|
94
|
+
404 => lambda { |_| [404, { 'Content-Type' => 'text/html', 'Content-Length' => '0' }, [EMPTY_STRING]] }
|
95
95
|
}
|
96
96
|
|
97
97
|
#
|
@@ -23,20 +23,12 @@ module Picky
|
|
23
23
|
@amount = amount
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
#
|
33
|
-
def sort hash
|
34
|
-
hash.each_pair.each do |code, ary|
|
35
|
-
ary.sort_by_levenshtein! code
|
36
|
-
ary.slice! amount, ary.size # size is not perfectly correct, but anyway
|
37
|
-
end
|
38
|
-
hash
|
39
|
-
end
|
26
|
+
# Sorts the index values in place.
|
27
|
+
#
|
28
|
+
def sort ary, code
|
29
|
+
ary.sort_by_levenshtein! code
|
30
|
+
ary.slice! amount, ary.size # THINK size is not perfectly correct, but anyway
|
31
|
+
end
|
40
32
|
|
41
33
|
end
|
42
34
|
|
@@ -9,8 +9,8 @@ module Picky
|
|
9
9
|
# does nothing at all.
|
10
10
|
#
|
11
11
|
# To override, implement:
|
12
|
-
# *
|
13
|
-
# *
|
12
|
+
# * [symbol_or_string] # During runtime.
|
13
|
+
# * weight_for(size) # During indextime. # Probably never used.
|
14
14
|
#
|
15
15
|
# TODO Find a better name.
|
16
16
|
#
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Picky
|
2
|
+
|
3
|
+
# Helper methods for measuring, benchmarking, logging.
|
4
|
+
#
|
5
|
+
module Helpers
|
6
|
+
module Indexing
|
7
|
+
|
8
|
+
include Measuring
|
9
|
+
|
10
|
+
# Returns a duration in seconds.
|
11
|
+
#
|
12
|
+
def timed_indexing scheduler, &block
|
13
|
+
timed_exclaim "Indexing using #{scheduler.fork? ? 'multiple processes' : 'a single process'}."
|
14
|
+
timed_exclaim "Indexing finished after #{timed(&block).round}s."
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
data/lib/picky/index.rb
CHANGED
@@ -167,7 +167,7 @@ module Picky
|
|
167
167
|
# * qualifiers: An array of qualifiers with which you can define which category you’d like to search, for example “title:hobbit” will search for hobbit in just title categories. Example: qualifiers: [:t, :titre, :title] (use it for example with multiple languages). Default is the name of the category.
|
168
168
|
# * qualifier: Convenience options if you just need a single qualifier, see above. Example: qualifiers => :title. Default is the name of the category.
|
169
169
|
# * source: Use a different source than the index uses. If you think you need that, there might be a better solution to your problem. Please post to the mailing list first with your application.rb :)
|
170
|
-
# * from: Take the data from the data category with this name. Example: You have a source Sources::CSV.new(:title, file:'some_file.csv') but you want the category to be called differently. The you use from:
|
170
|
+
# * from: Take the data from the data category with this name. Example: You have a source Sources::CSV.new(:title, file:'some_file.csv') but you want the category to be called differently. The you use from: category(:similar_title, :from => :title).
|
171
171
|
#
|
172
172
|
def category category_name, options = {}
|
173
173
|
new_category = Category.new category_name.intern, self, options
|
@@ -177,7 +177,6 @@ module Picky
|
|
177
177
|
|
178
178
|
new_category
|
179
179
|
end
|
180
|
-
alias define_category category
|
181
180
|
|
182
181
|
# Make this category range searchable with a fixed range. If you need other
|
183
182
|
# ranges, define another category with a different range value.
|
@@ -233,7 +232,7 @@ module Picky
|
|
233
232
|
# Or go crazy and use 4 ranged categories for a space/time search! ;)
|
234
233
|
#
|
235
234
|
# === Parameters
|
236
|
-
# * category_name: The category_name as used in #
|
235
|
+
# * category_name: The category_name as used in #category.
|
237
236
|
# * range: The range (in the units of your data values) around the query point where we search for results.
|
238
237
|
#
|
239
238
|
# -----|<- range ->*------------|-----
|
@@ -241,7 +240,7 @@ module Picky
|
|
241
240
|
# === Options
|
242
241
|
# * precision: Default is 1 (20% error margin, very fast), up to 5 (5% error margin, slower) makes sense.
|
243
242
|
# * anchor: Where to anchor the geo grid.
|
244
|
-
# * ... all options of #
|
243
|
+
# * ... all options of #category.
|
245
244
|
#
|
246
245
|
def ranged_category category_name, range, options = {}
|
247
246
|
precision = options.delete(:precision) || 1
|
@@ -251,19 +250,18 @@ module Picky
|
|
251
250
|
#
|
252
251
|
options = { partial: Partial::None.new }.merge options
|
253
252
|
|
254
|
-
|
255
|
-
Wrappers::Category::Location.wrap
|
253
|
+
category category_name, options do |cat|
|
254
|
+
Wrappers::Category::Location.wrap cat, range, precision, anchor
|
256
255
|
end
|
257
256
|
end
|
258
|
-
alias define_ranged_category ranged_category
|
259
257
|
|
260
258
|
# HIGHLY EXPERIMENTAL Not correctly working yet. Try it if you feel "beta".
|
261
259
|
#
|
262
260
|
# Also a range search see #ranged_category, but on the earth's surface.
|
263
261
|
#
|
264
262
|
# Parameters:
|
265
|
-
# * lat_name: The latitude's name as used in #
|
266
|
-
# * lng_name: The longitude's name as used in #
|
263
|
+
# * lat_name: The latitude's name as used in #category.
|
264
|
+
# * lng_name: The longitude's name as used in #category.
|
267
265
|
# * radius: The distance (in km) around the query point which we search for results.
|
268
266
|
#
|
269
267
|
# Note: Picky uses a square, not a circle. That should be ok for most usages.
|
@@ -317,7 +315,6 @@ module Picky
|
|
317
315
|
ranged_category lng_name, radius*0.01796624, options.merge(from: lng_from)
|
318
316
|
|
319
317
|
end
|
320
|
-
alias define_geo_categories geo_categories
|
321
318
|
|
322
319
|
def to_stats # :nodoc:
|
323
320
|
stats = <<-INDEX
|
data/lib/picky/index_indexed.rb
CHANGED
@@ -10,20 +10,13 @@ module Picky
|
|
10
10
|
:possible_combinations,
|
11
11
|
:to => :categories
|
12
12
|
|
13
|
-
# TODO Remove in 4.0.
|
14
|
-
#
|
15
|
-
alias reload load
|
16
|
-
|
17
13
|
# Define how the results of this index are identified.
|
18
14
|
# (Shown in the client, for example)
|
19
15
|
#
|
20
16
|
# Default is the name of the index.
|
21
17
|
#
|
22
18
|
def result_identifier result_identifier = nil
|
23
|
-
result_identifier ?
|
24
|
-
end
|
25
|
-
def define_result_identifier result_identifier
|
26
|
-
@result_identifier = result_identifier
|
19
|
+
result_identifier ? (@result_identifier = result_identifier) : (@result_identifier || @name)
|
27
20
|
end
|
28
21
|
|
29
22
|
end
|