thinking-sphinx 1.4.5 → 1.4.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -191,3 +191,4 @@ Since I first released this library, there's been quite a few people who have su
191
191
  * Clemens Kofler
192
192
  * Ryan Mohr
193
193
  * Alex Chee
194
+ * Bruno Santschi
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.4.5
1
+ 1.4.6
@@ -66,6 +66,12 @@ Feature: Searching on a single model
66
66
  When I filter by 2001-01-01 on comments_created_at
67
67
  Then I should get 1 result
68
68
 
69
+ Scenario: Filtering on a wordcount attribute
70
+ Given Sphinx is running
71
+ And I am searching on developers
72
+ When I filter between 0 and 1 on state_wordcount
73
+ Then I should get 5 results
74
+
69
75
  Scenario: Searching by NULL/0 values in MVAs
70
76
  Given Sphinx is running
71
77
  And I am searching on boxes
@@ -166,3 +172,10 @@ Feature: Searching on a single model
166
172
  And I am searching on posts
167
173
  When I search for "Shakespeare"
168
174
  Then I should get 1 result
175
+
176
+ Scenario: Searching on content from file field
177
+ Given Sphinx is running
178
+ And I am searching on posts
179
+ When I search for "foo bar baz"
180
+ Then I should get 1 result
181
+
@@ -1,5 +1,9 @@
1
1
  post = Post.create(
2
- :subject => "Hello World", :content => "Um Text", :id => 1, :category_id => 1
2
+ :subject => "Hello World",
3
+ :content => "Um Text",
4
+ :id => 1,
5
+ :category_id => 1,
6
+ :keywords_file => (File.dirname(__FILE__) + '/post_keywords.txt')
3
7
  )
4
8
 
5
9
  post.authors << Author.find(:first)
@@ -2,4 +2,5 @@ ActiveRecord::Base.connection.create_table :posts, :force => true do |t|
2
2
  t.column :subject, :string, :null => false
3
3
  t.column :content, :text
4
4
  t.column :category_id, :integer, :null => false
5
+ t.column :keywords_file, :string
5
6
  end
@@ -12,6 +12,7 @@ class Developer < ActiveRecord::Base
12
12
 
13
13
  has age, :facet => true
14
14
  has tags(:id), :as => :tag_ids, :facet => true
15
+ has state, :as => :state_wordcount, :type => :wordcount
15
16
 
16
17
  facet "LOWER(city)", :as => :city, :type => :string, :value => :city
17
18
 
@@ -2,7 +2,9 @@ class Music < Medium
2
2
  set_table_name 'music'
3
3
 
4
4
  define_index do
5
- indexes artist, track, album
5
+ indexes artist, :with => :attribute
6
+ indexes track
7
+ indexes album, :with => :wordcount
6
8
  indexes genre(:name), :as => :genre
7
9
  end
8
10
  end
@@ -11,6 +11,7 @@ class Post < ActiveRecord::Base
11
11
  indexes tags.text, :as => :tags
12
12
  indexes comments.content, :as => :comments
13
13
  indexes authors.name, :as => :authors
14
+ indexes keywords_file, :as => :keywords, :file => true
14
15
 
15
16
  has comments(:id), :as => :comment_ids, :source => :ranged_query,
16
17
  :facet => true
@@ -108,8 +108,8 @@ module ThinkingSphinx
108
108
  end
109
109
  end
110
110
 
111
- def self.unique_id_expression(offset = nil)
112
- "* #{context.indexed_models.size} + #{offset || 0}"
111
+ def self.unique_id_expression(adapter, offset = nil)
112
+ "* #{adapter.cast_to_int context.indexed_models.size} + #{offset || 0}"
113
113
  end
114
114
 
115
115
  # Check if index definition is disabled.
@@ -285,6 +285,33 @@ module ThinkingSphinx
285
285
  index eldest_indexed_ancestor
286
286
  end
287
287
 
