thinking-sphinx 3.1.1 → 3.1.2

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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -6
  3. data/HISTORY +21 -0
  4. data/lib/thinking_sphinx.rb +1 -0
  5. data/lib/thinking_sphinx/active_record.rb +1 -0
  6. data/lib/thinking_sphinx/active_record/base.rb +3 -2
  7. data/lib/thinking_sphinx/active_record/database_adapters/mysql_adapter.rb +4 -0
  8. data/lib/thinking_sphinx/active_record/database_adapters/postgresql_adapter.rb +4 -0
  9. data/lib/thinking_sphinx/active_record/filtered_reflection.rb +10 -2
  10. data/lib/thinking_sphinx/active_record/interpreter.rb +2 -1
  11. data/lib/thinking_sphinx/active_record/join_association.rb +13 -0
  12. data/lib/thinking_sphinx/active_record/log_subscriber.rb +8 -3
  13. data/lib/thinking_sphinx/active_record/polymorpher.rb +8 -1
  14. data/lib/thinking_sphinx/active_record/sql_builder.rb +19 -4
  15. data/lib/thinking_sphinx/active_record/sql_builder/statement.rb +19 -12
  16. data/lib/thinking_sphinx/active_record/sql_source.rb +2 -2
  17. data/lib/thinking_sphinx/capistrano/v3.rb +1 -1
  18. data/lib/thinking_sphinx/configuration.rb +1 -1
  19. data/lib/thinking_sphinx/connection.rb +4 -2
  20. data/lib/thinking_sphinx/controller.rb +3 -13
  21. data/lib/thinking_sphinx/core/index.rb +13 -3
  22. data/lib/thinking_sphinx/core/interpreter.rb +4 -0
  23. data/lib/thinking_sphinx/deletion.rb +5 -3
  24. data/lib/thinking_sphinx/errors.rb +3 -0
  25. data/lib/thinking_sphinx/facet.rb +3 -2
  26. data/lib/thinking_sphinx/facet_search.rb +6 -2
  27. data/lib/thinking_sphinx/guard.rb +6 -0
  28. data/lib/thinking_sphinx/guard/file.rb +26 -0
  29. data/lib/thinking_sphinx/guard/files.rb +38 -0
  30. data/lib/thinking_sphinx/masks/group_enumerators_mask.rb +4 -4
  31. data/lib/thinking_sphinx/masks/weight_enumerator_mask.rb +1 -1
  32. data/lib/thinking_sphinx/middlewares/sphinxql.rb +2 -2
  33. data/lib/thinking_sphinx/panes/weight_pane.rb +1 -1
  34. data/lib/thinking_sphinx/rake_interface.rb +20 -1
  35. data/lib/thinking_sphinx/real_time.rb +2 -2
  36. data/lib/thinking_sphinx/real_time/callbacks/real_time_callbacks.rb +10 -4
  37. data/lib/thinking_sphinx/real_time/interpreter.rb +2 -1
  38. data/lib/thinking_sphinx/real_time/transcriber.rb +1 -1
  39. data/lib/thinking_sphinx/search.rb +4 -0
  40. data/lib/thinking_sphinx/search/merger.rb +4 -0
  41. data/lib/thinking_sphinx/sphinxql.rb +12 -6
  42. data/lib/thinking_sphinx/tasks.rb +13 -3
  43. data/spec/acceptance/attribute_access_spec.rb +2 -2
  44. data/spec/acceptance/big_integers_spec.rb +11 -0
  45. data/spec/acceptance/facets_spec.rb +4 -1
  46. data/spec/acceptance/indexing_spec.rb +9 -0
  47. data/spec/acceptance/specifying_sql_spec.rb +1 -1
  48. data/spec/acceptance/sphinx_scopes_spec.rb +9 -0
  49. data/spec/internal/app/indices/user_index.rb +2 -0
  50. data/spec/thinking_sphinx/active_record/base_spec.rb +3 -1
  51. data/spec/thinking_sphinx/active_record/index_spec.rb +8 -0
  52. data/spec/thinking_sphinx/active_record/interpreter_spec.rb +7 -1
  53. data/spec/thinking_sphinx/active_record/polymorpher_spec.rb +16 -3
  54. data/spec/thinking_sphinx/configuration_spec.rb +18 -0
  55. data/spec/thinking_sphinx/facet_search_spec.rb +6 -6
  56. data/spec/thinking_sphinx/masks/scopes_mask_spec.rb +6 -1
  57. data/spec/thinking_sphinx/panes/weight_pane_spec.rb +1 -1
  58. data/spec/thinking_sphinx/rake_interface_spec.rb +62 -3
  59. data/spec/thinking_sphinx/real_time/callbacks/real_time_callbacks_spec.rb +38 -4
  60. data/spec/thinking_sphinx/real_time/index_spec.rb +4 -0
  61. data/spec/thinking_sphinx/real_time/interpreter_spec.rb +7 -1
  62. data/thinking-sphinx.gemspec +1 -1
  63. metadata +7 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ff053fbf548b20a5ffe44d2bc171d68d6553dd08
