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