thinking-sphinx 2.0.14 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. data/HISTORY +17 -1
  2. data/features/attribute_updates.feature +15 -13
  3. data/features/deleting_instances.feature +16 -13
  4. data/features/handling_edits.feature +20 -17
  5. data/features/searching_by_index.feature +6 -5
  6. data/features/step_definitions/common_steps.rb +4 -0
  7. data/features/support/env.rb +0 -3
  8. data/lib/thinking_sphinx.rb +8 -1
  9. data/lib/thinking_sphinx/active_record.rb +3 -3
  10. data/lib/thinking_sphinx/active_record/attribute_updates.rb +5 -4
  11. data/lib/thinking_sphinx/adapters/abstract_adapter.rb +7 -0
  12. data/lib/thinking_sphinx/auto_version.rb +1 -1
  13. data/lib/thinking_sphinx/bundled_search.rb +6 -10
  14. data/lib/thinking_sphinx/configuration.rb +19 -33
  15. data/lib/thinking_sphinx/connection.rb +71 -0
  16. data/lib/thinking_sphinx/deltas.rb +2 -0
  17. data/lib/thinking_sphinx/deltas/default_delta.rb +14 -18
  18. data/lib/thinking_sphinx/deltas/delete_job.rb +16 -0
  19. data/lib/thinking_sphinx/deltas/index_job.rb +17 -0
  20. data/lib/thinking_sphinx/search.rb +26 -15
  21. data/lib/thinking_sphinx/tasks.rb +1 -5
  22. data/spec/spec_helper.rb +0 -3
  23. data/spec/thinking_sphinx/active_record/delta_spec.rb +6 -5
  24. data/spec/thinking_sphinx/active_record/scopes_spec.rb +2 -1
  25. data/spec/thinking_sphinx/active_record_spec.rb +2 -2
  26. data/spec/thinking_sphinx/adapters/abstract_adapter_spec.rb +18 -0
  27. data/spec/thinking_sphinx/configuration_spec.rb +0 -68
  28. data/spec/thinking_sphinx/connection_spec.rb +77 -0
  29. data/spec/thinking_sphinx/facet_search_spec.rb +25 -25
  30. data/spec/thinking_sphinx/search_methods_spec.rb +34 -34
  31. data/spec/thinking_sphinx/search_spec.rb +4 -16
  32. metadata +197 -186
  33. data/lib/thinking_sphinx/version.rb +0 -3
data/HISTORY CHANGED
@@ -1,4 +1,7 @@
1
- 2.0.14 - January 2nd 2012
1
+ 2.1.0 - May 7th 2013
2
+ * 1.5.0 changes.
3
+
4
+ 2.0.14 - January 2nd 2013
2
5
  * Fix model loading for Rails 3.2.9 when subdirectories exist (Kenn Ejima).
3
6
  * Use BasicObject instead of BlankSlate when running on 1.9 (Steve Purcell).
4
7
  * 1.4.14 changes.
@@ -69,6 +72,19 @@
69
72
  * Rails 3 support.
70
73
  * 1.4.0 changes.
71
74
 
75
+ 1.5.0 - May 7th 2013
76
+ * Removed plugin support - Thinking Sphinx is now gem-only across all branches.
77
+ * ThinkingSphinx::Version and the thinking_sphinx:version task have been removed - it's a gem, it has a version number.
78
+ * Updating Riddle to 1.5.6 or newer.
79
+ * Requires ActiveRecord ~> 2.1 (earlier versions were considered unsupported a few releases ago).
80
+ * Allow custom Riddle controllers - useful for Flying Sphinx to take over management of Sphinx daemon/indexing actions.
81
+ * Rejigged delta support to be generic, with local job classes that provide a clean, simple interface for third-party libraries.
82
+ * Add hooks for anything that needs to happen before indexing (such as clearing out existing delta jobs).
83
+ * Connection pool for all Sphinx client communication, with new connections built if there's any connection-related (as opposed to syntax) issues.
84
+ * Multiple-field search conditions can be done with arrays of field names as keys in the :conditions hash (Alex Dowad).
85
+ * Removed named capture in regular expressions to maintain MRI 1.8 support (Michael Wintrant).
86
+ * Support new JDBC configuration style (Kyle Stevens).
87
+
72
88
  1.4.14 - January 2nd 2013