4
- data.tar.gz: 62849df76201a3ba5c65d7a2dfc6de0d641a7347
3
+ metadata.gz: 629217e38872edc12e92be134409a509b84f1304
4
+ data.tar.gz: 4b19eec90cfe3b560b1fcdd56a7018f07704ec94
5
5
  SHA512:
6
- metadata.gz: 0c1b3ffb995ccf4588ffc9a3354adfcdc9a5b6eb3feec6ddff4ec791f26fc043557dcfb14e240c47cc80a86202ab6e6d0371b3adca937b6b9e2f9ee740f22370
7
- data.tar.gz: 63e2df341ccdc388d6227890ddb00073dfdd32611f7427706e886df59dd6483b61530029d16a50c335ad12a7288b43e140701afe4cd69183bd0dc74e21b245c0
6
+ metadata.gz: 5116aad817ad119c97f05ec5bcdf330ca89ecae39ecac5695c4b9573ba062a88e25b6c8db22c596a32ec57ca8c044b2805360696b4b6342196d19b775886e340
7
+ data.tar.gz: 6923c30ad7163f0ec5c286b5cf98403c27618dc57191bff659808000f9f51bcf2e1ef0eec22fbf6ecc54752a9e1e6474d6e62a65b65db6cc462d8657beae183e
@@ -10,12 +10,12 @@ before_script:
10
10
  - "mysql -e 'create database thinking_sphinx;' > /dev/null"
11
11
  - "psql -c 'create database thinking_sphinx;' -U postgres >/dev/null"
12
12
  env:
13
- - DATABASE=mysql2 SPHINX_BIN=/usr/local/sphinx-2.0.9/bin/ SPHINX_VERSION=2.0.9
14
- - DATABASE=postgresql SPHINX_BIN=/usr/local/sphinx-2.0.9/bin/ SPHINX_VERSION=2.0.9
15
- - DATABASE=mysql2 SPHINX_BIN=/usr/local/sphinx-2.1.3/bin/ SPHINX_VERSION=2.1.3
16
- - DATABASE=postgresql SPHINX_BIN=/usr/local/sphinx-2.1.3/bin/ SPHINX_VERSION=2.1.3
17
- - DATABASE=mysql2 SPHINX_BIN=/usr/local/sphinx-2.2.1/bin/ SPHINX_VERSION=2.2.1
18
- - DATABASE=postgresql SPHINX_BIN=/usr/local/sphinx-2.2.1/bin/ SPHINX_VERSION=2.2.1
13
+ - DATABASE=mysql2 SPHINX_BIN=/usr/local/sphinx-2.0.10/bin/ SPHINX_VERSION=2.0.10
14
+ - DATABASE=postgresql SPHINX_BIN=/usr/local/sphinx-2.0.10/bin/ SPHINX_VERSION=2.0.10
15
+ - DATABASE=mysql2 SPHINX_BIN=/usr/local/sphinx-2.1.8/bin/ SPHINX_VERSION=2.1.8
16
+ - DATABASE=postgresql SPHINX_BIN=/usr/local/sphinx-2.1.8/bin/ SPHINX_VERSION=2.1.8
17
+ - DATABASE=mysql2 SPHINX_BIN=/usr/local/sphinx-2.2.2-beta/bin/ SPHINX_VERSION=2.2.2
18
+ - DATABASE=postgresql SPHINX_BIN=/usr/local/sphinx-2.2.2-beta/bin/ SPHINX_VERSION=2.2.2
19
19
  gemfile:
