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