288
+ # Temporarily disable delta indexing inside a block, then perform a
289
+ # single rebuild of index at the end.
290
+ #
291
+ # Useful when performing updates to batches of models to prevent
292
+ # the delta index being rebuilt after each individual update.
293
+ #
294
+ # In the following example, the delta index will only be rebuilt
295
+ # once, not 10 times.
296
+ #
297
+ # SomeModel.suspended_delta do
298
+ # 10.times do
299
+ # SomeModel.create( ... )
300
+ # end
301
+ # end
302
+ #
303
+ def suspended_delta(reindex_after = true, &block)
304
+ define_indexes
305
+ original_setting = ThinkingSphinx.deltas_suspended?
306
+ ThinkingSphinx.deltas_suspended = true
307
+ begin
308
+ yield
309
+ ensure
310
+ ThinkingSphinx.deltas_suspended = original_setting
311
+ self.index_delta if reindex_after
312
+ end
313
+ end
314
+
288
315
  private
289
316
 
290
317
  def local_sphinx_indexes
@@ -22,33 +22,6 @@ module ThinkingSphinx
22
22
  def delta_objects
23
23
  self.sphinx_indexes.collect(&:delta_object).compact
24
24
  end
25
-
26
- # Temporarily disable delta indexing inside a block, then perform a
27
- # single rebuild of index at the end.
28
- #
29
- # Useful when performing updates to batches of models to prevent
30
- # the delta index being rebuilt after each individual update.
31
- #
32
- # In the following example, the delta index will only be rebuilt
33
- # once, not 10 times.
34
- #
35
- # SomeModel.suspended_delta do
36
- # 10.times do
37
- # SomeModel.create( ... )
38
- # end
39
- # end
40
- #
41
- def suspended_delta(reindex_after = true, &block)
42
- define_indexes
43
- original_setting = ThinkingSphinx.deltas_suspended?
44
- ThinkingSphinx.deltas_suspended = true
45
- begin
46
- yield
47
- ensure
48
- ThinkingSphinx.deltas_suspended = original_setting
49
- self.index_delta if reindex_after
50
- end
51
- end
52
25
  end
53
26
 
54
27
  def toggled_delta?
@@ -28,6 +28,10 @@ module ThinkingSphinx
28
28
  "CAST(#{clause} AS UNSIGNED)"
29
29
  end
30
30
 
31
+ def cast_to_int(clause)
32
+ "CAST(#{clause} AS SIGNED)"
33
+ end
34
+
31
35
  def convert_nulls(clause, default = '')
32
36
  default = "'#{default}'" if default.is_a?(String)
33
37
 
@@ -35,6 +35,10 @@ module ThinkingSphinx
35
35
  clause
36
36
  end
37
37
 
38
+ def cast_to_int(clause)
39
+ "#{clause}::INT8"
40
+ end
41
+
38
42
  def convert_nulls(clause, default = '')
39
43
  default = case default
40
44
  when String
@@ -71,9 +71,7 @@ module ThinkingSphinx
71
71
  # join conditions avoid column name collisions.
72
72
  #
73
73
  def to_sql
74
- @join.association_join.gsub(/::ts_join_alias::/,
75
- "#{@reflection.klass.connection.quote_table_name(@join.parent.aliased_table_name)}"
76
- )
74
+ rewrite_conditions
77
75
  end
78
76
 
79
77
  # Returns true if the association - or a parent - is a has_many or
@@ -160,5 +158,27 @@ module ThinkingSphinx
160
158
 
161
159
  options
162
160
  end
161
+
162
+ def rewrite_conditions
163
+ rewrite_condition @join.association_join
164
+ end
165
+
166
+ def rewrite_condition(condition)
167
+ return condition unless condition.is_a?(String)
168
+
169
+ if defined?(ActsAsTaggableOn) &&
170
+ @reflection.klass == ActsAsTaggableOn::Tagging &&
171
+ @reflection.name.to_s[/_taggings$/]
172
+ condition = condition.gsub /taggings\./, "#{quoted_alias @join}."
173
+ end
174
+
175
+ condition.gsub /::ts_join_alias::/, quoted_alias(@join.parent)
176
+ end
177
+
178
+ def quoted_alias(join)
179
+ @reflection.klass.connection.quote_table_name(
180
+ join.aliased_table_name
181
+ )
182
+ end
163
183
  end
164
184
  end
@@ -11,6 +11,21 @@ module ThinkingSphinx
11
11
  class Attribute < ThinkingSphinx::Property
12
12
  attr_accessor :query_source
13
13
 
