picky 4.21.2 → 4.22.0
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.
- checksums.yaml +4 -4
- data/lib/picky/bundle.rb +10 -9
- data/lib/picky/generators/similarity.rb +4 -4
- data/lib/picky/index_indexing.rb +2 -0
- data/lib/picky/query/allocation.rb +18 -10
- data/lib/picky/query/allocations.rb +4 -4
- data/lib/picky/query/combinations.rb +9 -3
- data/lib/picky/results.rb +19 -13
- data/lib/picky/search.rb +9 -9
- data/spec/functional/arrays_as_ids_spec.rb +2 -2
- data/spec/functional/results_spec.rb +63 -0
- data/spec/functional/similarity_spec.rb +72 -0
- data/spec/functional/terminate_early_spec.rb +18 -10
- data/spec/lib/bundle_indexing_spec.rb +2 -2
- data/spec/lib/generators/similarity/double_metaphone_spec.rb +0 -39
- data/spec/lib/generators/similarity/metaphone_spec.rb +0 -40
- data/spec/lib/generators/similarity/soundex_spec.rb +0 -40
- data/spec/lib/generators/similarity_spec.rb +6 -6
- data/spec/lib/results_spec.rb +9 -19
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 954befab3206369e74bfcdda5281da5f9c638f6a
|
4
|
+
data.tar.gz: 7128af9049b1b9ce1f5d29fbc1b37df8ef9eca58
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa52877a9229a585e86fa4e2dd47dfedd093a53e1f7cc802eb6b309ccc49e0ef9c161c2e3b9b6be0ebdec9866365bf940e589dcd83731bdef4c1593fb6c3bce4
|
7
|
+
data.tar.gz: 6f5095a81599f40c006db8cce7bacfa82b58ac8f7043b64d1287ac673dec5b40bb3dd558213dd478d6ee5980f82f1695227a94bc158fe95c3aaa7d93e7dfc172
|
data/lib/picky/bundle.rb
CHANGED
@@ -128,19 +128,20 @@ module Picky
|
|
128
128
|
|
129
129
|
# Get a list of similar texts.
|
130
130
|
#
|
131
|
-
# Note:
|
131
|
+
# Note: Also checks for itself.
|
132
132
|
#
|
133
133
|
def similar text
|
134
134
|
code = similarity_strategy.encode text
|
135
135
|
return [] unless code
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
136
|
+
@similarity[code] || []
|
137
|
+
# similar_codes = @similarity[code]
|
138
|
+
# if similar_codes.blank?
|
139
|
+
# [] # Return a simple array.
|
140
|
+
# else
|
141
|
+
# similar_codes = similar_codes.dup
|
142
|
+
# similar_codes.delete text # Remove itself.
|
143
|
+
# similar_codes
|
144
|
+
# end
|
144
145
|
end
|
145
146
|
|
146
147
|
# If a key format is set, use it, else forward to the category.
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Picky
|
2
|
-
|
2
|
+
|
3
3
|
module Generators
|
4
4
|
|
5
5
|
module Similarity
|
@@ -12,8 +12,8 @@ module Picky
|
|
12
12
|
thing
|
13
13
|
else
|
14
14
|
raise <<-ERROR
|
15
|
-
|
16
|
-
* for example a Similarity::
|
15
|
+
Similarity options #{identifier_for(index_name, category_name)}should be either
|
16
|
+
* for example a Similarity::Soundex.new(n), Similarity::Metaphone.new(n), Similarity::DoubleMetaphone.new(n) etc.
|
17
17
|
or
|
18
18
|
* an object that responds to #encode(text) => encoded_text and #prioritize(array_of_encoded, encoded)
|
19
19
|
ERROR
|
@@ -23,5 +23,5 @@ ERROR
|
|
23
23
|
end
|
24
24
|
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
end
|
data/lib/picky/index_indexing.rb
CHANGED
@@ -105,6 +105,8 @@ module Picky
|
|
105
105
|
#
|
106
106
|
# Parameter is a method name to use on the key (e.g. :to_i, :to_s, :strip, :split).
|
107
107
|
#
|
108
|
+
# TODO Rename to id_format.
|
109
|
+
#
|
108
110
|
def key_format key_format = nil
|
109
111
|
key_format ? (@key_format = key_format) : @key_format
|
110
112
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Picky
|
2
2
|
|
3
3
|
module Query
|
4
|
-
|
4
|
+
|
5
5
|
# An Allocation contains an ordered list of
|
6
6
|
# tuples (Combinations).
|
7
7
|
# The Combinations are ordered according to the order
|
@@ -25,7 +25,13 @@ module Picky
|
|
25
25
|
@index = index
|
26
26
|
@combinations = combinations
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
|
+
# TODO
|
30
|
+
#
|
31
|
+
def each &block
|
32
|
+
@combinations.each &block
|
33
|
+
end
|
34
|
+
|
29
35
|
#
|
30
36
|
#
|
31
37
|
def backend
|
@@ -48,6 +54,14 @@ module Picky
|
|
48
54
|
end)
|
49
55
|
end
|
50
56
|
|
57
|
+
# Ids return by default [].
|
58
|
+
#
|
59
|
+
# TODO Calculate ids here.
|
60
|
+
#
|
61
|
+
def ids
|
62
|
+
@ids ||= []
|
63
|
+
end
|
64
|
+
|
51
65
|
# Asks the backend for the (intersected) ids.
|
52
66
|
#
|
53
67
|
# Note: Combinations can be empty on eg.
|
@@ -56,18 +70,12 @@ module Picky
|
|
56
70
|
#
|
57
71
|
def calculate_ids amount, offset
|
58
72
|
return [] if @combinations.empty? # Checked here to avoid checking in each backend.
|
59
|
-
|
73
|
+
|
60
74
|
# TODO Redesign such that ids is only created (and cached) if requested.
|
61
75
|
#
|
62
76
|
backend.ids @combinations, amount, offset
|
63
77
|
end
|
64
78
|
|
65
|
-
# Ids return by default [].
|
66
|
-
#
|
67
|
-
def ids
|
68
|
-
@ids ||= []
|
69
|
-
end
|
70
|
-
|
71
79
|
# This starts the searching process.
|
72
80
|
#
|
73
81
|
# Returns the calculated ids (from the offset).
|
@@ -112,7 +120,7 @@ module Picky
|
|
112
120
|
def to_result
|
113
121
|
[@index.result_identifier, self.score, self.count, @combinations.to_result, self.ids] if self.count && self.count > 0
|
114
122
|
end
|
115
|
-
|
123
|
+
|
116
124
|
#
|
117
125
|
#
|
118
126
|
def to_qualifiers
|
@@ -53,7 +53,7 @@ module Picky
|
|
53
53
|
def remove_categories categories = []
|
54
54
|
@allocations.each { |allocation| allocation.remove categories } unless categories.empty?
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
# Removes allocations.
|
58
58
|
#
|
59
59
|
# Only those passed in are removed.
|
@@ -70,7 +70,7 @@ module Picky
|
|
70
70
|
allocation
|
71
71
|
end
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
# Keeps allocations.
|
75
75
|
#
|
76
76
|
# Only those passed in are kept.
|
@@ -90,7 +90,7 @@ module Picky
|
|
90
90
|
# Returns the top amount ids.
|
91
91
|
#
|
92
92
|
def ids amount = 20
|
93
|
-
|
93
|
+
inject([]) do |total, allocation|
|
94
94
|
total.size >= amount ? (return total.shift(amount)) : total + allocation.ids
|
95
95
|
end
|
96
96
|
end
|
@@ -128,7 +128,7 @@ module Picky
|
|
128
128
|
end
|
129
129
|
end
|
130
130
|
end
|
131
|
-
|
131
|
+
|
132
132
|
# Same as #process! but removes duplicate ids from results.
|
133
133
|
#
|
134
134
|
# Note that in the result later on an allocation won't be
|
@@ -6,7 +6,7 @@ module Picky
|
|
6
6
|
#
|
7
7
|
# Combinations contain methods for calculating score (including
|
8
8
|
# the boost) and ids for each of its Combination s.
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# They are the core of an Allocation.
|
11
11
|
# An Allocation consists of a number of Combinations.
|
12
12
|
#
|
@@ -23,6 +23,12 @@ module Picky
|
|
23
23
|
@combinations = combinations
|
24
24
|
end
|
25
25
|
|
26
|
+
# TODO
|
27
|
+
#
|
28
|
+
def each &block
|
29
|
+
@combinations.each &block
|
30
|
+
end
|
31
|
+
|
26
32
|
# Sums up the weights of the combinations.
|
27
33
|
#
|
28
34
|
# Note: Optimized sum(&:weight) away – ~3% improvement.
|
@@ -39,7 +45,7 @@ module Picky
|
|
39
45
|
# ids that have an associated identifier that is nil.
|
40
46
|
#
|
41
47
|
def remove categories = []
|
42
|
-
# TODO Do not use the name, but the category.
|
48
|
+
# TODO Do not use the name, but the category.
|
43
49
|
#
|
44
50
|
@combinations.reject! { |combination| categories.include?(combination.category.name) }
|
45
51
|
end
|
@@ -49,7 +55,7 @@ module Picky
|
|
49
55
|
def to_result
|
50
56
|
@combinations.map &:to_result
|
51
57
|
end
|
52
|
-
|
58
|
+
|
53
59
|
def to_qualifiers
|
54
60
|
@combinations.map &:category_name
|
55
61
|
end
|
data/lib/picky/results.rb
CHANGED
@@ -5,31 +5,29 @@ module Picky
|
|
5
5
|
#
|
6
6
|
class Results
|
7
7
|
|
8
|
+
include Enumerable
|
9
|
+
|
8
10
|
# Duration is set externally by the query.
|
9
11
|
#
|
10
12
|
attr_writer :duration
|
11
|
-
attr_reader :
|
12
|
-
:offset,
|
13
|
+
attr_reader :offset,
|
13
14
|
:amount,
|
14
15
|
:query
|
15
16
|
|
16
17
|
# Takes instances of Query::Allocations as param.
|
17
18
|
#
|
18
|
-
def initialize query = nil, amount = 0, offset = 0, allocations = Query::Allocations.new
|
19
|
+
def initialize query = nil, amount = 0, offset = 0, allocations = Query::Allocations.new, extra_allocations = nil, unique = false
|
19
20
|
@amount = amount
|
20
21
|
@query = query
|
21
22
|
@offset = offset
|
22
23
|
@allocations = allocations
|
24
|
+
@extra_allocations = extra_allocations
|
25
|
+
@unique = unique
|
23
26
|
end
|
24
27
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
#
|
29
|
-
def self.from query, amount, offset, allocations, extra_allocations = nil, unique = false
|
30
|
-
results = new query, amount, offset, allocations
|
31
|
-
results.prepare! extra_allocations, unique
|
32
|
-
results
|
28
|
+
def allocations
|
29
|
+
prepare! *(@prepared || [@extra_allocations, @unique])
|
30
|
+
@allocations
|
33
31
|
end
|
34
32
|
|
35
33
|
# This starts the actual processing.
|
@@ -38,9 +36,15 @@ module Picky
|
|
38
36
|
# and no ids are calculated.
|
39
37
|
#
|
40
38
|
def prepare! extra_allocations = nil, unique = false
|
39
|
+
return if @prepared == [extra_allocations, unique] # cached?
|
40
|
+
@prepared = [extra_allocations, unique] # cache!
|
41
41
|
unique ?
|
42
|
-
allocations.process_unique!(amount, offset, extra_allocations) :
|
43
|
-
allocations.process!(amount, offset, extra_allocations)
|
42
|
+
@allocations.process_unique!(amount, offset, extra_allocations) :
|
43
|
+
@allocations.process!(amount, offset, extra_allocations)
|
44
|
+
end
|
45
|
+
|
46
|
+
def each &block
|
47
|
+
allocations.each &block
|
44
48
|
end
|
45
49
|
|
46
50
|
# Forwards to allocations.
|
@@ -49,6 +53,8 @@ module Picky
|
|
49
53
|
# should not be done repeatedly. Just keep
|
50
54
|
# a reference to the result.
|
51
55
|
#
|
56
|
+
# TODO Rewrite such that this triggers calculation, not prepare!
|
57
|
+
#
|
52
58
|
def ids only = amount
|
53
59
|
allocations.ids only
|
54
60
|
end
|
data/lib/picky/search.rb
CHANGED
@@ -138,7 +138,7 @@ module Picky
|
|
138
138
|
def boost boosts
|
139
139
|
@boosts = extract_boosts boosts
|
140
140
|
end
|
141
|
-
|
141
|
+
|
142
142
|
# Ignore given categories and/or combinations of
|
143
143
|
# categories.
|
144
144
|
#
|
@@ -158,7 +158,7 @@ module Picky
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
end
|
161
|
-
|
161
|
+
|
162
162
|
# Exclusively keep combinations of
|
163
163
|
# categories.
|
164
164
|
#
|
@@ -171,7 +171,7 @@ module Picky
|
|
171
171
|
def only *allocations_and_categories
|
172
172
|
indexes.keep_allocations *allocations_and_categories
|
173
173
|
end
|
174
|
-
|
174
|
+
|
175
175
|
# Ignore the given token if it cannot be matched to a category.
|
176
176
|
# The default behaviour is that if a token does not match to
|
177
177
|
# any category, the query will not return anything (since a
|
@@ -236,12 +236,12 @@ module Picky
|
|
236
236
|
# Note: Internal method, use #search to search.
|
237
237
|
#
|
238
238
|
def execute tokens, ids, offset, original_text = nil, unique = false
|
239
|
-
Results.
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
239
|
+
Results.new original_text,
|
240
|
+
ids,
|
241
|
+
offset,
|
242
|
+
sorted_allocations(tokens, @max_allocations),
|
243
|
+
@extra_allocations,
|
244
|
+
unique
|
245
245
|
end
|
246
246
|
|
247
247
|
# Forwards the tokenizing to the query tokenizer.
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'ostruct'
|
5
|
+
|
6
|
+
describe "Results" do
|
7
|
+
|
8
|
+
let(:index1) { Picky::Index.new :results1 }
|
9
|
+
let(:index2) { Picky::Index.new :results2 }
|
10
|
+
let(:try) { Picky::Search.new index1, index2 }
|
11
|
+
|
12
|
+
# Test the enumerator abilities.
|
13
|
+
#
|
14
|
+
it 'can enumerate through the allocations' do
|
15
|
+
index1.category :text
|
16
|
+
index2.category :text
|
17
|
+
|
18
|
+
thing = OpenStruct.new id: 1, text: "ohai"
|
19
|
+
other = OpenStruct.new id: 2, text: "ohai kthxbye"
|
20
|
+
|
21
|
+
index1.add thing
|
22
|
+
index1.add other
|
23
|
+
index2.add thing
|
24
|
+
|
25
|
+
# each
|
26
|
+
#
|
27
|
+
expected = [
|
28
|
+
[2, 1],
|
29
|
+
[1]
|
30
|
+
]
|
31
|
+
try.search("text:ohai").each do |allocation|
|
32
|
+
expected.shift.should == allocation.ids
|
33
|
+
end
|
34
|
+
|
35
|
+
# map
|
36
|
+
#
|
37
|
+
try.search("text:ohai").map(&:ids).should == [
|
38
|
+
[2, 1],
|
39
|
+
[1]
|
40
|
+
]
|
41
|
+
try.search("text:ohai").map(&:score).should == [0.693, 0.0]
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'can re-prepare with different parameters' do
|
45
|
+
index1.category :text
|
46
|
+
index2.category :text
|
47
|
+
|
48
|
+
thing = OpenStruct.new id: 1, text: "ohai"
|
49
|
+
other = OpenStruct.new id: 2, text: "ohai kthxbye"
|
50
|
+
|
51
|
+
index1.add thing
|
52
|
+
index1.add other
|
53
|
+
index2.add thing
|
54
|
+
|
55
|
+
results = try.search "text:ohai"
|
56
|
+
results.ids.should == [2, 1, 1]
|
57
|
+
|
58
|
+
results.prepare! nil, true
|
59
|
+
results.ids.should == [2, 1]
|
60
|
+
results.ids.object_id.should_not == results.ids.object_id # Not cached.
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe 'similarity' do
|
6
|
+
it 'does Soundex' do
|
7
|
+
index = Picky::Index.new :phonetic do
|
8
|
+
indexing removes_characters: /[^a-z\s]/i
|
9
|
+
category :text, similarity: Picky::Similarity::Soundex.new(1)
|
10
|
+
end
|
11
|
+
|
12
|
+
index.replace_from id: 1, text: "Peter"
|
13
|
+
|
14
|
+
try = Picky::Search.new index
|
15
|
+
|
16
|
+
# No ~, no similarity.
|
17
|
+
#
|
18
|
+
try.search("text:petor").ids.should == []
|
19
|
+
|
20
|
+
# Finds soundex-similar text.
|
21
|
+
#
|
22
|
+
try.search("text:petor~").ids.should == [1]
|
23
|
+
|
24
|
+
# Finds the identity.
|
25
|
+
#
|
26
|
+
try.search("text:peter~").ids.should == [1]
|
27
|
+
end
|
28
|
+
it 'does Metaphone' do
|
29
|
+
index = Picky::Index.new :phonetic do
|
30
|
+
indexing removes_characters: /[^a-z\s]/i
|
31
|
+
category :text, similarity: Picky::Similarity::Metaphone.new(1)
|
32
|
+
end
|
33
|
+
|
34
|
+
index.replace_from id: 1, text: "Peter"
|
35
|
+
|
36
|
+
try = Picky::Search.new index
|
37
|
+
|
38
|
+
# No ~, no similarity.
|
39
|
+
#
|
40
|
+
try.search("text:pdr").ids.should == []
|
41
|
+
|
42
|
+
# Finds soundex-similar text.
|
43
|
+
#
|
44
|
+
try.search("text:pdr~").ids.should == [1]
|
45
|
+
|
46
|
+
# Finds the identity.
|
47
|
+
#
|
48
|
+
try.search("text:peter~").ids.should == [1]
|
49
|
+
end
|
50
|
+
it 'does DoubleMetaphone' do
|
51
|
+
index = Picky::Index.new :phonetic do
|
52
|
+
indexing removes_characters: /[^a-z\s]/i
|
53
|
+
category :text, similarity: Picky::Similarity::DoubleMetaphone.new(1)
|
54
|
+
end
|
55
|
+
|
56
|
+
index.replace_from id: 1, text: "Peter"
|
57
|
+
|
58
|
+
try = Picky::Search.new index
|
59
|
+
|
60
|
+
# No ~, no similarity.
|
61
|
+
#
|
62
|
+
try.search("text:pdr").ids.should == []
|
63
|
+
|
64
|
+
# Finds soundex-similar text.
|
65
|
+
#
|
66
|
+
try.search("text:pdr~").ids.should == [1]
|
67
|
+
|
68
|
+
# Finds the identity.
|
69
|
+
#
|
70
|
+
try.search("text:peter~").ids.should == [1]
|
71
|
+
end
|
72
|
+
end
|
@@ -156,43 +156,51 @@ describe 'Search#terminate_early' do
|
|
156
156
|
fast = performance_of do
|
157
157
|
try_fast.search 'hello'
|
158
158
|
end
|
159
|
-
|
159
|
+
slow.should < 0.00009
|
160
|
+
fast.should < 0.00005
|
161
|
+
(slow/fast).should >= 1.5
|
160
162
|
|
161
163
|
try_slow = Picky::Search.new index
|
162
164
|
slow = performance_of do
|
163
|
-
try_slow.search
|
165
|
+
try_slow.search('hello hello').ids
|
164
166
|
end
|
165
167
|
try_fast = Picky::Search.new index do
|
166
168
|
terminate_early
|
167
169
|
end
|
168
170
|
fast = performance_of do
|
169
|
-
try_fast.search
|
171
|
+
try_fast.search('hello hello').ids
|
170
172
|
end
|
171
|
-
|
173
|
+
slow.should < 0.00015
|
174
|
+
fast.should < 0.00009
|
175
|
+
(slow/fast).should >= 1.5
|
172
176
|
|
173
177
|
try_slow = Picky::Search.new index
|
174
178
|
slow = performance_of do
|
175
|
-
try_slow.search
|
179
|
+
try_slow.search('hello hello hello').ids
|
176
180
|
end
|
177
181
|
try_fast = Picky::Search.new index do
|
178
182
|
terminate_early
|
179
183
|
end
|
180
184
|
fast = performance_of do
|
181
|
-
try_fast.search
|
185
|
+
try_fast.search('hello hello hello').ids
|
182
186
|
end
|
183
|
-
|
187
|
+
slow.should < 0.0005
|
188
|
+
fast.should < 0.00025
|
189
|
+
(slow/fast).should >= 2
|
184
190
|
|
185
191
|
try_slow = Picky::Search.new index
|
186
192
|
slow = performance_of do
|
187
|
-
try_slow.search
|
193
|
+
try_slow.search('hello hello hello hello').ids
|
188
194
|
end
|
189
195
|
try_fast = Picky::Search.new index do
|
190
196
|
terminate_early
|
191
197
|
end
|
192
198
|
fast = performance_of do
|
193
|
-
try_fast.search
|
199
|
+
try_fast.search('hello hello hello hello').ids
|
194
200
|
end
|
195
|
-
|
201
|
+
slow.should < 0.002
|
202
|
+
fast.should < 0.0008
|
203
|
+
(slow/fast).should >= 2.3
|
196
204
|
end
|
197
205
|
|
198
206
|
end
|
@@ -21,8 +21,8 @@ describe Picky::Bundle do
|
|
21
21
|
bundle.add_similarity :dragon
|
22
22
|
bundle.add_similarity :dargon
|
23
23
|
end
|
24
|
-
it 'returns the right similars (
|
25
|
-
bundle.similar(:dragon).should == [:dargon]
|
24
|
+
it 'returns the right similars (including itself)' do
|
25
|
+
bundle.similar(:dragon).should == [:dargon, :dragon]
|
26
26
|
end
|
27
27
|
it 'returns the right similars' do
|
28
28
|
bundle.similar(:trkn).should == [:dargon, :dragon]
|
@@ -19,48 +19,9 @@ describe Picky::Generators::Similarity::DoubleMetaphone do
|
|
19
19
|
@similarity.encode(text).should == expected
|
20
20
|
end
|
21
21
|
end
|
22
|
-
# def self.it_should_generate_from index, expected
|
23
|
-
# it "should generate #{expected.inspect} correctly from #{index.inspect}" do
|
24
|
-
# @similarity.generate_from(index).should == expected
|
25
|
-
# end
|
26
|
-
# end
|
27
22
|
|
28
23
|
it_should_encode :meier, :MR
|
29
24
|
it_should_encode :grossberger, :KRSP
|
30
25
|
it_should_encode :hadelbla, :HTLP
|
31
26
|
|
32
|
-
# it_should_generate_from({}, {})
|
33
|
-
# it_should_generate_from({ :maier => nil, :meier => nil }, :MR => [:maier, :meier]) # should be correctly ordered
|
34
|
-
# it_should_generate_from({ :maier => nil, :meier => nil, :hallaballa => nil }, :MR => [:maier, :meier], :HLPL => [:hallaballa])
|
35
|
-
# it_should_generate_from({ :susan => nil, :susanne => nil, :bruderer => nil }, :SSN => [:susan, :susanne], :PRTR => [:bruderer])
|
36
|
-
|
37
|
-
# describe 'with reduced amount' do
|
38
|
-
# before(:each) do
|
39
|
-
# @similarity = described_class.new(1)
|
40
|
-
# end
|
41
|
-
# it_should_generate_from({ :maier => nil, :meier => nil }, :MR => [:maier])
|
42
|
-
# it_should_generate_from({ :susan => nil, :susanne => nil, :bruderer => nil }, :SSN => [:susan], :PRTR => [:bruderer])
|
43
|
-
# end
|
44
|
-
|
45
|
-
# describe 'hashify' do
|
46
|
-
# it 'should turn an empty list into an empty hash' do
|
47
|
-
# @similarity.send(:hashify, []).should == {}
|
48
|
-
# end
|
49
|
-
# it 'should turn the list into an unordered similarity' do
|
50
|
-
# @similarity.send(:hashify, [:meier, :maier]).should == { :MR => [:meier, :maier] }
|
51
|
-
# end
|
52
|
-
# it 'should turn the list into a encoded hash' do
|
53
|
-
# @similarity.send(:hashify, [:meier, :maier, :peter]).should == { :MR => [:meier, :maier], :PTR => [:peter] }
|
54
|
-
# end
|
55
|
-
# end
|
56
|
-
#
|
57
|
-
# context 'integration' do
|
58
|
-
# it 'should return the right ordered array' do
|
59
|
-
# index = @similarity.generate_from :meier => nil, :maier => nil, :mairai => nil, :mair => nil, :meira => nil
|
60
|
-
# code = @similarity.encoded :maier
|
61
|
-
#
|
62
|
-
# index[code].should == [:mair, :maier, :meier, :meira, :mairai]
|
63
|
-
# end
|
64
|
-
# end
|
65
|
-
|
66
27
|
end
|
@@ -20,48 +20,8 @@ describe Picky::Generators::Similarity::Metaphone do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
# def self.it_should_generate_from index, expected
|
24
|
-
# it "should generate #{expected.inspect} correctly from #{index.inspect}" do
|
25
|
-
# @similarity.generate_from(index).should == expected
|
26
|
-
# end
|
27
|
-
# end
|
28
|
-
|
29
23
|
it_should_encode :meier, :MR
|
30
24
|
it_should_encode :grossberger, :KRSBRJR
|
31
25
|
it_should_encode :hadelbla, :HTLBL
|
32
26
|
|
33
|
-
# it_should_generate_from({}, {})
|
34
|
-
# it_should_generate_from({ :maier => nil, :meier => nil }, :MR => [:maier, :meier]) # should be correctly ordered
|
35
|
-
# it_should_generate_from({ :maier => nil, :meier => nil, :hallaballa => nil }, :MR => [:maier, :meier], :HLBL => [:hallaballa])
|
36
|
-
# it_should_generate_from({ :susan => nil, :susanne => nil, :bruderer => nil }, :SSN => [:susan, :susanne], :BRTRR => [:bruderer])
|
37
|
-
|
38
|
-
# describe 'with reduced amount' do
|
39
|
-
# before(:each) do
|
40
|
-
# @similarity = described_class.new(1)
|
41
|
-
# end
|
42
|
-
# it_should_generate_from({ :maier => nil, :meier => nil }, :MR => [:maier])
|
43
|
-
# it_should_generate_from({ :susan => nil, :susanne => nil, :bruderer => nil }, :SSN => [:susan], :BRTRR => [:bruderer])
|
44
|
-
# end
|
45
|
-
#
|
46
|
-
# describe 'hashify' do
|
47
|
-
# it 'should turn an empty list into an empty hash' do
|
48
|
-
# @similarity.send(:hashify, []).should == {}
|
49
|
-
# end
|
50
|
-
# it 'should turn the list into an unordered similarity' do
|
51
|
-
# @similarity.send(:hashify, [:meier, :maier]).should == { :MR => [:meier, :maier] }
|
52
|
-
# end
|
53
|
-
# it 'should turn the list into a encoded hash' do
|
54
|
-
# @similarity.send(:hashify, [:meier, :maier, :peter]).should == { :MR => [:meier, :maier], :PTR => [:peter] }
|
55
|
-
# end
|
56
|
-
# end
|
57
|
-
#
|
58
|
-
# context 'integration' do
|
59
|
-
# it 'should return the right ordered array' do
|
60
|
-
# index = @similarity.generate_from :meier => nil, :maier => nil, :mairai => nil, :mair => nil, :meira => nil
|
61
|
-
# code = @similarity.encoded :maier
|
62
|
-
#
|
63
|
-
# index[code].should == [:mair, :maier, :meier, :meira, :mairai]
|
64
|
-
# end
|
65
|
-
# end
|
66
|
-
|
67
27
|
end
|
@@ -20,48 +20,8 @@ describe Picky::Generators::Similarity::Soundex do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
# def self.it_should_generate_from index, expected
|
24
|
-
# it "should generate #{expected.inspect} correctly from #{index.inspect}" do
|
25
|
-
# @similarity.generate_from(index).should == expected
|
26
|
-
# end
|
27
|
-
# end
|
28
|
-
|
29
23
|
it_should_encode :meier, :M600
|
30
24
|
it_should_encode :grossberger, :G621
|
31
25
|
it_should_encode :hadelbla, :H341
|
32
26
|
|
33
|
-
# it_should_generate_from({}, {})
|
34
|
-
# it_should_generate_from({ :maier => nil, :meier => nil }, :M600 => [:maier, :meier]) # should be correctly ordered
|
35
|
-
# it_should_generate_from({ :maier => nil, :meier => nil, :hallaballa => nil }, :M600 => [:maier, :meier], :H414 => [:hallaballa])
|
36
|
-
# it_should_generate_from({ :susan => nil, :susanne => nil, :bruderer => nil }, :S250 => [:susan, :susanne], :B636 => [:bruderer])
|
37
|
-
|
38
|
-
# describe 'with reduced amount' do
|
39
|
-
# before(:each) do
|
40
|
-
# @similarity = described_class.new(1)
|
41
|
-
# end
|
42
|
-
# it_should_generate_from({ :maier => nil, :meier => nil }, :M600 => [:maier])
|
43
|
-
# it_should_generate_from({ :susan => nil, :susanne => nil, :bruderer => nil }, :S250 => [:susan], :B636 => [:bruderer])
|
44
|
-
# end
|
45
|
-
|
46
|
-
# describe 'hashify' do
|
47
|
-
# it 'should turn an empty list into an empty hash' do
|
48
|
-
# @similarity.send(:hashify, []).should == {}
|
49
|
-
# end
|
50
|
-
# it 'should turn the list into an unordered similarity' do
|
51
|
-
# @similarity.send(:hashify, [:meier, :maier]).should == { :M600 => [:meier, :maier] }
|
52
|
-
# end
|
53
|
-
# it 'should turn the list into a encoded hash' do
|
54
|
-
# @similarity.send(:hashify, [:meier, :maier, :peter]).should == { :M600 => [:meier, :maier], :P360 => [:peter] }
|
55
|
-
# end
|
56
|
-
# end
|
57
|
-
|
58
|
-
# context 'integration' do
|
59
|
-
# it 'should return the right ordered array' do
|
60
|
-
# index = @similarity.generate_from :meier => nil, :maier => nil, :mairai => nil, :mair => nil, :meira => nil
|
61
|
-
# code = @similarity.encoded :maier
|
62
|
-
#
|
63
|
-
# index[code].should == [:mair, :maier, :meier, :meira, :mairai]
|
64
|
-
# end
|
65
|
-
# end
|
66
|
-
|
67
27
|
end
|
@@ -28,8 +28,8 @@ describe Picky::Generators::Similarity do
|
|
28
28
|
expect {
|
29
29
|
similarity.from Object.new
|
30
30
|
}.to raise_error(<<-ERROR)
|
31
|
-
|
32
|
-
* for example a Similarity::
|
31
|
+
Similarity options should be either
|
32
|
+
* for example a Similarity::Soundex.new(n), Similarity::Metaphone.new(n), Similarity::DoubleMetaphone.new(n) etc.
|
33
33
|
or
|
34
34
|
* an object that responds to #encode(text) => encoded_text and #prioritize(array_of_encoded, encoded)
|
35
35
|
ERROR
|
@@ -38,8 +38,8 @@ ERROR
|
|
38
38
|
expect {
|
39
39
|
similarity.from Object.new, 'some_index'
|
40
40
|
}.to raise_error(<<-ERROR)
|
41
|
-
|
42
|
-
* for example a Similarity::
|
41
|
+
Similarity options for some_index should be either
|
42
|
+
* for example a Similarity::Soundex.new(n), Similarity::Metaphone.new(n), Similarity::DoubleMetaphone.new(n) etc.
|
43
43
|
or
|
44
44
|
* an object that responds to #encode(text) => encoded_text and #prioritize(array_of_encoded, encoded)
|
45
45
|
ERROR
|
@@ -48,8 +48,8 @@ ERROR
|
|
48
48
|
expect {
|
49
49
|
similarity.from Object.new, 'some_index', 'some_category'
|
50
50
|
}.to raise_error(<<-ERROR)
|
51
|
-
|
52
|
-
* for example a Similarity::
|
51
|
+
Similarity options for some_index:some_category should be either
|
52
|
+
* for example a Similarity::Soundex.new(n), Similarity::Metaphone.new(n), Similarity::DoubleMetaphone.new(n) etc.
|
53
53
|
or
|
54
54
|
* an object that responds to #encode(text) => encoded_text and #prioritize(array_of_encoded, encoded)
|
55
55
|
ERROR
|
data/spec/lib/results_spec.rb
CHANGED
@@ -2,34 +2,23 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Picky::Results do
|
4
4
|
|
5
|
-
describe "from" do
|
6
|
-
before(:each) do
|
7
|
-
@results = double :results
|
8
|
-
described_class.stub :new => @results
|
9
|
-
|
10
|
-
@results.stub :prepare!
|
11
|
-
end
|
12
|
-
it "should generate a result" do
|
13
|
-
described_class.from("some query", 20, 0, @allocations).should == @results
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
5
|
describe "ids" do
|
18
6
|
before(:each) do
|
19
7
|
@allocations = double :allocations
|
20
|
-
@results = described_class.new :unimportant, :amount, :
|
8
|
+
@results = described_class.new :unimportant, :amount, :offset, @allocations
|
21
9
|
end
|
22
10
|
it "forwards" do
|
11
|
+
@allocations.should_receive(:process!).once.with :amount, :offset, nil
|
23
12
|
@allocations.should_receive(:ids).once.with :anything
|
24
13
|
|
25
14
|
@results.ids :anything
|
26
15
|
end
|
27
16
|
it "forwards and uses amount if nothing given" do
|
17
|
+
@allocations.should_receive(:process!).once.with :amount, :offset, nil
|
28
18
|
@allocations.should_receive(:ids).once.with :amount
|
29
19
|
|
30
20
|
@results.ids
|
31
21
|
end
|
32
|
-
|
33
22
|
end
|
34
23
|
|
35
24
|
describe 'to_s time format' do
|
@@ -54,12 +43,12 @@ describe Picky::Results do
|
|
54
43
|
context 'with results' do
|
55
44
|
before(:each) do
|
56
45
|
@allocations = double :allocations,
|
57
|
-
|
58
|
-
|
46
|
+
:process! => nil,
|
47
|
+
:size => 12
|
59
48
|
|
60
49
|
@results = described_class.new "some_query", 20, 1234, @allocations
|
61
50
|
@results.stub :duration => 0.1234567890,
|
62
|
-
|
51
|
+
:total => 12345678
|
63
52
|
end
|
64
53
|
it 'should output a specific log' do
|
65
54
|
@results.to_s.should == '>|2011-08-16 10:07:33|0.123457|some_query |12345678|1234|12|'
|
@@ -94,7 +83,8 @@ describe Picky::Results do
|
|
94
83
|
|
95
84
|
describe "accessors" do
|
96
85
|
before(:each) do
|
97
|
-
@
|
86
|
+
@allocations = double :allocations, :process! => :allocations
|
87
|
+
@results = described_class.new :query, :amount, :offset, @allocations
|
98
88
|
end
|
99
89
|
it "should have accessors for query" do
|
100
90
|
@results.query.should == :query
|
@@ -106,7 +96,7 @@ describe Picky::Results do
|
|
106
96
|
@results.offset.should == :offset
|
107
97
|
end
|
108
98
|
it "should have accessors for allocations" do
|
109
|
-
@results.allocations.should ==
|
99
|
+
@results.allocations.should == @allocations
|
110
100
|
end
|
111
101
|
it "should have accessors for duration" do
|
112
102
|
@results.duration = :some_duration
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: picky
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.22.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Hanke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -259,6 +259,8 @@ files:
|
|
259
259
|
- spec/functional/regression_spec.rb
|
260
260
|
- spec/functional/reloading_spec.rb
|
261
261
|
- spec/functional/remap_qualifiers_spec.rb
|
262
|
+
- spec/functional/results_spec.rb
|
263
|
+
- spec/functional/similarity_spec.rb
|
262
264
|
- spec/functional/sorting_spec.rb
|
263
265
|
- spec/functional/speed_spec.rb
|
264
266
|
- spec/functional/static_spec.rb
|
@@ -438,6 +440,8 @@ test_files:
|
|
438
440
|
- spec/functional/regression_spec.rb
|
439
441
|
- spec/functional/reloading_spec.rb
|
440
442
|
- spec/functional/remap_qualifiers_spec.rb
|
443
|
+
- spec/functional/results_spec.rb
|
444
|
+
- spec/functional/similarity_spec.rb
|
441
445
|
- spec/functional/sorting_spec.rb
|
442
446
|
- spec/functional/speed_spec.rb
|
443
447
|
- spec/functional/static_spec.rb
|