20
20
  - gemfiles/rails_3_2.gemfile
21
21
  - gemfiles/rails_4_0.gemfile
data/HISTORY CHANGED
@@ -1,3 +1,24 @@
1
+ 2014-11-04: 3.1.2
2
+ * [CHANGE] regenerate task now only deletes index files for real-time indices.
3
+ * [CHANGE] Raise an exception when a populated search query is modified (as it can't be requeried).
4
+ * [FEATURE] Allow for custom paths for index files using :path option in the ThinkingSphinx::Index.define call.
5
+ * [FIX] Ensure indexing guard files are removed when an exception is raised (Bobby Uhlenbrock).
6
+ * [FIX] Don't update real-time indices for objects that are not persisted (Chance Downs).
7
+ * [FEATURE] Allow the binlog path to be an empty string (Bobby Uhlenbrock).
8
+ * [FIX] Use STI base class for polymorphic association replacements.
9
+ * [FIX] Convert database setting keys to symbols for consistency with Rails (@dimko).
10
+ * [FIX] Field weights and other search options are now respected from set_property.
11
+ * [CHANGE] Log indices that aren't processed due to guard files existing.
12
+ * [FEATURE] Add status task to report on whether Sphinx is running.
13
+ * [FIX] Models with more than one index have correct facet counts (using Sphinx 2.1.x or newer).
14
+ * [FEATURE] Real-time index callbacks can take a block for dynamic scoping.
15
+ * [FIX] Some association fixes for Rails 4.1.
16
+ * [CHANGE] Paginate records by 1000 results at a time when flagging as deleted.
17
+ * [CHANGE] Default the Capistrano TS Rails environment to use rails_env, and then fall back to stage.
18
+ * [CHANGE] rebuild task uses clear between stopping the daemon and indexing.
19
+ * [FIX] Clear connections when raising connection errors.
20
+ * [FEATURE] Allow casting of document ids pre-offset as bigints (via big_documents_id option).
21
+
1
22
  2014-04-22: 3.1.1
2
23
  * [CHANGE] Include full statements when query execution errors are raised (uglier, but more useful when debugging).
3
24
  * [FEATURE] Allow for common section in generated Sphinx configuration files for Sphinx 2.2.x (disabled by default, though) (Trevor Smith).
@@ -55,6 +55,7 @@ require 'thinking_sphinx/facet'
55
55
  require 'thinking_sphinx/facet_search'
56
56
  require 'thinking_sphinx/float_formatter'
57
57
  require 'thinking_sphinx/frameworks'
58
+ require 'thinking_sphinx/guard'
58
59
  require 'thinking_sphinx/index'
59
60
  require 'thinking_sphinx/index_set'
60
61
  require 'thinking_sphinx/masks'
@@ -17,6 +17,7 @@ require 'thinking_sphinx/active_record/field'
17
17
  require 'thinking_sphinx/active_record/filtered_reflection'
18
18
  require 'thinking_sphinx/active_record/index'
19
19
  require 'thinking_sphinx/active_record/interpreter'
20
+ require 'thinking_sphinx/active_record/join_association'
20
21
  require 'thinking_sphinx/active_record/log_subscriber'
21
22
  require 'thinking_sphinx/active_record/polymorpher'
22
23
  require 'thinking_sphinx/active_record/property_query'
@@ -25,8 +25,9 @@ module ThinkingSphinx::ActiveRecord::Base
25
25
  end
26
26
 
27
27
  def search_for_ids(query = nil, options = {})
28
- search = search query, options
29
- ThinkingSphinx::Search::Merger.new(search).merge! nil, :ids_only => true
28
+ ThinkingSphinx::Search::Merger.new(
29
+ search(query, options)
30
+ ).merge! nil, :ids_only => true
30
31
  end
31
32
 
32
33
  private
@@ -5,6 +5,10 @@ class ThinkingSphinx::ActiveRecord::DatabaseAdapters::MySQLAdapter <
5
5
  value ? 1 : 0
6
6
  end
7
7
 
8
+ def cast_to_bigint(clause)
9
+ "CAST(#{clause} AS UNSIGNED INTEGER)"
10
+ end
11
+
8
12
  def cast_to_string(clause)
9
13
  "CAST(#{clause} AS char)"
10
14
  end
@@ -5,6 +5,10 @@ class ThinkingSphinx::ActiveRecord::DatabaseAdapters::PostgreSQLAdapter <
5
5
  value ? 'TRUE' : 'FALSE'
6
6
  end
7
7
 
8
+ def cast_to_bigint(clause)
9
+ "#{clause}::bigint"
10
+ end
11
+
8
12
  def cast_to_string(clause)
9
13
  "#{clause}::varchar"
10
14
  end
@@ -17,7 +17,10 @@ class ThinkingSphinx::ActiveRecord::FilteredReflection <
17
17
  @options[:foreign_key] ||= "#{reflection.name}_id"
18
18
  @options[:foreign_type] = reflection.foreign_type
19
19
 
20
- return @options if reflection.respond_to?(:scope)
20
+ if reflection.respond_to?(:scope)
21
+ @options[:sphinx_internal_filtered] = true
22
+ return @options
23
+ end
21
24
 
22
25
  case @options[:conditions]
23
26
  when nil
@@ -34,11 +37,16 @@ class ThinkingSphinx::ActiveRecord::FilteredReflection <
34
37
  end
35
38
 
36
39
  def scope
40
+ if ::Joiner::Joins.instance_methods.include?(:join_association_class)
41
+ return nil
42
+ end
43
+
37
44
  lambda { |association|
38
45
  reflection = association.reflection
46
+ klass = reflection.class_name.constantize
39
47
  where(
40
48
  association.parent.aliased_table_name.to_sym =>
41
- {reflection.foreign_type => reflection.class_name}
49
+ {reflection.foreign_type => klass.base_class.name}
42
50
  )
43
51
  }
44
52
  end
@@ -39,7 +39,7 @@ class ThinkingSphinx::ActiveRecord::Interpreter <
39
39
  end
40
40
 
41
41
  def set_database(hash_or_key)
42
- configuration = hash_or_key.is_a?(::Hash) ? hash_or_key :
42
+ configuration = hash_or_key.is_a?(::Hash) ? hash_or_key.symbolize_keys :
43
43
  ::ActiveRecord::Base.configurations[hash_or_key.to_s]
44
44
 
45
45
  __source.set_database_settings configuration
@@ -50,6 +50,7 @@ class ThinkingSphinx::ActiveRecord::Interpreter <
50
50
  @index.send("#{key}=", value) if @index.class.settings.include?(key)
51
51
  __source.send("#{key}=", value) if __source.class.settings.include?(key)
52
52
  __source.options[key] = value if source_option?(key)
53
+ @index.options[key] = value if search_option?(key)
53
54
  end
54
55
  end
55
56
 
@@ -0,0 +1,13 @@
1
+ class ThinkingSphinx::ActiveRecord::JoinAssociation <
2
+ ::ActiveRecord::Associations::JoinDependency::JoinAssociation
3
+
4
+ def build_constraint(klass, table, key, foreign_table, foreign_key)
5
+ constraint = super
6
+
7
+ constraint = constraint.and(
8
+ foreign_table[reflection.options[:foreign_type]].eq(base_klass.name)
9
+ ) if reflection.options[:sphinx_internal_filtered]
10
+
11
+ constraint
12
+ end
13
+ end
@@ -1,13 +1,18 @@
1
1
  class ThinkingSphinx::ActiveRecord::LogSubscriber < ActiveSupport::LogSubscriber
2
- def query(event)
3
- identifier = color('Sphinx Query (%.1fms)' % event.duration, GREEN, true)
4
- debug " #{identifier} #{event.payload[:query]}"
2
+ def guard(event)
3
+ identifier = color 'Sphinx', GREEN, true
4
+ warn " #{identifier} #{event.payload[:guard]}"
5
5
  end
6
6
 
7
7
  def message(event)
8
8
  identifier = color 'Sphinx', GREEN, true
9
9
  debug " #{identifier} #{event.payload[:message]}"
10
10
  end
11
+
12
+ def query(event)
13
+ identifier = color('Sphinx Query (%.1fms)' % event.duration, GREEN, true)
14
+ debug " #{identifier} #{event.payload[:query]}"
15
+ end
11
16
  end
12
17
 
13
18
  ThinkingSphinx::ActiveRecord::LogSubscriber.attach_to :thinking_sphinx
@@ -14,7 +14,14 @@ class ThinkingSphinx::ActiveRecord::Polymorpher
14
14
 
15
15
  def append_reflections
16
16
  mappings.each do |class_name, name|
17
- klass.reflections[name] ||= clone_with name, class_name
17
+ next if klass.reflections[name]
18
+
19
+ reflection = clone_with name, class_name
20
+ if ActiveRecord::Reflection.respond_to?(:add_reflection)
21
+ ActiveRecord::Reflection.add_reflection klass, name, reflection
22
+ else
23
+ klass.reflections[name] = reflection
24
+ end
18
25
  end
19
26
  end
20
27
 
@@ -34,7 +34,7 @@ module ThinkingSphinx
34
34
 
35
35
  delegate :adapter, :model, :delta_processor, :to => :source
36
36
  delegate :convert_nulls, :time_zone_query_pre, :utf8_query_pre,
37
- :to => :adapter
37
+ :cast_to_bigint, :to => :adapter
38
38
 
39
39
  def query
40
40
  Query.new(self)
@@ -53,10 +53,17 @@ module ThinkingSphinx
53
53
  end
54
54
 
55
55
  def associations
56
- @associations ||= Joiner::Joins.new(model).tap do |assocs|
56
+ @associations ||= begin
57
+ joins = Joiner::Joins.new model
58
+ if joins.respond_to?(:join_association_class)
59
+ joins.join_association_class = ThinkingSphinx::ActiveRecord::JoinAssociation
60
+ end
61
+
57
62
  source.associations.reject(&:string?).each do |association|
58
- assocs.add_join_to association.stack
63
+ joins.add_join_to association.stack
59
64
  end
65
+
66
+ joins
60
67
  end
61
68
  end
62
69
 
@@ -76,9 +83,17 @@ module ThinkingSphinx
76
83
  ('SQL_NO_CACHE ' if source.type == 'mysql').to_s
77
84
  end
78
85
 
86
+ def big_document_ids?
87
+ source.options[:big_document_ids] || config.settings['big_document_ids']
88
+ end
89
+
79
90
  def document_id
80
91
  quoted_alias = quote_column source.primary_key
81
- "#{quoted_primary_key} * #{config.indices.count} + #{source.offset} AS #{quoted_alias}"
92
+ column = quoted_primary_key
93
+ column = cast_to_bigint column if big_document_ids?
94
+ column = "#{column} * #{config.indices.count} + #{source.offset}"
95
+
96
+ "#{column} AS #{quoted_alias}"
82
97
  end
83
98
 
84
99
  def reversed_document_id
@@ -4,8 +4,8 @@ module ThinkingSphinx
4
4
  module ActiveRecord
5
5
  class SQLBuilder::Statement
6
6
  def initialize(report)
7
- self.report = report
8
- self.scope = relation
7
+ @report = report
8
+ @scope = relation
9
9
  end
10
10
 
11
11
  def to_relation
@@ -32,8 +32,9 @@ module ThinkingSphinx
32
32
  scope
33
33
  end
34
34
 
35
- protected
36
- attr_accessor :report, :scope
35
+ private
36
+
37
+ attr_reader :report, :scope
37
38
 
38
39
  def custom_joins
39
40
  @custom_joins ||= source.associations.select(&:string?).collect(&:to_s)
@@ -43,11 +44,13 @@ module ThinkingSphinx
43
44
  minimum = convert_nulls "MIN(#{quoted_primary_key})", 1
44
45
  maximum = convert_nulls "MAX(#{quoted_primary_key})", 1
45
46
 
46
- self.scope = scope.select("#{minimum}, #{maximum}").where(where_clause(true))
47
+ @scope = scope.select("#{minimum}, #{maximum}").where(
48
+ where_clause(true)
49
+ )
47
50
  end
48
51
 
49
52
  def filter_by_query_info
50
- self.scope = scope.where("#{quoted_primary_key} = #{reversed_document_id}")
53
+ @scope = scope.where("#{quoted_primary_key} = #{reversed_document_id}")
51
54
  end
52
55
 
53
56
  def filter_by_scopes
@@ -86,27 +89,31 @@ module ThinkingSphinx
86
89
  end
87
90
 
88
91
  def scope_by_select
89
- self.scope = scope.select(pre_select + select_clause)
92
+ @scope = scope.select(pre_select + select_clause)
90
93
  end
91
94
 
92
95
  def scope_by_where_clause
93
- self.scope = scope.where where_clause
96
+ @scope = scope.where where_clause
94
97
  end
95
98
 
96
99
  def scope_by_group_clause
97
- self.scope = scope.group(group_clause)
100
+ @scope = scope.group(group_clause)
98
101
  end
99
102
 
100
103
  def scope_by_joins
101
- self.scope = scope.joins(associations.join_values)
104
+ @scope = scope.joins(associations.join_values)
102
105
  end
103
106
 
104
107
  def scope_by_custom_joins
105
- self.scope = scope.joins(custom_joins) if custom_joins.any?
108
+ @scope = scope.joins(custom_joins) if custom_joins.any?
106
109
  end
107
110
 
108
111
  def scope_by_order
109
- self.scope = scope.order('NULL') if source.type == 'mysql'
112
+ @scope = scope.order('NULL') if source.type == 'mysql'
113
+ end
114
+
115
+ def source
116
+ report.source
110
117
  end
111
118
 
112
119
  def method_missing(*args, &block)
@@ -7,8 +7,8 @@ module ThinkingSphinx
7
7
  :groupings, :polymorphs
8
8
 
9
9
  OPTIONS = [:name, :offset, :delta_processor, :delta?, :delta_options,
10
- :disable_range?, :group_concat_max_len, :utf8?, :position,
11
- :minimal_group_by?]
10
+ :disable_range?, :group_concat_max_len, :utf8?, :position,
11
+ :minimal_group_by?, :big_document_ids]
12
12
 