14
+ SphinxTypeMappings = {
15
+ :multi => :sql_attr_multi,
16
+ :datetime => :sql_attr_timestamp,
17
+ :string => :sql_attr_str2ordinal,
18
+ :float => :sql_attr_float,
19
+ :boolean => :sql_attr_bool,
20
+ :integer => :sql_attr_uint,
21
+ :bigint => :sql_attr_bigint,
22
+ :wordcount => :sql_attr_str2wordcount
23
+ }
24
+
25
+ if Riddle.loaded_version.to_i > 1
26
+ SphinxTypeMappings[:string] = :sql_attr_string
27
+ end
28
+
14
29
  # To create a new attribute, you'll need to pass in either a single Column
15
30
  # or an array of them, and some (optional) options.
16
31
  #
@@ -117,15 +132,7 @@ module ThinkingSphinx
117
132
  end
118
133
 
119
134
  def type_to_config
120
- {
121
- :multi => :sql_attr_multi,
122
- :datetime => :sql_attr_timestamp,
123
- :string => :sql_attr_str2ordinal,
124
- :float => :sql_attr_float,
125
- :boolean => :sql_attr_bool,
126
- :integer => :sql_attr_uint,
127
- :bigint => :sql_attr_bigint
128
- }[type]
135
+ SphinxTypeMappings[type]
129
136
  end
130
137
 
131
138
  def include_as_association?
@@ -226,7 +233,7 @@ module ThinkingSphinx
226
233
 
227
234
  <<-SQL
228
235
  SELECT #{foreign_key_for_mva base_assoc}
229
- #{ThinkingSphinx.unique_id_expression(offset)} AS #{quote_column('id')},
236
+ #{ThinkingSphinx.unique_id_expression(adapter, offset)} AS #{quote_column('id')},
230
237
  #{primary_key_for_mva(end_assoc)} AS #{quote_column(unique_name)}
231
238
  FROM #{quote_table_name base_assoc.table} #{association_joins}
232
239
  SQL
@@ -7,7 +7,7 @@ module ThinkingSphinx
7
7
  require "riddle/#{version}"
8
8
  when /1.10/
9
9
  require 'riddle/1.10'
10
- when /2.0.1/
10
+ when /2.0.\d/
11
11
  require 'riddle/2.0.1'
12
12
  else
13
13
  documentation_link = %Q{
@@ -5,12 +5,16 @@ module ThinkingSphinx
5
5
  end
6
6
 
7
7
  def attribute_name
8
- "class_crc"
8
+ Riddle.loaded_version.to_i < 2 ? 'class_crc' : 'sphinx_internal_class'
9
9
  end
10
10
 
11
11
  def value(object, attribute_hash)
12
- crc = attribute_hash['class_crc']
13
- ThinkingSphinx::Configuration.instance.models_by_crc[crc]
12
+ if Riddle.loaded_version.to_i < 2
13
+ crc = attribute_hash['class_crc']
14
+ ThinkingSphinx::Configuration.instance.models_by_crc[crc]
15
+ else
16
+ attribute_hash['sphinx_internal_class']
17
+ end
14
18
  end
15
19
  end
16
20
  end
@@ -91,10 +91,10 @@ module ThinkingSphinx
91
91
  if custom_app_root
92
92
  self.app_root = custom_app_root
93
93
  else
94
- self.app_root = RAILS_ROOT if defined?(RAILS_ROOT)
95
- self.app_root = Merb.root if defined?(Merb)
96
- self.app_root = Sinatra::Application.root if defined?(Sinatra)
97
- self.app_root ||= app_root
94
+ self.app_root = Merb.root if defined?(Merb)
95
+ self.app_root = Sinatra::Application.root if defined?(Sinatra)
96
+ self.app_root = RAILS_ROOT if defined?(RAILS_ROOT)
97
+ self.app_root ||= app_root
98
98
  end
99
99
 
100
100
  @configuration = Riddle::Configuration.new
@@ -132,10 +132,10 @@ module ThinkingSphinx
132
132
  ThinkingSphinx.mutex.synchronize do
133
133
  @@environment ||= if defined?(Merb)
134
134
  Merb.environment
135
- elsif defined?(Sinatra)
136
- Sinatra::Application.environment.to_s
137
135
  elsif defined?(RAILS_ENV)
138
136
  RAILS_ENV
137
+ elsif defined?(Sinatra)
138
+ Sinatra::Application.environment.to_s
139
139
  else
140
140
  ENV['RAILS_ENV'] || 'development'
141
141
  end
@@ -16,6 +16,7 @@ module ThinkingSphinx
16
16
  when Facet
17
17
  facet.name
18
18
  when String, Symbol
19
+ return :class if facet.to_s == 'sphinx_internal_class'
19
20
  facet.to_s.gsub(/(_facet|_crc)$/,'').to_sym
20
21
  end
21
22
  end
@@ -29,7 +29,7 @@ module ThinkingSphinx
29
29
  names = options[:all_facets] ?
30
30
  facet_names_for_all_classes : facet_names_common_to_all_classes
31
31
 
32
- names.delete "class_crc" unless options[:class_facet]
32
+ names.delete class_facet unless options[:class_facet]
33
33
  names
34
34
  end
35
35
  end
@@ -162,5 +162,9 @@ module ThinkingSphinx
162
162
  facet.name == name
163
163
  }
