picky 4.0.0pre2 → 4.0.0pre3
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/aux/picky/cli.rb +1 -1
- data/lib/picky/backends/backend.rb +0 -16
- data/lib/picky/backends/file.rb +5 -10
- data/lib/picky/backends/memory.rb +5 -10
- data/lib/picky/backends/redis/basic.rb +3 -3
- data/lib/picky/backends/redis/list.rb +5 -6
- data/lib/picky/backends/redis/string.rb +1 -1
- data/lib/picky/backends/redis.rb +24 -27
- data/lib/picky/backends/sqlite/basic.rb +4 -4
- data/lib/picky/backends/sqlite.rb +7 -13
- data/lib/picky/bundle.rb +39 -43
- data/lib/picky/bundle_indexed.rb +17 -2
- data/lib/picky/bundle_indexing.rb +1 -26
- data/lib/picky/bundle_realtime.rb +2 -6
- data/lib/picky/category_indexing.rb +2 -2
- data/lib/picky/generators/similarity/phonetic.rb +3 -1
- data/lib/picky/index_indexing.rb +1 -1
- data/lib/picky/indexers/base.rb +5 -4
- data/lib/picky/indexers/parallel.rb +3 -3
- data/lib/picky/indexers/serial.rb +2 -2
- data/lib/picky/wrappers/bundle/location.rb +3 -5
- data/spec/functional/backends/redis_bundle_realtime_spec.rb +1 -1
- data/spec/functional/backends/redis_spec.rb +29 -6
- data/spec/functional/backends/special_spec.rb +229 -0
- data/spec/functional/backends/sqlite_bundle_realtime_spec.rb +1 -1
- data/spec/functional/backends/sqlite_spec.rb +1 -1
- data/spec/lib/backends/backend_spec.rb +40 -24
- data/spec/lib/backends/file_spec.rb +25 -25
- data/spec/lib/backends/memory_spec.rb +51 -51
- data/spec/lib/backends/redis_spec.rb +77 -77
- data/spec/lib/backends/sqlite/array_spec.rb +1 -1
- data/spec/lib/backends/sqlite_spec.rb +51 -51
- data/spec/lib/{indexed/bundle_spec.rb → bundle_indexed_spec.rb} +0 -0
- data/spec/lib/{indexing/bundle_spec.rb → bundle_indexing_spec.rb} +2 -9
- data/spec/lib/{indexing/bundle_partial_generation_speed_spec.rb → bundle_partial_generation_speed_spec.rb} +0 -0
- data/spec/lib/{indexed/bundle_realtime_spec.rb → bundle_realtime_spec.rb} +0 -0
- data/spec/lib/category_indexed_spec.rb +2 -2
- data/spec/lib/category_spec.rb +2 -2
- data/spec/lib/extensions/object_spec.rb +8 -8
- data/spec/lib/generators/similarity/phonetic_spec.rb +13 -7
- data/spec/lib/index_spec.rb +16 -0
- data/spec/lib/indexers/base_spec.rb +1 -1
- metadata +27 -25
data/aux/picky/cli.rb
CHANGED
@@ -104,7 +104,7 @@ module Picky
|
|
104
104
|
|
105
105
|
# Maps commands to the other gem's command.
|
106
106
|
#
|
107
|
-
#
|
107
|
+
# THINK Try to load the other gems and get the commands dynamically.
|
108
108
|
#
|
109
109
|
@@mapping = {
|
110
110
|
:generate => [Generate, :'{client,server,all_in_one}', :'app_directory_name'],
|
@@ -6,22 +6,6 @@ module Picky
|
|
6
6
|
#
|
7
7
|
class Backend
|
8
8
|
|
9
|
-
attr_reader :inverted,
|
10
|
-
:weights,
|
11
|
-
:similarity,
|
12
|
-
:configuration
|
13
|
-
|
14
|
-
def initialize options = {}
|
15
|
-
@inverted = options[:inverted]
|
16
|
-
@weights = options[:weights]
|
17
|
-
@similarity = options[:similarity]
|
18
|
-
@configuration = options[:configuration]
|
19
|
-
end
|
20
|
-
|
21
|
-
def extract_lambda_or thing, *args
|
22
|
-
thing && (thing.respond_to?(:call) && thing.call(*args) || thing)
|
23
|
-
end
|
24
|
-
|
25
9
|
# Returns the total score of the combinations.
|
26
10
|
#
|
27
11
|
# Default implementation. Override to speed up.
|
data/lib/picky/backends/file.rb
CHANGED
@@ -14,36 +14,31 @@ module Picky
|
|
14
14
|
# [:token] # => [id, id, id, id, id] (an array of ids)
|
15
15
|
#
|
16
16
|
def create_inverted bundle
|
17
|
-
|
18
|
-
JSON.new(bundle.index_path(:inverted))
|
17
|
+
JSON.new bundle.index_path(:inverted)
|
19
18
|
end
|
20
19
|
# Returns an object that on #initial, #load returns an object that responds to:
|
21
20
|
# [:token] # => 1.23 (a weight)
|
22
21
|
#
|
23
22
|
def create_weights bundle
|
24
|
-
|
25
|
-
JSON.new(bundle.index_path(:weights))
|
23
|
+
JSON.new bundle.index_path(:weights)
|
26
24
|
end
|
27
25
|
# Returns an object that on #initial, #load returns an object that responds to:
|
28
26
|
# [:encoded] # => [:original, :original] (an array of original symbols this similarity encoded thing maps to)
|
29
27
|
#
|
30
28
|
def create_similarity bundle
|
31
|
-
|
32
|
-
JSON.new(bundle.index_path(:similarity))
|
29
|
+
JSON.new bundle.index_path(:similarity)
|
33
30
|
end
|
34
31
|
# Returns an object that on #initial, #load returns an object that responds to:
|
35
32
|
# [:key] # => value (a value for this config key)
|
36
33
|
#
|
37
34
|
def create_configuration bundle
|
38
|
-
|
39
|
-
JSON.new(bundle.index_path(:configuration))
|
35
|
+
JSON.new bundle.index_path(:configuration)
|
40
36
|
end
|
41
37
|
# Returns an object that on #initial, #load returns an object that responds to:
|
42
38
|
# [id] # => [:sym1, :sym2]
|
43
39
|
#
|
44
40
|
def create_realtime bundle
|
45
|
-
|
46
|
-
JSON.new(bundle.index_path(:realtime))
|
41
|
+
JSON.new bundle.index_path(:realtime)
|
47
42
|
end
|
48
43
|
|
49
44
|
end
|
@@ -9,40 +9,35 @@ module Picky
|
|
9
9
|
# [:token] # => [id, id, id, id, id] (an array of ids)
|
10
10
|
#
|
11
11
|
def create_inverted bundle
|
12
|
-
|
13
|
-
JSON.new(bundle.index_path(:inverted))
|
12
|
+
JSON.new bundle.index_path(:inverted)
|
14
13
|
end
|
15
14
|
# Returns an object that on #initial, #load returns
|
16
15
|
# an object that responds to:
|
17
16
|
# [:token] # => 1.23 (a weight)
|
18
17
|
#
|
19
18
|
def create_weights bundle
|
20
|
-
|
21
|
-
JSON.new(bundle.index_path(:weights))
|
19
|
+
JSON.new bundle.index_path(:weights)
|
22
20
|
end
|
23
21
|
# Returns an object that on #initial, #load returns
|
24
22
|
# an object that responds to:
|
25
23
|
# [:encoded] # => [:original, :original] (an array of original symbols this similarity encoded thing maps to)
|
26
24
|
#
|
27
25
|
def create_similarity bundle
|
28
|
-
|
29
|
-
Marshal.new(bundle.index_path(:similarity))
|
26
|
+
Marshal.new bundle.index_path(:similarity)
|
30
27
|
end
|
31
28
|
# Returns an object that on #initial, #load returns
|
32
29
|
# an object that responds to:
|
33
30
|
# [:key] # => value (a value for this config key)
|
34
31
|
#
|
35
32
|
def create_configuration bundle
|
36
|
-
|
37
|
-
JSON.new(bundle.index_path(:configuration))
|
33
|
+
JSON.new bundle.index_path(:configuration)
|
38
34
|
end
|
39
35
|
# Returns an object that on #initial, #load returns
|
40
36
|
# an object that responds to:
|
41
37
|
# [id] # => [:sym1, :sym2]
|
42
38
|
#
|
43
39
|
def create_realtime bundle
|
44
|
-
|
45
|
-
JSON.new(bundle.index_path(:realtime))
|
40
|
+
JSON.new bundle.index_path(:realtime)
|
46
41
|
end
|
47
42
|
|
48
43
|
end
|
@@ -24,14 +24,14 @@ module Picky
|
|
24
24
|
|
25
25
|
@empty = options[:empty]
|
26
26
|
@initial = options[:initial]
|
27
|
-
@
|
27
|
+
@realtime = options[:realtime]
|
28
28
|
end
|
29
29
|
|
30
30
|
# The empty index that is used for putting the index
|
31
31
|
# together.
|
32
32
|
#
|
33
33
|
def empty
|
34
|
-
@empty && @empty.clone || (@
|
34
|
+
@empty && @empty.clone || (@realtime ? self.reset : {})
|
35
35
|
end
|
36
36
|
|
37
37
|
# The initial content before loading.
|
@@ -40,7 +40,7 @@ module Picky
|
|
40
40
|
# this just returns the same thing as #load.
|
41
41
|
#
|
42
42
|
def initial
|
43
|
-
@initial && @initial.clone || (@
|
43
|
+
@initial && @initial.clone || (@realtime ? self.reset : {})
|
44
44
|
end
|
45
45
|
|
46
46
|
# Returns itself.
|
@@ -27,7 +27,7 @@ module Picky
|
|
27
27
|
# Writes the hash into Redis.
|
28
28
|
#
|
29
29
|
def dump hash
|
30
|
-
unless @
|
30
|
+
unless @realtime
|
31
31
|
clear
|
32
32
|
# client.pipelined do
|
33
33
|
hash.each_pair do |key, values|
|
@@ -54,9 +54,9 @@ module Picky
|
|
54
54
|
|
55
55
|
# Set a single list.
|
56
56
|
#
|
57
|
-
# TODO Clear? Maybe only add the difference?
|
58
|
-
#
|
59
57
|
def []= key, values
|
58
|
+
delete key
|
59
|
+
|
60
60
|
redis_key = "#{namespace}:#{key}"
|
61
61
|
i = 0
|
62
62
|
values.each do |value|
|
@@ -64,9 +64,8 @@ module Picky
|
|
64
64
|
client.zadd redis_key, i, value
|
65
65
|
end
|
66
66
|
|
67
|
-
|
68
|
-
|
69
|
-
self[key]
|
67
|
+
DirectlyManipulable.make self, values, key
|
68
|
+
values
|
70
69
|
end
|
71
70
|
|
72
71
|
end
|
data/lib/picky/backends/redis.rb
CHANGED
@@ -7,17 +7,15 @@ module Picky
|
|
7
7
|
class Redis < Backend
|
8
8
|
|
9
9
|
attr_reader :client,
|
10
|
-
:
|
10
|
+
:realtime
|
11
11
|
|
12
12
|
def initialize options = {}
|
13
|
-
super options
|
14
|
-
|
15
13
|
maybe_load_hiredis
|
16
14
|
check_hiredis_gem
|
17
15
|
check_redis_gem
|
18
16
|
|
19
17
|
@client = options[:client] || ::Redis.new(:db => (options[:db] || 15))
|
20
|
-
@
|
18
|
+
@realtime = options[:realtime]
|
21
19
|
end
|
22
20
|
def maybe_load_hiredis
|
23
21
|
require 'hiredis'
|
@@ -39,36 +37,31 @@ module Picky
|
|
39
37
|
# [:token] # => [id, id, id, id, id] (an array of ids)
|
40
38
|
#
|
41
39
|
def create_inverted bundle
|
42
|
-
|
43
|
-
List.new(client, "#{PICKY_ENVIRONMENT}:#{bundle.identifier}:inverted", immediate: immediate)
|
40
|
+
List.new client, "#{PICKY_ENVIRONMENT}:#{bundle.identifier}:inverted", realtime: realtime
|
44
41
|
end
|
45
42
|
# Returns an object that on #initial, #load returns an object that responds to:
|
46
43
|
# [:token] # => 1.23 (a weight)
|
47
44
|
#
|
48
45
|
def create_weights bundle
|
49
|
-
|
50
|
-
Float.new(client, "#{PICKY_ENVIRONMENT}:#{bundle.identifier}:weights", immediate: immediate)
|
46
|
+
Float.new client, "#{PICKY_ENVIRONMENT}:#{bundle.identifier}:weights", realtime: realtime
|
51
47
|
end
|
52
48
|
# Returns an object that on #initial, #load returns an object that responds to:
|
53
49
|
# [:encoded] # => [:original, :original] (an array of original symbols this similarity encoded thing maps to)
|
54
50
|
#
|
55
51
|
def create_similarity bundle
|
56
|
-
|
57
|
-
List.new(client, "#{PICKY_ENVIRONMENT}:#{bundle.identifier}:similarity", immediate: immediate)
|
52
|
+
List.new client, "#{PICKY_ENVIRONMENT}:#{bundle.identifier}:similarity", realtime: realtime
|
58
53
|
end
|
59
54
|
# Returns an object that on #initial, #load returns an object that responds to:
|
60
55
|
# [:key] # => value (a value for this config key)
|
61
56
|
#
|
62
57
|
def create_configuration bundle
|
63
|
-
|
64
|
-
String.new(client, "#{PICKY_ENVIRONMENT}:#{bundle.identifier}:configuration", immediate: immediate)
|
58
|
+
String.new client, "#{PICKY_ENVIRONMENT}:#{bundle.identifier}:configuration", realtime: realtime
|
65
59
|
end
|
66
60
|
# Returns an object that on #initial, #load returns an object that responds to:
|
67
61
|
# [id] # => [:sym1, :sym2]
|
68
62
|
#
|
69
63
|
def create_realtime bundle
|
70
|
-
|
71
|
-
List.new(client, "#{bundle.identifier}:realtime", immediate: immediate)
|
64
|
+
List.new client, "#{bundle.identifier}:realtime", realtime: realtime
|
72
65
|
end
|
73
66
|
|
74
67
|
# Does the Redis version already include
|
@@ -162,12 +155,12 @@ module Picky
|
|
162
155
|
# Note: We use the amount and offset hints to speed Redis up.
|
163
156
|
#
|
164
157
|
def ids combinations, amount, offset
|
165
|
-
# TODO
|
166
|
-
#
|
167
|
-
#
|
168
|
-
#
|
158
|
+
# TODO This is actually not correct:
|
159
|
+
# A dumped/loaded Redis backend should use
|
160
|
+
# the Redis backend calculation method.
|
161
|
+
# So loaded? would be more appropriate.
|
169
162
|
#
|
170
|
-
if
|
163
|
+
if realtime
|
171
164
|
# Just checked once on the first call.
|
172
165
|
#
|
173
166
|
if redis_with_scripting?
|
@@ -187,12 +180,18 @@ module Picky
|
|
187
180
|
# Assume it's using EVALSHA.
|
188
181
|
#
|
189
182
|
begin
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
183
|
+
if identifiers.size > 1
|
184
|
+
client.evalsha @@ids_sent_once,
|
185
|
+
identifiers.size,
|
186
|
+
*identifiers,
|
187
|
+
generate_intermediate_result_id,
|
188
|
+
offset,
|
189
|
+
(offset + amount)
|
190
|
+
else
|
191
|
+
client.zrange identifiers.first,
|
192
|
+
offset,
|
193
|
+
(offset + amount)
|
194
|
+
end
|
196
195
|
rescue RuntimeError => e
|
197
196
|
# Make the server have a SHA-1 for the script.
|
198
197
|
#
|
@@ -219,8 +218,6 @@ module Picky
|
|
219
218
|
|
220
219
|
# Little optimization.
|
221
220
|
#
|
222
|
-
# TODO Include in the scripting version as well.
|
223
|
-
#
|
224
221
|
if identifiers.size > 1
|
225
222
|
# Intersect and store.
|
226
223
|
#
|
@@ -14,21 +14,21 @@ module Picky
|
|
14
14
|
@cache_path = "#{cache_path}.sqlite3"
|
15
15
|
@empty = options[:empty]
|
16
16
|
@initial = options[:initial]
|
17
|
-
@
|
17
|
+
@realtime = options[:realtime]
|
18
18
|
|
19
19
|
lazily_initialize_client
|
20
20
|
end
|
21
21
|
|
22
22
|
def initial
|
23
|
-
@initial && @initial.clone || (@
|
23
|
+
@initial && @initial.clone || (@realtime ? self.reset : {})
|
24
24
|
end
|
25
25
|
|
26
26
|
def empty
|
27
|
-
@empty && @empty.clone || (@
|
27
|
+
@empty && @empty.clone || (@realtime ? self.reset.asynchronous : {})
|
28
28
|
end
|
29
29
|
|
30
30
|
def dump internal
|
31
|
-
dump_sqlite internal unless @
|
31
|
+
dump_sqlite internal unless @realtime
|
32
32
|
self
|
33
33
|
end
|
34
34
|
|
@@ -4,11 +4,10 @@ module Picky
|
|
4
4
|
|
5
5
|
class SQLite < Backend
|
6
6
|
|
7
|
-
attr_reader :
|
7
|
+
attr_reader :realtime
|
8
8
|
|
9
9
|
def initialize options = {}
|
10
|
-
|
11
|
-
@self_indexed = options[:self_indexed]
|
10
|
+
@realtime = options[:realtime]
|
12
11
|
|
13
12
|
require 'sqlite3'
|
14
13
|
rescue LoadError => e
|
@@ -19,36 +18,31 @@ module Picky
|
|
19
18
|
# [:token] # => [id, id, id, id, id] (an array of ids)
|
20
19
|
#
|
21
20
|
def create_inverted bundle
|
22
|
-
|
23
|
-
StringKeyArray.new(bundle.index_path(:inverted), self_indexed: self_indexed)
|
21
|
+
StringKeyArray.new bundle.index_path(:inverted), realtime: realtime
|
24
22
|
end
|
25
23
|
# Returns an object that on #initial, #load returns an object that responds to:
|
26
24
|
# [:token] # => 1.23 (a weight)
|
27
25
|
#
|
28
26
|
def create_weights bundle
|
29
|
-
|
30
|
-
Value.new(bundle.index_path(:weights), self_indexed: self_indexed)
|
27
|
+
Value.new bundle.index_path(:weights), realtime: realtime
|
31
28
|
end
|
32
29
|
# Returns an object that on #initial, #load returns an object that responds to:
|
33
30
|
# [:encoded] # => [:original, :original] (an array of original symbols this similarity encoded thing maps to)
|
34
31
|
#
|
35
32
|
def create_similarity bundle
|
36
|
-
|
37
|
-
StringKeyArray.new(bundle.index_path(:similarity), self_indexed: self_indexed)
|
33
|
+
StringKeyArray.new bundle.index_path(:similarity), realtime: realtime
|
38
34
|
end
|
39
35
|
# Returns an object that on #initial, #load returns an object that responds to:
|
40
36
|
# [:key] # => value (a value for this config key)
|
41
37
|
#
|
42
38
|
def create_configuration bundle
|
43
|
-
|
44
|
-
Value.new(bundle.index_path(:configuration), self_indexed: self_indexed)
|
39
|
+
Value.new bundle.index_path(:configuration), realtime: realtime
|
45
40
|
end
|
46
41
|
# Returns an object that on #initial, #load returns an object that responds to:
|
47
42
|
# [id] # => [:sym1, :sym2]
|
48
43
|
#
|
49
44
|
def create_realtime bundle
|
50
|
-
|
51
|
-
IntegerKeyArray.new(bundle.index_path(:realtime), self_indexed: self_indexed)
|
45
|
+
IntegerKeyArray.new bundle.index_path(:realtime), realtime: realtime
|
52
46
|
end
|
53
47
|
|
54
48
|
end
|
data/lib/picky/bundle.rb
CHANGED
@@ -35,19 +35,20 @@ module Picky
|
|
35
35
|
:backend_weights,
|
36
36
|
:backend_similarity,
|
37
37
|
:backend_configuration,
|
38
|
+
:backend_realtime,
|
38
39
|
|
39
|
-
:
|
40
|
+
:weight_strategy,
|
40
41
|
:partial_strategy,
|
41
42
|
:similarity_strategy
|
42
43
|
|
43
44
|
delegate :[], :[]=, :to => :configuration
|
44
45
|
delegate :index_directory, :to => :category
|
45
46
|
|
46
|
-
def initialize name, category,
|
47
|
+
def initialize name, category, weight_strategy, partial_strategy, similarity_strategy, options = {}
|
47
48
|
@name = name
|
48
49
|
@category = category
|
49
50
|
|
50
|
-
@
|
51
|
+
@weight_strategy = weight_strategy
|
51
52
|
@partial_strategy = partial_strategy
|
52
53
|
@similarity_strategy = similarity_strategy
|
53
54
|
|
@@ -70,21 +71,31 @@ module Picky
|
|
70
71
|
# Initializes all necessary indexes from the backend.
|
71
72
|
#
|
72
73
|
def reset_backend
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
74
|
+
create_backends
|
75
|
+
initialize_backends
|
76
|
+
end
|
77
|
+
|
78
|
+
# Extract specific indexes from backend.
|
79
|
+
#
|
80
|
+
def create_backends
|
81
|
+
@backend_inverted = backend.create_inverted self
|
82
|
+
@backend_weights = backend.create_weights self
|
83
|
+
@backend_similarity = backend.create_similarity self
|
78
84
|
@backend_configuration = backend.create_configuration self
|
79
|
-
@backend_realtime = backend.create_realtime
|
85
|
+
@backend_realtime = backend.create_realtime self
|
86
|
+
end
|
80
87
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
88
|
+
# Initial indexes.
|
89
|
+
#
|
90
|
+
# Note that if the weights strategy doesn't need to be saved,
|
91
|
+
# the strategy itself pretends to be an index.
|
92
|
+
#
|
93
|
+
def initialize_backends
|
94
|
+
# @inverted, @weights, @similarity, @configuration, @realtime = backend.initial weight_strategy
|
86
95
|
@inverted = @backend_inverted.initial
|
87
|
-
@weights
|
96
|
+
# TODO @weights = @weight_strategy.initial || @backend_weights.initial
|
97
|
+
#
|
98
|
+
@weights = @weight_strategy.saved?? @backend_weights.initial : @weight_strategy
|
88
99
|
@similarity = @backend_similarity.initial
|
89
100
|
@configuration = @backend_configuration.initial
|
90
101
|
@realtime = @backend_realtime.initial
|
@@ -94,30 +105,27 @@ module Picky
|
|
94
105
|
# internal backend instance.
|
95
106
|
#
|
96
107
|
def empty
|
97
|
-
empty_inverted
|
98
|
-
empty_weights
|
99
|
-
empty_similarity
|
100
|
-
empty_configuration
|
101
|
-
empty_realtime
|
102
|
-
end
|
103
|
-
def empty_inverted
|
104
108
|
@inverted = @backend_inverted.empty
|
105
|
-
end
|
106
|
-
def empty_weights
|
107
109
|
# THINK about this. Perhaps the strategies should implement the backend methods?
|
108
110
|
#
|
109
|
-
@weights = @
|
110
|
-
end
|
111
|
-
def empty_similarity
|
111
|
+
@weights = @weight_strategy.saved? ? @backend_weights.empty : @weight_strategy
|
112
112
|
@similarity = @backend_similarity.empty
|
113
|
-
end
|
114
|
-
def empty_configuration
|
115
113
|
@configuration = @backend_configuration.empty
|
116
|
-
end
|
117
|
-
def empty_realtime
|
118
114
|
@realtime = @backend_realtime.empty
|
119
115
|
end
|
120
116
|
|
117
|
+
# Delete all index files.
|
118
|
+
#
|
119
|
+
def delete
|
120
|
+
@backend_inverted.delete if @backend_inverted.respond_to? :delete
|
121
|
+
# THINK about this. Perhaps the strategies should implement the backend methods?
|
122
|
+
#
|
123
|
+
@backend_weights.delete if @backend_weights.respond_to?(:delete) && @weight_strategy.saved?
|
124
|
+
@backend_similarity.delete if @backend_similarity.respond_to? :delete
|
125
|
+
@backend_configuration.delete if @backend_configuration.respond_to? :delete
|
126
|
+
@backend_realtime.delete if @backend_realtime.respond_to? :delete
|
127
|
+
end
|
128
|
+
|
121
129
|
# Get a list of similar texts.
|
122
130
|
#
|
123
131
|
# Note: Does not return itself.
|
@@ -156,18 +164,6 @@ module Picky
|
|
156
164
|
::File.join index_directory, "#{category.name}_#{name}#{ "_#{type}" if type }"
|
157
165
|
end
|
158
166
|
|
159
|
-
# Delete all index files.
|
160
|
-
#
|
161
|
-
def delete
|
162
|
-
@backend_inverted.delete if @backend_inverted.respond_to? :delete
|
163
|
-
# THINK about this. Perhaps the strategies should implement the backend methods?
|
164
|
-
#
|
165
|
-
@backend_weights.delete if @backend_weights.respond_to?(:delete) && @weights_strategy.saved?
|
166
|
-
@backend_similarity.delete if @backend_similarity.respond_to? :delete
|
167
|
-
@backend_configuration.delete if @backend_configuration.respond_to? :delete
|
168
|
-
@backend_realtime.delete if @backend_realtime.respond_to? :delete
|
169
|
-
end
|
170
|
-
|
171
167
|
def to_s
|
172
168
|
"#{self.class}(#{identifier})"
|
173
169
|
end
|
data/lib/picky/bundle_indexed.rb
CHANGED
@@ -25,6 +25,21 @@ module Picky
|
|
25
25
|
#
|
26
26
|
def ids sym_or_string
|
27
27
|
@inverted[sym_or_string] || []
|
28
|
+
# TODO ?
|
29
|
+
#
|
30
|
+
# if @key_format
|
31
|
+
# class << self
|
32
|
+
# def ids
|
33
|
+
# (@inverted[sym_or_string] || []).map &@key_format
|
34
|
+
# end
|
35
|
+
# end
|
36
|
+
# else
|
37
|
+
# class << self
|
38
|
+
# def ids
|
39
|
+
# @inverted[sym_or_string] || []
|
40
|
+
# end
|
41
|
+
# end
|
42
|
+
# end
|
28
43
|
end
|
29
44
|
|
30
45
|
# Get a weight for the given symbol.
|
@@ -64,9 +79,9 @@ module Picky
|
|
64
79
|
# Loads the weights index.
|
65
80
|
#
|
66
81
|
def load_weights
|
67
|
-
#
|
82
|
+
# TODO @weights = @weight_strategy.load || @backend_weights.load
|
68
83
|
#
|
69
|
-
self.weights = @backend_weights.load if @
|
84
|
+
self.weights = @backend_weights.load if @weight_strategy.saved?
|
70
85
|
end
|
71
86
|
# Loads the similarity index.
|
72
87
|
#
|
@@ -31,37 +31,12 @@ module Picky
|
|
31
31
|
# Saves the indexes in a dump file.
|
32
32
|
#
|
33
33
|
def dump
|
34
|
-
dump_inverted
|
35
|
-
dump_similarity
|
36
|
-
dump_weights
|
37
|
-
dump_configuration
|
38
|
-
dump_realtime
|
39
|
-
end
|
40
|
-
# Dumps the core index.
|
41
|
-
#
|
42
|
-
def dump_inverted
|
43
34
|
@backend_inverted.dump @inverted
|
44
|
-
end
|
45
|
-
# Dumps the weights index.
|
46
|
-
#
|
47
|
-
def dump_weights
|
48
35
|
# THINK about this. Perhaps the strategies should implement the backend methods? Or only the internal index ones?
|
49
36
|
#
|
50
|
-
@backend_weights.dump @weights if @
|
51
|
-
end
|
52
|
-
# Dumps the similarity index.
|
53
|
-
#
|
54
|
-
def dump_similarity
|
37
|
+
@backend_weights.dump @weights if @weight_strategy.saved?
|
55
38
|
@backend_similarity.dump @similarity if @similarity_strategy.saved?
|
56
|
-
end
|
57
|
-
# Dumps the configuration.
|
58
|
-
#
|
59
|
-
def dump_configuration
|
60
39
|
@backend_configuration.dump @configuration
|
61
|
-
end
|
62
|
-
# Dumps the realtime.
|
63
|
-
#
|
64
|
-
def dump_realtime
|
65
40
|
@backend_realtime.dump @realtime
|
66
41
|
end
|
67
42
|
|
@@ -24,7 +24,7 @@ module Picky
|
|
24
24
|
#
|
25
25
|
@similarity.delete self.similarity_strategy.encoded(str_or_sym)
|
26
26
|
else
|
27
|
-
@weights[str_or_sym] = self.
|
27
|
+
@weights[str_or_sym] = self.weight_strategy.weight_for ids.size
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -53,7 +53,7 @@ module Picky
|
|
53
53
|
|
54
54
|
# Weights.
|
55
55
|
#
|
56
|
-
@weights[str_or_sym] = self.
|
56
|
+
@weights[str_or_sym] = self.weight_strategy.weight_for ids.size
|
57
57
|
|
58
58
|
# Similarity.
|
59
59
|
#
|
@@ -74,10 +74,6 @@ module Picky
|
|
74
74
|
#
|
75
75
|
similars.delete str_or_sym if similars.include? str_or_sym
|
76
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
77
|
end
|
82
78
|
end
|
83
79
|
|
@@ -31,7 +31,7 @@ module Picky
|
|
31
31
|
with_data_snapshot do
|
32
32
|
scheduler.schedule do
|
33
33
|
indexer.prepare categories, scheduler
|
34
|
-
nil #
|
34
|
+
nil # Note: Needed so procrastinate is happy.
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -43,7 +43,7 @@ module Picky
|
|
43
43
|
empty
|
44
44
|
retrieve
|
45
45
|
dump
|
46
|
-
nil #
|
46
|
+
nil # Note: Needed so procrastinate is happy.
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
@@ -36,7 +36,9 @@ module Picky
|
|
36
36
|
|
37
37
|
# Sorts the index values in place.
|
38
38
|
#
|
39
|
-
|
39
|
+
# Not used currently.
|
40
|
+
#
|
41
|
+
def prioritize! ary, code
|
40
42
|
ary.sort_by_levenshtein! code
|
41
43
|
ary.slice! amount, ary.size # THINK size is not perfectly correct, but anyway
|
42
44
|
end
|
data/lib/picky/index_indexing.rb
CHANGED
@@ -105,7 +105,7 @@ module Picky
|
|
105
105
|
# capsule, i.e. a block/lambda.
|
106
106
|
#
|
107
107
|
def extract_source
|
108
|
-
@source
|
108
|
+
@source.respond_to?(:call) ? @source.call : @source
|
109
109
|
end
|
110
110
|
def check_source source # :nodoc:
|
111
111
|
raise ArgumentError.new(<<-SOURCE
|