picky 0.2.2 → 0.2.3
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/cacher/similarity/double_levenshtone.rb +1 -1
- data/lib/picky/configuration/type.rb +11 -11
- data/lib/picky/index/bundle.rb +3 -3
- data/lib/picky/index/category.rb +15 -15
- data/lib/picky/index/combined.rb +8 -10
- data/lib/picky/indexers/base.rb +8 -6
- data/lib/picky/indexes.rb +7 -7
- data/lib/picky/loader.rb +3 -3
- data/lib/picky/query/combination.rb +1 -1
- data/lib/picky/sources/db.rb +2 -0
- data/prototype_project/Gemfile +11 -12
- data/prototype_project/app/db.yml +1 -1
- data/spec/lib/configuration/type_spec.rb +15 -15
- data/spec/lib/index/bundle_partial_generation_speed_spec.rb +3 -3
- data/spec/lib/index/category_spec.rb +26 -26
- data/spec/lib/query/solr_spec.rb +51 -51
- data/spec/lib/solr/schema_generator_spec.rb +42 -42
- metadata +3 -4
- data/lib/picky/initializers/mysql.rb +0 -22
|
@@ -29,7 +29,7 @@ module Cacher
|
|
|
29
29
|
codes.first.to_sym unless codes.empty?
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
# Generates an index for the given index (in
|
|
32
|
+
# Generates an index for the given index (in exact index style).
|
|
33
33
|
#
|
|
34
34
|
# In the following form:
|
|
35
35
|
# [:meier, :mueller, :peter, :pater] => { :MR => [:meier], :MLR => [:mueller], :PTR => [:peter, :pater] }
|
|
@@ -21,7 +21,7 @@ module Configuration
|
|
|
21
21
|
@after_indexing = options[:after_indexing]
|
|
22
22
|
@result_type = options[:result_type] || name
|
|
23
23
|
@ignore_unassigned_tokens = options[:ignore_unassigned_tokens] || false # TODO Move to query?
|
|
24
|
-
@solr = options[:solr] || nil
|
|
24
|
+
# @solr = options[:solr] || nil
|
|
25
25
|
end
|
|
26
26
|
def generate
|
|
27
27
|
categories = fields.map { |field| field.generate }
|
|
@@ -35,16 +35,16 @@ module Configuration
|
|
|
35
35
|
field.index
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
|
-
def solr_fields
|
|
39
|
-
|
|
40
|
-
end
|
|
41
|
-
# TODO Delegate to Solr handler.
|
|
42
|
-
#
|
|
43
|
-
def index_solr
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
end
|
|
38
|
+
# def solr_fields
|
|
39
|
+
# solr ? fields.select { |field| !field.virtual? } : []
|
|
40
|
+
# end
|
|
41
|
+
# # TODO Delegate to Solr handler.
|
|
42
|
+
# #
|
|
43
|
+
# def index_solr
|
|
44
|
+
# return unless solr
|
|
45
|
+
# @indexer = Indexers::Solr.new self
|
|
46
|
+
# @indexer.index
|
|
47
|
+
# end
|
|
48
48
|
# TODO Spec!
|
|
49
49
|
#
|
|
50
50
|
def connect_backend
|
data/lib/picky/index/bundle.rb
CHANGED
|
@@ -4,7 +4,7 @@ module Index
|
|
|
4
4
|
|
|
5
5
|
# This is the ACTUAL index.
|
|
6
6
|
#
|
|
7
|
-
# Handles
|
|
7
|
+
# Handles exact index, partial index, weights index, and similarity index.
|
|
8
8
|
#
|
|
9
9
|
class Bundle
|
|
10
10
|
|
|
@@ -269,8 +269,8 @@ module Index
|
|
|
269
269
|
generator = Cacher::PartialGenerator.new self.index
|
|
270
270
|
self.index = generator.generate self.partial_strategy
|
|
271
271
|
end
|
|
272
|
-
def generate_partial_from
|
|
273
|
-
self.index =
|
|
272
|
+
def generate_partial_from exact_index
|
|
273
|
+
self.index = exact_index
|
|
274
274
|
self.generate_partial
|
|
275
275
|
self
|
|
276
276
|
end
|
data/lib/picky/index/category.rb
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
module Index
|
|
2
2
|
|
|
3
|
-
# An index category holds a
|
|
3
|
+
# An index category holds a exact and a partial index for a given field.
|
|
4
4
|
#
|
|
5
|
-
# For example an index category for names holds a
|
|
5
|
+
# For example an index category for names holds a exact and
|
|
6
6
|
# a partial index bundle for names.
|
|
7
7
|
#
|
|
8
8
|
class Category
|
|
9
9
|
|
|
10
|
-
attr_reader :name, :type, :
|
|
10
|
+
attr_reader :name, :type, :exact, :partial
|
|
11
11
|
|
|
12
12
|
#
|
|
13
13
|
#
|
|
@@ -19,17 +19,17 @@ module Index
|
|
|
19
19
|
weights = options[:weights] || Cacher::Weights::Default
|
|
20
20
|
similarity = options[:similarity] || Cacher::Similarity::Default
|
|
21
21
|
|
|
22
|
-
@
|
|
22
|
+
@exact = options[:exact_bundle] || Bundle.new(:exact, self, type, Cacher::Partial::None.new, weights, similarity)
|
|
23
23
|
@partial = options[:partial_bundle] || Bundle.new(:partial, self, type, partial, weights, Cacher::Similarity::None.new)
|
|
24
24
|
|
|
25
|
-
@
|
|
26
|
-
@partial = partial_lambda.call(@
|
|
25
|
+
@exact = exact_lambda.call(@exact, @partial) if exact_lambda = options[:exact_lambda]
|
|
26
|
+
@partial = partial_lambda.call(@exact, @partial) if partial_lambda = options[:partial_lambda]
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
# Loads the index from cache.
|
|
30
30
|
#
|
|
31
31
|
def load_from_cache
|
|
32
|
-
|
|
32
|
+
exact.load
|
|
33
33
|
partial.load
|
|
34
34
|
end
|
|
35
35
|
|
|
@@ -50,16 +50,16 @@ module Index
|
|
|
50
50
|
dump_caches
|
|
51
51
|
end
|
|
52
52
|
def generate_caches_from_db
|
|
53
|
-
|
|
53
|
+
exact.generate_caches_from_db
|
|
54
54
|
end
|
|
55
55
|
def generate_partial
|
|
56
|
-
partial.generate_partial_from
|
|
56
|
+
partial.generate_partial_from exact.index
|
|
57
57
|
end
|
|
58
58
|
def generate_caches_from_memory
|
|
59
59
|
partial.generate_caches_from_memory
|
|
60
60
|
end
|
|
61
61
|
def dump_caches
|
|
62
|
-
|
|
62
|
+
exact.dump
|
|
63
63
|
partial.dump
|
|
64
64
|
end
|
|
65
65
|
# TODO move to Kernel?
|
|
@@ -75,13 +75,13 @@ module Index
|
|
|
75
75
|
|
|
76
76
|
# Used for testing.
|
|
77
77
|
#
|
|
78
|
-
def
|
|
79
|
-
|
|
78
|
+
def generate_indexes_from_exact_index
|
|
79
|
+
generate_derived_exact
|
|
80
80
|
generate_partial
|
|
81
81
|
generate_derived_partial
|
|
82
82
|
end
|
|
83
|
-
def
|
|
84
|
-
|
|
83
|
+
def generate_derived_exact
|
|
84
|
+
exact.generate_derived
|
|
85
85
|
end
|
|
86
86
|
def generate_derived_partial
|
|
87
87
|
partial.generate_derived
|
|
@@ -102,7 +102,7 @@ module Index
|
|
|
102
102
|
# Returns the right index bundle for this token.
|
|
103
103
|
#
|
|
104
104
|
def bundle_for token
|
|
105
|
-
token.partial? ? partial :
|
|
105
|
+
token.partial? ? partial : exact
|
|
106
106
|
end
|
|
107
107
|
|
|
108
108
|
#
|
data/lib/picky/index/combined.rb
CHANGED
|
@@ -2,10 +2,8 @@
|
|
|
2
2
|
#
|
|
3
3
|
module Index
|
|
4
4
|
|
|
5
|
-
# This index combines
|
|
6
|
-
# It serves to order the results such that exact
|
|
7
|
-
#
|
|
8
|
-
# TODO Rename full -> exact. exact/partial?
|
|
5
|
+
# This index combines an exact and partial index.
|
|
6
|
+
# It serves to order the results such that exact hits are found first.
|
|
9
7
|
#
|
|
10
8
|
# TODO Need to use the right subtokens. Bake in?
|
|
11
9
|
#
|
|
@@ -16,7 +14,7 @@ module Index
|
|
|
16
14
|
delegate :similar,
|
|
17
15
|
:identifier,
|
|
18
16
|
:name,
|
|
19
|
-
:to => :@
|
|
17
|
+
:to => :@exact
|
|
20
18
|
delegate :type,
|
|
21
19
|
:category,
|
|
22
20
|
:weight,
|
|
@@ -27,19 +25,19 @@ module Index
|
|
|
27
25
|
:load,
|
|
28
26
|
:to => :@partial
|
|
29
27
|
|
|
30
|
-
# TODO initialize type_or_category # => installs itself on all
|
|
28
|
+
# TODO initialize type_or_category # => installs itself on all exact and partial
|
|
31
29
|
#
|
|
32
|
-
def initialize
|
|
33
|
-
@
|
|
30
|
+
def initialize exact, partial
|
|
31
|
+
@exact = exact
|
|
34
32
|
@partial = partial
|
|
35
33
|
end
|
|
36
34
|
|
|
37
35
|
def ids text
|
|
38
|
-
@
|
|
36
|
+
@exact.ids(text) + @partial.ids(text)
|
|
39
37
|
end
|
|
40
38
|
|
|
41
39
|
def weight text
|
|
42
|
-
[@
|
|
40
|
+
[@exact.weight(text) || 0, @partial.weight(text) || 0].max
|
|
43
41
|
end
|
|
44
42
|
|
|
45
43
|
end
|
data/lib/picky/indexers/base.rb
CHANGED
|
@@ -35,11 +35,13 @@ module Indexers
|
|
|
35
35
|
@field.source || raise_no_source
|
|
36
36
|
end
|
|
37
37
|
def raise_no_source
|
|
38
|
-
raise NoSourceSpecifiedException.new "No source given for #{@type.name}:#{@field.name}."
|
|
38
|
+
raise NoSourceSpecifiedException.new "No source given for #{@type.name}:#{@field.name}." # TODO field.identifier
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
# Selects the original id (indexed id) and a column to process. The column data is called "token".
|
|
42
42
|
#
|
|
43
|
+
# Note: Puts together the parts first in an array, then releasing the array from time to time by joining.
|
|
44
|
+
#
|
|
43
45
|
def process
|
|
44
46
|
comma = ?,
|
|
45
47
|
newline = ?\n
|
|
@@ -47,19 +49,19 @@ module Indexers
|
|
|
47
49
|
indexing_message
|
|
48
50
|
|
|
49
51
|
File.open(search_index_file_name, 'w:binary') do |file|
|
|
52
|
+
result = []
|
|
50
53
|
source.harvest(@type, @field) do |indexed_id, text|
|
|
51
54
|
tokenizer.tokenize(text).each do |token_text|
|
|
52
|
-
|
|
53
|
-
file.write comma
|
|
54
|
-
file.write token_text
|
|
55
|
-
file.write newline
|
|
55
|
+
result << indexed_id << comma << token_text << newline
|
|
56
56
|
end
|
|
57
|
+
file.write(result.join) && result.clear if result.size > 100_000
|
|
57
58
|
end
|
|
59
|
+
file.write result.join
|
|
58
60
|
end
|
|
59
61
|
end
|
|
60
62
|
|
|
61
63
|
def indexing_message
|
|
62
|
-
puts "#{Time.now}: Indexing #{@type.name}:#{@field.name}:#{@field.indexed_name}."
|
|
64
|
+
puts "#{Time.now}: Indexing #{@type.name}:#{@field.name}:#{@field.indexed_name}." # TODO field.identifier
|
|
63
65
|
end
|
|
64
66
|
|
|
65
67
|
end
|
data/lib/picky/indexes.rb
CHANGED
|
@@ -71,13 +71,13 @@ module Indexes
|
|
|
71
71
|
#
|
|
72
72
|
def self.backup_caches
|
|
73
73
|
each_category do |category|
|
|
74
|
-
category.
|
|
74
|
+
category.exact.backup
|
|
75
75
|
category.partial.backup
|
|
76
76
|
end
|
|
77
77
|
end
|
|
78
78
|
def self.restore_caches
|
|
79
79
|
each_category do |category|
|
|
80
|
-
category.
|
|
80
|
+
category.exact.restore
|
|
81
81
|
category.partial.restore
|
|
82
82
|
end
|
|
83
83
|
end
|
|
@@ -122,7 +122,7 @@ module Indexes
|
|
|
122
122
|
def self.check_caches
|
|
123
123
|
each do |type|
|
|
124
124
|
type.categories.each do |category|
|
|
125
|
-
category.
|
|
125
|
+
category.exact.raise_unless_cache_exists
|
|
126
126
|
category.partial.raise_unless_cache_exists
|
|
127
127
|
end
|
|
128
128
|
end
|
|
@@ -133,7 +133,7 @@ module Indexes
|
|
|
133
133
|
def self.clear_caches
|
|
134
134
|
each do |type|
|
|
135
135
|
type.categories.each do |category|
|
|
136
|
-
category.
|
|
136
|
+
category.exact.delete_all
|
|
137
137
|
category.partial.delete_all
|
|
138
138
|
end
|
|
139
139
|
end
|
|
@@ -144,8 +144,8 @@ module Indexes
|
|
|
144
144
|
# TODO Should be on type?
|
|
145
145
|
#
|
|
146
146
|
def self.create_directory_structure
|
|
147
|
-
each_bundle do |
|
|
148
|
-
|
|
147
|
+
each_bundle do |exact, partial|
|
|
148
|
+
exact.create_directory
|
|
149
149
|
partial.create_directory
|
|
150
150
|
end
|
|
151
151
|
end
|
|
@@ -167,7 +167,7 @@ module Indexes
|
|
|
167
167
|
end
|
|
168
168
|
def self.each_bundle
|
|
169
169
|
each_category do |category|
|
|
170
|
-
yield category.
|
|
170
|
+
yield category.exact, category.partial
|
|
171
171
|
end
|
|
172
172
|
end
|
|
173
173
|
|
data/lib/picky/loader.rb
CHANGED
|
@@ -121,7 +121,7 @@ module Loader
|
|
|
121
121
|
load_relative 'indexers/field'
|
|
122
122
|
load_relative 'indexers/default'
|
|
123
123
|
#
|
|
124
|
-
load_relative 'indexers/solr'
|
|
124
|
+
# load_relative 'indexers/solr'
|
|
125
125
|
|
|
126
126
|
# Partial index generation strategies.
|
|
127
127
|
#
|
|
@@ -194,7 +194,7 @@ module Loader
|
|
|
194
194
|
load_relative 'query/live'
|
|
195
195
|
load_relative 'query/full'
|
|
196
196
|
#
|
|
197
|
-
load_relative 'query/solr'
|
|
197
|
+
# load_relative 'query/solr'
|
|
198
198
|
|
|
199
199
|
# Results.
|
|
200
200
|
#
|
|
@@ -229,7 +229,7 @@ module Loader
|
|
|
229
229
|
|
|
230
230
|
# Load tools.
|
|
231
231
|
#
|
|
232
|
-
load_relative 'solr/schema_generator'
|
|
232
|
+
# load_relative 'solr/schema_generator'
|
|
233
233
|
load_relative 'cores'
|
|
234
234
|
|
|
235
235
|
# Load generation.
|
data/lib/picky/sources/db.rb
CHANGED
data/prototype_project/Gemfile
CHANGED
|
@@ -2,21 +2,20 @@ source :gemcutter
|
|
|
2
2
|
|
|
3
3
|
# Gems required by Picky.
|
|
4
4
|
#
|
|
5
|
-
gem 'picky'
|
|
6
|
-
gem 'bundler', '>=0.9.26'
|
|
7
|
-
gem 'rack', '1.2.1'
|
|
8
|
-
gem 'rack-mount', '0.6.9'
|
|
9
|
-
gem 'text', '0.2.0'
|
|
10
|
-
gem 'yajl-ruby', '0.7.8', :require => 'yajl'
|
|
5
|
+
gem 'picky', '~> 0.2.0'
|
|
6
|
+
gem 'bundler', '>= 0.9.26'
|
|
7
|
+
gem 'rack', '~> 1.2.1'
|
|
8
|
+
gem 'rack-mount', '~> 0.6.9'
|
|
9
|
+
gem 'text', '~> 0.2.0'
|
|
10
|
+
gem 'yajl-ruby', '~> 0.7.8', :require => 'yajl'
|
|
11
11
|
|
|
12
|
-
# Should be optional.
|
|
12
|
+
# Should be optional, but isn't yet.
|
|
13
|
+
#
|
|
14
|
+
gem 'activerecord', '~> 2.3.8', :require => 'active_record'
|
|
15
|
+
|
|
16
|
+
# Optional.
|
|
13
17
|
#
|
|
14
|
-
gem 'activesupport', '2.3.8', :require => 'active_support'
|
|
15
|
-
gem 'activerecord', '2.3.8', :require => 'active_record'
|
|
16
|
-
gem 'rsolr', '0.12.1'
|
|
17
|
-
gem 'sunspot', '1.1.0'
|
|
18
18
|
gem 'rack_fast_escape', '2009.06.24'
|
|
19
|
-
gem 'rspec'
|
|
20
19
|
|
|
21
20
|
# Required by your project.
|
|
22
21
|
#
|
|
@@ -20,22 +20,22 @@ describe Configuration::Type do
|
|
|
20
20
|
:solr => :some_solr_option
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
describe 'solr_fields' do
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
end
|
|
23
|
+
# describe 'solr_fields' do
|
|
24
|
+
# it 'should return all non-virtual fields' do
|
|
25
|
+
# @type.solr_fields.should == [@field]
|
|
26
|
+
# end
|
|
27
|
+
# end
|
|
28
28
|
|
|
29
|
-
describe 'index_solr' do
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
end
|
|
29
|
+
# describe 'index_solr' do
|
|
30
|
+
# it 'should get a new solr indexer and start it' do
|
|
31
|
+
# solr = mock :solr
|
|
32
|
+
# Indexers::Solr.should_receive(:new).once.with(@type).and_return solr
|
|
33
|
+
#
|
|
34
|
+
# solr.should_receive(:index).once.with
|
|
35
|
+
#
|
|
36
|
+
# @type.index_solr
|
|
37
|
+
# end
|
|
38
|
+
# end
|
|
39
39
|
|
|
40
40
|
describe 'index' do
|
|
41
41
|
it 'should index each of the fields' do
|
|
@@ -6,7 +6,7 @@ describe Index::Bundle do
|
|
|
6
6
|
@category = stub :category, :name => :some_category
|
|
7
7
|
@type = stub :type, :name => :some_type
|
|
8
8
|
@partial_strategy = Cacher::Partial::Subtoken.new :down_to => 1
|
|
9
|
-
@
|
|
9
|
+
@exact = Index::Bundle.new :some_name, @category, @type, @partial_strategy, nil, nil
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def generate_random_keys amount
|
|
@@ -28,11 +28,11 @@ describe Index::Bundle do
|
|
|
28
28
|
before(:each) do
|
|
29
29
|
random_keys = generate_random_keys 500
|
|
30
30
|
random_ids = generate_random_ids 500
|
|
31
|
-
@
|
|
31
|
+
@exact.index = Hash[random_keys.zip(random_ids)]
|
|
32
32
|
end
|
|
33
33
|
it 'should be fast' do
|
|
34
34
|
performance_of do
|
|
35
|
-
@
|
|
35
|
+
@exact.generate_partial
|
|
36
36
|
end.should < 0.2
|
|
37
37
|
end
|
|
38
38
|
end
|
|
@@ -10,16 +10,16 @@ describe Index::Category do
|
|
|
10
10
|
@similarity = stub :similarity
|
|
11
11
|
@category = Index::Category.new @field, @type, :partial => @partial, :weights => @weights, :similarity => @similarity
|
|
12
12
|
|
|
13
|
-
@
|
|
14
|
-
@category.stub! :
|
|
13
|
+
@exact = stub :exact, :dump => nil
|
|
14
|
+
@category.stub! :exact => @exact
|
|
15
15
|
|
|
16
16
|
@partial = stub :partial, :dump => nil
|
|
17
17
|
@category.stub! :partial => @partial
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
describe 'dump_caches' do
|
|
21
|
-
it 'should dump the
|
|
22
|
-
@
|
|
21
|
+
it 'should dump the exact index' do
|
|
22
|
+
@exact.should_receive(:dump).once.with
|
|
23
23
|
|
|
24
24
|
@category.dump_caches
|
|
25
25
|
end
|
|
@@ -38,21 +38,21 @@ describe Index::Category do
|
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
describe '
|
|
42
|
-
it 'should delegate to
|
|
43
|
-
@
|
|
41
|
+
describe 'generate_derived_exact' do
|
|
42
|
+
it 'should delegate to exact' do
|
|
43
|
+
@exact.should_receive(:generate_derived).once.with
|
|
44
44
|
|
|
45
|
-
@category.
|
|
45
|
+
@category.generate_derived_exact
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
describe '
|
|
49
|
+
describe 'generate_indexes_from_exact_index' do
|
|
50
50
|
it 'should call three method in order' do
|
|
51
|
-
@category.should_receive(:
|
|
51
|
+
@category.should_receive(:generate_derived_exact).once.with().ordered
|
|
52
52
|
@category.should_receive(:generate_partial).once.with().ordered
|
|
53
53
|
@category.should_receive(:generate_derived_partial).once.with().ordered
|
|
54
54
|
|
|
55
|
-
@category.
|
|
55
|
+
@category.generate_indexes_from_exact_index
|
|
56
56
|
end
|
|
57
57
|
end
|
|
58
58
|
|
|
@@ -70,12 +70,12 @@ describe Index::Category do
|
|
|
70
70
|
@category.weight @token
|
|
71
71
|
end
|
|
72
72
|
end
|
|
73
|
-
context '
|
|
73
|
+
context 'exact bundle' do
|
|
74
74
|
before(:each) do
|
|
75
|
-
@category.stub! :bundle_for => @
|
|
75
|
+
@category.stub! :bundle_for => @exact
|
|
76
76
|
end
|
|
77
77
|
it 'should receive weight with the token text' do
|
|
78
|
-
@
|
|
78
|
+
@exact.should_receive(:weight).once.with :some_text
|
|
79
79
|
|
|
80
80
|
@category.weight @token
|
|
81
81
|
end
|
|
@@ -96,12 +96,12 @@ describe Index::Category do
|
|
|
96
96
|
@category.ids @token
|
|
97
97
|
end
|
|
98
98
|
end
|
|
99
|
-
context '
|
|
99
|
+
context 'exact bundle' do
|
|
100
100
|
before(:each) do
|
|
101
|
-
@category.stub! :bundle_for => @
|
|
101
|
+
@category.stub! :bundle_for => @exact
|
|
102
102
|
end
|
|
103
103
|
it 'should receive ids with the token text' do
|
|
104
|
-
@
|
|
104
|
+
@exact.should_receive(:ids).once.with :some_text
|
|
105
105
|
|
|
106
106
|
@category.ids @token
|
|
107
107
|
end
|
|
@@ -137,7 +137,7 @@ describe Index::Category do
|
|
|
137
137
|
it 'should return the right bundle' do
|
|
138
138
|
token = stub :token, :partial? => false
|
|
139
139
|
|
|
140
|
-
@category.bundle_for(token).should == @
|
|
140
|
+
@category.bundle_for(token).should == @exact
|
|
141
141
|
end
|
|
142
142
|
it 'should return the right bundle' do
|
|
143
143
|
token = stub :token, :partial? => true
|
|
@@ -156,23 +156,23 @@ describe Index::Category do
|
|
|
156
156
|
|
|
157
157
|
describe 'generate_partial' do
|
|
158
158
|
it 'should return whatever the partial generation returns' do
|
|
159
|
-
@
|
|
159
|
+
@exact.stub! :index
|
|
160
160
|
@partial.stub! :generate_partial_from => :generation_returns
|
|
161
161
|
|
|
162
162
|
@category.generate_partial
|
|
163
163
|
end
|
|
164
|
-
it 'should use the
|
|
165
|
-
|
|
166
|
-
@
|
|
167
|
-
@partial.should_receive(:generate_partial_from).once.with(
|
|
164
|
+
it 'should use the exact index to generate the partial index' do
|
|
165
|
+
exact_index = stub :exact_index
|
|
166
|
+
@exact.stub! :index => exact_index
|
|
167
|
+
@partial.should_receive(:generate_partial_from).once.with(exact_index)
|
|
168
168
|
|
|
169
169
|
@category.generate_partial
|
|
170
170
|
end
|
|
171
171
|
end
|
|
172
172
|
|
|
173
173
|
describe 'generate_caches_from_db' do
|
|
174
|
-
it 'should delegate to
|
|
175
|
-
@
|
|
174
|
+
it 'should delegate to exact' do
|
|
175
|
+
@exact.should_receive(:generate_caches_from_db).once.with
|
|
176
176
|
|
|
177
177
|
@category.generate_caches_from_db
|
|
178
178
|
end
|
|
@@ -193,7 +193,7 @@ describe Index::Category do
|
|
|
193
193
|
|
|
194
194
|
describe 'load_from_cache' do
|
|
195
195
|
it 'should call two methods' do
|
|
196
|
-
@
|
|
196
|
+
@exact.should_receive(:load).once
|
|
197
197
|
@partial.should_receive(:load).once
|
|
198
198
|
|
|
199
199
|
@category.load_from_cache
|
data/spec/lib/query/solr_spec.rb
CHANGED
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Query::Solr do
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
end
|
|
1
|
+
# require 'spec_helper'
|
|
2
|
+
#
|
|
3
|
+
# describe Query::Solr do
|
|
4
|
+
#
|
|
5
|
+
# describe 'real server' do
|
|
6
|
+
# before(:each) do
|
|
7
|
+
# @server = Query::Solr.new
|
|
8
|
+
# end
|
|
9
|
+
#
|
|
10
|
+
# describe 'execute' do
|
|
11
|
+
# context 'error cases' do
|
|
12
|
+
# before(:each) do
|
|
13
|
+
# @tokens = stub :tokens
|
|
14
|
+
# end
|
|
15
|
+
# context 'tokens are malformed' do
|
|
16
|
+
#
|
|
17
|
+
# end
|
|
18
|
+
# context 'server returns strange values' do
|
|
19
|
+
#
|
|
20
|
+
# end
|
|
21
|
+
# context 'server raises' do
|
|
22
|
+
# before(:each) do
|
|
23
|
+
# @server.stub! :select => lambda { raise Solr::RequestError }
|
|
24
|
+
# end
|
|
25
|
+
# it 'should not fail' do
|
|
26
|
+
# @tokens.stub! :to_solr_query => ''
|
|
27
|
+
#
|
|
28
|
+
# lambda { @server.execute(@tokens) }.should_not raise_error
|
|
29
|
+
# end
|
|
30
|
+
# end
|
|
31
|
+
# end
|
|
32
|
+
# end
|
|
33
|
+
# end
|
|
34
|
+
#
|
|
35
|
+
# context 'with connected Server' do
|
|
36
|
+
# before(:each) do
|
|
37
|
+
# @server = stub :server
|
|
38
|
+
# RSolr.stub! :connect => @server
|
|
39
|
+
# end
|
|
40
|
+
# end
|
|
41
|
+
#
|
|
42
|
+
# context 'without connected server' do
|
|
43
|
+
# before(:each) do
|
|
44
|
+
# RSolr.should_receive(:connect).and_raise RuntimeError
|
|
45
|
+
# end
|
|
46
|
+
# it 'should have a nil server' do
|
|
47
|
+
# Query::Solr.new(:some_index_type).server.should == nil
|
|
48
|
+
# end
|
|
49
|
+
# end
|
|
50
|
+
#
|
|
51
|
+
# end
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
require 'spec_helper'
|
|
3
|
-
|
|
4
|
-
describe Solr::SchemaGenerator do
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
end
|
|
1
|
+
# # encoding: utf-8
|
|
2
|
+
# require 'spec_helper'
|
|
3
|
+
#
|
|
4
|
+
# describe Solr::SchemaGenerator do
|
|
5
|
+
#
|
|
6
|
+
# before(:each) do
|
|
7
|
+
# @types = stub :types
|
|
8
|
+
# @configuration = stub :configuration, :types => @types
|
|
9
|
+
# @generator = Solr::SchemaGenerator.new @configuration
|
|
10
|
+
# end
|
|
11
|
+
#
|
|
12
|
+
# describe 'bound_field_names' do
|
|
13
|
+
# before(:each) do
|
|
14
|
+
# @generator.stub! :combine_field_names => :some_field_names
|
|
15
|
+
# end
|
|
16
|
+
# it 'should bind field_names' do
|
|
17
|
+
# b = @generator.bound_field_names
|
|
18
|
+
#
|
|
19
|
+
# eval('field_names', b).should == :some_field_names
|
|
20
|
+
# end
|
|
21
|
+
# end
|
|
22
|
+
#
|
|
23
|
+
# describe 'generate' do
|
|
24
|
+
# before(:each) do
|
|
25
|
+
# @generator.stub! :bound_field_names
|
|
26
|
+
# @generator.stub! :generate_schema_for
|
|
27
|
+
# end
|
|
28
|
+
# it 'should receive generate_schema_for once with the result of extract_binding' do
|
|
29
|
+
# @generator.stub! :bound_field_names => :some_binding
|
|
30
|
+
#
|
|
31
|
+
# @generator.should_receive(:generate_schema_for).once.with :some_binding
|
|
32
|
+
#
|
|
33
|
+
# @generator.generate
|
|
34
|
+
# end
|
|
35
|
+
# it 'should extract the binding' do
|
|
36
|
+
# @generator.should_receive(:bound_field_names).once.with
|
|
37
|
+
#
|
|
38
|
+
# @generator.generate
|
|
39
|
+
# end
|
|
40
|
+
# end
|
|
41
|
+
#
|
|
42
|
+
# end
|
metadata
CHANGED
|
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
|
5
5
|
segments:
|
|
6
6
|
- 0
|
|
7
7
|
- 2
|
|
8
|
-
-
|
|
9
|
-
version: 0.2.
|
|
8
|
+
- 3
|
|
9
|
+
version: 0.2.3
|
|
10
10
|
platform: ruby
|
|
11
11
|
authors:
|
|
12
12
|
- Florian Hanke
|
|
@@ -14,7 +14,7 @@ autorequire:
|
|
|
14
14
|
bindir: bin
|
|
15
15
|
cert_chain: []
|
|
16
16
|
|
|
17
|
-
date: 2010-10-
|
|
17
|
+
date: 2010-10-15 00:00:00 +02:00
|
|
18
18
|
default_executable: picky
|
|
19
19
|
dependencies:
|
|
20
20
|
- !ruby/object:Gem::Dependency
|
|
@@ -84,7 +84,6 @@ files:
|
|
|
84
84
|
- lib/picky/indexers/solr.rb
|
|
85
85
|
- lib/picky/indexes.rb
|
|
86
86
|
- lib/picky/initializers/ext.rb
|
|
87
|
-
- lib/picky/initializers/mysql.rb
|
|
88
87
|
- lib/picky/loader.rb
|
|
89
88
|
- lib/picky/loggers/search.rb
|
|
90
89
|
- lib/picky/query/allocation.rb
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# Wrapper for the mysql adapter method execute
|
|
2
|
-
# to handle the 8 hours disconnect problem.
|
|
3
|
-
# (http://www.mysql.fr/search/?q=autoreconnect)
|
|
4
|
-
#
|
|
5
|
-
ActiveRecord::ConnectionAdapters::MysqlAdapter.module_eval do
|
|
6
|
-
def execute_with_retry_once(sql, name = nil)
|
|
7
|
-
retried = false
|
|
8
|
-
begin
|
|
9
|
-
execute_without_retry_once(sql, name)
|
|
10
|
-
rescue ActiveRecord::StatementInvalid => statement_invalid_exception
|
|
11
|
-
# Our database connection has gone away, reconnect and retry this method
|
|
12
|
-
#
|
|
13
|
-
reconnect!
|
|
14
|
-
unless retried
|
|
15
|
-
retried = true
|
|
16
|
-
retry
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
alias_method_chain :execute, :retry_once
|
|
22
|
-
end
|