thinking-sphinx 2.0.4 → 2.0.5

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.
Files changed (36) hide show
  1. data/README.textile +2 -0
  2. data/VERSION +1 -1
  3. data/features/searching_by_model.feature +13 -0
  4. data/features/support/env.rb +2 -1
  5. data/features/thinking_sphinx/db/fixtures/cats.rb +1 -1
  6. data/features/thinking_sphinx/db/fixtures/dogs.rb +1 -1
  7. data/features/thinking_sphinx/db/fixtures/foxes.rb +1 -1
  8. data/features/thinking_sphinx/db/fixtures/posts.rb +5 -1
  9. data/features/thinking_sphinx/db/migrations/create_posts.rb +1 -0
  10. data/features/thinking_sphinx/models/developer.rb +1 -0
  11. data/features/thinking_sphinx/models/music.rb +3 -1
  12. data/features/thinking_sphinx/models/post.rb +1 -0
  13. data/lib/thinking_sphinx.rb +2 -2
  14. data/lib/thinking_sphinx/active_record.rb +32 -2
  15. data/lib/thinking_sphinx/active_record/delta.rb +0 -27
  16. data/lib/thinking_sphinx/adapters/mysql_adapter.rb +4 -0
  17. data/lib/thinking_sphinx/adapters/postgresql_adapter.rb +4 -0
  18. data/lib/thinking_sphinx/association.rb +55 -5
  19. data/lib/thinking_sphinx/attribute.rb +17 -10
  20. data/lib/thinking_sphinx/auto_version.rb +1 -1
  21. data/lib/thinking_sphinx/class_facet.rb +7 -3
  22. data/lib/thinking_sphinx/configuration.rb +3 -3
  23. data/lib/thinking_sphinx/facet.rb +1 -0
  24. data/lib/thinking_sphinx/facet_search.rb +5 -1
  25. data/lib/thinking_sphinx/field.rb +16 -0
  26. data/lib/thinking_sphinx/search.rb +21 -5
  27. data/lib/thinking_sphinx/sinatra.rb +7 -0
  28. data/lib/thinking_sphinx/source.rb +33 -2
  29. data/lib/thinking_sphinx/source/internal_properties.rb +8 -3
  30. data/lib/thinking_sphinx/source/sql.rb +10 -1
  31. data/spec/thinking_sphinx/attribute_spec.rb +86 -94
  32. data/spec/thinking_sphinx/auto_version_spec.rb +8 -0
  33. data/spec/thinking_sphinx/facet_search_spec.rb +12 -6
  34. data/spec/thinking_sphinx/index/builder_spec.rb +32 -29
  35. data/spec/thinking_sphinx/search_spec.rb +14 -11
  36. metadata +5 -4
@@ -19,6 +19,8 @@ module ThinkingSphinx
19
19
  # - :sortable => true
20
20
  # - :infixes => true
21
21
  # - :prefixes => true
22
+ # - :file => true
23
+ # - :with => :attribute # or :wordcount
22
24
  #
23
25
  # Alias is only required in three circumstances: when there's
24
26
  # another attribute or field with the same name, when the column name is
@@ -58,6 +60,8 @@ module ThinkingSphinx
58
60
  @sortable = options[:sortable] || false
59
61
  @infixes = options[:infixes] || false
60
62
  @prefixes = options[:prefixes] || false
63
+ @file = options[:file] || false
64
+ @with = options[:with]
61
65
 
62
66
  source.fields << self
63
67
  end
@@ -78,5 +82,17 @@ module ThinkingSphinx
78
82
 
79
83
  "#{clause} AS #{quote_column(unique_name)}"
80
84
  end
85
+
86
+ def file?
87
+ @file
88
+ end
89
+
90
+ def with_attribute?
91
+ @with == :attribute
92
+ end
93
+
94
+ def with_wordcount?
95
+ @with == :wordcount
96
+ end
81
97
  end
82
98
  end
@@ -22,7 +22,7 @@ module ThinkingSphinx
22
22
  undef_method method
23
23
  }
24
24
 
