thinking-sphinx 3.2.0 → 3.3.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/.travis.yml +6 -2
- data/Appraisals +13 -0
- data/Gemfile +2 -1
- data/HISTORY +19 -0
- data/README.textile +3 -2
- data/gemfiles/rails_3_2.gemfile +2 -1
- data/gemfiles/rails_4_0.gemfile +2 -1
- data/gemfiles/rails_4_1.gemfile +2 -1
- data/gemfiles/rails_4_2.gemfile +2 -1
- data/gemfiles/rails_5_0.gemfile +12 -0
- data/lib/thinking_sphinx.rb +2 -0
- data/lib/thinking_sphinx/active_record/attribute/type.rb +17 -3
- data/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb +12 -4
- data/lib/thinking_sphinx/active_record/database_adapters.rb +1 -1
- data/lib/thinking_sphinx/active_record/sql_builder/query.rb +4 -0
- data/lib/thinking_sphinx/active_record/sql_source.rb +1 -1
- data/lib/thinking_sphinx/configuration.rb +3 -2
- data/lib/thinking_sphinx/connection.rb +23 -10
- data/lib/thinking_sphinx/deltas/index_job.rb +6 -2
- data/lib/thinking_sphinx/errors.rb +25 -0
- data/lib/thinking_sphinx/middlewares/active_record_translator.rb +14 -2
- data/lib/thinking_sphinx/railtie.rb +1 -1
- data/lib/thinking_sphinx/rake_interface.rb +71 -23
- data/lib/thinking_sphinx/real_time/callbacks/real_time_callbacks.rb +15 -7
- data/lib/thinking_sphinx/real_time/populator.rb +3 -3
- data/lib/thinking_sphinx/tasks.rb +7 -8
- data/lib/thinking_sphinx/wildcard.rb +1 -1
- data/spec/acceptance/association_scoping_spec.rb +5 -5
- data/spec/acceptance/attribute_access_spec.rb +4 -4
- data/spec/acceptance/attribute_updates_spec.rb +3 -3
- data/spec/acceptance/batch_searching_spec.rb +4 -4
- data/spec/acceptance/big_integers_spec.rb +6 -6
- data/spec/acceptance/connection_spec.rb +23 -0
- data/spec/acceptance/excerpts_spec.rb +8 -8
- data/spec/acceptance/facets_spec.rb +13 -13
- data/spec/acceptance/geosearching_spec.rb +8 -8
- data/spec/acceptance/grouping_by_attributes_spec.rb +10 -10
- data/spec/acceptance/index_options_spec.rb +16 -16
- data/spec/acceptance/indexing_spec.rb +3 -3
- data/spec/acceptance/paginating_search_results_spec.rb +3 -3
- data/spec/acceptance/real_time_updates_spec.rb +4 -4
- data/spec/acceptance/remove_deleted_records_spec.rb +12 -12
- data/spec/acceptance/search_counts_spec.rb +2 -2
- data/spec/acceptance/search_for_just_ids_spec.rb +2 -2
- data/spec/acceptance/searching_across_models_spec.rb +6 -6
- data/spec/acceptance/searching_across_schemas_spec.rb +10 -10
- data/spec/acceptance/searching_on_fields_spec.rb +9 -9
- data/spec/acceptance/searching_with_filters_spec.rb +16 -16
- data/spec/acceptance/searching_with_sti_spec.rb +9 -9
- data/spec/acceptance/searching_within_a_model_spec.rb +17 -17
- data/spec/acceptance/sorting_search_results_spec.rb +6 -6
- data/spec/acceptance/specifying_sql_spec.rb +62 -62
- data/spec/acceptance/sphinx_scopes_spec.rb +9 -9
- data/spec/acceptance/sql_deltas_spec.rb +7 -7
- data/spec/acceptance/support/database_cleaner.rb +1 -1
- data/spec/acceptance/support/sphinx_controller.rb +4 -1
- data/spec/acceptance/support/sphinx_helpers.rb +4 -0
- data/spec/acceptance/suspended_deltas_spec.rb +9 -9
- data/spec/internal/app/indices/article_index.rb +2 -2
- data/spec/internal/app/indices/book_index.rb +2 -1
- data/spec/internal/app/indices/product_index.rb +0 -2
- data/spec/internal/app/models/categorisation.rb +8 -1
- data/spec/spec_helper.rb +2 -0
- data/spec/support/json_column.rb +5 -1
- data/spec/support/multi_schema.rb +3 -1
- data/spec/support/sphinx_yaml_helpers.rb +1 -1
- data/spec/thinking_sphinx/active_record/association_spec.rb +1 -1
- data/spec/thinking_sphinx/active_record/attribute/type_spec.rb +41 -38
- data/spec/thinking_sphinx/active_record/base_spec.rb +29 -29
- data/spec/thinking_sphinx/active_record/callbacks/delete_callbacks_spec.rb +10 -10
- data/spec/thinking_sphinx/active_record/callbacks/delta_callbacks_spec.rb +48 -25
- data/spec/thinking_sphinx/active_record/callbacks/update_callbacks_spec.rb +8 -8
- data/spec/thinking_sphinx/active_record/column_spec.rb +13 -13
- data/spec/thinking_sphinx/active_record/column_sql_presenter_spec.rb +5 -5
- data/spec/thinking_sphinx/active_record/database_adapters/abstract_adapter_spec.rb +5 -5
- data/spec/thinking_sphinx/active_record/database_adapters/mysql_adapter_spec.rb +11 -11
- data/spec/thinking_sphinx/active_record/database_adapters/postgresql_adapter_spec.rb +13 -13
- data/spec/thinking_sphinx/active_record/database_adapters_spec.rb +48 -48
- data/spec/thinking_sphinx/active_record/field_spec.rb +7 -7
- data/spec/thinking_sphinx/active_record/filter_reflection_spec.rb +32 -32
- data/spec/thinking_sphinx/active_record/index_spec.rb +35 -36
- data/spec/thinking_sphinx/active_record/interpreter_spec.rb +51 -51
- data/spec/thinking_sphinx/active_record/polymorpher_spec.rb +14 -14
- data/spec/thinking_sphinx/active_record/property_sql_presenter_spec.rb +67 -67
- data/spec/thinking_sphinx/active_record/sql_builder_spec.rb +140 -140
- data/spec/thinking_sphinx/active_record/sql_source_spec.rb +97 -95
- data/spec/thinking_sphinx/configuration_spec.rb +81 -81
- data/spec/thinking_sphinx/connection_spec.rb +13 -13
- data/spec/thinking_sphinx/deletion_spec.rb +11 -11
- data/spec/thinking_sphinx/deltas/default_delta_spec.rb +20 -20
- data/spec/thinking_sphinx/deltas_spec.rb +12 -12
- data/spec/thinking_sphinx/errors_spec.rb +30 -30
- data/spec/thinking_sphinx/excerpter_spec.rb +7 -7
- data/spec/thinking_sphinx/facet_search_spec.rb +16 -16
- data/spec/thinking_sphinx/index_set_spec.rb +7 -7
- data/spec/thinking_sphinx/index_spec.rb +24 -24
- data/spec/thinking_sphinx/masks/pagination_mask_spec.rb +20 -20
- data/spec/thinking_sphinx/masks/scopes_mask_spec.rb +18 -18
- data/spec/thinking_sphinx/middlewares/active_record_translator_spec.rb +22 -22
- data/spec/thinking_sphinx/middlewares/geographer_spec.rb +9 -9
- data/spec/thinking_sphinx/middlewares/glazier_spec.rb +4 -4
- data/spec/thinking_sphinx/middlewares/inquirer_spec.rb +7 -7
- data/spec/thinking_sphinx/middlewares/sphinxql_spec.rb +53 -53
- data/spec/thinking_sphinx/middlewares/stale_id_checker_spec.rb +5 -5
- data/spec/thinking_sphinx/middlewares/stale_id_filter_spec.rb +15 -15
- data/spec/thinking_sphinx/panes/attributes_pane_spec.rb +1 -1
- data/spec/thinking_sphinx/panes/distance_pane_spec.rb +4 -4
- data/spec/thinking_sphinx/panes/excerpts_pane_spec.rb +5 -5
- data/spec/thinking_sphinx/panes/weight_pane_spec.rb +1 -1
- data/spec/thinking_sphinx/rake_interface_spec.rb +66 -53
- data/spec/thinking_sphinx/real_time/attribute_spec.rb +13 -13
- data/spec/thinking_sphinx/real_time/callbacks/real_time_callbacks_spec.rb +107 -23
- data/spec/thinking_sphinx/real_time/field_spec.rb +14 -14
- data/spec/thinking_sphinx/real_time/index_spec.rb +29 -30
- data/spec/thinking_sphinx/real_time/interpreter_spec.rb +30 -30
- data/spec/thinking_sphinx/scopes_spec.rb +5 -5
- data/spec/thinking_sphinx/search/glaze_spec.rb +15 -15
- data/spec/thinking_sphinx/search/query_spec.rb +10 -10
- data/spec/thinking_sphinx/search_spec.rb +28 -28
- data/spec/thinking_sphinx/wildcard_spec.rb +16 -11
- data/spec/thinking_sphinx_spec.rb +6 -6
- data/thinking-sphinx.gemspec +4 -4
- metadata +12 -9
|
@@ -7,11 +7,11 @@ describe ThinkingSphinx::RealTime::Attribute do
|
|
|
7
7
|
describe '#name' do
|
|
8
8
|
it "uses the provided option by default" do
|
|
9
9
|
attribute = ThinkingSphinx::RealTime::Attribute.new column, :as => :foo
|
|
10
|
-
attribute.name.
|
|
10
|
+
expect(attribute.name).to eq('foo')
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
it "falls back to the column's name" do
|
|
14
|
-
attribute.name.
|
|
14
|
+
expect(attribute.name).to eq('created_at')
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
@@ -21,34 +21,34 @@ describe ThinkingSphinx::RealTime::Attribute do
|
|
|
21
21
|
let(:parent) { klass.new 'the parent name', nil }
|
|
22
22
|
|
|
23
23
|
it "returns the column's name if it's a string" do
|
|
24
|
-
column.
|
|
24
|
+
allow(column).to receive_messages :__name => 'value'
|
|
25
25
|
|
|
26
|
-
attribute.translate(object).
|
|
26
|
+
expect(attribute.translate(object)).to eq('value')
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
it "returns the column's name if it's an integer" do
|
|
30
|
-
column.
|
|
30
|
+
allow(column).to receive_messages :__name => 404
|
|
31
31
|
|
|
32
|
-
attribute.translate(object).
|
|
32
|
+
expect(attribute.translate(object)).to eq(404)
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
it "returns the object's method matching the column's name" do
|
|
36
|
-
object.
|
|
36
|
+
allow(object).to receive_messages :created_at => 'a time'
|
|
37
37
|
|
|
38
|
-
attribute.translate(object).
|
|
38
|
+
expect(attribute.translate(object)).to eq('a time')
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
it "uses the column's stack to navigate through the object tree" do
|
|
42
|
-
column.
|
|
42
|
+
allow(column).to receive_messages :__name => :name, :__stack => [:parent]
|
|
43
43
|
|
|
44
|
-
attribute.translate(object).
|
|
44
|
+
expect(attribute.translate(object)).to eq('the parent name')
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
it "returns zero if any element in the object tree is nil" do
|
|
48
|
-
column.
|
|
48
|
+
allow(column).to receive_messages :__name => :name, :__stack => [:parent]
|
|
49
49
|
object.parent = nil
|
|
50
50
|
|
|
51
|
-
attribute.translate(object).
|
|
51
|
+
expect(attribute.translate(object)).to be_zero
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
|
|
@@ -56,7 +56,7 @@ describe ThinkingSphinx::RealTime::Attribute do
|
|
|
56
56
|
it "returns the given type option" do
|
|
57
57
|
attribute = ThinkingSphinx::RealTime::Attribute.new column,
|
|
58
58
|
:type => :string
|
|
59
|
-
attribute.type.
|
|
59
|
+
expect(attribute.type).to eq(:string)
|
|
60
60
|
end
|
|
61
61
|
end
|
|
62
62
|
end
|
|
@@ -13,11 +13,11 @@ describe ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks do
|
|
|
13
13
|
let(:connection) { double('connection', :execute => true) }
|
|
14
14
|
|
|
15
15
|
before :each do
|
|
16
|
-
ThinkingSphinx::Configuration.
|
|
17
|
-
ThinkingSphinx::Connection.
|
|
16
|
+
allow(ThinkingSphinx::Configuration).to receive_messages :instance => config
|
|
17
|
+
allow(ThinkingSphinx::Connection).to receive_message_chain(:pool, :take).and_yield connection
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
describe '#after_save' do
|
|
20
|
+
describe '#after_save, #after_commit' do
|
|
21
21
|
let(:insert) { double('insert', :to_sql => 'REPLACE INTO my_index') }
|
|
22
22
|
let(:time) { 1.day.ago }
|
|
23
23
|
let(:field) { double('field', :name => 'name', :translate => 'Foo') }
|
|
@@ -25,14 +25,14 @@ describe ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks do
|
|
|
25
25
|
:translate => time) }
|
|
26
26
|
|
|
27
27
|
before :each do
|
|
28
|
-
ThinkingSphinx::Configuration.
|
|
29
|
-
Riddle::Query::Insert.
|
|
30
|
-
insert.
|
|
31
|
-
index.
|
|
28
|
+
allow(ThinkingSphinx::Configuration).to receive_messages :instance => config
|
|
29
|
+
allow(Riddle::Query::Insert).to receive_messages :new => insert
|
|
30
|
+
allow(insert).to receive_messages :replace! => insert
|
|
31
|
+
allow(index).to receive_messages :fields => [field], :attributes => [attribute]
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
it "creates an insert statement with all fields and attributes" do
|
|
35
|
-
Riddle::Query::Insert.
|
|
35
|
+
expect(Riddle::Query::Insert).to receive(:new).
|
|
36
36
|
with('my_index', ['id', 'name', 'created_at'], [[123, 'Foo', time]]).
|
|
37
37
|
and_return(insert)
|
|
38
38
|
|
|
@@ -40,17 +40,37 @@ describe ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks do
|
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
it "switches the insert to a replace statement" do
|
|
43
|
-
insert.
|
|
43
|
+
expect(insert).to receive(:replace!).and_return(insert)
|
|
44
44
|
|
|
45
45
|
callbacks.after_save instance
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
it "sends the insert through to the server" do
|
|
49
|
-
connection.
|
|
49
|
+
expect(connection).to receive(:execute).with('REPLACE INTO my_index')
|
|
50
50
|
|
|
51
51
|
callbacks.after_save instance
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
+
it "creates an insert statement with all fields and attributes" do
|
|
55
|
+
expect(Riddle::Query::Insert).to receive(:new).
|
|
56
|
+
with('my_index', ['id', 'name', 'created_at'], [[123, 'Foo', time]]).
|
|
57
|
+
and_return(insert)
|
|
58
|
+
|
|
59
|
+
callbacks.after_commit instance
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "switches the insert to a replace statement" do
|
|
63
|
+
expect(insert).to receive(:replace!).and_return(insert)
|
|
64
|
+
|
|
65
|
+
callbacks.after_commit instance
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "sends the insert through to the server" do
|
|
69
|
+
expect(connection).to receive(:execute).with('REPLACE INTO my_index')
|
|
70
|
+
|
|
71
|
+
callbacks.after_commit instance
|
|
72
|
+
end
|
|
73
|
+
|
|
54
74
|
context 'with a given path' do
|
|
55
75
|
let(:callbacks) {
|
|
56
76
|
ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks.new(
|
|
@@ -61,7 +81,7 @@ describe ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks do
|
|
|
61
81
|
let(:user) { double('user', :id => 13, :persisted? => true) }
|
|
62
82
|
|
|
63
83
|
it "creates an insert statement with all fields and attributes" do
|
|
64
|
-
Riddle::Query::Insert.
|
|
84
|
+
expect(Riddle::Query::Insert).to receive(:new).
|
|
65
85
|
with('my_index', ['id', 'name', 'created_at'], [[123, 'Foo', time]]).
|
|
66
86
|
and_return(insert)
|
|
67
87
|
|
|
@@ -69,16 +89,36 @@ describe ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks do
|
|
|
69
89
|
end
|
|
70
90
|
|
|
71
91
|
it "gets the document id for the user object" do
|
|
72
|
-
index.
|
|
92
|
+
expect(index).to receive(:document_id_for_key).with(13).and_return(123)
|
|
73
93
|
|
|
74
94
|
callbacks.after_save instance
|
|
75
95
|
end
|
|
76
96
|
|
|
77
97
|
it "translates values for the user object" do
|
|
78
|
-
field.
|
|
98
|
+
expect(field).to receive(:translate).with(user).and_return('Foo')
|
|
79
99
|
|
|
80
100
|
callbacks.after_save instance
|
|
81
101
|
end
|
|
102
|
+
|
|
103
|
+
it "creates an insert statement with all fields and attributes" do
|
|
104
|
+
expect(Riddle::Query::Insert).to receive(:new).
|
|
105
|
+
with('my_index', ['id', 'name', 'created_at'], [[123, 'Foo', time]]).
|
|
106
|
+
and_return(insert)
|
|
107
|
+
|
|
108
|
+
callbacks.after_commit instance
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it "gets the document id for the user object" do
|
|
112
|
+
expect(index).to receive(:document_id_for_key).with(13).and_return(123)
|
|
113
|
+
|
|
114
|
+
callbacks.after_commit instance
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it "translates values for the user object" do
|
|
118
|
+
expect(field).to receive(:translate).with(user).and_return('Foo')
|
|
119
|
+
|
|
120
|
+
callbacks.after_commit instance
|
|
121
|
+
end
|
|
82
122
|
end
|
|
83
123
|
|
|
84
124
|
context 'with a path returning multiple objects' do
|
|
@@ -93,7 +133,7 @@ describe ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks do
|
|
|
93
133
|
let(:user_b) { double('user', :id => 14, :persisted? => true) }
|
|
94
134
|
|
|
95
135
|
it "creates insert statements with all fields and attributes" do
|
|
96
|
-
Riddle::Query::Insert.
|
|
136
|
+
expect(Riddle::Query::Insert).to receive(:new).twice.
|
|
97
137
|
with('my_index', ['id', 'name', 'created_at'], [[123, 'Foo', time]]).
|
|
98
138
|
and_return(insert)
|
|
99
139
|
|
|
@@ -101,18 +141,40 @@ describe ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks do
|
|
|
101
141
|
end
|
|
102
142
|
|
|
103
143
|
it "gets the document id for each reader" do
|
|
104
|
-
index.
|
|
105
|
-
index.
|
|
144
|
+
expect(index).to receive(:document_id_for_key).with(13).and_return(123)
|
|
145
|
+
expect(index).to receive(:document_id_for_key).with(14).and_return(123)
|
|
106
146
|
|
|
107
147
|
callbacks.after_save instance
|
|
108
148
|
end
|
|
109
149
|
|
|
110
150
|
it "translates values for each reader" do
|
|
111
|
-
field.
|
|
112
|
-
field.
|
|
151
|
+
expect(field).to receive(:translate).with(user_a).and_return('Foo')
|
|
152
|
+
expect(field).to receive(:translate).with(user_b).and_return('Foo')
|
|
113
153
|
|
|
114
154
|
callbacks.after_save instance
|
|
115
155
|
end
|
|
156
|
+
|
|
157
|
+
it "creates insert statements with all fields and attributes" do
|
|
158
|
+
expect(Riddle::Query::Insert).to receive(:new).twice.
|
|
159
|
+
with('my_index', ['id', 'name', 'created_at'], [[123, 'Foo', time]]).
|
|
160
|
+
and_return(insert)
|
|
161
|
+
|
|
162
|
+
callbacks.after_commit instance
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
it "gets the document id for each reader" do
|
|
166
|
+
expect(index).to receive(:document_id_for_key).with(13).and_return(123)
|
|
167
|
+
expect(index).to receive(:document_id_for_key).with(14).and_return(123)
|
|
168
|
+
|
|
169
|
+
callbacks.after_commit instance
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it "translates values for each reader" do
|
|
173
|
+
expect(field).to receive(:translate).with(user_a).and_return('Foo')
|
|
174
|
+
expect(field).to receive(:translate).with(user_b).and_return('Foo')
|
|
175
|
+
|
|
176
|
+
callbacks.after_commit instance
|
|
177
|
+
end
|
|
116
178
|
end
|
|
117
179
|
|
|
118
180
|
context 'with a block instead of a path' do
|
|
@@ -127,7 +189,7 @@ describe ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks do
|
|
|
127
189
|
let(:user_b) { double('user', :id => 14, :persisted? => true) }
|
|
128
190
|
|
|
129
191
|
it "creates insert statements with all fields and attributes" do
|
|
130
|
-
Riddle::Query::Insert.
|
|
192
|
+
expect(Riddle::Query::Insert).to receive(:new).twice.
|
|
131
193
|
with('my_index', ['id', 'name', 'created_at'], [[123, 'Foo', time]]).
|
|
132
194
|
and_return(insert)
|
|
133
195
|
|
|
@@ -135,18 +197,40 @@ describe ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks do
|
|
|
135
197
|
end
|
|
136
198
|
|
|
137
199
|
it "gets the document id for each reader" do
|
|
138
|
-
index.
|
|
139
|
-
index.
|
|
200
|
+
expect(index).to receive(:document_id_for_key).with(13).and_return(123)
|
|
201
|
+
expect(index).to receive(:document_id_for_key).with(14).and_return(123)
|
|
140
202
|
|
|
141
203
|
callbacks.after_save instance
|
|
142
204
|
end
|
|
143
205
|
|
|
144
206
|
it "translates values for each reader" do
|
|
145
|
-
field.
|
|
146
|
-
field.
|
|
207
|
+
expect(field).to receive(:translate).with(user_a).and_return('Foo')
|
|
208
|
+
expect(field).to receive(:translate).with(user_b).and_return('Foo')
|
|
147
209
|
|
|
148
210
|
callbacks.after_save instance
|
|
149
211
|
end
|
|
212
|
+
|
|
213
|
+
it "creates insert statements with all fields and attributes" do
|
|
214
|
+
expect(Riddle::Query::Insert).to receive(:new).twice.
|
|
215
|
+
with('my_index', ['id', 'name', 'created_at'], [[123, 'Foo', time]]).
|
|
216
|
+
and_return(insert)
|
|
217
|
+
|
|
218
|
+
callbacks.after_commit instance
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
it "gets the document id for each reader" do
|
|
222
|
+
expect(index).to receive(:document_id_for_key).with(13).and_return(123)
|
|
223
|
+
expect(index).to receive(:document_id_for_key).with(14).and_return(123)
|
|
224
|
+
|
|
225
|
+
callbacks.after_commit instance
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
it "translates values for each reader" do
|
|
229
|
+
expect(field).to receive(:translate).with(user_a).and_return('Foo')
|
|
230
|
+
expect(field).to receive(:translate).with(user_b).and_return('Foo')
|
|
231
|
+
|
|
232
|
+
callbacks.after_commit instance
|
|
233
|
+
end
|
|
150
234
|
end
|
|
151
235
|
end
|
|
152
236
|
end
|
|
@@ -6,11 +6,11 @@ describe ThinkingSphinx::RealTime::Field do
|
|
|
6
6
|
|
|
7
7
|
describe '#column' do
|
|
8
8
|
it 'returns the provided Column object' do
|
|
9
|
-
field.column.
|
|
9
|
+
expect(field.column).to eq(column)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
it 'translates symbols to Column objects' do
|
|
13
|
-
ThinkingSphinx::ActiveRecord::Column.
|
|
13
|
+
expect(ThinkingSphinx::ActiveRecord::Column).to receive(:new).with(:title).
|
|
14
14
|
and_return(column)
|
|
15
15
|
|
|
16
16
|
ThinkingSphinx::RealTime::Field.new :title
|
|
@@ -20,11 +20,11 @@ describe ThinkingSphinx::RealTime::Field do
|
|
|
20
20
|
describe '#name' do
|
|
21
21
|
it "uses the provided option by default" do
|
|
22
22
|
field = ThinkingSphinx::RealTime::Field.new column, :as => :foo
|
|
23
|
-
field.name.
|
|
23
|
+
expect(field.name).to eq('foo')
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
it "falls back to the column's name" do
|
|
27
|
-
field.name.
|
|
27
|
+
expect(field.name).to eq('created_at')
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
|
|
@@ -34,34 +34,34 @@ describe ThinkingSphinx::RealTime::Field do
|
|
|
34
34
|
let(:parent) { klass.new 'the parent name', nil }
|
|
35
35
|
|
|
36
36
|
it "returns the column's name if it's a string" do
|
|
37
|
-
column.
|
|
37
|
+
allow(column).to receive_messages :__name => 'value'
|
|
38
38
|
|
|
39
|
-
field.translate(object).
|
|
39
|
+
expect(field.translate(object)).to eq('value')
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
it "returns the column's name as a string if it's an integer" do
|
|
43
|
-
column.
|
|
43
|
+
allow(column).to receive_messages :__name => 404
|
|
44
44
|
|
|
45
|
-
field.translate(object).
|
|
45
|
+
expect(field.translate(object)).to eq('404')
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
it "returns the object's method matching the column's name" do
|
|
49
|
-
object.
|
|
49
|
+
allow(object).to receive_messages :created_at => 'a time'
|
|
50
50
|
|
|
51
|
-
field.translate(object).
|
|
51
|
+
expect(field.translate(object)).to eq('a time')
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
it "uses the column's stack to navigate through the object tree" do
|
|
55
|
-
column.
|
|
55
|
+
allow(column).to receive_messages :__name => :name, :__stack => [:parent]
|
|
56
56
|
|
|
57
|
-
field.translate(object).
|
|
57
|
+
expect(field.translate(object)).to eq('the parent name')
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
it "returns a blank string if any element in the object tree is nil" do
|
|
61
|
-
column.
|
|
61
|
+
allow(column).to receive_messages :__name => :name, :__stack => [:parent]
|
|
62
62
|
object.parent = nil
|
|
63
63
|
|
|
64
|
-
field.translate(object).
|
|
64
|
+
expect(field.translate(object)).to eq('')
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
end
|
|
@@ -2,46 +2,45 @@ require 'spec_helper'
|
|
|
2
2
|
|
|
3
3
|
describe ThinkingSphinx::RealTime::Index do
|
|
4
4
|
let(:index) { ThinkingSphinx::RealTime::Index.new :user }
|
|
5
|
-
let(:indices_path) { double('indices path', :join => '') }
|
|
6
5
|
let(:config) { double('config', :settings => {},
|
|
7
|
-
:indices_location =>
|
|
6
|
+
:indices_location => 'location', :next_offset => 8) }
|
|
8
7
|
|
|
9
8
|
before :each do
|
|
10
|
-
ThinkingSphinx::Configuration.
|
|
9
|
+
allow(ThinkingSphinx::Configuration).to receive_messages :instance => config
|
|
11
10
|
end
|
|
12
11
|
|
|
13
12
|
describe '#attributes' do
|
|
14
13
|
it "has the internal id attribute by default" do
|
|
15
|
-
index.attributes.collect(&:name).
|
|
14
|
+
expect(index.attributes.collect(&:name)).to include('sphinx_internal_id')
|
|
16
15
|
end
|
|
17
16
|
|
|
18
17
|
it "has the class name attribute by default" do
|
|
19
|
-
index.attributes.collect(&:name).
|
|
18
|
+
expect(index.attributes.collect(&:name)).to include('sphinx_internal_class')
|
|
20
19
|
end
|
|
21
20
|
|
|
22
21
|
it "has the internal deleted attribute by default" do
|
|
23
|
-
index.attributes.collect(&:name).
|
|
22
|
+
expect(index.attributes.collect(&:name)).to include('sphinx_deleted')
|
|
24
23
|
end
|
|
25
24
|
end
|
|
26
25
|
|
|
27
26
|
describe '#delta?' do
|
|
28
27
|
it "always returns false" do
|
|
29
|
-
index.
|
|
28
|
+
expect(index).not_to be_delta
|
|
30
29
|
end
|
|
31
30
|
end
|
|
32
31
|
|
|
33
32
|
describe '#document_id_for_key' do
|
|
34
33
|
it "calculates the document id based on offset and number of indices" do
|
|
35
|
-
config.
|
|
36
|
-
config.
|
|
34
|
+
allow(config).to receive_message_chain(:indices, :count).and_return(5)
|
|
35
|
+
allow(config).to receive_messages :next_offset => 7
|
|
37
36
|
|
|
38
|
-
index.document_id_for_key(123).
|
|
37
|
+
expect(index.document_id_for_key(123)).to eq(622)
|
|
39
38
|
end
|
|
40
39
|
end
|
|
41
40
|
|
|
42
41
|
describe '#fields' do
|
|
43
42
|
it "has the internal class field by default" do
|
|
44
|
-
index.fields.collect(&:name).
|
|
43
|
+
expect(index.fields.collect(&:name)).to include('sphinx_internal_class_name')
|
|
45
44
|
end
|
|
46
45
|
end
|
|
47
46
|
|
|
@@ -53,14 +52,14 @@ describe ThinkingSphinx::RealTime::Index do
|
|
|
53
52
|
end
|
|
54
53
|
|
|
55
54
|
it "interprets the definition block" do
|
|
56
|
-
ThinkingSphinx::RealTime::Interpreter.
|
|
55
|
+
expect(ThinkingSphinx::RealTime::Interpreter).to receive(:translate!).
|
|
57
56
|
with(index, block)
|
|
58
57
|
|
|
59
58
|
index.interpret_definition!
|
|
60
59
|
end
|
|
61
60
|
|
|
62
61
|
it "only interprets the definition block once" do
|
|
63
|
-
ThinkingSphinx::RealTime::Interpreter.
|
|
62
|
+
expect(ThinkingSphinx::RealTime::Interpreter).to receive(:translate!).
|
|
64
63
|
once
|
|
65
64
|
|
|
66
65
|
index.interpret_definition!
|
|
@@ -72,13 +71,13 @@ describe ThinkingSphinx::RealTime::Index do
|
|
|
72
71
|
let(:model) { double('model') }
|
|
73
72
|
|
|
74
73
|
it "translates symbol references to model class" do
|
|
75
|
-
ActiveSupport::Inflector.
|
|
74
|
+
allow(ActiveSupport::Inflector).to receive_messages(:constantize => model)
|
|
76
75
|
|
|
77
|
-
index.model.
|
|
76
|
+
expect(index.model).to eq(model)
|
|
78
77
|
end
|
|
79
78
|
|
|
80
79
|
it "memoizes the result" do
|
|
81
|
-
ActiveSupport::Inflector.
|
|
80
|
+
expect(ActiveSupport::Inflector).to receive(:constantize).with('User').once.
|
|
82
81
|
and_return(model)
|
|
83
82
|
|
|
84
83
|
index.model
|
|
@@ -88,7 +87,7 @@ describe ThinkingSphinx::RealTime::Index do
|
|
|
88
87
|
|
|
89
88
|
describe '#morphology' do
|
|
90
89
|
before :each do
|
|
91
|
-
|
|
90
|
+
skip
|
|
92
91
|
end
|
|
93
92
|
|
|
94
93
|
context 'with a render' do
|
|
@@ -98,7 +97,7 @@ describe ThinkingSphinx::RealTime::Index do
|
|
|
98
97
|
rescue Riddle::Configuration::ConfigurationError
|
|
99
98
|
end
|
|
100
99
|
|
|
101
|
-
index.morphology.
|
|
100
|
+
expect(index.morphology).to be_nil
|
|
102
101
|
end
|
|
103
102
|
|
|
104
103
|
it "reads from the settings file if provided" do
|
|
@@ -109,7 +108,7 @@ describe ThinkingSphinx::RealTime::Index do
|
|
|
109
108
|
rescue Riddle::Configuration::ConfigurationError
|
|
110
109
|
end
|
|
111
110
|
|
|
112
|
-
index.morphology.
|
|
111
|
+
expect(index.morphology).to eq('stem_en')
|
|
113
112
|
end
|
|
114
113
|
end
|
|
115
114
|
end
|
|
@@ -117,21 +116,21 @@ describe ThinkingSphinx::RealTime::Index do
|
|
|
117
116
|
describe '#name' do
|
|
118
117
|
it "always uses the core suffix" do
|
|
119
118
|
index = ThinkingSphinx::RealTime::Index.new :user
|
|
120
|
-
index.name.
|
|
119
|
+
expect(index.name).to eq('user_core')
|
|
121
120
|
end
|
|
122
121
|
end
|
|
123
122
|
|
|
124
123
|
describe '#offset' do
|
|
125
124
|
before :each do
|
|
126
|
-
config.
|
|
125
|
+
allow(config).to receive_messages :next_offset => 4
|
|
127
126
|
end
|
|
128
127
|
|
|
129
128
|
it "uses the next offset value from the configuration" do
|
|
130
|
-
index.offset.
|
|
129
|
+
expect(index.offset).to eq(4)
|
|
131
130
|
end
|
|
132
131
|
|
|
133
132
|
it "uses the reference to get a unique offset" do
|
|
134
|
-
config.
|
|
133
|
+
expect(config).to receive(:next_offset).with(:user).and_return(2)
|
|
135
134
|
|
|
136
135
|
index.offset
|
|
137
136
|
end
|
|
@@ -139,11 +138,11 @@ describe ThinkingSphinx::RealTime::Index do
|
|
|
139
138
|
|
|
140
139
|
describe '#render' do
|
|
141
140
|
before :each do
|
|
142
|
-
FileUtils.
|
|
141
|
+
allow(FileUtils).to receive_messages :mkdir_p => true
|
|
143
142
|
end
|
|
144
143
|
|
|
145
144
|
it "interprets the provided definition" do
|
|
146
|
-
index.
|
|
145
|
+
expect(index).to receive(:interpret_definition!).at_least(:once)
|
|
147
146
|
|
|
148
147
|
begin
|
|
149
148
|
index.render
|
|
@@ -157,23 +156,23 @@ describe ThinkingSphinx::RealTime::Index do
|
|
|
157
156
|
let(:model) { double('model') }
|
|
158
157
|
|
|
159
158
|
it "returns the model by default" do
|
|
160
|
-
ActiveSupport::Inflector.
|
|
159
|
+
allow(ActiveSupport::Inflector).to receive_messages(:constantize => model)
|
|
161
160
|
|
|
162
|
-
index.scope.
|
|
161
|
+
expect(index.scope).to eq(model)
|
|
163
162
|
end
|
|
164
163
|
|
|
165
164
|
it "returns the evaluated scope if provided" do
|
|
166
165
|
index.scope = lambda { :foo }
|
|
167
166
|
|
|
168
|
-
index.scope.
|
|
167
|
+
expect(index.scope).to eq(:foo)
|
|
169
168
|
end
|
|
170
169
|
end
|
|
171
170
|
|
|
172
171
|
describe '#unique_attribute_names' do
|
|
173
172
|
it "returns all attribute names" do
|
|
174
|
-
index.unique_attribute_names.
|
|
173
|
+
expect(index.unique_attribute_names).to eq([
|
|
175
174
|
'sphinx_internal_id', 'sphinx_internal_class', 'sphinx_deleted'
|
|
176
|
-
]
|
|
175
|
+
])
|
|
177
176
|
end
|
|
178
177
|
end
|
|
179
178
|
end
|