73
89
  * Allow sql_query_pre values to come through from config/sphinx.yml (George Ogata).
74
90
  * ThinkingSphinx::Search#tap doesn't delegate through to the underlying array.
@@ -2,13 +2,13 @@ Feature: Update attributes directly to Sphinx
2
2
  In order for updates to be more seamless
3
3
  The plugin
4
4
  Should update Sphinx's attributes where possible
5
-
5
+
6
6
  Scenario: Updating attributes in Sphinx without delta indexes
7
7
  Given Sphinx is running
8
8
  And I am searching on alphas
9
9
  When I filter by 3 on value
10
10
  Then I should get 1 result
11
-
11
+
12
12
  When I change the value of alpha four to 13
13
13
  And I wait for Sphinx to catch up
14
14
  And I filter by 13 on value
@@ -16,7 +16,7 @@ Feature: Update attributes directly to Sphinx
16
16
  Then I should get 1 result
17
17
  When I use index alternative_core
18
18
  Then I should get 1 result
19
-
19
+
20
20
  When I change the value of alpha four to 4
21
21
  And I wait for Sphinx to catch up
22
22
  And I filter by 13 on value
@@ -30,47 +30,49 @@ Feature: Update attributes directly to Sphinx
30
30
  And I am searching on betas
31
31
  When I filter by 8 on value
32
32
  Then I should get 1 result
33
-
33
+
34
34
  When I change the value of beta eight to 18
35
35
  And I wait for Sphinx to catch up
36
36
  And I filter by 18 on value
37
37
  Then I should get 1 result
38
-
38
+
39
39
  When I search for the document id of beta eight in the secondary_beta_delta index
40
40
  Then it should not exist
41
-
41
+
42
42
  Scenario: Updating attributes in a delta index
43
43
  Given Sphinx is running
44
44
  And I am searching on betas
45
-
45
+
46
46
  When I change the name of beta nine to nineteen
47
47
  And I change the value of beta nineteen to 19
48
48
  And I wait for Sphinx to catch up
49
-
49
+
50
50
  When I filter by 19 on value
51
51
  And I use index secondary_beta_delta
52
+ And I clear the connection pool
52
53
  Then I should get 1 result
53
-
54
+
54
55
  Scenario: Updating attributes in a delta index with deltas disabled
55
56
  Given Sphinx is running
56
57
  And I am searching on betas
57
-
58
+
58
59
  When I change the name of beta eleven to twentyone
59
60
  And I disable delta updates
60
61
  And I change the value of beta twentyone to 21
61
62
  And I wait for Sphinx to catch up
62
-
63
+ And I clear the connection pool
64
+
63
65
  When I filter by 21 on value
64
66
  And I use index secondary_beta_delta
65
67
  Then I should get 1 result
66
68
  And I enable delta updates
67
-
69
+
68
70
  Scenario: Updating boolean attribute in Sphinx
69
71
  Given Sphinx is running
70
72
  And I am searching on alphas
71
73
  When I filter by active alphas
72
74
  Then I should get 10 results
73
-
75
+
74
76
  When I flag alpha five as inactive
75
77
  And I wait for Sphinx to catch up
76
78
  And I filter by active alphas
@@ -2,50 +2,52 @@ Feature: Keeping Sphinx in line with deleted model instances
2
2
  In order to avoid deleted items being returned by Sphinx
3
3
  Thinking Sphinx
4
4
  Should keep deleted items out of search results
5
-
5
+
6
6
  Scenario: Deleting instances from the core index
7
7
  Given Sphinx is running
8
8
  And I am searching on betas
9
9
  When I search for three
10
10
  Then I should get 1 result
11
-
11
+
12
12
  When I destroy beta three
13
13
  And I wait for Sphinx to catch up
14
14
  And I search for three
15
15
  Then I should get 0 results