25
- HashOptions = [:conditions, :with, :without, :with_all]
25
+ HashOptions = [:conditions, :with, :without, :with_all, :without_any]
26
26
  ArrayOptions = [:classes, :without_ids]
27
27
 
28
28
  attr_reader :args, :options
@@ -482,9 +482,12 @@ module ThinkingSphinx
482
482
 
483
483
  def match_hash(object)
484
484
  @results[:matches].detect { |match|
485
+ class_crc = object.class.name
486
+ class_crc = object.class.to_crc32 if Riddle.loaded_version.to_i < 2
487
+
485
488
  match[:attributes]['sphinx_internal_id'] == object.
486
489
  primary_key_for_sphinx &&
487
- match[:attributes]['class_crc'] == object.class.to_crc32
490
+ match[:attributes][crc_attribute] == class_crc
488
491
  }
489
492
  end
490
493
 
@@ -722,6 +725,11 @@ module ThinkingSphinx
722
725
  Array(values).collect { |value|
723
726
  Riddle::Client::Filter.new attrib.to_s, filter_value(value)
724
727
  }
728
+ }.flatten +
729
+ (options[:without_any] || {}).collect { |attrib, values|
730
+ Array(values).collect { |value|
731
+ Riddle::Client::Filter.new attrib.to_s, filter_value(value), true
732
+ }
725
733
  }.flatten
726
734
  end
727
735
 
@@ -877,7 +885,7 @@ module ThinkingSphinx
877
885
  return single_class_results if one_class
878
886
 
879
887
  groups = results[:matches].group_by { |match|
880
- match[:attributes]["class_crc"]
888
+ match[:attributes][crc_attribute]
881
889
  }
882
890
  groups.each do |crc, group|
