picky 3.6.16 → 4.0.0pre1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|