freelancing-god-thinking-sphinx 1.1.22 → 1.1.23

Sign up to get free protection for your applications and to get access to all the features.
@@ -37,7 +37,7 @@ module ThinkingSphinx
37
37
  module Version #:nodoc:
38
38
  Major = 1
39
39
  Minor = 1
40
- Tiny = 22
40
+ Tiny = 23
41
41
 
42
42
  String = [Major, Minor, Tiny].join('.')
43
43
  end
@@ -124,10 +124,10 @@ module ThinkingSphinx
124
124
  # Special case is the multi-valued attribute that needs some
125
125
  # extra configuration.
126
126
  #
127
- def config_value(offset = nil)
127
+ def config_value(offset = nil, delta = false)
128
128
  if type == :multi
129
129
  multi_config = include_as_association? ? "field" :
130
- source_value(offset).gsub(/\s+/m, " ").strip
130
+ source_value(offset, delta).gsub(/\s+/m, " ").strip
131
131
  "uint #{unique_name} from #{multi_config}"
132
132
  else
133
133
  unique_name
@@ -183,13 +183,20 @@ module ThinkingSphinx
183
183
 
184
184
  private
185
185
 
186
- def source_value(offset)
186
+ def source_value(offset, delta)
187
187
  if is_string?
188
- "#{query_source.to_s.dasherize}; #{columns.first.__name}"
189
- elsif query_source == :ranged_query
190
- "ranged-query; #{query offset} #{query_clause}; #{range_query}"
188
+ return "#{query_source.to_s.dasherize}; #{columns.first.__name}"
189
+ end
190
+
191
+ query = query(offset)
192
+
193
+ if query_source == :ranged_query
194
+ query += query_clause
195
+ query += " AND #{query_delta.strip}" if delta
196
+ "ranged-query; #{query}; #{range_query}"
191
197
  else
192
- "query; #{query offset}"
198
+ query += "WHERE #{query_delta.strip}" if delta
199
+ "query; #{query}"
193
200
  end
194
201
  end
195
202
 
@@ -211,6 +218,15 @@ FROM #{quote_table_name base_assoc.table} #{association_joins}
211
218
  "WHERE #{foreign_key} >= $start AND #{foreign_key} <= $end"
212
219
  end
213
220
 
221
+ def query_delta
222
+ foreign_key = foreign_key_for_mva base_association_for_mva
223
+ <<-SQL
224
+ #{foreign_key} IN (SELECT #{quote_column model.primary_key}
225
+ FROM #{model.quoted_table_name}
226
+ WHERE #{@source.index.delta_object.clause(model, true)})
227
+ SQL
228
+ end
229
+
214
230
  def range_query
215
231
  assoc = base_association_for_mva
216
232
  foreign_key = foreign_key_for_mva assoc
@@ -8,7 +8,7 @@ module ThinkingSphinx
8
8
 
9
9
  attr_accessor :model, :fields, :attributes, :conditions, :groupings,
10
10
  :options
11
- attr_reader :base
11
+ attr_reader :base, :index
12
12
 
13
13
  def initialize(index, options = {})
14
14
  @index = index
@@ -56,7 +56,7 @@ module ThinkingSphinx
56
56
  source.parent = "#{name}_core_#{index}"
57
57
 
58
58
  set_source_database_settings source
59
- set_source_attributes source, offset
59
+ set_source_attributes source, offset, true
60
60
  set_source_sql source, offset, true
61
61
 
62
62
  source
@@ -89,9 +89,9 @@ module ThinkingSphinx
89
89
  source.sql_sock = config[:socket]
90
90
  end
91
91
 
92
- def set_source_attributes(source, offset)
92
+ def set_source_attributes(source, offset, delta = false)
93
93
  attributes.each do |attrib|
94
- source.send(attrib.type_to_config) << attrib.config_value(offset)
94
+ source.send(attrib.type_to_config) << attrib.config_value(offset, delta)
95
95
  end
96
96
  end
97
97
 
@@ -4,6 +4,8 @@ describe ThinkingSphinx::Attribute do
4
4
  before :each do
5
5
  @index = ThinkingSphinx::Index.new(Person)
6
6
  @source = ThinkingSphinx::Source.new(@index)
7
+
8
+ @index.delta_object = ThinkingSphinx::Deltas::DefaultDelta.new @index, @index.local_options
7
9
  end
8
10
 
9
11
  describe '#initialize' do
@@ -232,6 +234,23 @@ describe ThinkingSphinx::Attribute do
232
234
  end
233
235
  end
234
236
 