883
891
  group.replace(
@@ -887,7 +895,7 @@ module ThinkingSphinx
887
895
 
888
896
  results[:matches].collect do |match|
889
897
  groups.detect { |crc, group|
890
- crc == match[:attributes]["class_crc"]
898
+ crc == match[:attributes][crc_attribute]
891
899
  }[1].compact.detect { |obj|
892
900
  obj.primary_key_for_sphinx == match[:attributes]["sphinx_internal_id"]
893
901
  }
@@ -899,7 +907,11 @@ module ThinkingSphinx
899
907
  end
900
908
 
901
909
  def class_from_crc(crc)
902
- config.models_by_crc[crc].constantize
910
+ if Riddle.loaded_version.to_i < 2
911
+ config.models_by_crc[crc].constantize
912
+ else
913
+ crc.constantize
914
+ end
903
915
  end
904
916
 
905
917
  def each_with_attribute(attribute, &block)
@@ -952,5 +964,9 @@ module ThinkingSphinx
952
964
 
953
965
  results_count
954
966
  end
967
+
968
+ def crc_attribute
969
+ Riddle.loaded_version.to_i < 2 ? 'class_crc' : 'sphinx_internal_class'
970
+ end
955
971
  end
956
972
  end
@@ -0,0 +1,7 @@
1
+ require 'thinking_sphinx'
2
+
3
+ ThinkingSphinx::Configuration.instance
4
+
5
+ ActiveSupport.on_load :active_record do
6
+ include ThinkingSphinx::ActiveRecord
7
+ end
@@ -23,8 +23,8 @@ module ThinkingSphinx
23
23
  @database_configuration = @model.connection.
24
24
  instance_variable_get(:@config).clone
25
25
 
26
- @base = ::ActiveRecord::Associations::ClassMethods::JoinDependency.new(
27
- @model, [], nil
26
+ @base = join_dependency_class.new(
27
+ @model, [], initial_joins
28
28
  )
29
29
 
30
30
  unless @model.descends_from_active_record?
@@ -45,6 +45,7 @@ module ThinkingSphinx
45
45
  )
46
46
 
47
47
  set_source_database_settings source
48
+ set_source_fields source
48
49
  set_source_attributes source, offset
49
50
  set_source_settings source
50
51
  set_source_sql source, offset
@@ -59,6 +60,7 @@ module ThinkingSphinx
59
60
  source.parent = "#{index.core_name}_#{position}"
60
61
 
61
62
  set_source_database_settings source
63
+ set_source_fields source
62
64
  set_source_attributes source, offset, true
63
65
  set_source_settings source
64
66
  set_source_sql source, offset, true
@@ -97,6 +99,14 @@ module ThinkingSphinx
97
99
  source.sql_sock = config[:socket]
98
100
  end
99
101
 
102
+ def set_source_fields(source)
103
+ fields.each do |field|
104
+ source.sql_file_field << field.unique_name if field.file?
105
+ source.sql_field_string << field.unique_name if field.with_attribute?
106
+ source.sql_field_str2wordcount << field.unique_name if field.with_wordcount?
107
+ end
108
+ end
109
+
100
110
  def set_source_attributes(source, offset, delta = false)
101
111
  available_attributes.each do |attrib|
102
112
  source.send(attrib.type_to_config) << attrib.config_value(offset, delta)
@@ -159,5 +169,26 @@ module ThinkingSphinx
159
169
  def utf8?
160
170
  @index.options[:charset_type] =~ /utf-8|zh_cn.utf-8/
161
171
  end
172
+
173
+ def join_dependency_class
174
+ if rails_3_1?
175
+ ::ActiveRecord::Associations::JoinDependency
176
+ else
177
+ ::ActiveRecord::Associations::ClassMethods::JoinDependency
178
+ end
179
+ end
180
+
181
+ def initial_joins
182
+ if rails_3_1?
183
+ []
184
+ else
185
+ nil
186
+ end
187
+ end
188
+
189
+ def rails_3_1?
190
+ ::ActiveRecord::Associations.constants.include?(:JoinDependency) ||
191
+ ::ActiveRecord::Associations.constants.include?('JoinDependency')
192
+ end
162
193
  end
163
194
  end
@@ -4,10 +4,15 @@ module ThinkingSphinx
4
4
  def add_internal_attributes_and_facets
5
5
  add_internal_attribute :sphinx_internal_id, nil,
6
6
  @model.primary_key_for_sphinx.to_sym
7
- add_internal_attribute :class_crc, :integer, crc_column, true
8
7
  add_internal_attribute :sphinx_deleted, :integer, "0"
9
-
10
- add_internal_facet :class_crc
8
+ add_internal_attribute :class_crc, :integer, crc_column, true
9
+
10
+ unless Riddle.loaded_version.to_i < 2
11
+ add_internal_attribute :sphinx_internal_class, :string, internal_class_column, true
12
+ add_internal_facet :sphinx_internal_class
13
+ else
14
+ add_internal_facet :class_crc
15
+ end
11
16
  end
12
17
 
13
18
  def add_internal_attribute(name, type, contents, facet = false)
@@ -61,7 +61,7 @@ module ThinkingSphinx
61
61
  end
62
62
 
63
63
  def sql_select_clause(offset)
64
- unique_id_expr = ThinkingSphinx.unique_id_expression(offset)
64
+ unique_id_expr = ThinkingSphinx.unique_id_expression(adapter, offset)
65
65
 
66
66
  (
67
67
  ["#{@model.quoted_table_name}.#{quote_column(@model.primary_key_for_sphinx)} #{unique_id_expr} AS #{quote_column(@model.primary_key_for_sphinx)} "] +
@@ -130,6 +130,15 @@ module ThinkingSphinx
130
130
  end
131
131
  end
132
132
 
133
+ def internal_class_column
134
+ if @model.table_exists? &&
135
+ @model.column_names.include?(@model.inheritance_column)
136
+ adapter.quote_with_table(@model.inheritance_column)
137
+ else
138
+ "'#{@model.name}'"
139
+ end
140
+ end
141
+
133
142
  def type_values
134
143
  @model.connection.select_values <<-SQL
135
144
  SELECT DISTINCT #{@model.inheritance_column}
@@ -298,184 +298,176 @@ describe ThinkingSphinx::Attribute do
298
298
  end
299
299
 
300
300
  describe "MVA with source query" do
301
- before :each do
302
- @attribute = ThinkingSphinx::Attribute.new(@source,
303
- [ThinkingSphinx::Index::FauxColumn.new(:tags, :id)],
304
- :as => :tag_ids, :source => :query
305
- )
306
- end
301
+ let(:attribute) { ThinkingSphinx::Attribute.new(@source,
302
+ [ThinkingSphinx::Index::FauxColumn.new(:tags, :id)],
303
+ :as => :tag_ids, :source => :query)
304
+ }
305
+ let(:adapter) { attribute.send(:adapter) }
307
306
 
308
307
  it "should use a query" do
309
- @attribute.type_to_config.should == :sql_attr_multi
308
+ attribute.type_to_config.should == :sql_attr_multi
310
309
 
311
- declaration, query = @attribute.config_value.split('; ')
310
+ declaration, query = attribute.config_value.split('; ')
312
311
  declaration.should == "uint tag_ids from query"
313
- query.should == "SELECT `tags`.`person_id` #{ThinkingSphinx.unique_id_expression} AS `id`, `tags`.`id` AS `tag_ids` FROM `tags`"
312
+ query.should == "SELECT `tags`.`person_id` #{ThinkingSphinx.unique_id_expression adapter} AS `id`, `tags`.`id` AS `tag_ids` FROM `tags`"
314
313
  end
315
314
  end
316
315
 
317
316
  describe "MVA with source query for a delta source" do
318
- before :each do
319
- @attribute = ThinkingSphinx::Attribute.new(@source,
320
- [ThinkingSphinx::Index::FauxColumn.new(:tags, :id)],
321
- :as => :tag_ids, :source => :query
322
- )
323
- end
317
+ let(:attribute) { ThinkingSphinx::Attribute.new(@source,
318
+ [ThinkingSphinx::Index::FauxColumn.new(:tags, :id)],
319
+ :as => :tag_ids, :source => :query)
320
+ }
321
+ let(:adapter) { attribute.send(:adapter) }
324
322
 
325
323
  it "should use a query" do
326
- @attribute.type_to_config.should == :sql_attr_multi
324
+ attribute.type_to_config.should == :sql_attr_multi
327
325
 
328
- declaration, query = @attribute.config_value(nil, true).split('; ')
326
+ declaration, query = attribute.config_value(nil, true).split('; ')
329
327
  declaration.should == "uint tag_ids from query"
330
- 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)"
328
+ query.should == "SELECT `tags`.`person_id` #{ThinkingSphinx.unique_id_expression adapter} AS `id`, `tags`.`id` AS `tag_ids` FROM `tags` WHERE `tags`.`person_id` IN (SELECT `id` FROM `people` WHERE `people`.`delta` = 1)"
331
329
  end
332
330
  end
333
331
 
334
332
  describe "MVA via a HABTM association with a source query" do
335
- before :each do
336
- @attribute = ThinkingSphinx::Attribute.new(@source,
337
- [ThinkingSphinx::Index::FauxColumn.new(:links, :id)],
338
- :as => :link_ids, :source => :query
339
- )
340
- end
333
+ let(:attribute) { ThinkingSphinx::Attribute.new(@source,
334
+ [ThinkingSphinx::Index::FauxColumn.new(:links, :id)],
335
+ :as => :link_ids, :source => :query)
336
+ }
337
+ let(:adapter) { attribute.send(:adapter) }
341
338
 
342
339
  it "should use a ranged query" do
343
- @attribute.type_to_config.should == :sql_attr_multi
340
+ attribute.type_to_config.should == :sql_attr_multi
344
341
 
345
- declaration, query = @attribute.config_value.split('; ')
342
+ declaration, query = attribute.config_value.split('; ')
346
343
  declaration.should == "uint link_ids from query"
347
- query.should == "SELECT `links_people`.`person_id` #{ThinkingSphinx.unique_id_expression} AS `id`, `links_people`.`link_id` AS `link_ids` FROM `links_people`"
344
+ query.should == "SELECT `links_people`.`person_id` #{ThinkingSphinx.unique_id_expression adapter} AS `id`, `links_people`.`link_id` AS `link_ids` FROM `links_people`"
348
345
  end
349
346
  end
350
347
 
351
348
  describe "MVA with ranged source query" do
352
- before :each do
353
- @attribute = ThinkingSphinx::Attribute.new(@source,
354
- [ThinkingSphinx::Index::FauxColumn.new(:tags, :id)],
355
- :as => :tag_ids, :source => :ranged_query
356
- )
357
- end
349
+ let(:attribute) { ThinkingSphinx::Attribute.new(@source,
350
+ [ThinkingSphinx::Index::FauxColumn.new(:tags, :id)],
351
+ :as => :tag_ids, :source => :ranged_query)
352
+ }
353
+ let(:adapter) { attribute.send(:adapter) }
358
354
 
359
355
  it "should use a ranged query" do
360
- @attribute.type_to_config.should == :sql_attr_multi
356
+ attribute.type_to_config.should == :sql_attr_multi
361
357
 
362
- declaration, query, range_query = @attribute.config_value.split('; ')
358
+ declaration, query, range_query = attribute.config_value.split('; ')
363
359
  declaration.should == "uint tag_ids from ranged-query"
364
- 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"
360
+ query.should == "SELECT `tags`.`person_id` #{ThinkingSphinx.unique_id_expression adapter} AS `id`, `tags`.`id` AS `tag_ids` FROM `tags` WHERE `tags`.`person_id` >= $start AND `tags`.`person_id` <= $end"
365
361
  range_query.should == "SELECT MIN(`tags`.`person_id`), MAX(`tags`.`person_id`) FROM `tags`"
366
362
  end
367
363
  end
368
364
 
369
365
  describe "MVA with ranged source query for a delta source" do
370
- before :each do
371
- @attribute = ThinkingSphinx::Attribute.new(@source,
372
- [ThinkingSphinx::Index::FauxColumn.new(:tags, :id)],
373
- :as => :tag_ids, :source => :ranged_query
374
- )
375
- end
366
+ let(:attribute) { ThinkingSphinx::Attribute.new(@source,
367
+ [ThinkingSphinx::Index::FauxColumn.new(:tags, :id)],
368
+ :as => :tag_ids, :source => :ranged_query)
369
+ }
370
+ let(:adapter) { attribute.send(:adapter) }
376
371
 
377
372
  it "should use a ranged query" do
378
- @attribute.type_to_config.should == :sql_attr_multi
373
+ attribute.type_to_config.should == :sql_attr_multi
379
374
 
380
- declaration, query, range_query = @attribute.config_value(nil, true).split('; ')
375
+ declaration, query, range_query = attribute.config_value(nil, true).split('; ')
381
376
  declaration.should == "uint tag_ids from ranged-query"
382
- 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)"
377
+ query.should == "SELECT `tags`.`person_id` #{ThinkingSphinx.unique_id_expression adapter} 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)"
383
378
  range_query.should == "SELECT MIN(`tags`.`person_id`), MAX(`tags`.`person_id`) FROM `tags`"