13
13
  def initialize(model, options = {})
14
14
  @model = model
@@ -1,7 +1,7 @@
1
1
  namespace :load do
2
2
  task :defaults do
3
3
  set :thinking_sphinx_roles, :db
4
- set :thinking_sphinx_rails_env, -> { fetch(:stage) }
4
+ set :thinking_sphinx_rails_env, -> { fetch(:rails_env) || fetch(:stage) }
5
5
  end
6
6
  end
7
7
 
@@ -91,7 +91,7 @@ class ThinkingSphinx::Configuration < Riddle::Configuration
91
91
  end
92
92
 
93
93
  def render_to_file
94
- FileUtils.mkdir_p searchd.binlog_path
94
+ FileUtils.mkdir_p searchd.binlog_path unless searchd.binlog_path.blank?
95
95
 
96
96
  open(configuration_file, 'w') { |file| file.write render }
97
97
  end
@@ -1,4 +1,6 @@
1
1
  module ThinkingSphinx::Connection
2
+ MAXIMUM_RETRIES = 3
3
+
2
4
  def self.new
3
5
  configuration = ThinkingSphinx::Configuration.instance
4
6
  # If you use localhost, MySQL insists on a socket connection, but Sphinx
@@ -37,13 +39,13 @@ module ThinkingSphinx::Connection
37
39
  yield connection