237
+ describe "MVA with source query for a delta source" do
238
+ before :each do
239
+ @attribute = ThinkingSphinx::Attribute.new(@source,
240
+ [ThinkingSphinx::Index::FauxColumn.new(:tags, :id)],
241
+ :as => :tag_ids, :source => :query
242
+ )
243
+ end
244
+
245
+ it "should use a query" do
246
+ @attribute.type_to_config.should == :sql_attr_multi
247
+
248
+ declaration, query = @attribute.config_value(nil, true).split('; ')
249
+ declaration.should == "uint tag_ids from query"
250
+ query.should == "SELECT `tags`.`person_id` #{ThinkingSphinx.unique_id_expression} AS `id`, `tags`.`id` AS `tag_ids` FROM `tags` WHERE `tags`.`person_id` IN (SELECT `id` FROM `people` WHERE `people`.`delta` = 1)"
251
+ end
252
+ end
253
+
235
254
  describe "MVA via a HABTM association with a source query" do
236
255
  before :each do
237
256
  @attribute = ThinkingSphinx::Attribute.new(@source,
@@ -267,6 +286,24 @@ describe ThinkingSphinx::Attribute do
267
286
  end
268
287
  end
269
288
 
289
+ describe "MVA with ranged source query for a delta source" do
290
+ before :each do
291
+ @attribute = ThinkingSphinx::Attribute.new(@source,
292
+ [ThinkingSphinx::Index::FauxColumn.new(:tags, :id)],
293
+ :as => :tag_ids, :source => :ranged_query
294
+ )
295
+ end
296
+
297
+ it "should use a ranged query" do
298
+ @attribute.type_to_config.should == :sql_attr_multi
299
+
300
+ declaration, query, range_query = @attribute.config_value(nil, true).split('; ')
301
+ declaration.should == "uint tag_ids from ranged-query"
302
+ query.should == "SELECT `tags`.`person_id` #{ThinkingSphinx.unique_id_expression} AS `id`, `tags`.`id` AS `tag_ids` FROM `tags` WHERE `tags`.`person_id` >= $start AND `tags`.`person_id` <= $end AND `tags`.`person_id` IN (SELECT `id` FROM `people` WHERE `people`.`delta` = 1)"
303
+ range_query.should == "SELECT MIN(`tags`.`person_id`), MAX(`tags`.`person_id`) FROM `tags`"
304
+ end
305
+ end
306
+
270
307
  describe "MVA via a has-many :through with a ranged source query" do
271
308
  before :each do
272
309
  @attribute = ThinkingSphinx::Attribute.new(@source,
@@ -341,6 +378,28 @@ describe ThinkingSphinx::Attribute do
341
378
  end
342
379
  end
343
380
 
381
+ describe "MVA via two has-many associations with a ranged source query for a delta source" do
382
+ before :each do
383
+ @index = ThinkingSphinx::Index.new(Alpha)
384
+ @source = ThinkingSphinx::Source.new(@index)
385
+ @attribute = ThinkingSphinx::Attribute.new(@source,
386
+ [ThinkingSphinx::Index::FauxColumn.new(:betas, :gammas, :value)],
387
+ :as => :gamma_values, :source => :ranged_query
388
+ )
389
+
390
+ @index.delta_object = ThinkingSphinx::Deltas::DefaultDelta.new @index, @index.local_options
391
+ end
392
+
393
+ it "should use a ranged query" do
394
+ @attribute.type_to_config.should == :sql_attr_multi
395
+
396
+ declaration, query, range_query = @attribute.config_value(nil, true).split('; ')
397
+ declaration.should == "uint gamma_values from ranged-query"
398
+ query.should == "SELECT `betas`.`alpha_id` #{ThinkingSphinx.unique_id_expression} AS `id`, `gammas`.`value` AS `gamma_values` FROM `betas` LEFT OUTER JOIN `gammas` ON gammas.beta_id = betas.id WHERE `betas`.`alpha_id` >= $start AND `betas`.`alpha_id` <= $end AND `betas`.`alpha_id` IN (SELECT `id` FROM `alphas` WHERE `alphas`.`delta` = 1)"
399
+ range_query.should == "SELECT MIN(`betas`.`alpha_id`), MAX(`betas`.`alpha_id`) FROM `betas`"
400
+ end
401
+ end
402
+
344
403
  describe "with custom queries" do
345
404
  before :each do
346
405
  index = CricketTeam.sphinx_indexes.first
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: freelancing-god-thinking-sphinx
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.22
4
+ version: 1.1.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pat Allan
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-22 00:00:00 -07:00
12
+ date: 2009-06-28 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15