384
379
  end
385
380
  end
386
381
 
387
382
  describe "MVA via a has-many :through with a ranged source query" do
388
- before :each do
389
- @attribute = ThinkingSphinx::Attribute.new(@source,
390
- [ThinkingSphinx::Index::FauxColumn.new(:football_teams, :id)],
391
- :as => :football_team_ids, :source => :ranged_query
392
- )
393
- end
383
+ let(:attribute) { ThinkingSphinx::Attribute.new(@source,
384
+ [ThinkingSphinx::Index::FauxColumn.new(:football_teams, :id)],
385
+ :as => :football_team_ids, :source => :ranged_query)
386
+ }
387
+ let(:adapter) { attribute.send(:adapter) }
394
388
 
395
389
  it "should use a ranged query" do
396
- @attribute.type_to_config.should == :sql_attr_multi
390
+ attribute.type_to_config.should == :sql_attr_multi
397
391
 
398
- declaration, query, range_query = @attribute.config_value.split('; ')
392
+ declaration, query, range_query = attribute.config_value.split('; ')
399
393
  declaration.should == "uint football_team_ids from ranged-query"
400
- query.should == "SELECT `tags`.`person_id` #{ThinkingSphinx.unique_id_expression} AS `id`, `tags`.`football_team_id` AS `football_team_ids` FROM `tags` WHERE `tags`.`person_id` >= $start AND `tags`.`person_id` <= $end"
394
+ query.should == "SELECT `tags`.`person_id` #{ThinkingSphinx.unique_id_expression adapter} AS `id`, `tags`.`football_team_id` AS `football_team_ids` FROM `tags` WHERE `tags`.`person_id` >= $start AND `tags`.`person_id` <= $end"
401
395
  range_query.should == "SELECT MIN(`tags`.`person_id`), MAX(`tags`.`person_id`) FROM `tags`"