16
-
16
+
17
17
  Scenario: Deleting subclasses when the parent class is indexed
18
18
  Given Sphinx is running
19
19
  And I am searching on cats
20
20
  When I search for moggy
21
21
  Then I should get 1 result
22
-
22
+
23
23
  When I destroy cat moggy
24
24
  And I wait for Sphinx to catch up
25
25
  And I search for moggy
26
26
  Then I should get 0 results
27
-
27
+
28
28
  Scenario: Deleting created instances from the delta index
29
29
  Given Sphinx is running
30
30
  And I am searching on betas
31
- When I create a new beta named eleven
31
+ When I create a new beta named eighteen
32
32
  And I wait for Sphinx to catch up
33
- And I search for eleven
33
+ And I clear the connection pool
34
+ And I search for eighteen
34
35
  Then I should get 1 result
35
-
36
- When I destroy beta eleven
36
+
37
+ When I destroy beta eighteen
37
38
  And I wait for Sphinx to catch up
38
- And I search for eleven
39
+ And I search for eighteen
39
40
  Then I should get 0 results
40
-
41
+
41
42
  Scenario: Deleting edited instances from the delta index
42
43
  Given Sphinx is running
43
44
  And I am searching on betas
44
45
  When I change the name of beta four to fourteen
45
46
  And I wait for Sphinx to catch up
47
+ And I clear the connection pool
46
48
  And I search for fourteen
47
49
  Then I should get 1 result
48
-
50
+
49
51
  When I destroy beta fourteen
50
52
  And I wait for Sphinx to catch up
51
53
  And I search for fourteen
@@ -56,9 +58,10 @@ Feature: Keeping Sphinx in line with deleted model instances
56
58
  And I am searching on betas
57
59
  When I create a new beta named thirteen
58
60
  And I wait for Sphinx to catch up
61
+ And I clear the connection pool
59
62
  And I search for thirteen
60
63
  Then I should get 1 result
61
-
64
+
62
65
  And I disable delta updates
63
66
  And I destroy beta thirteen
64
67
  And I wait for Sphinx to catch up
@@ -2,72 +2,75 @@ Feature: Keeping Sphinx in line with model changes when requested
2
2
  In order to keep indexes as up to date as possible
3
3
  Thinking Sphinx
4
4
  Should return the expected results depending on whether delta indexes are used
5
-
5
+
6
6
  Scenario: Returning instance from old data if there is no delta
7
7
  Given Sphinx is running
8
8
  And I am searching on alphas
9
9
  When I search for two
10
10
  Then I should get 1 result
11
-
11
+
12
12
  When I change the name of alpha two to twelve
13
13
  And I wait for Sphinx to catch up
14
14
  And I search for two
15
15
  Then I should get 1 result
16
-
16
+
17
17
  Scenario: Not returning an instance from old data if there is a delta
18
18
  Given Sphinx is running
19
19
  And I am searching on betas
20
20
  When I search for two
21
21
  Then I should get 1 result
22
-
22
+
23
23
  When I change the name of beta two to twelve
24
24
  And I wait for Sphinx to catch up
25
+ And I clear the connection pool
25
26
  And I search for two
26
27
  Then I should get 0 results
27
-
28
+
28
29
  Scenario: Returning instance from new data if there is a delta
29
30
  Given Sphinx is running
30
31
  And I am searching on betas
31
32
  When I search for one
32
33
  Then I should get 1 result
33
-
34
+
34
35
  When I change the name of beta one to eleventeen
35
36
  And I wait for Sphinx to catch up
37
+ And I clear the connection pool
36
38
  And I search for one
37
39
  Then I should get 0 results
38
-
40
+
39
41
  When I search for eleventeen
40
42
  Then I should get 1 result
41
-
43
+
42
44
  Scenario: Returning new records if there's a delta
43
45
  Given Sphinx is running
44
46
  And I am searching on betas
45
47
  When I search for fifteen
46
48
  Then I should get 0 results
47
-
49
+
48
50
  When I create a new beta named fifteen
49
51
  And I wait for Sphinx to catch up