164
164
  end
165
+
166
+ def class_facet
167
+ Riddle.loaded_version.to_i < 2 ? 'class_crc' : 'sphinx_internal_class'
168
+ end
165
169
  end
166
170
  end
@@ -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
@@ -474,9 +474,12 @@ module ThinkingSphinx
474
474
 
475
475
  def match_hash(object)
476
476
  @results[:matches].detect { |match|
477
+ class_crc = object.class.name
478
+ class_crc = object.class.to_crc32 if Riddle.loaded_version.to_i < 2
479
+
477
480
  match[:attributes]['sphinx_internal_id'] == object.
478
481
  primary_key_for_sphinx &&
479
- match[:attributes]['class_crc'] == object.class.to_crc32
482
+ match[:attributes][crc_attribute] == class_crc
480
483
  }
481
484
  end
482
485
 
@@ -714,6 +717,11 @@ module ThinkingSphinx
714
717
  Array(values).collect { |value|
715
718
  Riddle::Client::Filter.new attrib.to_s, filter_value(value)
716
719
  }
720
+ }.flatten +
721
+ (options[:without_any] || {}).collect { |attrib, values|
722
+ Array(values).collect { |value|
723
+ Riddle::Client::Filter.new attrib.to_s, filter_value(value), true
724
+ }
717
725
  }.flatten
718
726
  end
719
727
 
@@ -869,7 +877,7 @@ module ThinkingSphinx
869
877
  return single_class_results if one_class
870
878
 
871
879
  groups = results[:matches].group_by { |match|
872
- match[:attributes]["class_crc"]
880
+ match[:attributes][crc_attribute]
873
881
  }
874
882
  groups.each do |crc, group|
875
883
  group.replace(
@@ -879,7 +887,7 @@ module ThinkingSphinx
879
887
 
880
888
  results[:matches].collect do |match|
881
889
  groups.detect { |crc, group|
882
- crc == match[:attributes]["class_crc"]
890
+ crc == match[:attributes][crc_attribute]
883
891
  }[1].compact.detect { |obj|
884
892
  obj.primary_key_for_sphinx == match[:attributes]["sphinx_internal_id"]
885
893
  }
@@ -891,7 +899,11 @@ module ThinkingSphinx
891
899
  end
892
900
 
893
901
  def class_from_crc(crc)
894
- config.models_by_crc[crc].constantize
902
+ if Riddle.loaded_version.to_i < 2
903
+ config.models_by_crc[crc].constantize
904
+ else
905
+ crc.constantize
906
+ end
895
907
  end
896
908
 
897
909
  def each_with_attribute(attribute, &block)
@@ -944,5 +956,9 @@ module ThinkingSphinx
944
956
 
945
957
  results_count
946
958
  end
959
+
960
+ def crc_attribute
961
+ Riddle.loaded_version.to_i < 2 ? 'class_crc' : 'sphinx_internal_class'
962
+ end
947
963
  end
948
964
  end
@@ -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)
@@ -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)
@@ -59,7 +59,7 @@ GROUP BY #{ sql_group_clause }
59
59
  end
60
60
 
61
61
  def sql_select_clause(offset)
62
- unique_id_expr = ThinkingSphinx.unique_id_expression(offset)
62
+ unique_id_expr = ThinkingSphinx.unique_id_expression(adapter, offset)
63
63
 