402
396
  end
403
397
  end
404
398
 
405
399
  describe "MVA via a has-many :through using a foreign key with a ranged source query" do
406
- before :each do
407
- @attribute = ThinkingSphinx::Attribute.new(@source,
408
- [ThinkingSphinx::Index::FauxColumn.new(:friends, :id)],
409
- :as => :friend_ids, :source => :ranged_query
410
- )
411
- end
400
+ let(:attribute) { ThinkingSphinx::Attribute.new(@source,
401
+ [ThinkingSphinx::Index::FauxColumn.new(:friends, :id)],
402
+ :as => :friend_ids, :source => :ranged_query)
403
+ }
404
+ let(:adapter) { attribute.send(:adapter) }
412
405
 
413
406
  it "should use a ranged query" do
414
- @attribute.type_to_config.should == :sql_attr_multi
407
+ attribute.type_to_config.should == :sql_attr_multi
415
408
 
416
- declaration, query, range_query = @attribute.config_value.split('; ')
409
+ declaration, query, range_query = attribute.config_value.split('; ')
417
410
  declaration.should == "uint friend_ids from ranged-query"
418
- query.should == "SELECT `friendships`.`person_id` #{ThinkingSphinx.unique_id_expression} AS `id`, `friendships`.`friend_id` AS `friend_ids` FROM `friendships` WHERE `friendships`.`person_id` >= $start AND `friendships`.`person_id` <= $end"
411
+ query.should == "SELECT `friendships`.`person_id` #{ThinkingSphinx.unique_id_expression adapter} AS `id`, `friendships`.`friend_id` AS `friend_ids` FROM `friendships` WHERE `friendships`.`person_id` >= $start AND `friendships`.`person_id` <= $end"
419
412
  range_query.should == "SELECT MIN(`friendships`.`person_id`), MAX(`friendships`.`person_id`) FROM `friendships`"