52
+ And I clear the connection pool
50
53
  And I search for fifteen
51
54
  Then I should get 1 result
52
-
55
+
53
56
  Scenario: Avoiding delta updates if there hasn't been changes
54
57
  Given Sphinx is running
55
58
  And I am searching on betas
56
59
  When I search for five
57
60
  Then I should get 1 result
58
-
61
+
59
62
  When I change the name of beta five to five
60
63
  And I wait for Sphinx to catch up
61
64
  And I search for five
62
65
  Then I should get 1 result
63
-
66
+
64
67
  When I search for the document id of beta five in the beta_core index
65
68
  Then it should exist if using Rails 2.1 or newer
66
69
  When I search for the document id of beta five in the secondary_beta_core index
67
70
  Then it should exist if using Rails 2.1 or newer
68
71
  When I search for the document id of beta five in the secondary_beta_delta index
69
72
  Then it should not exist if using Rails 2.1 or newer
70
-
73
+
71
74
  Scenario: Handling edits with a delta when Sphinx isn't running
72
75
  Given Sphinx is running
73
76
  And I am searching on betas
@@ -76,19 +79,19 @@ Feature: Keeping Sphinx in line with model changes when requested
76
79
  And I start Sphinx
77
80
  And I search for sixteen
78
81
  Then I should get 1 result
79
-
82
+
80
83
  Scenario: Handling edits when updates are disabled
81
84
  Given Sphinx is running
82
85
  And updates are disabled
83
86
  And I am searching on betas
84
-
87
+
85
88
  When I search for seven
86
89
  Then I should get 1 result
87
-
90
+
88
91
  When I change the name of beta seven to seventeen
89
92
  And I wait for Sphinx to catch up
90
93
  And I search for seven
91
94
  Then I should get 1 result
92
-
95
+
93
96
  When I search for seventeen
94
97
  Then I should get 0 results
@@ -2,21 +2,21 @@ Feature: Searching within a single index
2
2
  In order to use Thinking Sphinx's core functionality
3
3
  A developer
4
4
  Should be able to search on a single index
5
-
5
+
6
6
  Scenario: Searching with alternative index
7
7
  Given Sphinx is running
8
8
  And I am searching on alphas
9
9
  When I order by value
10
10
  And I use index alternative_core
11
11
  Then I should get 7 results
12
-
12
+
13
13
  Scenario: Searching with default index
14
14
  Given Sphinx is running
15
15
  And I am searching on alphas
16
16
  When I order by value
17
17
  And I use index alpha_core
18
18
  Then I should get 10 results
19
-
19
+
20
20
  Scenario: Searching without specified index
21
21
  Given Sphinx is running
22
22
  And I am searching on alphas
@@ -26,14 +26,15 @@ Feature: Searching within a single index
26
26
  Scenario: Deleting instances from the core index
27
27
  Given Sphinx is running
28
28
  And I am searching on alphas
29
-
29
+
30
30
  When I create a new alpha named eleven
31
31
  And I process the alpha_core index
32
32
  And I process the alternative_core index
33
33
  And I wait for Sphinx to catch up
34
+ And I clear the connection pool
34
35
  And I search for eleven
35
36
  Then I should get 1 result
36
-
37
+
37
38
  When I destroy alpha eleven
38
39
  And I wait for Sphinx to catch up
39
40
  And I search for eleven
@@ -46,6 +46,10 @@ When /^I search for (\w+)$/ do |query|
46
46
  @query = query
47
47
  end
48
48
 
49
+ When /^I clear the connection pool$/ do
50
+ ThinkingSphinx::Connection.pool.clear
51
+ end
52
+
49
53
  When /^I search for "([^\"]*)"$/ do |query|
50
54
  @results = nil
51
55
  @query = query
@@ -5,9 +5,6 @@ require 'bundler'
5
5
  Bundler.require :default, :development
6
6
 
7
7
  $:.unshift File.dirname(__FILE__) + '/../../lib'
8
- Dir[File.join(File.dirname(__FILE__), '../../vendor/*/lib')].each do |path|
9
- $:.unshift path
10
- end
11
8
 