38
40
  rescue ThinkingSphinx::QueryExecutionError, connection.base_error => error
39
41
  original = ThinkingSphinx::SphinxError.new_from_mysql error
40
- raise original if original.is_a?(ThinkingSphinx::QueryError)
42
+ retries += MAXIMUM_RETRIES if original.is_a?(ThinkingSphinx::QueryError)
41
43
  raise Innertube::Pool::BadResource
42
44
  end
43
45
  end
44
46
  rescue Innertube::Pool::BadResource
45
47
  retries += 1
46
- raise original unless retries < 3
48
+ raise original unless retries < MAXIMUM_RETRIES
47
49
 
48
50
  ActiveSupport::Notifications.instrument(
49
51
  "message.thinking_sphinx", :message => "Retrying query \"#{original.statement}\" after error: #{original.message}"
@@ -3,18 +3,8 @@ class ThinkingSphinx::Controller < Riddle::Controller
3
3
  options = indices.extract_options!
4
4
  indices << '--all' if indices.empty?
5
5
 
6
- indices = indices.reject { |index| File.exists? guard_file(index) }
7
- return if indices.empty?
8
-
9
- indices.each { |index| FileUtils.touch guard_file(index) }
10
- super(*(indices + [options]))
11
- indices.each { |index| FileUtils.rm guard_file(index) }
12
- end
13
-
14
- def guard_file(index)
15
- File.join(
16
- ThinkingSphinx::Configuration.instance.indices_location,
17
- "ts-#{index}.tmp"
18
- )
6
+ ThinkingSphinx::Guard::Files.call(indices) do |names|
7
+ super(*(names + [options]))
8
+ end
19
9
  end
20
10
  end
@@ -3,7 +3,7 @@ module ThinkingSphinx::Core::Index
3
3
  include ThinkingSphinx::Core::Settings
4
4
 
5
5
  included do
6
- attr_reader :reference, :offset, :options
6
+ attr_reader :reference, :offset
7
7
  attr_writer :definition_block
8
8
  end
9
9
 
@@ -27,7 +27,7 @@ module ThinkingSphinx::Core::Index
27
27
  end
28
28
 
29
29
  def document_id_for_key(key)
30
- key * config.indices.count + offset
30
+ key * config.indices.count + offset
31
31
  end
32
32
 
33
33
  def interpret_definition!
@@ -43,6 +43,11 @@ module ThinkingSphinx::Core::Index
43
43
  @model ||= reference.to_s.camelize.constantize
44
44
  end
45
45
 
46
+ def options
47
+ interpret_definition!
48
+ @options
49
+ end
50
+
46
51
  def render
47
52
  pre_render
48
53
  set_path
@@ -71,11 +76,16 @@ module ThinkingSphinx::Core::Index
71
76
  'core'
72
77
  end
73
78
 
79
+ def path_prefix
80
+ options[:path] || config.indices_location
81
+ end
82
+
74
83
  def pre_render
75
84
  interpret_definition!
76
85
  end
77
86
 
78
87
  def set_path
79
- @path ||= File.join config.indices_location, name
88
+ FileUtils.mkdir_p path_prefix
89
+ @path = File.join path_prefix, name
80
90
  end
81
91
  end