420
413
  end
421
414
  end
422
415
 
423
416
  describe "MVA via a HABTM with a ranged source query" do
424
- before :each do
425
- @attribute = ThinkingSphinx::Attribute.new(@source,
426
- [ThinkingSphinx::Index::FauxColumn.new(:links, :id)],
427
- :as => :link_ids, :source => :ranged_query
428
- )
429
- end
417
+ let(:attribute) { ThinkingSphinx::Attribute.new(@source,
418
+ [ThinkingSphinx::Index::FauxColumn.new(:links, :id)],
419
+ :as => :link_ids, :source => :ranged_query)
420
+ }
421
+ let(:adapter) { attribute.send(:adapter) }
430
422
 
431
423
  it "should use a ranged query" do
432
- @attribute.type_to_config.should == :sql_attr_multi
424
+ attribute.type_to_config.should == :sql_attr_multi
433
425
 
434
- declaration, query, range_query = @attribute.config_value.split('; ')
426
+ declaration, query, range_query = attribute.config_value.split('; ')
435
427
  declaration.should == "uint link_ids from ranged-query"
436
- query.should == "SELECT `links_people`.`person_id` #{ThinkingSphinx.unique_id_expression} AS `id`, `links_people`.`link_id` AS `link_ids` FROM `links_people` WHERE `links_people`.`person_id` >= $start AND `links_people`.`person_id` <= $end"
428
+ query.should == "SELECT `links_people`.`person_id` #{ThinkingSphinx.unique_id_expression adapter} AS `id`, `links_people`.`link_id` AS `link_ids` FROM `links_people` WHERE `links_people`.`person_id` >= $start AND `links_people`.`person_id` <= $end"
437
429
  range_query.should == "SELECT MIN(`links_people`.`person_id`), MAX(`links_people`.`person_id`) FROM `links_people`"
