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
data/lib/picky/tokenizer.rb
CHANGED
@@ -135,14 +135,14 @@ Case sensitive? #{@case_sensitive ? "Yes." : "-"}
|
|
135
135
|
!@case_sensitive
|
136
136
|
end
|
137
137
|
|
138
|
-
def
|
139
|
-
@
|
138
|
+
def max_words amount
|
139
|
+
@max_words = amount
|
140
140
|
end
|
141
141
|
def cap words
|
142
|
-
words.slice!(@
|
142
|
+
words.slice!(@max_words..-1) if cap?(words)
|
143
143
|
end
|
144
144
|
def cap? words
|
145
|
-
@
|
145
|
+
@max_words && words.size > @max_words
|
146
146
|
end
|
147
147
|
|
148
148
|
# Checks if the right argument type has been given.
|
@@ -160,7 +160,7 @@ Case sensitive? #{@case_sensitive ? "Yes." : "-"}
|
|
160
160
|
stopwords options[:stopwords] if options[:stopwords]
|
161
161
|
splits_text_on options[:splits_text_on] || /\s/
|
162
162
|
normalizes_words options[:normalizes_words] if options[:normalizes_words]
|
163
|
-
|
163
|
+
max_words options[:max_words]
|
164
164
|
rejects_token_if &(options[:rejects_token_if] || :blank?)
|
165
165
|
case_sensitive options[:case_sensitive] unless options[:case_sensitive].nil?
|
166
166
|
end
|
@@ -203,7 +203,7 @@ Case sensitive? #{@case_sensitive ? "Yes." : "-"}
|
|
203
203
|
#
|
204
204
|
# Does:
|
205
205
|
# * Split the text into words.
|
206
|
-
# * Cap the amount of tokens if
|
206
|
+
# * Cap the amount of tokens if max_words is set.
|
207
207
|
#
|
208
208
|
def pretokenize text
|
209
209
|
words = split text
|
@@ -7,7 +7,6 @@ module Picky
|
|
7
7
|
module Delegator
|
8
8
|
|
9
9
|
delegate :add,
|
10
|
-
:clear_realtime_mapping,
|
11
10
|
|
12
11
|
:inverted,
|
13
12
|
:weights,
|
@@ -18,6 +17,8 @@ module Picky
|
|
18
17
|
:restore,
|
19
18
|
:delete,
|
20
19
|
|
20
|
+
:reset_backend,
|
21
|
+
|
21
22
|
:raise_unless_cache_exists,
|
22
23
|
:raise_unless_index_exists,
|
23
24
|
:raise_unless_similarity_exists,
|
@@ -53,6 +54,7 @@ module Picky
|
|
53
54
|
:clear_weights,
|
54
55
|
:clear_similarity,
|
55
56
|
:clear_configuration,
|
57
|
+
:clear_realtime,
|
56
58
|
:identifier,
|
57
59
|
:ids,
|
58
60
|
:load,
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Picky::Category, "Realtime API" do
|
6
|
+
|
7
|
+
Thing = Struct.new :id, :text
|
8
|
+
|
9
|
+
let(:category) do
|
10
|
+
index = Picky::Index.new :some_index_name
|
11
|
+
category = described_class.new :text, index
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'offers an add method' do
|
15
|
+
category.add Thing.new(1, 'text')
|
16
|
+
end
|
17
|
+
it 'offers a remove method' do
|
18
|
+
category.remove 1
|
19
|
+
end
|
20
|
+
it 'offers a replace method' do
|
21
|
+
category.replace Thing.new(1, 'text')
|
22
|
+
end
|
23
|
+
it 'offers a << method' do
|
24
|
+
category << Thing.new(1, 'text')
|
25
|
+
end
|
26
|
+
# it 'offers a >> method' do
|
27
|
+
# Thing.new(1, 'text') >> category # I mean, as long as we're dreaming.
|
28
|
+
# end
|
29
|
+
it 'offers an unshift method' do
|
30
|
+
category.unshift Thing.new(1, 'text')
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
# Describes a Picky index that uses the File backend
|
6
|
+
# for data storage.
|
7
|
+
#
|
8
|
+
# TODO Everything should just fail.
|
9
|
+
#
|
10
|
+
describe Picky::Backends::File do
|
11
|
+
|
12
|
+
class Book
|
13
|
+
attr_reader :id, :title, :author
|
14
|
+
def initialize id, title, author
|
15
|
+
@id, @title, @author = id, title, author
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :data, :books
|
20
|
+
|
21
|
+
let(:data) do
|
22
|
+
Picky::Index.new(:books) do
|
23
|
+
key_format :to_s # TODO Also make to_i work.
|
24
|
+
source []
|
25
|
+
category :title, partial: Picky::Partial::Postfix.new(from: 1)
|
26
|
+
category :author, similarity: Picky::Generators::Similarity::DoubleMetaphone.new(3)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
let(:books) { Picky::Search.new data }
|
30
|
+
|
31
|
+
its = ->(*) do
|
32
|
+
it 'searching for it' do
|
33
|
+
books.search('title').ids.should == ['1']
|
34
|
+
end
|
35
|
+
it 'searching for it using multiple words' do
|
36
|
+
books.search('title author').ids.should == ['1']
|
37
|
+
end
|
38
|
+
it 'searching for it using partial' do
|
39
|
+
books.search('tit').ids.should == ['1']
|
40
|
+
end
|
41
|
+
it 'searching for it using similarity' do
|
42
|
+
books.search('aothor~').ids.should == ['1']
|
43
|
+
end
|
44
|
+
it 'handles removing' do
|
45
|
+
data.remove 1
|
46
|
+
|
47
|
+
books.search('title').ids.should == []
|
48
|
+
end
|
49
|
+
it 'handles removing with more than one entry' do
|
50
|
+
data.add Book.new(2, 'title', 'author')
|
51
|
+
|
52
|
+
books.search('title').ids.should == ['2', '1'] # TODO Should be ['2', '1']
|
53
|
+
|
54
|
+
data.remove '1'
|
55
|
+
|
56
|
+
books.search('title').ids.should == ['2']
|
57
|
+
end
|
58
|
+
it 'handles removing with three entries' do
|
59
|
+
data.add Book.new(2, 'title', 'author')
|
60
|
+
data.add Book.new(3, 'title', 'author')
|
61
|
+
|
62
|
+
books.search('title').ids.should == ['3', '2', '1'] # TODO Should be ['3', '2', '1']
|
63
|
+
|
64
|
+
data.remove '1'
|
65
|
+
|
66
|
+
books.search('title').ids.should == ['3', '2']
|
67
|
+
end
|
68
|
+
it 'handles replacing' do
|
69
|
+
data.replace Book.new(1, 'toitle', 'oithor')
|
70
|
+
|
71
|
+
books.search('title').ids.should == []
|
72
|
+
books.search('toitle').ids.should == ['1']
|
73
|
+
end
|
74
|
+
it 'handles clearing' do
|
75
|
+
data.clear
|
76
|
+
|
77
|
+
books.search('title').ids.should == []
|
78
|
+
end
|
79
|
+
it 'handles dumping and loading' do
|
80
|
+
data.dump
|
81
|
+
data.load
|
82
|
+
|
83
|
+
books.search('title').ids.should == ['1']
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'immediately indexing backend (no dump needed)' do
|
88
|
+
before(:each) do
|
89
|
+
data.backend described_class.new
|
90
|
+
data.clear
|
91
|
+
|
92
|
+
data.add Book.new(1, 'title', 'author')
|
93
|
+
end
|
94
|
+
|
95
|
+
instance_eval &its
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
# Describes a Picky index that uses the Memory backend
|
6
|
+
# for data storage.
|
7
|
+
#
|
8
|
+
describe Picky::Backends::Memory do
|
9
|
+
|
10
|
+
class Book
|
11
|
+
attr_reader :id, :title, :author
|
12
|
+
def initialize id, title, author
|
13
|
+
@id, @title, @author = id, title, author
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :data, :books
|
18
|
+
|
19
|
+
let(:data) do
|
20
|
+
Picky::Index.new(:books) do
|
21
|
+
key_format :to_s # TODO Also make to_i work.
|
22
|
+
source []
|
23
|
+
category :title, partial: Picky::Partial::Postfix.new(from: 1)
|
24
|
+
category :author, similarity: Picky::Generators::Similarity::DoubleMetaphone.new(3)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
let(:books) { Picky::Search.new data }
|
28
|
+
|
29
|
+
its = ->(*) do
|
30
|
+
it 'searching for it' do
|
31
|
+
books.search('title').ids.should == ['1']
|
32
|
+
end
|
33
|
+
it 'searching for it using multiple words' do
|
34
|
+
books.search('title author').ids.should == ['1']
|
35
|
+
end
|
36
|
+
it 'searching for it using partial' do
|
37
|
+
books.search('tit').ids.should == ['1']
|
38
|
+
end
|
39
|
+
it 'searching for it using similarity' do
|
40
|
+
books.search('aothor~').ids.should == ['1']
|
41
|
+
end
|
42
|
+
it 'handles removing' do
|
43
|
+
data.remove 1
|
44
|
+
|
45
|
+
books.search('title').ids.should == []
|
46
|
+
end
|
47
|
+
it 'handles removing with more than one entry' do
|
48
|
+
data.add Book.new(2, 'title', 'author')
|
49
|
+
|
50
|
+
books.search('title').ids.should == ['2', '1'] # TODO Should be ['2', '1']
|
51
|
+
|
52
|
+
data.remove '1'
|
53
|
+
|
54
|
+
books.search('title').ids.should == ['2']
|
55
|
+
end
|
56
|
+
it 'handles removing with three entries' do
|
57
|
+
data.add Book.new(2, 'title', 'author')
|
58
|
+
data.add Book.new(3, 'title', 'author')
|
59
|
+
|
60
|
+
books.search('title').ids.should == ['3', '2', '1'] # TODO Should be ['3', '2', '1']
|
61
|
+
|
62
|
+
data.remove '1'
|
63
|
+
|
64
|
+
books.search('title').ids.should == ['3', '2']
|
65
|
+
end
|
66
|
+
it 'handles replacing' do
|
67
|
+
data.replace Book.new(1, 'toitle', 'oithor')
|
68
|
+
|
69
|
+
books.search('title').ids.should == []
|
70
|
+
books.search('toitle').ids.should == ['1']
|
71
|
+
end
|
72
|
+
it 'handles clearing' do
|
73
|
+
data.clear
|
74
|
+
|
75
|
+
books.search('title').ids.should == []
|
76
|
+
end
|
77
|
+
it 'handles dumping and loading' do
|
78
|
+
data.dump
|
79
|
+
data.load
|
80
|
+
|
81
|
+
books.search('title').ids.should == ['1']
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'immediately indexing backend (no dump needed)' do
|
86
|
+
before(:each) do
|
87
|
+
data.backend described_class.new
|
88
|
+
data.clear
|
89
|
+
|
90
|
+
data.add Book.new(1, 'title', 'author')
|
91
|
+
end
|
92
|
+
|
93
|
+
instance_eval &its
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
# Describes a Picky index that uses the Redis backend
|
6
|
+
# for data storage.
|
7
|
+
#
|
8
|
+
describe Picky::Backends::Redis do
|
9
|
+
|
10
|
+
class Book
|
11
|
+
attr_reader :id, :title, :author
|
12
|
+
def initialize id, title, author
|
13
|
+
@id, @title, @author = id, title, author
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :data, :books
|
18
|
+
|
19
|
+
let(:data) do
|
20
|
+
Picky::Index.new(:books) do
|
21
|
+
key_format :to_s # TODO Also make to_i work.
|
22
|
+
source []
|
23
|
+
category :title, partial: Picky::Partial::Postfix.new(from: 1)
|
24
|
+
category :author, similarity: Picky::Generators::Similarity::DoubleMetaphone.new(3)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
let(:books) { Picky::Search.new data }
|
28
|
+
|
29
|
+
its = ->(*) do
|
30
|
+
it 'searching for it' do
|
31
|
+
books.search('title').ids.should == ['1']
|
32
|
+
end
|
33
|
+
it 'searching for it using multiple words' do
|
34
|
+
books.search('title author').ids.should == ['1']
|
35
|
+
end
|
36
|
+
it 'searching for it using partial' do
|
37
|
+
books.search('tit').ids.should == ['1']
|
38
|
+
end
|
39
|
+
it 'searching for it using similarity' do
|
40
|
+
books.search('aothor~').ids.should == ['1']
|
41
|
+
end
|
42
|
+
it 'handles removing' do
|
43
|
+
data.remove 1
|
44
|
+
|
45
|
+
books.search('title').ids.should == []
|
46
|
+
end
|
47
|
+
it 'handles removing with more than one entry' do
|
48
|
+
data.add Book.new(2, 'title', 'author')
|
49
|
+
|
50
|
+
books.search('title').ids.should == ['2', '1']
|
51
|
+
|
52
|
+
data.remove '1'
|
53
|
+
|
54
|
+
books.search('title').ids.should == ['2']
|
55
|
+
end
|
56
|
+
it 'handles removing with three entries' do
|
57
|
+
data.add Book.new(2, 'title', 'author')
|
58
|
+
data.add Book.new(3, 'title', 'author')
|
59
|
+
|
60
|
+
books.search('title').ids.should == ['3', '2', '1'] # TODO Should be ['3', '2', '1']
|
61
|
+
|
62
|
+
data.remove '1'
|
63
|
+
|
64
|
+
books.search('title').ids.should == ['3', '2']
|
65
|
+
end
|
66
|
+
it 'handles replacing' do
|
67
|
+
data.replace Book.new(1, 'toitle', 'oithor')
|
68
|
+
|
69
|
+
books.search('title').ids.should == []
|
70
|
+
books.search('toitle').ids.should == ['1']
|
71
|
+
end
|
72
|
+
it 'handles clearing' do
|
73
|
+
data.clear
|
74
|
+
|
75
|
+
books.search('title').ids.should == []
|
76
|
+
end
|
77
|
+
it 'handles dumping and loading' do
|
78
|
+
data.dump
|
79
|
+
data.load
|
80
|
+
|
81
|
+
books.search('title').ids.should == ['1']
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'default backend (dump needed)' do
|
86
|
+
before(:each) do
|
87
|
+
data.backend Picky::Backends::Redis.new
|
88
|
+
data.clear
|
89
|
+
|
90
|
+
data.add Book.new(1, 'title', 'author')
|
91
|
+
end
|
92
|
+
|
93
|
+
instance_eval &its
|
94
|
+
end
|
95
|
+
|
96
|
+
# context 'immediately indexing backend (no dump needed)' do
|
97
|
+
# before(:each) do
|
98
|
+
# data.backend Picky::Backends::Redis.new(immediate: true)
|
99
|
+
# data.clear
|
100
|
+
#
|
101
|
+
# data.add Book.new(1, 'title', 'author')
|
102
|
+
# end
|
103
|
+
#
|
104
|
+
# instance_eval &its
|
105
|
+
# end
|
106
|
+
|
107
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
# Describes a Picky index that uses the SQLite backend
|
6
|
+
# for data storage.
|
7
|
+
#
|
8
|
+
describe Picky::Backends::SQLite do
|
9
|
+
|
10
|
+
class Book
|
11
|
+
attr_reader :id, :title, :author
|
12
|
+
def initialize id, title, author
|
13
|
+
@id, @title, @author = id, title, author
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:data) do
|
18
|
+
Picky::Index.new(:books) do
|
19
|
+
source []
|
20
|
+
category :title, partial: Picky::Partial::Postfix.new(from: 1)
|
21
|
+
category :author, similarity: Picky::Generators::Similarity::DoubleMetaphone.new(3)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
let(:books) { Picky::Search.new data }
|
25
|
+
|
26
|
+
its = ->(*) do
|
27
|
+
it 'searching for it' do
|
28
|
+
books.search('title').ids.should == [1]
|
29
|
+
end
|
30
|
+
it 'searching for it using multiple words' do
|
31
|
+
books.search('title author').ids.should == [1]
|
32
|
+
end
|
33
|
+
it 'searching for it using partial' do
|
34
|
+
books.search('tit').ids.should == [1]
|
35
|
+
end
|
36
|
+
it 'searching for it using similarity' do
|
37
|
+
books.search('aothor~').ids.should == [1]
|
38
|
+
end
|
39
|
+
it 'handles removing' do
|
40
|
+
data.remove 1
|
41
|
+
|
42
|
+
books.search('title').ids.should == []
|
43
|
+
end
|
44
|
+
it 'handles removing with more than one entry' do
|
45
|
+
data.add Book.new(2, 'title', 'author')
|
46
|
+
|
47
|
+
books.search('title').ids.should == [2, 1]
|
48
|
+
|
49
|
+
data.remove 1
|
50
|
+
|
51
|
+
books.search('title').ids.should == [2]
|
52
|
+
end
|
53
|
+
it 'handles clearing' do
|
54
|
+
data.clear
|
55
|
+
|
56
|
+
books.search('title').ids.should == []
|
57
|
+
end
|
58
|
+
it 'handles dumping and loading' do
|
59
|
+
data.dump
|
60
|
+
data.load
|
61
|
+
|
62
|
+
books.search('title').ids.should == [1]
|
63
|
+
end
|
64
|
+
it 'handles removing with three entries' do
|
65
|
+
data.add Book.new(2, 'title', 'author')
|
66
|
+
data.add Book.new(3, 'title', 'author')
|
67
|
+
|
68
|
+
books.search('title').ids.should == [3, 2, 1]
|
69
|
+
|
70
|
+
data.remove 1
|
71
|
+
|
72
|
+
books.search('title').ids.should == [3, 2]
|
73
|
+
end
|
74
|
+
it 'handles replacing' do
|
75
|
+
data.replace Book.new(1, 'toitle', 'oithor')
|
76
|
+
|
77
|
+
books.search('title').ids.should == []
|
78
|
+
books.search('toitle').ids.should == [1]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'default backend (dump needed)' do
|
83
|
+
before(:each) do
|
84
|
+
data.backend described_class.new
|
85
|
+
data.clear
|
86
|
+
|
87
|
+
data.add Book.new(1, 'title', 'author')
|
88
|
+
end
|
89
|
+
|
90
|
+
instance_eval &its
|
91
|
+
end
|
92
|
+
|
93
|
+
# context 'immediately indexing backend (no dump needed)' do
|
94
|
+
# before(:each) do
|
95
|
+
# data.backend described_class.new(self_indexed: true)
|
96
|
+
# data.clear
|
97
|
+
#
|
98
|
+
# data.add Book.new(1, 'title', 'author')
|
99
|
+
# end
|
100
|
+
#
|
101
|
+
# instance_eval &its
|
102
|
+
# end
|
103
|
+
|
104
|
+
end
|
File without changes
|
@@ -2,11 +2,9 @@
|
|
2
2
|
#
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe "
|
5
|
+
describe "exact first" do
|
6
6
|
|
7
|
-
|
8
|
-
#
|
9
|
-
it 'can handle dynamic weights' do
|
7
|
+
it 'returns exact results first' do
|
10
8
|
index = Picky::Index.new :exact_first do
|
11
9
|
source { [] }
|
12
10
|
category :text, partial: Picky::Partial::Substring.new(from: 1)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe 'Search#max_allocations' do
|
6
|
+
|
7
|
+
it 'offers the option max_allocations' do
|
8
|
+
index = Picky::Index.new :dynamic_weights do
|
9
|
+
category :text1
|
10
|
+
category :text2
|
11
|
+
end
|
12
|
+
|
13
|
+
index.add Struct.new(:id, :text1, :text2).new(1, 'hello world', 'hello world')
|
14
|
+
|
15
|
+
try = Picky::Search.new index
|
16
|
+
|
17
|
+
try.search('hello world').allocations.size.should == 4
|
18
|
+
try.search('hello world').ids.should == [1,1,1,1]
|
19
|
+
|
20
|
+
try_again = Picky::Search.new index do
|
21
|
+
max_allocations 2
|
22
|
+
end
|
23
|
+
|
24
|
+
try_again.search('hello world').allocations.size.should == 2
|
25
|
+
try_again.search('hello world').ids.should == [1,1]
|
26
|
+
|
27
|
+
try_again.max_allocations 1
|
28
|
+
|
29
|
+
try_again.search('hello world').allocations.size.should == 1
|
30
|
+
try_again.search('hello world').ids.should == [1]
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -5,39 +5,38 @@ describe Picky::Backends::Redis::Basic do
|
|
5
5
|
let(:client) { stub :client }
|
6
6
|
|
7
7
|
context 'without options' do
|
8
|
-
let(:
|
8
|
+
let(:backend) { described_class.new client, :some_namespace }
|
9
9
|
|
10
10
|
describe 'load, retrieve, delete' do
|
11
11
|
it 'is nothing they do (at least on the backend)' do
|
12
|
-
|
12
|
+
backend.should_receive(:client).never
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
index.delete
|
14
|
+
backend.load
|
15
|
+
backend.retrieve
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
20
19
|
describe 'empty' do
|
21
|
-
it 'returns the container that is used for
|
22
|
-
|
20
|
+
it 'returns the container that is used for backending' do
|
21
|
+
backend.empty.should == {}
|
23
22
|
end
|
24
23
|
end
|
25
24
|
|
26
25
|
describe 'initial' do
|
27
26
|
it 'is correct' do
|
28
|
-
|
27
|
+
backend.initial.should == {}
|
29
28
|
end
|
30
29
|
end
|
31
30
|
|
32
31
|
describe 'to_s' do
|
33
32
|
it 'returns the cache path with the default file extension' do
|
34
|
-
|
33
|
+
backend.to_s.should == 'Picky::Backends::Redis::Basic(some_namespace:*)'
|
35
34
|
end
|
36
35
|
end
|
37
36
|
end
|
38
37
|
|
39
38
|
context 'with options' do
|
40
|
-
let(:
|
39
|
+
let(:backend) do
|
41
40
|
described_class.new client,
|
42
41
|
:some_namespace,
|
43
42
|
empty: [],
|
@@ -45,14 +44,14 @@ describe Picky::Backends::Redis::Basic do
|
|
45
44
|
end
|
46
45
|
|
47
46
|
describe 'empty' do
|
48
|
-
it 'returns the container that is used for
|
49
|
-
|
47
|
+
it 'returns the container that is used for backending' do
|
48
|
+
backend.empty.should == []
|
50
49
|
end
|
51
50
|
end
|
52
51
|
|
53
52
|
describe 'initial' do
|
54
53
|
it 'is correct' do
|
55
|
-
|
54
|
+
backend.initial.class.should == Array
|
56
55
|
end
|
57
56
|
end
|
58
57
|
end
|