picky 3.6.7 → 3.6.8
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/backends/file/basic.rb +1 -1
- data/lib/picky/backends/file/json.rb +5 -1
- data/lib/picky/backends/file.rb +7 -0
- data/lib/picky/backends/memory.rb +7 -0
- data/lib/picky/backends/redis/basic.rb +3 -11
- data/lib/picky/backends/redis/directly_manipulable.rb +48 -0
- data/lib/picky/backends/redis/list.rb +39 -15
- data/lib/picky/backends/redis/string.rb +17 -9
- data/lib/picky/backends/redis.rb +102 -66
- data/lib/picky/backends/sqlite/array.rb +38 -0
- data/lib/picky/backends/sqlite/basic.rb +100 -0
- data/lib/picky/backends/sqlite/directly_manipulable.rb +42 -0
- data/lib/picky/backends/sqlite/value.rb +34 -0
- data/lib/picky/backends/sqlite.rb +14 -4
- data/lib/picky/bundle.rb +12 -5
- data/lib/picky/bundle_indexed.rb +15 -2
- data/lib/picky/bundle_indexing.rb +6 -5
- data/lib/picky/bundle_realtime.rb +22 -31
- data/lib/picky/categories_realtime.rb +1 -1
- data/lib/picky/category_indexed.rb +1 -1
- data/lib/picky/category_indexing.rb +7 -5
- data/lib/picky/category_realtime.rb +17 -5
- data/lib/picky/generators/strategy.rb +4 -0
- data/lib/picky/index_indexing.rb +1 -4
- data/lib/picky/index_realtime.rb +16 -6
- data/lib/picky/indexers/base.rb +7 -1
- data/lib/picky/indexes.rb +1 -0
- data/lib/picky/loader.rb +11 -7
- data/lib/picky/query/allocation.rb +1 -1
- data/lib/picky/query/indexes.rb +2 -2
- data/lib/picky/query/token.rb +1 -1
- data/lib/picky/search.rb +20 -8
- data/lib/picky/tokenizer.rb +6 -6
- data/lib/picky/wrappers/bundle/delegators.rb +3 -1
- data/spec/category_realtime_spec.rb +33 -0
- data/spec/functional/backends/file_spec.rb +98 -0
- data/spec/functional/backends/memory_spec.rb +96 -0
- data/spec/functional/backends/redis_spec.rb +107 -0
- data/spec/functional/backends/sqlite_spec.rb +104 -0
- data/spec/{specific → functional}/dynamic_weights_spec.rb +0 -0
- data/spec/{specific → functional}/exact_first_spec.rb +2 -4
- data/spec/functional/max_allocations_spec.rb +33 -0
- data/spec/{specific → functional}/realtime_spec.rb +0 -0
- data/spec/{specific → functional}/regression_spec.rb +0 -0
- data/spec/{specific → functional}/speed_spec.rb +0 -0
- data/spec/lib/backends/file/basic_spec.rb +1 -1
- data/spec/lib/backends/redis/basic_spec.rb +12 -13
- data/spec/lib/backends/redis/directly_manipulable_spec.rb +91 -0
- data/spec/lib/backends/redis/float_spec.rb +17 -17
- data/spec/lib/backends/redis/list_spec.rb +9 -9
- data/spec/lib/backends/sqlite/array_spec.rb +143 -0
- data/spec/lib/backends/sqlite/directly_manipulable_spec.rb +65 -0
- data/spec/lib/backends/sqlite/{db_spec.rb → value_spec.rb} +2 -7
- data/spec/lib/backends/sqlite_spec.rb +22 -20
- data/spec/lib/category_indexed_spec.rb +1 -1
- data/spec/lib/category_indexing_spec.rb +2 -2
- data/spec/lib/index_indexing_spec.rb +0 -7
- data/spec/lib/index_realtime_spec.rb +34 -0
- data/spec/lib/indexed/bundle_realtime_spec.rb +166 -75
- data/spec/lib/indexers/base_spec.rb +13 -1
- data/spec/lib/search_spec.rb +31 -20
- metadata +58 -34
- data/lib/picky/backends/sqlite/db.rb +0 -84
@@ -0,0 +1,34 @@
|
|
1
|
+
module Picky
|
2
|
+
|
3
|
+
module Backends
|
4
|
+
|
5
|
+
class SQLite
|
6
|
+
|
7
|
+
class Value < Basic
|
8
|
+
|
9
|
+
def []= key, value
|
10
|
+
db.execute 'insert or replace into key_value (key, value) values (?,?)',
|
11
|
+
key.to_s,
|
12
|
+
Yajl::Encoder.encode(value)
|
13
|
+
|
14
|
+
value
|
15
|
+
end
|
16
|
+
|
17
|
+
def [] key
|
18
|
+
res = db.execute "select value from key_value where key = ? limit 1;", key.to_s
|
19
|
+
return nil if res.empty?
|
20
|
+
|
21
|
+
Yajl::Parser.parse res.first.first
|
22
|
+
end
|
23
|
+
|
24
|
+
def delete key
|
25
|
+
db.execute "delete from key_value where key = (?)", key.to_s
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -4,8 +4,11 @@ module Picky
|
|
4
4
|
|
5
5
|
class SQLite < Backend
|
6
6
|
|
7
|
+
attr_reader :self_indexed
|
8
|
+
|
7
9
|
def initialize options = {}
|
8
10
|
super options
|
11
|
+
@self_indexed = options[:self_indexed]
|
9
12
|
|
10
13
|
require 'sqlite3'
|
11
14
|
rescue LoadError => e
|
@@ -17,28 +20,35 @@ module Picky
|
|
17
20
|
#
|
18
21
|
def create_inverted bundle
|
19
22
|
extract_lambda_or(inverted, bundle) ||
|
20
|
-
|
23
|
+
Array.new(bundle.index_path(:inverted), self_indexed: self_indexed)
|
21
24
|
end
|
22
25
|
# Returns an object that on #initial, #load returns an object that responds to:
|
23
26
|
# [:token] # => 1.23 (a weight)
|
24
27
|
#
|
25
28
|
def create_weights bundle
|
26
29
|
extract_lambda_or(weights, bundle) ||
|
27
|
-
|
30
|
+
Value.new(bundle.index_path(:weights), self_indexed: self_indexed)
|
28
31
|
end
|
29
32
|
# Returns an object that on #initial, #load returns an object that responds to:
|
30
33
|
# [:encoded] # => [:original, :original] (an array of original symbols this similarity encoded thing maps to)
|
31
34
|
#
|
32
35
|
def create_similarity bundle
|
33
36
|
extract_lambda_or(similarity, bundle) ||
|
34
|
-
|
37
|
+
Array.new(bundle.index_path(:similarity), self_indexed: self_indexed)
|
35
38
|
end
|
36
39
|
# Returns an object that on #initial, #load returns an object that responds to:
|
37
40
|
# [:key] # => value (a value for this config key)
|
38
41
|
#
|
39
42
|
def create_configuration bundle
|
40
43
|
extract_lambda_or(configuration, bundle) ||
|
41
|
-
|
44
|
+
Value.new(bundle.index_path(:configuration), self_indexed: self_indexed)
|
45
|
+
end
|
46
|
+
# Returns an object that on #initial, #load returns an object that responds to:
|
47
|
+
# [id] # => [:sym1, :sym2]
|
48
|
+
#
|
49
|
+
def create_realtime bundle
|
50
|
+
extract_lambda_or(similarity, bundle) ||
|
51
|
+
Array.new(bundle.index_path(:realtime), self_indexed: self_indexed)
|
42
52
|
end
|
43
53
|
|
44
54
|
# Returns the result ids for the allocation.
|
data/lib/picky/bundle.rb
CHANGED
@@ -29,6 +29,7 @@ module Picky
|
|
29
29
|
:weights,
|
30
30
|
:similarity,
|
31
31
|
:configuration,
|
32
|
+
:realtime,
|
32
33
|
|
33
34
|
:backend_inverted,
|
34
35
|
:backend_weights,
|
@@ -73,12 +74,11 @@ module Picky
|
|
73
74
|
def reset_backend
|
74
75
|
# Extract specific indexes from backend.
|
75
76
|
#
|
76
|
-
# TODO Clean up all related.
|
77
|
-
#
|
78
77
|
@backend_inverted = backend.create_inverted self
|
79
78
|
@backend_weights = backend.create_weights self
|
80
79
|
@backend_similarity = backend.create_similarity self
|
81
80
|
@backend_configuration = backend.create_configuration self
|
81
|
+
@backend_realtime = backend.create_realtime self
|
82
82
|
|
83
83
|
# Initial indexes.
|
84
84
|
#
|
@@ -89,8 +89,7 @@ module Picky
|
|
89
89
|
@weights = @weights_strategy.saved?? @backend_weights.initial : @weights_strategy
|
90
90
|
@similarity = @backend_similarity.initial
|
91
91
|
@configuration = @backend_configuration.initial
|
92
|
-
|
93
|
-
@realtime_mapping = {} # id -> ary of syms. TODO Always instantiate? d
|
92
|
+
@realtime = @backend_realtime.initial
|
94
93
|
end
|
95
94
|
|
96
95
|
# "Empties" the index(es) by getting a new empty
|
@@ -101,6 +100,7 @@ module Picky
|
|
101
100
|
empty_weights
|
102
101
|
empty_similarity
|
103
102
|
empty_configuration
|
103
|
+
empty_realtime
|
104
104
|
end
|
105
105
|
def empty_inverted
|
106
106
|
@inverted = @backend_inverted.empty
|
@@ -116,6 +116,9 @@ module Picky
|
|
116
116
|
def empty_configuration
|
117
117
|
@configuration = @backend_configuration.empty
|
118
118
|
end
|
119
|
+
def empty_realtime
|
120
|
+
@realtime = @backend_realtime.empty
|
121
|
+
end
|
119
122
|
|
120
123
|
# Get a list of similar texts.
|
121
124
|
#
|
@@ -124,7 +127,10 @@ module Picky
|
|
124
127
|
def similar text
|
125
128
|
code = similarity_strategy.encoded text
|
126
129
|
similar_codes = code && @similarity[code]
|
127
|
-
|
130
|
+
if similar_codes
|
131
|
+
similar_codes = similar_codes.dup # TODO
|
132
|
+
similar_codes.delete text
|
133
|
+
end
|
128
134
|
similar_codes || []
|
129
135
|
end
|
130
136
|
|
@@ -158,6 +164,7 @@ module Picky
|
|
158
164
|
@backend_weights.delete if @backend_weights.respond_to?(:delete) && @weights_strategy.saved?
|
159
165
|
@backend_similarity.delete if @backend_similarity.respond_to? :delete
|
160
166
|
@backend_configuration.delete if @backend_configuration.respond_to? :delete
|
167
|
+
@backend_realtime.delete if @backend_realtime.respond_to? :delete
|
161
168
|
end
|
162
169
|
|
163
170
|
def to_s
|
data/lib/picky/bundle_indexed.rb
CHANGED
@@ -16,12 +16,13 @@ module Picky
|
|
16
16
|
#
|
17
17
|
class Bundle
|
18
18
|
|
19
|
-
attr_reader :realtime_mapping
|
20
|
-
|
21
19
|
# Get the ids for the given symbol.
|
22
20
|
#
|
23
21
|
# Returns a (potentially empty) array of ids.
|
24
22
|
#
|
23
|
+
# TODO Empty string ok, or does it need to be from the backend?
|
24
|
+
# Should the backend always return an empty array? (Probably no)
|
25
|
+
#
|
25
26
|
def ids sym_or_string
|
26
27
|
@inverted[sym_or_string] || []
|
27
28
|
end
|
@@ -52,6 +53,7 @@ module Picky
|
|
52
53
|
load_weights
|
53
54
|
load_similarity
|
54
55
|
load_configuration
|
56
|
+
load_realtime
|
55
57
|
end
|
56
58
|
|
57
59
|
# Loads the core index.
|
@@ -76,6 +78,11 @@ module Picky
|
|
76
78
|
def load_configuration
|
77
79
|
self.configuration = @backend_configuration.load
|
78
80
|
end
|
81
|
+
# Loads the realtime mapping.
|
82
|
+
#
|
83
|
+
def load_realtime
|
84
|
+
self.realtime = @backend_realtime.load
|
85
|
+
end
|
79
86
|
|
80
87
|
# Clears all indexes.
|
81
88
|
#
|
@@ -84,6 +91,7 @@ module Picky
|
|
84
91
|
clear_weights
|
85
92
|
clear_similarity
|
86
93
|
clear_configuration
|
94
|
+
clear_realtime
|
87
95
|
end
|
88
96
|
|
89
97
|
# Clears the core index.
|
@@ -106,6 +114,11 @@ module Picky
|
|
106
114
|
def clear_configuration
|
107
115
|
configuration.clear
|
108
116
|
end
|
117
|
+
# Clears the realtime mapping.
|
118
|
+
#
|
119
|
+
def clear_realtime
|
120
|
+
realtime.clear
|
121
|
+
end
|
109
122
|
|
110
123
|
end
|
111
124
|
|
@@ -28,11 +28,6 @@ module Picky
|
|
28
28
|
#
|
29
29
|
class Bundle
|
30
30
|
|
31
|
-
# When indexing, clear only clears the inverted index.
|
32
|
-
#
|
33
|
-
delegate :clear,
|
34
|
-
:to => :inverted
|
35
|
-
|
36
31
|
# Saves the indexes in a dump file.
|
37
32
|
#
|
38
33
|
def dump
|
@@ -40,6 +35,7 @@ module Picky
|
|
40
35
|
dump_similarity
|
41
36
|
dump_weights
|
42
37
|
dump_configuration
|
38
|
+
dump_realtime
|
43
39
|
end
|
44
40
|
# Dumps the core index.
|
45
41
|
#
|
@@ -63,6 +59,11 @@ module Picky
|
|
63
59
|
def dump_configuration
|
64
60
|
@backend_configuration.dump @configuration
|
65
61
|
end
|
62
|
+
# Dumps the realtime.
|
63
|
+
#
|
64
|
+
def dump_realtime
|
65
|
+
@backend_realtime.dump @realtime
|
66
|
+
end
|
66
67
|
|
67
68
|
end
|
68
69
|
|
@@ -7,36 +7,31 @@ module Picky
|
|
7
7
|
def remove id
|
8
8
|
# Is it anywhere?
|
9
9
|
#
|
10
|
-
syms = @
|
10
|
+
syms = @realtime[id]
|
11
11
|
return unless syms
|
12
12
|
|
13
13
|
syms.each do |sym|
|
14
14
|
ids = @inverted[sym]
|
15
15
|
ids.delete id
|
16
16
|
|
17
|
-
encoded = self.similarity_strategy.encoded sym
|
18
|
-
|
19
17
|
if ids.empty?
|
20
|
-
@inverted.delete
|
21
|
-
@weights.delete
|
18
|
+
@inverted.delete sym
|
19
|
+
@weights.delete sym
|
22
20
|
# Since no element uses this sym anymore, we can delete the similarity for it.
|
23
21
|
# TODO Not really. Since multiple syms can point to the same encoded.
|
24
|
-
@similarity.delete encoded
|
22
|
+
@similarity.delete self.similarity_strategy.encoded(sym)
|
25
23
|
else
|
26
24
|
@weights[sym] = self.weights_strategy.weight_for ids.size
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
30
|
-
@
|
28
|
+
@realtime.delete id
|
31
29
|
end
|
32
30
|
|
33
31
|
# Returns a reference to the array where the id has been added.
|
34
32
|
#
|
35
33
|
def add id, str_or_sym, where = :unshift
|
36
|
-
|
37
|
-
|
38
|
-
str_or_syms = @realtime_mapping[id]
|
39
|
-
str_or_syms = (@realtime_mapping[id] = []) unless str_or_syms # TODO Nicefy.
|
34
|
+
str_or_syms = @realtime[id] || (@realtime[id] = [])
|
40
35
|
|
41
36
|
# Inverted.
|
42
37
|
#
|
@@ -46,7 +41,10 @@ module Picky
|
|
46
41
|
ids.send where, id
|
47
42
|
else
|
48
43
|
str_or_syms << str_or_sym
|
49
|
-
|
44
|
+
|
45
|
+
# TODO Introduce a new method?
|
46
|
+
#
|
47
|
+
ids = @inverted[str_or_sym] || (@inverted[str_or_sym] = []) # Ensures that we get an extended Array
|
50
48
|
ids.send where, id
|
51
49
|
end
|
52
50
|
|
@@ -69,13 +67,12 @@ module Picky
|
|
69
67
|
#
|
70
68
|
def add_similarity str_or_sym, where = :unshift
|
71
69
|
if encoded = self.similarity_strategy.encoded(str_or_sym)
|
72
|
-
similarity = @similarity[encoded]
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
end
|
70
|
+
similarity = @similarity[encoded] || (@similarity[encoded] = []) # Ensures that we get an extended Array
|
71
|
+
|
72
|
+
# Not completely correct, as others will also be affected, but meh.
|
73
|
+
#
|
74
|
+
similarity.delete str_or_sym if similarity.include? str_or_sym
|
75
|
+
similarity.send where, str_or_sym
|
79
76
|
end
|
80
77
|
end
|
81
78
|
|
@@ -87,29 +84,23 @@ module Picky
|
|
87
84
|
end
|
88
85
|
end
|
89
86
|
|
90
|
-
# Clears the realtime mapping.
|
91
|
-
#
|
92
|
-
def clear_realtime_mapping
|
93
|
-
@realtime_mapping.clear
|
94
|
-
end
|
95
|
-
|
96
87
|
# Builds the realtime mapping.
|
97
88
|
#
|
98
89
|
# Note: Experimental feature.
|
99
90
|
#
|
100
91
|
# TODO Subset of #add. Rewrite.
|
101
92
|
#
|
102
|
-
def
|
103
|
-
|
93
|
+
def build_realtime
|
94
|
+
clear_realtime
|
104
95
|
@inverted.each_pair do |str_or_sym, ids|
|
105
96
|
ids.each do |id|
|
106
|
-
str_or_syms = @
|
107
|
-
str_or_syms = (@
|
108
|
-
@
|
97
|
+
str_or_syms = @realtime[id]
|
98
|
+
str_or_syms = (@realtime[id] = []) unless str_or_syms # TODO Nicefy.
|
99
|
+
@realtime[id] << str_or_sym unless str_or_syms.include? str_or_sym
|
109
100
|
end
|
110
101
|
end
|
111
102
|
end
|
112
103
|
|
113
104
|
end
|
114
105
|
|
115
|
-
end
|
106
|
+
end
|
@@ -51,7 +51,7 @@ module Picky
|
|
51
51
|
empty
|
52
52
|
retrieve
|
53
53
|
dump
|
54
|
-
|
54
|
+
clear_realtime # TODO To call or not to call, that is the question.
|
55
55
|
end
|
56
56
|
|
57
57
|
# Retrieves the prepared index data into the indexes and
|
@@ -107,12 +107,14 @@ module Picky
|
|
107
107
|
@tokenizer || @index.tokenizer
|
108
108
|
end
|
109
109
|
|
110
|
-
#
|
110
|
+
# Clears the caches.
|
111
|
+
#
|
112
|
+
# TODO Think about the semantics of clear.
|
113
|
+
# Is a delete even needed or is it clear+dump?
|
111
114
|
#
|
112
115
|
def clear
|
113
|
-
|
114
|
-
|
115
|
-
partial.delete
|
116
|
+
exact.clear
|
117
|
+
partial.clear
|
116
118
|
end
|
117
119
|
|
118
120
|
end
|
@@ -27,6 +27,18 @@ module Picky
|
|
27
27
|
add object, where
|
28
28
|
end
|
29
29
|
|
30
|
+
# Add at the end.
|
31
|
+
#
|
32
|
+
def << thing
|
33
|
+
add thing, __method__
|
34
|
+
end
|
35
|
+
|
36
|
+
# Add at the beginning.
|
37
|
+
#
|
38
|
+
def unshift thing
|
39
|
+
add thing, __method__
|
40
|
+
end
|
41
|
+
|
30
42
|
# For the given id, adds the list of
|
31
43
|
# strings to the index for the given id.
|
32
44
|
#
|
@@ -47,16 +59,16 @@ module Picky
|
|
47
59
|
|
48
60
|
# Clears the realtime mapping.
|
49
61
|
#
|
50
|
-
def
|
51
|
-
exact.
|
52
|
-
partial.
|
62
|
+
def clear_realtime
|
63
|
+
exact.clear_realtime
|
64
|
+
partial.clear_realtime
|
53
65
|
end
|
54
66
|
|
55
67
|
# Builds the realtime mapping.
|
56
68
|
#
|
57
69
|
def build_realtime_mapping
|
58
|
-
exact.
|
59
|
-
partial.
|
70
|
+
exact.build_realtime
|
71
|
+
partial.build_realtime
|
60
72
|
end
|
61
73
|
|
62
74
|
end
|
data/lib/picky/index_indexing.rb
CHANGED
@@ -87,7 +87,7 @@ module Picky
|
|
87
87
|
#
|
88
88
|
def source some_source = nil, &block
|
89
89
|
some_source ||= block
|
90
|
-
some_source ? define_source(some_source) : (@source && extract_source
|
90
|
+
some_source ? define_source(some_source) : (@source && extract_source)
|
91
91
|
end
|
92
92
|
# Extract the actual source if it is wrapped in a time
|
93
93
|
# capsule, i.e. a block/lambda.
|
@@ -101,9 +101,6 @@ module Picky
|
|
101
101
|
check_source source
|
102
102
|
@source = source
|
103
103
|
end
|
104
|
-
def warn_no_source
|
105
|
-
warn "No source given for index #{name}."
|
106
|
-
end
|
107
104
|
def check_source source # :nodoc:
|
108
105
|
raise ArgumentError.new(<<-SOURCE
|
109
106
|
|
data/lib/picky/index_realtime.rb
CHANGED
@@ -4,15 +4,25 @@ module Picky
|
|
4
4
|
#
|
5
5
|
class Index
|
6
6
|
|
7
|
-
#
|
8
|
-
|
9
|
-
|
10
|
-
:
|
11
|
-
:replace,
|
12
|
-
:clear_realtime_mapping,
|
7
|
+
delegate :remove, # aka "delete".
|
8
|
+
:add, # aka "insert".
|
9
|
+
:replace, # aka "insert or update".
|
10
|
+
:clear_realtime,
|
13
11
|
:build_realtime_mapping,
|
14
12
|
:to => :categories
|
15
13
|
|
14
|
+
# Add at the end.
|
15
|
+
#
|
16
|
+
def << thing
|
17
|
+
add thing, __method__
|
18
|
+
end
|
19
|
+
|
20
|
+
# Add at the beginning (calls add).
|
21
|
+
#
|
22
|
+
def unshift thing
|
23
|
+
add thing, __method__
|
24
|
+
end
|
25
|
+
|
16
26
|
end
|
17
27
|
|
18
28
|
end
|
data/lib/picky/indexers/base.rb
CHANGED
@@ -10,7 +10,8 @@ module Picky
|
|
10
10
|
|
11
11
|
attr_reader :index_or_category
|
12
12
|
|
13
|
-
delegate :source,
|
13
|
+
delegate :source,
|
14
|
+
:to => :index_or_category
|
14
15
|
|
15
16
|
def initialize index_or_category
|
16
17
|
@index_or_category = index_or_category
|
@@ -19,6 +20,7 @@ module Picky
|
|
19
20
|
# Starts the indexing process.
|
20
21
|
#
|
21
22
|
def index categories
|
23
|
+
check_source
|
22
24
|
categories.empty
|
23
25
|
process categories do |file|
|
24
26
|
notify_finished file
|
@@ -26,6 +28,10 @@ module Picky
|
|
26
28
|
categories.cache
|
27
29
|
end
|
28
30
|
|
31
|
+
def check_source # :nodoc:
|
32
|
+
raise "Trying to index without a source for #{@index_or_category.name}." unless source
|
33
|
+
end
|
34
|
+
|
29
35
|
def notify_finished file
|
30
36
|
timed_exclaim %Q{"#{@index_or_category.identifier}": Tokenized -> #{file.path.gsub("#{PICKY_ROOT}/", '')}.}
|
31
37
|
end
|
data/lib/picky/indexes.rb
CHANGED
data/lib/picky/loader.rb
CHANGED
@@ -112,12 +112,6 @@ module Picky
|
|
112
112
|
load_relative 'backends/helpers/file'
|
113
113
|
load_relative 'backends/backend'
|
114
114
|
|
115
|
-
load_relative 'backends/redis'
|
116
|
-
load_relative 'backends/redis/basic'
|
117
|
-
load_relative 'backends/redis/list'
|
118
|
-
load_relative 'backends/redis/string'
|
119
|
-
load_relative 'backends/redis/float'
|
120
|
-
|
121
115
|
load_relative 'backends/memory'
|
122
116
|
load_relative 'backends/memory/basic'
|
123
117
|
load_relative 'backends/memory/text'
|
@@ -128,8 +122,18 @@ module Picky
|
|
128
122
|
load_relative 'backends/file/basic'
|
129
123
|
load_relative 'backends/file/json'
|
130
124
|
|
125
|
+
load_relative 'backends/redis'
|
126
|
+
load_relative 'backends/redis/directly_manipulable'
|
127
|
+
load_relative 'backends/redis/basic'
|
128
|
+
load_relative 'backends/redis/list'
|
129
|
+
load_relative 'backends/redis/string'
|
130
|
+
load_relative 'backends/redis/float'
|
131
|
+
|
131
132
|
load_relative 'backends/sqlite'
|
132
|
-
load_relative 'backends/sqlite/
|
133
|
+
load_relative 'backends/sqlite/directly_manipulable'
|
134
|
+
load_relative 'backends/sqlite/basic'
|
135
|
+
load_relative 'backends/sqlite/array'
|
136
|
+
load_relative 'backends/sqlite/value'
|
133
137
|
|
134
138
|
# Indexing and Indexed things.
|
135
139
|
#
|
@@ -18,7 +18,7 @@ module Picky
|
|
18
18
|
def initialize index, combinations
|
19
19
|
@combinations = combinations
|
20
20
|
@result_identifier = index.result_identifier # TODO Make cleverer.
|
21
|
-
@backend = index.backend # TODO Make cleverer.
|
21
|
+
@backend = index.backend # TODO Make cleverer. Use inverted?
|
22
22
|
end
|
23
23
|
|
24
24
|
def hash
|
data/lib/picky/query/indexes.rb
CHANGED
@@ -54,7 +54,7 @@ module Picky
|
|
54
54
|
|
55
55
|
# Returns a number of prepared (sorted, reduced etc.) allocations for the given tokens.
|
56
56
|
#
|
57
|
-
def prepared_allocations_for tokens, weights = {}
|
57
|
+
def prepared_allocations_for tokens, weights = {}, amount = nil
|
58
58
|
allocations = allocations_for tokens
|
59
59
|
|
60
60
|
# Remove double allocations.
|
@@ -72,7 +72,7 @@ module Picky
|
|
72
72
|
|
73
73
|
# Reduce the amount of allocations.
|
74
74
|
#
|
75
|
-
|
75
|
+
allocations.reduce_to amount if amount
|
76
76
|
|
77
77
|
# Remove categories from allocations.
|
78
78
|
#
|
data/lib/picky/query/token.rb
CHANGED
@@ -132,7 +132,7 @@ module Picky
|
|
132
132
|
# (We avoid a StopIteration exception. Which of both is less evil?)
|
133
133
|
#
|
134
134
|
def generate_similarity_for bundle
|
135
|
-
bundle.similar(@text)
|
135
|
+
bundle.similar(@text) || []
|
136
136
|
end
|
137
137
|
|
138
138
|
# Splits text into a qualifier and text.
|
data/lib/picky/search.rb
CHANGED
@@ -49,6 +49,8 @@ module Picky
|
|
49
49
|
self
|
50
50
|
end
|
51
51
|
|
52
|
+
# Defines tokenizer options or the tokenizer itself.
|
53
|
+
#
|
52
54
|
# Examples:
|
53
55
|
# search = Search.new(index1, index2, index3) do
|
54
56
|
# searching removes_characters: /[^a-z]/,
|
@@ -67,6 +69,17 @@ module Picky
|
|
67
69
|
end
|
68
70
|
end
|
69
71
|
|
72
|
+
# Sets the max amount of allocations to calculate.
|
73
|
+
#
|
74
|
+
# Examples:
|
75
|
+
# search = Search.new(index1, index2, index3) do
|
76
|
+
# max_allocations 10
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
def max_allocations amount = nil
|
80
|
+
amount ? @max_allocations = amount : @max_allocations
|
81
|
+
end
|
82
|
+
|
70
83
|
# Examples:
|
71
84
|
# search = Search.new(books_index, dvd_index, mp3_index) do
|
72
85
|
# boost [:author, :title] => +3,
|
@@ -161,7 +174,7 @@ module Picky
|
|
161
174
|
# Note: Internal method, use #search to search.
|
162
175
|
#
|
163
176
|
def execute tokens, ids, offset, original_text = nil
|
164
|
-
Results.from original_text, ids, offset, sorted_allocations(tokens)
|
177
|
+
Results.from original_text, ids, offset, sorted_allocations(tokens, @max_allocations)
|
165
178
|
end
|
166
179
|
|
167
180
|
# Delegates the tokenizing to the query tokenizer.
|
@@ -182,19 +195,18 @@ module Picky
|
|
182
195
|
|
183
196
|
# Gets sorted allocations for the tokens.
|
184
197
|
#
|
185
|
-
def sorted_allocations tokens # :nodoc:
|
186
|
-
indexes.prepared_allocations_for tokens, weights
|
198
|
+
def sorted_allocations tokens, amount = nil # :nodoc:
|
199
|
+
indexes.prepared_allocations_for tokens, weights, amount
|
187
200
|
end
|
188
201
|
|
189
202
|
# Display some nice information for the user.
|
190
203
|
#
|
191
204
|
def to_s
|
192
205
|
s = "#{self.class}("
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
s << "weights: #{@weights}"
|
206
|
+
ary = []
|
207
|
+
ary << @indexes.indexes.map(&:name).join(', ') unless @indexes.indexes.empty?
|
208
|
+
ary << "weights: #{@weights}" if @weights
|
209
|
+
s << ary.join(', ')
|
198
210
|
s << ")"
|
199
211
|
s
|
200
212
|
end
|