438
430
  end
439
431
  end
440
432
 
441
433
  describe "MVA via two has-many associations with a ranged source query" do
442
- before :each do
443
- @index = ThinkingSphinx::Index.new(Alpha)
444
- @source = ThinkingSphinx::Source.new(@index)
445
- @attribute = ThinkingSphinx::Attribute.new(@source,
446
- [ThinkingSphinx::Index::FauxColumn.new(:betas, :gammas, :value)],
447
- :as => :gamma_values, :source => :ranged_query
448
- )
449
- end
434
+ let(:index) { ThinkingSphinx::Index.new(Alpha) }
435
+ let(:source) { ThinkingSphinx::Source.new(index) }
436
+ let(:attribute) { ThinkingSphinx::Attribute.new(source,
437
+ [ThinkingSphinx::Index::FauxColumn.new(:betas, :gammas, :value)],
438
+ :as => :gamma_values, :source => :ranged_query)
439
+ }
440
+ let(:adapter) { attribute.send(:adapter) }
450
441
 
451
442
  it "should use a ranged query" do
452
- @attribute.type_to_config.should == :sql_attr_multi
443
+ attribute.type_to_config.should == :sql_attr_multi
453
444
 
454
- declaration, query, range_query = @attribute.config_value.split('; ')
445
+ declaration, query, range_query = attribute.config_value.split('; ')
455
446
  declaration.should == "uint gamma_values from ranged-query"
456
- 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"
447
+ query.should == "SELECT `betas`.`alpha_id` #{ThinkingSphinx.unique_id_expression adapter} 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"
457
448
  range_query.should == "SELECT MIN(`betas`.`alpha_id`), MAX(`betas`.`alpha_id`) FROM `betas`"
458
449
  end
459
450
  end
460
451
 
461
452
  describe "MVA via two has-many associations with a ranged source query for a delta source" do
462
- before :each do
463
- @index = ThinkingSphinx::Index.new(Alpha)
464
- @source = ThinkingSphinx::Source.new(@index)
465
- @attribute = ThinkingSphinx::Attribute.new(@source,
466
- [ThinkingSphinx::Index::FauxColumn.new(:betas, :gammas, :value)],
467
- :as => :gamma_values, :source => :ranged_query
468
- )
453
+ let(:index) { ThinkingSphinx::Index.new(Alpha) }
454
+ let(:source) { ThinkingSphinx::Source.new(index) }
455
+ let(:attribute) { ThinkingSphinx::Attribute.new(source,
456
+ [ThinkingSphinx::Index::FauxColumn.new(:betas, :gammas, :value)],
457
+ :as => :gamma_values, :source => :ranged_query)
458
+ }
459
+ let(:adapter) { attribute.send(:adapter) }
469
460
 
470
- @index.delta_object = ThinkingSphinx::Deltas::DefaultDelta.new @index, @index.local_options
461
+ before :each do
462
+ index.delta_object = ThinkingSphinx::Deltas::DefaultDelta.new index, index.local_options
471
463
  end
472
464
 
473
465
  it "should use a ranged query" do
474
- @attribute.type_to_config.should == :sql_attr_multi
466
+ attribute.type_to_config.should == :sql_attr_multi
475
467
 
476
- declaration, query, range_query = @attribute.config_value(nil, true).split('; ')
468
+ declaration, query, range_query = attribute.config_value(nil, true).split('; ')
477
469
  declaration.should == "uint gamma_values from ranged-query"
478
- 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)"
470
+ query.should == "SELECT `betas`.`alpha_id` #{ThinkingSphinx.unique_id_expression adapter} 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)"
479
471
  range_query.should == "SELECT MIN(`betas`.`alpha_id`), MAX(`betas`.`alpha_id`) FROM `betas`"
480
472
  end
481
473
  end