64
64
  (
65
65
  ["#{@model.quoted_table_name}.#{quote_column(@model.primary_key_for_sphinx)} #{unique_id_expr} AS #{quote_column(@model.primary_key_for_sphinx)} "] +
@@ -128,6 +128,15 @@ GROUP BY #{ sql_group_clause }
128
128
  end
129
129
  end
130
130
 
131
+ def internal_class_column
132
+ if @model.table_exists? &&
133
+ @model.column_names.include?(@model.inheritance_column)
134
+ adapter.quote_with_table(@model.inheritance_column)
135
+ else
136
+ "'#{@model.name}'"
137
+ end
138
+ end
139
+
131
140
  def type_values
132
141
  @model.connection.select_values <<-SQL
133
142
  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
@@ -46,6 +46,14 @@ describe ThinkingSphinx::AutoVersion do
46
46
  ThinkingSphinx::AutoVersion.detect
47
47
  end
48
48
 
49
+ it "should require 2.0.1 if using Sphinx 2.0.2 dev" do
50
+ ThinkingSphinx::AutoVersion.should_receive(:require).
51
+ with('riddle/2.0.1')
52
+
53
+ @config.stub!(:version => '2.0.2-dev')
54
+ ThinkingSphinx::AutoVersion.detect
55
+ end
56
+
49
57
  it "should output a warning if the detected version is unsupported" do
50
58
  STDERR.should_receive(:puts).with(/unsupported/i)
51
59
 
@@ -16,16 +16,22 @@ describe ThinkingSphinx::FacetSearch do
16
16
 
17
17
  it "should request all shared facets in a multi-model request by default" do
18
18
  ThinkingSphinx.stub!(:search => search)
19
- ThinkingSphinx::FacetSearch.new.facet_names.should == ['class_crc']
19
+ if Riddle.loaded_version.to_i < 2
20
+ ThinkingSphinx::FacetSearch.new.facet_names.should == ['class_crc']
21
+ else
22
+ ThinkingSphinx::FacetSearch.new.facet_names.should == ['sphinx_internal_class']
23
+ end
20
24
  end
21
25
 
22
26
  it "should request all facets in a multi-model request if specified" do
23
27
  ThinkingSphinx.stub!(:search => search)
24
- ThinkingSphinx::FacetSearch.new(
25
- :all_facets => true
26
- ).facet_names.should == [
27
- 'class_crc', 'city_facet', 'state_facet', 'birthday'
28
- ]
28
+ names = ThinkingSphinx::FacetSearch.new(:all_facets => true).facet_names
29
+
30
+ if Riddle.loaded_version.to_i < 2
31
+ names.should == ['class_crc', 'city_facet', 'state_facet', 'birthday']
32
+ else
33
+ names.should == ['sphinx_internal_class', 'city_facet', 'state_facet', 'birthday']
34
+ end
29
35
  end
30
36
 
31
37
  it "should use the system-set max_matches for limit on facet calls" do
@@ -1,6 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ThinkingSphinx::Index::Builder do
4
+ let(:internal_attribute_count) {
5
+ Riddle.loaded_version.to_i < 2 ? 3 : 4
6
+ }
4
7
  describe ".generate without source scope" do
5
8
  before :each do
6
9
  @index = ThinkingSphinx::Index::Builder.generate(Person) do
@@ -31,10 +34,10 @@ describe ThinkingSphinx::Index::Builder do
31
34
  @source.fields[1].unique_name.should == :last_name
32
35
  end
33
36
 
34
- it "should have two attributes alongside the three internal ones" do
35
- @source.attributes.length.should == 5
36
- @source.attributes[3].unique_name.should == :birthday
37
- @source.attributes[4].unique_name.should == :internal_id
37
+ it "should have two attributes alongside the internal ones" do
38
+ @source.attributes.length.should == 2 + internal_attribute_count
39
+ @source.attributes[internal_attribute_count].unique_name.should == :birthday
40
+ @source.attributes[1 + internal_attribute_count].unique_name.should == :internal_id
38
41
  end
39
42
 
40
43
  it "should have one condition" do
@@ -95,8 +98,8 @@ describe ThinkingSphinx::Index::Builder do
95
98
  @source.fields.length.should == 1
96
99
  end
97
100
 
98
- it "should have one attribute alongside the three internal ones" do
99
- @source.attributes.length.should == 4
101
+ it "should have one attribute alongside the internal ones" do
102
+ @source.attributes.length.should == 1 + internal_attribute_count
100
103
  end
101
104
 
102
105
  it "should set the attribute name to have the _sort suffix" do
@@ -142,8 +145,8 @@ describe ThinkingSphinx::Index::Builder do
142
145
  @source.fields.length.should == 1
143
146
  end
144
147
 
145
- it "should have one attribute alongside the three internal ones" do
146
- @source.attributes.length.should == 4
148
+ it "should have one attribute alongside the internal ones" do
149
+ @source.attributes.length.should == 1 + internal_attribute_count
147
150
  end
148
151
 
149
152
  it "should set the attribute name to have the _facet suffix" do
@@ -174,8 +177,8 @@ describe ThinkingSphinx::Index::Builder do
174
177
  Alpha.sphinx_facets.delete_at(-1)
175
178
  end
176
179
 
177
- it "should have just one attribute alongside the three internal ones" do
178
- @source.attributes.length.should == 4
180
+ it "should have just one attribute alongside the internal ones" do
181
+ @source.attributes.length.should == 1 + internal_attribute_count
179
182
  end
180
183
  end
181
184
 
@@ -193,8 +196,8 @@ describe ThinkingSphinx::Index::Builder do
193
196
  Person.sphinx_facets.delete_at(-1)
194
197
  end
195
198
 
196
- it "should have just one attribute alongside the three internal ones" do
197
- @source.attributes.length.should == 4
199
+ it "should have just one attribute alongside the internal ones" do
200
+ @source.attributes.length.should == 1 + internal_attribute_count
198
201
  end
199
202
  end
200
203
 
@@ -212,8 +215,8 @@ describe ThinkingSphinx::Index::Builder do
212
215
  Beta.sphinx_facets.delete_at(-1)
213
216
  end
214
217
 
215
- it "should have just one attribute alongside the three internal ones" do
216
- @source.attributes.length.should == 4
218
+ it "should have just one attribute alongside the internal ones" do
219
+ @source.attributes.length.should == 1 + internal_attribute_count
217
220
  end
218
221
  end
219
222
 
@@ -231,8 +234,8 @@ describe ThinkingSphinx::Index::Builder do
231
234
  Alpha.sphinx_facets.delete_at(-1)
232
235
  end
233
236
 
234
- it "should have just one attribute alongside the three internal ones" do
235
- @source.attributes.length.should == 4
237
+ it "should have just one attribute alongside the internal ones" do
238
+ @source.attributes.length.should == 1 + internal_attribute_count
236
239
  end
237
240
  end
238
241
 
@@ -250,8 +253,8 @@ describe ThinkingSphinx::Index::Builder do
250
253
  Person.sphinx_facets.delete_at(-1)
251
254
  end
252
255
 
253
- it "should have two attributes alongside the three internal ones" do
254
- @source.attributes.length.should == 5
256
+ it "should have two attributes alongside the internal ones" do
257
+ @source.attributes.length.should == 2 + internal_attribute_count
255
258
  end
256
259
 
257
260
  it "should set the facet attribute name to have the _facet suffix" do
@@ -282,8 +285,8 @@ describe ThinkingSphinx::Index::Builder do
282
285
  Person.sphinx_facets.delete_at(-1)
283
286
  end
284
287
 
285
- it "should have two attributes alongside the three internal ones" do
286
- @source.attributes.length.should == 5
288
+ it "should have two attributes alongside the internal ones" do
289
+ @source.attributes.length.should == 2 + internal_attribute_count
287
290
  end
288
291
 
289
292
  it "should set the facet attribute name to have the _facet suffix" do
@@ -321,8 +324,8 @@ describe ThinkingSphinx::Index::Builder do
321
324
  @source.fields.length.should == 1
322
325
  end
323
326
 
324
- it "should have one attribute alongside the three internal ones" do
325
- @source.attributes.length.should == 4
327
+ it "should have one attribute alongside the internal ones" do
328
+ @source.attributes.length.should == 1 + internal_attribute_count
326
329
  end
327
330
 
328
331
  it "should set the attribute name to have the _facet suffix" do
@@ -381,10 +384,10 @@ describe ThinkingSphinx::Index::Builder do
381
384
  @source.fields[1].unique_name.should == :last_name
382
385
  end
383
386
 
384
- it "should have two attributes alongside the three internal ones" do
385
- @source.attributes.length.should == 5
386
- @source.attributes[3].unique_name.should == :birthday
387
- @source.attributes[4].unique_name.should == :internal_id
387
+ it "should have two attributes alongside the internal ones" do
388
+ @source.attributes.length.should == 2 + internal_attribute_count
389
+ @source.attributes[internal_attribute_count].unique_name.should == :birthday
390
+ @source.attributes[1 + internal_attribute_count].unique_name.should == :internal_id
388
391
  end
389
392
  end
390
393
 
@@ -418,12 +421,12 @@ describe ThinkingSphinx::Index::Builder do
418
421
  end
419
422
 
420
423
  it "should have two attributes alongside the six internal ones" do
421
- @index.attributes.length.should == 8
424
+ @index.attributes.length.should == 2 + (internal_attribute_count * 2)
422
425
  end
423
426
 
424
- it "should have one attribute in each source alongside the three internal ones" do
427
+ it "should have one attribute in each source alongside the internal ones" do
425
428
  @index.sources.each do |source|
426
- source.attributes.length.should == 4
429
+ source.attributes.length.should == 1 + internal_attribute_count
427
430
  end
428
431
  end
429
432
  end
@@ -1135,10 +1135,11 @@ describe ThinkingSphinx::Search do
1135
1135
  @client.stub! :query => {
1136
1136
  :matches => [{
1137
1137
  :attributes => {
1138
- 'sphinx_internal_id' => @alpha.id,
1139
- 'class_crc' => Alpha.to_crc32,
1140
- '@groupby' => 101,
1141
- '@count' => 5
1138
+ 'sphinx_internal_id' => @alpha.id,
1139
+ 'sphinx_internal_class' => 'Alpha',
1140
+ 'class_crc' => Alpha.to_crc32,
1141
+ '@groupby' => 101,
1142
+ '@count' => 5
1142
1143
  }
1143
1144
  }]
1144
1145
  }
@@ -1172,8 +1173,9 @@ describe ThinkingSphinx::Search do
1172
1173
  @client.stub! :query => {
1173
1174
  :matches => [{
1174
1175
  :attributes => {
1175
- 'sphinx_internal_id' => @alpha.id,
1176
- 'class_crc' => Alpha.to_crc32
1176
+ 'sphinx_internal_id' => @alpha.id,
1177
+ 'sphinx_internal_class' => 'Alpha',
1178
+ 'class_crc' => Alpha.to_crc32
1177
1179
  }, :weight => 12
1178
1180
  }]
1179
1181
  }
@@ -1197,11 +1199,12 @@ describe ThinkingSphinx::Search do
1197
1199
  @client.stub! :query => {
1198
1200
  :matches => [{
1199
1201
  :attributes => {
1200
- 'sphinx_internal_id' => @alpha.id,
1201
- 'class_crc' => Alpha.to_crc32,
1202
- '@geodist' => 101,
1203
- '@groupby' => 102,
1204
- '@count' => 103
1202
+ 'sphinx_internal_id' => @alpha.id,
1203
+ 'sphinx_internal_class' => 'Alpha',
1204
+ 'class_crc' => Alpha.to_crc32,
1205
+ '@geodist' => 101,
1206
+ '@groupby' => 102,
1207
+ '@count' => 103
1205
1208
  }, :weight => 12
1206
1209
  }]
1207
1210
  }
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: thinking-sphinx
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.4.5
5
+ version: 1.4.6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Pat Allan
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-12 00:00:00 +10:00
13
+ date: 2011-05-25 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -34,7 +34,7 @@ dependencies:
34
34
  requirements:
35
35
  - - ">="
36
36
  - !ruby/object:Gem::Version
37
- version: 1.3.2
37
+ version: 1.3.3
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: *id002
@@ -382,7 +382,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
382
382
  requirements:
383
383
  - - ">="
384
384
  - !ruby/object:Gem::Version
385
- hash: 1314985061244983665
385
+ hash: -3557249456082129398
386
386
  segments:
387
387
  - 0
388
388
  version: "0"