12
9
  require 'active_record'
13
10
  require 'cucumber/thinking_sphinx/internal_world'
@@ -1,5 +1,6 @@
1
1
  require 'thread'
2
2
  require 'active_record'
3
+ require 'innertube'
3
4
  require 'yaml'
4
5
  require 'riddle'
5
6
 
@@ -11,6 +12,7 @@ require 'thinking_sphinx/association'
11
12
  require 'thinking_sphinx/attribute'
12
13
  require 'thinking_sphinx/bundled_search'
13
14
  require 'thinking_sphinx/configuration'
15
+ require 'thinking_sphinx/connection'
14
16
  require 'thinking_sphinx/context'
15
17
  require 'thinking_sphinx/excerpter'
16
18
  require 'thinking_sphinx/facet'
@@ -23,7 +25,6 @@ require 'thinking_sphinx/source'
23
25
  require 'thinking_sphinx/search'
24
26
  require 'thinking_sphinx/search_methods'
25
27
  require 'thinking_sphinx/deltas'
26
- require 'thinking_sphinx/version'
27
28
 
28
29
  require 'thinking_sphinx/adapters/abstract_adapter'
29
30
  require 'thinking_sphinx/adapters/mysql_adapter'
@@ -293,5 +294,11 @@ module ThinkingSphinx
293
294
  !!defined?(::ActiveRecord::Associations::CollectionProxy)
294
295
  end
295
296
 
297
+ def self.before_index_hooks
298
+ @before_index_hooks
299
+ end
300
+
301
+ @before_index_hooks = []
302
+
296
303
  extend ThinkingSphinx::SearchMethods::ClassMethods
297
304
  end
@@ -270,9 +270,9 @@ module ThinkingSphinx
270
270
  def delete_in_index(index, document_id)
271
271
  return unless ThinkingSphinx.sphinx_running?
272
272
 
273
- ThinkingSphinx::Configuration.instance.client.update(
274
- index, ['sphinx_deleted'], {document_id => [1]}
275
- )
273
+ ThinkingSphinx::Connection.take do |client|
274
+ client.update index, ['sphinx_deleted'], {document_id => [1]}
275
+ end
276
276
  rescue Riddle::ConnectionError, Riddle::ResponseError,
277
277
  ThinkingSphinx::SphinxError, Errno::ETIMEDOUT, Timeout::Error
278
278
  # Not the end of the world if Sphinx isn't running.
@@ -40,10 +40,11 @@ module ThinkingSphinx
40
40
  end
41
41
 
42
42
  def update_index(index_name, attribute_names, attribute_values)
43
- config = ThinkingSphinx::Configuration.instance
44
- config.client.update index_name, attribute_names, {
45
- sphinx_document_id => attribute_values
46
- }
43
+ ThinkingSphinx::Connection.take do |client|
44
+ client.update index_name, attribute_names, {
45
+ sphinx_document_id => attribute_values
46
+ }
47
+ end
47
48
  rescue Riddle::ConnectionError, Riddle::ResponseError,
48
49
  ThinkingSphinx::SphinxError, Errno::ETIMEDOUT
49
50
  # Not the end of the world if Sphinx isn't running.
@@ -51,6 +51,13 @@ module ThinkingSphinx
51
51
  :mysql
52
52
  when "jdbcpostgresql"
53
53
  :postgresql
54
+ when "jdbc"
55
+ match = /^jdbc:(mysql|postgresql):\/\//.match(model.connection.config[:url])
56
+ if match
57
+ match[1].to_sym
58
+ else
59
+ model.connection.config[:adapter]
60
+ end
54
61
  else
55
62
  model.connection.config[:adapter].to_sym
56
63
  end
@@ -14,7 +14,7 @@ module ThinkingSphinx
14
14
  else
15
15
  documentation_link = %Q{
16
16
  For more information, read the documentation:
17
- http://pat.github.com/ts/en/advanced_config.html
17
+ http://pat.github.io/thinking-sphinx/advanced_config.html
18
18
  }
19
19
 
20
20
  if version.nil? || version.empty?