moneypools-thinking-sphinx 1.2.13 → 1.3.1
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.
- data/VERSION.yml +3 -2
- data/features/searching_across_models.feature +1 -1
- data/features/step_definitions/common_steps.rb +0 -1
- data/features/step_definitions/facet_steps.rb +1 -1
- data/features/support/{db/database.example.yml → database.example.yml} +0 -0
- data/features/support/db/fixtures/robots.rb +1 -1
- data/features/support/db/migrations/create_robots.rb +1 -2
- data/features/support/env.rb +13 -1
- data/features/support/models/robot.rb +4 -0
- data/lib/cucumber/thinking_sphinx/external_world.rb +41 -0
- data/lib/cucumber/thinking_sphinx/internal_world.rb +125 -0
- data/lib/cucumber/thinking_sphinx/sql_logger.rb +20 -0
- data/lib/thinking_sphinx.rb +3 -2
- data/lib/thinking_sphinx/active_record.rb +2 -2
- data/lib/thinking_sphinx/adapters/mysql_adapter.rb +1 -1
- data/lib/thinking_sphinx/adapters/postgresql_adapter.rb +18 -11
- data/lib/thinking_sphinx/attribute.rb +3 -3
- data/lib/thinking_sphinx/deltas.rb +0 -2
- data/lib/thinking_sphinx/tasks.rb +1 -33
- data/spec/lib/thinking_sphinx/active_record_spec.rb +6 -6
- data/spec/lib/thinking_sphinx_spec.rb +4 -0
- data/tasks/distribution.rb +2 -15
- data/tasks/testing.rb +8 -19
- data/vendor/riddle/lib/riddle.rb +1 -1
- data/vendor/riddle/lib/riddle/controller.rb +8 -15
- metadata +8 -36
- data/features/a.rb +0 -17
- data/features/datetime_deltas.feature +0 -66
- data/features/delayed_delta_indexing.feature +0 -37
- data/features/step_definitions/datetime_delta_steps.rb +0 -15
- data/features/step_definitions/delayed_delta_indexing_steps.rb +0 -7
- data/features/support/db/fixtures/delayed_betas.rb +0 -10
- data/features/support/db/fixtures/thetas.rb +0 -10
- data/features/support/db/migrations/create_delayed_betas.rb +0 -17
- data/features/support/db/migrations/create_thetas.rb +0 -5
- data/features/support/models/delayed_beta.rb +0 -7
- data/features/support/models/theta.rb +0 -7
- data/features/support/z.rb +0 -19
- data/lib/thinking_sphinx/deltas/datetime_delta.rb +0 -50
- data/lib/thinking_sphinx/deltas/delayed_delta.rb +0 -34
- data/lib/thinking_sphinx/deltas/delayed_delta/delta_job.rb +0 -24
- data/lib/thinking_sphinx/deltas/delayed_delta/flag_as_deleted_job.rb +0 -27
- data/lib/thinking_sphinx/deltas/delayed_delta/job.rb +0 -26
- data/spec/lib/thinking_sphinx/deltas/job_spec.rb +0 -32
data/VERSION.yml
CHANGED
File without changes
|
@@ -1,5 +1,4 @@
|
|
1
|
-
ActiveRecord::Base.connection.create_table :robots, :
|
2
|
-
t.column :alternate_primary_key, "int(11) DEFAULT NULL auto_increment PRIMARY KEY"
|
1
|
+
ActiveRecord::Base.connection.create_table :robots, :primary_key => :alternate_primary_key, :force => true do |t|
|
3
2
|
t.column :name, :string, :null => false
|
4
3
|
t.column :internal_id, :string, :null => false
|
5
4
|
end
|
data/features/support/env.rb
CHANGED
@@ -3,4 +3,16 @@ require 'cucumber'
|
|
3
3
|
require 'spec'
|
4
4
|
require 'fileutils'
|
5
5
|
require 'ginger'
|
6
|
-
require 'will_paginate'
|
6
|
+
require 'will_paginate'
|
7
|
+
require 'active_record'
|
8
|
+
|
9
|
+
$:.unshift File.dirname(__FILE__) + '/../../lib'
|
10
|
+
|
11
|
+
require 'cucumber/thinking_sphinx/internal_world'
|
12
|
+
|
13
|
+
world = Cucumber::ThinkingSphinx::InternalWorld.new
|
14
|
+
world.configure_database
|
15
|
+
|
16
|
+
require 'thinking_sphinx'
|
17
|
+
|
18
|
+
world.setup
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Cucumber
|
2
|
+
module ThinkingSphinx
|
3
|
+
class ExternalWorld
|
4
|
+
def initialize(suppress_delta_output = true)
|
5
|
+
set_flags suppress_delta_output
|
6
|
+
create_indexes_folder
|
7
|
+
prepare_and_start_daemon
|
8
|
+
configure_cleanup
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def config
|
14
|
+
@config ||= ::ThinkingSphinx::Configuration.instance
|
15
|
+
end
|
16
|
+
|
17
|
+
def set_flags(suppress_delta_output)
|
18
|
+
::ThinkingSphinx.deltas_enabled = true
|
19
|
+
::ThinkingSphinx.updates_enabled = true
|
20
|
+
::ThinkingSphinx.suppress_delta_output = suppress_delta_output
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_indexes_folder
|
24
|
+
FileUtils.mkdir_p config.searchd_file_path
|
25
|
+
end
|
26
|
+
|
27
|
+
def prepare_and_start_daemon
|
28
|
+
config.build
|
29
|
+
config.controller.index
|
30
|
+
config.controller.start
|
31
|
+
end
|
32
|
+
|
33
|
+
def configure_cleanup
|
34
|
+
Kernel.at_exit do
|
35
|
+
config.controller.stop
|
36
|
+
sleep(0.5) # Ensure Sphinx has shut down completely
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'cucumber/thinking_sphinx/sql_logger'
|
2
|
+
|
3
|
+
module Cucumber
|
4
|
+
module ThinkingSphinx
|
5
|
+
class InternalWorld
|
6
|
+
attr_accessor :temporary_directory, :migrations_directory,
|
7
|
+
:models_directory, :fixtures_directory, :database_file
|
8
|
+
attr_accessor :adapter, :database, :username,
|
9
|
+
:password, :host
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@temporary_directory = "#{Dir.pwd}/tmp"
|
13
|
+
@migrations_directory = "features/support/db/migrations"
|
14
|
+
@models_directory = "features/support/models"
|
15
|
+
@fixtures_directory = "features/support/db/fixtures"
|
16
|
+
@database_file = "features/support/database.yml"
|
17
|
+
|
18
|
+
@adapter = ENV['DATABASE'] || 'mysql'
|
19
|
+
@database = 'thinking_sphinx'
|
20
|
+
@username = 'thinking_sphinx'
|
21
|
+
# @password = 'thinking_sphinx'
|
22
|
+
@host = 'localhost'
|
23
|
+
end
|
24
|
+
|
25
|
+
def setup
|
26
|
+
make_temporary_directory
|
27
|
+
|
28
|
+
configure_cleanup
|
29
|
+
configure_thinking_sphinx
|
30
|
+
configure_active_record
|
31
|
+
|
32
|
+
prepare_data
|
33
|
+
setup_sphinx
|
34
|
+
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
def configure_database
|
39
|
+
ActiveRecord::Base.establish_connection database_settings
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def config
|
46
|
+
@config ||= ::ThinkingSphinx::Configuration.instance
|
47
|
+
end
|
48
|
+
|
49
|
+
def make_temporary_directory
|
50
|
+
FileUtils.mkdir_p temporary_directory
|
51
|
+
Dir["#{temporary_directory}/*"].each do |file|
|
52
|
+
FileUtils.rm_rf file
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def configure_thinking_sphinx
|
57
|
+
config.config_file = "#{temporary_directory}/sphinx.conf"
|
58
|
+
config.searchd_log_file = "#{temporary_directory}/searchd.log"
|
59
|
+
config.query_log_file = "#{temporary_directory}/searchd.query.log"
|
60
|
+
config.pid_file = "#{temporary_directory}/searchd.pid"
|
61
|
+
config.searchd_file_path = "#{temporary_directory}/indexes/"
|
62
|
+
|
63
|
+
::ThinkingSphinx.suppress_delta_output = true
|
64
|
+
end
|
65
|
+
|
66
|
+
def configure_cleanup
|
67
|
+
Kernel.at_exit do
|
68
|
+
::ThinkingSphinx::Configuration.instance.controller.stop
|
69
|
+
sleep(0.5) # Ensure Sphinx has shut down completely
|
70
|
+
ActiveRecord::Base.logger.close
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def yaml_database_settings
|
75
|
+
return {} unless File.exist?(@database_file)
|
76
|
+
|
77
|
+
YAML.load open(@database_file)
|
78
|
+
end
|
79
|
+
|
80
|
+
def database_settings
|
81
|
+
{
|
82
|
+
:adapter => @adapter,
|
83
|
+
:database => @database,
|
84
|
+
:username => @username,
|
85
|
+
:password => @password,
|
86
|
+
:host => @host
|
87
|
+
}.merge yaml_database_settings
|
88
|
+
end
|
89
|
+
|
90
|
+
def configure_active_record
|
91
|
+
ActiveRecord::Base.logger = Logger.new(
|
92
|
+
open("#{temporary_directory}/active_record.log", "a")
|
93
|
+
)
|
94
|
+
|
95
|
+
ActiveRecord::Base.connection.class.send(
|
96
|
+
:include, Cucumber::ThinkingSphinx::SqlLogger
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
def prepare_data
|
101
|
+
::ThinkingSphinx.deltas_enabled = false
|
102
|
+
|
103
|
+
load_files migrations_directory
|
104
|
+
load_files models_directory
|
105
|
+
load_files fixtures_directory
|
106
|
+
|
107
|
+
::ThinkingSphinx.deltas_enabled = true
|
108
|
+
end
|
109
|
+
|
110
|
+
def load_files(path)
|
111
|
+
Dir["#{path}/*.rb"].each do |file|
|
112
|
+
require file.gsub(/\.rb$/, '')
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def setup_sphinx
|
117
|
+
FileUtils.mkdir_p config.searchd_file_path
|
118
|
+
|
119
|
+
config.build
|
120
|
+
config.controller.index
|
121
|
+
config.controller.start
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Cucumber
|
2
|
+
module ThinkingSphinx
|
3
|
+
module SqlLogger
|
4
|
+
def self.included(base)
|
5
|
+
base.send :alias_method_chain, :execute, :query_record
|
6
|
+
end
|
7
|
+
|
8
|
+
IGNORED_SQL = [
|
9
|
+
/^PRAGMA/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/,
|
10
|
+
/^SELECT @@ROWCOUNT/, /^SHOW FIELDS/
|
11
|
+
]
|
12
|
+
|
13
|
+
def execute_with_query_record(sql, name = nil, &block)
|
14
|
+
$queries_executed ||= []
|
15
|
+
$queries_executed << sql unless IGNORED_SQL.any? { |r| sql =~ r }
|
16
|
+
execute_without_query_record(sql, name, &block)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/thinking_sphinx.rb
CHANGED
@@ -131,12 +131,13 @@ module ThinkingSphinx
|
|
131
131
|
def self.suppress_delta_output=(value)
|
132
132
|
@@suppress_delta_output = value
|
133
133
|
end
|
134
|
-
|
134
|
+
|
135
|
+
@@use_group_by_shortcut = nil
|
135
136
|
# Checks to see if MySQL will allow simplistic GROUP BY statements. If not,
|
136
137
|
# or if not using MySQL, this will return false.
|
137
138
|
#
|
138
139
|
def self.use_group_by_shortcut?
|
139
|
-
!!(
|
140
|
+
@@use_group_by_shortcut ||= !!(
|
140
141
|
mysql? && ::ActiveRecord::Base.connection.select_all(
|
141
142
|
"SELECT @@global.sql_mode, @@session.sql_mode;"
|
142
143
|
).all? { |key,value| value.nil? || value[/ONLY_FULL_GROUP_BY/].nil? }
|
@@ -269,13 +269,13 @@ module ThinkingSphinx
|
|
269
269
|
client.update(
|
270
270
|
"#{self.class.sphinx_indexes.first.name}_core",
|
271
271
|
['sphinx_deleted'],
|
272
|
-
{self.sphinx_document_id => 1}
|
272
|
+
{self.sphinx_document_id => [1]}
|
273
273
|
) if self.in_core_index?
|
274
274
|
|
275
275
|
client.update(
|
276
276
|
"#{self.class.sphinx_indexes.first.name}_delta",
|
277
277
|
['sphinx_deleted'],
|
278
|
-
{self.sphinx_document_id => 1}
|
278
|
+
{self.sphinx_document_id => [1]}
|
279
279
|
) if self.class.sphinx_indexes.any? { |index| index.delta? } &&
|
280
280
|
self.toggled_delta?
|
281
281
|
rescue ::ThinkingSphinx::ConnectionError
|
@@ -13,7 +13,7 @@ module ThinkingSphinx
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def group_concatenate(clause, separator = ' ')
|
16
|
-
"GROUP_CONCAT(DISTINCT #{clause} SEPARATOR '#{separator}')"
|
16
|
+
"GROUP_CONCAT(DISTINCT IFNULL(#{clause}, '0') SEPARATOR '#{separator}')"
|
17
17
|
end
|
18
18
|
|
19
19
|
def cast_to_string(clause)
|
@@ -10,18 +10,17 @@ module ThinkingSphinx
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def concatenate(clause, separator = ' ')
|
13
|
-
clause
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
}.join(" || '#{separator}' || ")
|
13
|
+
if clause[/^COALESCE/]
|
14
|
+
clause.split('), ').join(") || '#{separator}' || ")
|
15
|
+
else
|
16
|
+
clause.split(', ').collect { |field|
|
17
|
+
"CAST(COALESCE(#{field}, '') as varchar)"
|
18
|
+
}.join(" || '#{separator}' || ")
|
19
|
+
end
|
21
20
|
end
|
22
21
|
|
23
22
|
def group_concatenate(clause, separator = ' ')
|
24
|
-
"array_to_string(array_accum(#{clause}), '#{separator}')"
|
23
|
+
"array_to_string(array_accum(COALESCE(#{clause}, '0')), '#{separator}')"
|
25
24
|
end
|
26
25
|
|
27
26
|
def cast_to_string(clause)
|
@@ -37,8 +36,16 @@ module ThinkingSphinx
|
|
37
36
|
end
|
38
37
|
|
39
38
|
def convert_nulls(clause, default = '')
|
40
|
-
default =
|
41
|
-
|
39
|
+
default = case default
|
40
|
+
when String
|
41
|
+
"'#{default}'"
|
42
|
+
when NilClass
|
43
|
+
'NULL'
|
44
|
+
when Fixnum
|
45
|
+
"#{default}::bigint"
|
46
|
+
else
|
47
|
+
default
|
48
|
+
end
|
42
49
|
|
43
50
|
"COALESCE(#{clause}, #{default})"
|
44
51
|
end
|
@@ -101,14 +101,14 @@ module ThinkingSphinx
|
|
101
101
|
when :datetime
|
102
102
|
adapter.cast_to_datetime(part)
|
103
103
|
when :multi
|
104
|
-
part = adapter.cast_to_datetime(part)
|
105
|
-
adapter.convert_nulls(part, 0)
|
104
|
+
part = adapter.cast_to_datetime(part) if is_many_datetimes?
|
105
|
+
part = adapter.convert_nulls(part, '0') if is_many_ints?
|
106
|
+
part
|
106
107
|
else
|
107
108
|
part
|
108
109
|
end
|
109
110
|
}.join(', ')
|
110
111
|
|
111
|
-
# clause = adapter.cast_to_datetime(clause) if type == :datetime
|
112
112
|
clause = adapter.crc(clause) if @crc
|
113
113
|
clause = adapter.concatenate(clause, separator) if concat_ws?
|
114
114
|
clause = adapter.group_concatenate(clause, separator) if is_many?
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'thinking_sphinx/deltas/default_delta'
|
2
|
-
require 'thinking_sphinx/deltas/datetime_delta'
|
3
2
|
|
4
3
|
module ThinkingSphinx
|
5
4
|
module Deltas
|
@@ -9,7 +8,6 @@ module ThinkingSphinx
|
|
9
8
|
when TrueClass, :default
|
10
9
|
DefaultDelta.new index, index.local_options
|
11
10
|
when :delayed
|
12
|
-
require 'thinking_sphinx/deltas/delayed_delta'
|
13
11
|
DelayedDelta.new index, index.local_options
|
14
12
|
when :datetime
|
15
13
|
DatetimeDelta.new index, index.local_options
|
@@ -65,14 +65,12 @@ namespace :thinking_sphinx do
|
|
65
65
|
|
66
66
|
desc "Index data for Sphinx using Thinking Sphinx's settings"
|
67
67
|
task :index => :app_env do
|
68
|
-
ThinkingSphinx::Deltas::Job.cancel_thinking_sphinx_jobs
|
69
|
-
|
70
68
|
config = ThinkingSphinx::Configuration.instance
|
71
69
|
unless ENV["INDEX_ONLY"] == "true"
|
72
70
|
puts "Generating Configuration to #{config.config_file}"
|
73
71
|
config.build
|
74
72
|
end
|
75
|
-
|
73
|
+
|
76
74
|
FileUtils.mkdir_p config.searchd_file_path
|
77
75
|
cmd = "#{config.bin_path}#{config.indexer_binary_name} --config \"#{config.config_file}\" --all"
|
78
76
|
cmd << " --rotate" if sphinx_running?
|
@@ -86,30 +84,6 @@ namespace :thinking_sphinx do
|
|
86
84
|
Rake::Task["thinking_sphinx:index"].invoke
|
87
85
|
Rake::Task["thinking_sphinx:start"].invoke
|
88
86
|
end
|
89
|
-
|
90
|
-
namespace :index do
|
91
|
-
task :delta => :app_env do
|
92
|
-
ThinkingSphinx.indexed_models.select { |model|
|
93
|
-
model.constantize.sphinx_indexes.any? { |index| index.delta? }
|
94
|
-
}.each do |model|
|
95
|
-
model.constantize.sphinx_indexes.select { |index|
|
96
|
-
index.delta? && index.delta_object.respond_to?(:delayed_index)
|
97
|
-
}.each { |index|
|
98
|
-
index.delta_object.delayed_index(index.model)
|
99
|
-
}
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
desc "Process stored delta index requests"
|
105
|
-
task :delayed_delta => :app_env do
|
106
|
-
require 'delayed/worker'
|
107
|
-
|
108
|
-
Delayed::Worker.new(
|
109
|
-
:min_priority => ENV['MIN_PRIORITY'],
|
110
|
-
:max_priority => ENV['MAX_PRIORITY']
|
111
|
-
).start
|
112
|
-
end
|
113
87
|
end
|
114
88
|
|
115
89
|
namespace :ts do
|
@@ -123,10 +97,6 @@ namespace :ts do
|
|
123
97
|
task :stop => "thinking_sphinx:stop"
|
124
98
|
desc "Index data for Sphinx using Thinking Sphinx's settings"
|
125
99
|
task :in => "thinking_sphinx:index"
|
126
|
-
namespace :in do
|
127
|
-
desc "Index Thinking Sphinx datetime delta indexes"
|
128
|
-
task :delta => "thinking_sphinx:index:delta"
|
129
|
-
end
|
130
100
|
task :index => "thinking_sphinx:index"
|
131
101
|
desc "Restart Sphinx"
|
132
102
|
task :restart => "thinking_sphinx:restart"
|
@@ -136,8 +106,6 @@ namespace :ts do
|
|
136
106
|
task :config => "thinking_sphinx:configure"
|
137
107
|
desc "Stop Sphinx (if it's running), rebuild the indexes, and start Sphinx"
|
138
108
|
task :rebuild => "thinking_sphinx:rebuild"
|
139
|
-
desc "Process stored delta index requests"
|
140
|
-
task :dd => "thinking_sphinx:delayed_delta"
|
141
109
|
end
|
142
110
|
|
143
111
|
def sphinx_pid
|
@@ -203,7 +203,7 @@ describe ThinkingSphinx::ActiveRecord do
|
|
203
203
|
|
204
204
|
it "should update the core index's deleted flag if in core index" do
|
205
205
|
@client.should_receive(:update).with(
|
206
|
-
"person_core", ["sphinx_deleted"], {@person.sphinx_document_id => 1}
|
206
|
+
"person_core", ["sphinx_deleted"], {@person.sphinx_document_id => [1]}
|
207
207
|
)
|
208
208
|
|
209
209
|
@person.toggle_deleted
|
@@ -212,7 +212,7 @@ describe ThinkingSphinx::ActiveRecord do
|
|
212
212
|
it "shouldn't update the core index's deleted flag if the record isn't in it" do
|
213
213
|
@person.stub!(:in_core_index? => false)
|
214
214
|
@client.should_not_receive(:update).with(
|
215
|
-
"person_core", ["sphinx_deleted"], {@person.sphinx_document_id => 1}
|
215
|
+
"person_core", ["sphinx_deleted"], {@person.sphinx_document_id => [1]}
|
216
216
|
)
|
217
217
|
|
218
218
|
@person.toggle_deleted
|
@@ -231,7 +231,7 @@ describe ThinkingSphinx::ActiveRecord do
|
|
231
231
|
Person.sphinx_indexes.each { |index| index.stub!(:delta? => true) }
|
232
232
|
@person.delta = true
|
233
233
|
@client.should_receive(:update).with(
|
234
|
-
"person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => 1}
|
234
|
+
"person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => [1]}
|
235
235
|
)
|
236
236
|
|
237
237
|
@person.toggle_deleted
|
@@ -242,7 +242,7 @@ describe ThinkingSphinx::ActiveRecord do
|
|
242
242
|
Person.sphinx_indexes.each { |index| index.stub!(:delta? => true) }
|
243
243
|
@person.delta = false
|
244
244
|
@client.should_not_receive(:update).with(
|
245
|
-
"person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => 1}
|
245
|
+
"person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => [1]}
|
246
246
|
)
|
247
247
|
|
248
248
|
@person.toggle_deleted
|
@@ -253,7 +253,7 @@ describe ThinkingSphinx::ActiveRecord do
|
|
253
253
|
Person.sphinx_indexes.each { |index| index.stub!(:delta? => true) }
|
254
254
|
@person.delta = 0
|
255
255
|
@client.should_not_receive(:update).with(
|
256
|
-
"person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => 1}
|
256
|
+
"person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => [1]}
|
257
257
|
)
|
258
258
|
|
259
259
|
@person.toggle_deleted
|
@@ -262,7 +262,7 @@ describe ThinkingSphinx::ActiveRecord do
|
|
262
262
|
it "shouldn't update the delta index if delta indexes are disabled" do
|
263
263
|
ThinkingSphinx.deltas_enabled = true
|
264
264
|
@client.should_not_receive(:update).with(
|
265
|
-
"person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => 1}
|
265
|
+
"person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => [1]}
|
266
266
|
)
|
267
267
|
|
268
268
|
@person.toggle_deleted
|
@@ -93,6 +93,10 @@ describe ThinkingSphinx do
|
|
93
93
|
::ActiveRecord::Base.stub!(
|
94
94
|
:connection => @connection
|
95
95
|
)
|
96
|
+
|
97
|
+
ThinkingSphinx.module_eval do
|
98
|
+
class_variable_set :@@use_group_by_shortcut, nil
|
99
|
+
end
|
96
100
|
end
|
97
101
|
|
98
102
|
it "should return true if no ONLY_FULL_GROUP_BY" do
|
data/tasks/distribution.rb
CHANGED
@@ -33,21 +33,8 @@ Jeweler::Tasks.new do |gem|
|
|
33
33
|
gem.add_dependency 'activerecord', '>= 1.15.6'
|
34
34
|
|
35
35
|
gem.post_install_message = <<-MESSAGE
|
36
|
-
|
37
|
-
|
38
|
-
default is nil, to avoid any unexpected behavior. If you wish to keep the old
|
39
|
-
value though, you will need to add the following settings to your
|
40
|
-
config/sphinx.yml file:
|
41
|
-
|
42
|
-
development:
|
43
|
-
morphology: stem_en
|
44
|
-
test:
|
45
|
-
morphology: stem_en
|
46
|
-
production:
|
47
|
-
morphology: stem_en
|
48
|
-
|
49
|
-
To understand morphologies/stemmers better, visit the following link:
|
50
|
-
http://www.sphinxsearch.com/docs/manual-0.9.8.html#conf-morphology
|
36
|
+
If you're upgrading, you should read this:
|
37
|
+
http://freelancing-god.github.com/ts/en/upgrading.html
|
51
38
|
|
52
39
|
MESSAGE
|
53
40
|
end
|
data/tasks/testing.rb
CHANGED
@@ -10,17 +10,17 @@ end
|
|
10
10
|
|
11
11
|
desc "Run all feature-set configurations"
|
12
12
|
task :features do |t|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
databases = ENV['DATABASES'] || 'mysql,postgresql'
|
14
|
+
databases.split(',').each do |database|
|
15
|
+
puts "rake features:#{database}"
|
16
|
+
system "rake features:#{database}"
|
17
|
+
end
|
17
18
|
end
|
18
19
|
|
19
20
|
namespace :features do
|
20
21
|
def add_task(name, description)
|
21
22
|
Cucumber::Rake::Task.new(name, description) do |t|
|
22
|
-
t.cucumber_opts = "--format pretty"
|
23
|
-
t.profile = name
|
23
|
+
t.cucumber_opts = "--format pretty features/*.feature DATABASE=#{name}"
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -62,22 +62,11 @@ end
|
|
62
62
|
|
63
63
|
desc "Build cucumber.yml file"
|
64
64
|
task :cucumber_defaults do
|
65
|
-
|
66
|
-
--require features/support/env.rb
|
67
|
-
--require features/support/db/mysql.rb
|
68
|
-
--require features/support/db/active_record.rb
|
69
|
-
--require features/support/post_database.rb
|
70
|
-
).join(" ")
|
71
|
-
|
72
|
-
step_definitions = FileList["features/step_definitions/**.rb"].collect { |path|
|
65
|
+
steps = FileList["features/step_definitions/**.rb"].collect { |path|
|
73
66
|
"--require #{path}"
|
74
67
|
}.join(" ")
|
75
68
|
|
76
|
-
features = FileList["features/*.feature"].join(" ")
|
77
|
-
|
78
69
|
File.open('cucumber.yml', 'w') { |f|
|
79
|
-
f.write "default: \"
|
80
|
-
f.write "mysql: \"#{default_requires} #{step_definitions} #{features}\"\n\n"
|
81
|
-
f.write "postgresql: \"#{default_requires.gsub(/mysql/, 'postgresql')} #{step_definitions} #{features}\""
|
70
|
+
f.write "default: \"--require features/support/env.rb #{steps}\"\n"
|
82
71
|
}
|
83
72
|
end
|
data/vendor/riddle/lib/riddle.rb
CHANGED
@@ -18,7 +18,7 @@ module Riddle #:nodoc:
|
|
18
18
|
Rev = 1533
|
19
19
|
# Release number to mark my own fixes, beyond feature parity with
|
20
20
|
# Sphinx itself.
|
21
|
-
Release =
|
21
|
+
Release = 11
|
22
22
|
|
23
23
|
String = [Major, Minor, Tiny].join('.')
|
24
24
|
GemVersion = [Major, Minor, Tiny, Rev, Release].join('.')
|
@@ -5,14 +5,14 @@ module Riddle
|
|
5
5
|
@path = path
|
6
6
|
end
|
7
7
|
|
8
|
-
def index
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
def index(*indexes)
|
9
|
+
indexes << '--all' if indexes.empty?
|
10
|
+
|
11
|
+
cmd = "indexer --config #{@path} #{indexes.join(' ')}"
|
12
|
+
cmd << " --rotate" if running?
|
13
|
+
`#{cmd}`
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def start
|
17
17
|
return if running?
|
18
18
|
|
@@ -51,12 +51,5 @@ module Riddle
|
|
51
51
|
rescue
|
52
52
|
false
|
53
53
|
end
|
54
|
-
|
55
|
-
private
|
56
|
-
def run_index(name)
|
57
|
-
cmd = "indexer --config #{@path} #{name}"
|
58
|
-
cmd << " --rotate" if running?
|
59
|
-
`#{cmd}`
|
60
|
-
end
|
61
54
|
end
|
62
|
-
end
|
55
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: moneypools-thinking-sphinx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pat Allan
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-11-04 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -34,6 +34,9 @@ files:
|
|
34
34
|
- LICENCE
|
35
35
|
- README.textile
|
36
36
|
- VERSION.yml
|
37
|
+
- lib/cucumber/thinking_sphinx/external_world.rb
|
38
|
+
- lib/cucumber/thinking_sphinx/internal_world.rb
|
39
|
+
- lib/cucumber/thinking_sphinx/sql_logger.rb
|
37
40
|
- lib/thinking_sphinx.rb
|
38
41
|
- lib/thinking_sphinx/active_record.rb
|
39
42
|
- lib/thinking_sphinx/active_record/attribute_updates.rb
|
@@ -50,12 +53,7 @@ files:
|
|
50
53
|
- lib/thinking_sphinx/core/array.rb
|
51
54
|
- lib/thinking_sphinx/core/string.rb
|
52
55
|
- lib/thinking_sphinx/deltas.rb
|
53
|
-
- lib/thinking_sphinx/deltas/datetime_delta.rb
|
54
56
|
- lib/thinking_sphinx/deltas/default_delta.rb
|
55
|
-
- lib/thinking_sphinx/deltas/delayed_delta.rb
|
56
|
-
- lib/thinking_sphinx/deltas/delayed_delta/delta_job.rb
|
57
|
-
- lib/thinking_sphinx/deltas/delayed_delta/flag_as_deleted_job.rb
|
58
|
-
- lib/thinking_sphinx/deltas/delayed_delta/job.rb
|
59
57
|
- lib/thinking_sphinx/deploy/capistrano.rb
|
60
58
|
- lib/thinking_sphinx/excerpter.rb
|
61
59
|
- lib/thinking_sphinx/facet.rb
|
@@ -105,21 +103,8 @@ homepage: http://ts.freelancing-gods.com
|
|
105
103
|
licenses: []
|
106
104
|
|
107
105
|
post_install_message: |+
|
108
|
-
|
109
|
-
|
110
|
-
default is nil, to avoid any unexpected behavior. If you wish to keep the old
|
111
|
-
value though, you will need to add the following settings to your
|
112
|
-
config/sphinx.yml file:
|
113
|
-
|
114
|
-
development:
|
115
|
-
morphology: stem_en
|
116
|
-
test:
|
117
|
-
morphology: stem_en
|
118
|
-
production:
|
119
|
-
morphology: stem_en
|
120
|
-
|
121
|
-
To understand morphologies/stemmers better, visit the following link:
|
122
|
-
http://www.sphinxsearch.com/docs/manual-0.9.8.html#conf-morphology
|
106
|
+
If you're upgrading, you should read this:
|
107
|
+
http://freelancing-god.github.com/ts/en/upgrading.html
|
123
108
|
|
124
109
|
rdoc_options:
|
125
110
|
- --charset=UTF-8
|
@@ -145,12 +130,9 @@ signing_key:
|
|
145
130
|
specification_version: 3
|
146
131
|
summary: ActiveRecord/Rails Sphinx library
|
147
132
|
test_files:
|
148
|
-
- features/a.rb
|
149
133
|
- features/alternate_primary_key.feature
|
150
134
|
- features/attribute_transformation.feature
|
151
135
|
- features/attribute_updates.feature
|
152
|
-
- features/datetime_deltas.feature
|
153
|
-
- features/delayed_delta_indexing.feature
|
154
136
|
- features/deleting_instances.feature
|
155
137
|
- features/direct_attributes.feature
|
156
138
|
- features/excerpts.feature
|
@@ -167,8 +149,6 @@ test_files:
|
|
167
149
|
- features/step_definitions/alpha_steps.rb
|
168
150
|
- features/step_definitions/beta_steps.rb
|
169
151
|
- features/step_definitions/common_steps.rb
|
170
|
-
- features/step_definitions/datetime_delta_steps.rb
|
171
|
-
- features/step_definitions/delayed_delta_indexing_steps.rb
|
172
152
|
- features/step_definitions/extensible_delta_indexing_steps.rb
|
173
153
|
- features/step_definitions/facet_steps.rb
|
174
154
|
- features/step_definitions/find_arguments_steps.rb
|
@@ -177,8 +157,8 @@ test_files:
|
|
177
157
|
- features/step_definitions/search_steps.rb
|
178
158
|
- features/step_definitions/sphinx_steps.rb
|
179
159
|
- features/sti_searching.feature
|
160
|
+
- features/support/database.example.yml
|
180
161
|
- features/support/db/active_record.rb
|
181
|
-
- features/support/db/database.example.yml
|
182
162
|
- features/support/db/fixtures/alphas.rb
|
183
163
|
- features/support/db/fixtures/authors.rb
|
184
164
|
- features/support/db/fixtures/betas.rb
|
@@ -186,7 +166,6 @@ test_files:
|
|
186
166
|
- features/support/db/fixtures/categories.rb
|
187
167
|
- features/support/db/fixtures/cats.rb
|
188
168
|
- features/support/db/fixtures/comments.rb
|
189
|
-
- features/support/db/fixtures/delayed_betas.rb
|
190
169
|
- features/support/db/fixtures/developers.rb
|
191
170
|
- features/support/db/fixtures/dogs.rb
|
192
171
|
- features/support/db/fixtures/extensible_betas.rb
|
@@ -195,7 +174,6 @@ test_files:
|
|
195
174
|
- features/support/db/fixtures/posts.rb
|
196
175
|
- features/support/db/fixtures/robots.rb
|
197
176
|
- features/support/db/fixtures/tags.rb
|
198
|
-
- features/support/db/fixtures/thetas.rb
|
199
177
|
- features/support/db/migrations/create_alphas.rb
|
200
178
|
- features/support/db/migrations/create_animals.rb
|
201
179
|
- features/support/db/migrations/create_authors.rb
|
@@ -204,7 +182,6 @@ test_files:
|
|
204
182
|
- features/support/db/migrations/create_boxes.rb
|
205
183
|
- features/support/db/migrations/create_categories.rb
|
206
184
|
- features/support/db/migrations/create_comments.rb
|
207
|
-
- features/support/db/migrations/create_delayed_betas.rb
|
208
185
|
- features/support/db/migrations/create_developers.rb
|
209
186
|
- features/support/db/migrations/create_extensible_betas.rb
|
210
187
|
- features/support/db/migrations/create_gammas.rb
|
@@ -213,7 +190,6 @@ test_files:
|
|
213
190
|
- features/support/db/migrations/create_robots.rb
|
214
191
|
- features/support/db/migrations/create_taggings.rb
|
215
192
|
- features/support/db/migrations/create_tags.rb
|
216
|
-
- features/support/db/migrations/create_thetas.rb
|
217
193
|
- features/support/db/mysql.rb
|
218
194
|
- features/support/db/postgresql.rb
|
219
195
|
- features/support/env.rb
|
@@ -226,7 +202,6 @@ test_files:
|
|
226
202
|
- features/support/models/cat.rb
|
227
203
|
- features/support/models/category.rb
|
228
204
|
- features/support/models/comment.rb
|
229
|
-
- features/support/models/delayed_beta.rb
|
230
205
|
- features/support/models/developer.rb
|
231
206
|
- features/support/models/dog.rb
|
232
207
|
- features/support/models/extensible_beta.rb
|
@@ -236,9 +211,7 @@ test_files:
|
|
236
211
|
- features/support/models/robot.rb
|
237
212
|
- features/support/models/tag.rb
|
238
213
|
- features/support/models/tagging.rb
|
239
|
-
- features/support/models/theta.rb
|
240
214
|
- features/support/post_database.rb
|
241
|
-
- features/support/z.rb
|
242
215
|
- spec/lib/thinking_sphinx/active_record/delta_spec.rb
|
243
216
|
- spec/lib/thinking_sphinx/active_record/has_many_association_spec.rb
|
244
217
|
- spec/lib/thinking_sphinx/active_record/scopes_spec.rb
|
@@ -248,7 +221,6 @@ test_files:
|
|
248
221
|
- spec/lib/thinking_sphinx/configuration_spec.rb
|
249
222
|
- spec/lib/thinking_sphinx/core/array_spec.rb
|
250
223
|
- spec/lib/thinking_sphinx/core/string_spec.rb
|
251
|
-
- spec/lib/thinking_sphinx/deltas/job_spec.rb
|
252
224
|
- spec/lib/thinking_sphinx/excerpter_spec.rb
|
253
225
|
- spec/lib/thinking_sphinx/facet_search_spec.rb
|
254
226
|
- spec/lib/thinking_sphinx/facet_spec.rb
|
data/features/a.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
# This file exists because Cucumber likes to auto-load all ruby files
|
2
|
-
puts <<-MESSAGE
|
3
|
-
Cucumber 0.1.12 defaults to loading all ruby files within the features folder
|
4
|
-
alphabetically. This is annoying, because some files need to be loaded before
|
5
|
-
others (and others perhaps not at all, given missing dependencies). Hence this
|
6
|
-
place-holder imaginatively named 'a.rb', to force this message.
|
7
|
-
|
8
|
-
A work-around is to use cucumber profiles. You will find the default profile in
|
9
|
-
cucumber.yml should serve your needs fine, unless you add new step definitions.
|
10
|
-
When you do that, you can regenerate the YAML file by running:
|
11
|
-
rake cucumber_defaults
|
12
|
-
|
13
|
-
And then run specific features as follows is slightly more verbose, but it
|
14
|
-
works, whereas this doesn't.
|
15
|
-
cucumber -p default features/something.feature
|
16
|
-
MESSAGE
|
17
|
-
exit 0
|
@@ -1,66 +0,0 @@
|
|
1
|
-
Feature: Datetime Delta Indexing
|
2
|
-
In order to have delta indexing on frequently-updated sites
|
3
|
-
Developers
|
4
|
-
Should be able to use an existing datetime column to track changes
|
5
|
-
|
6
|
-
Scenario: Delta Index should not fire automatically
|
7
|
-
Given Sphinx is running
|
8
|
-
And I am searching on thetas
|
9
|
-
When I search for one
|
10
|
-
Then I should get 1 result
|
11
|
-
|
12
|
-
When I change the name of theta one to eleven
|
13
|
-
And I wait for Sphinx to catch up
|
14
|
-
And I search for one
|
15
|
-
Then I should get 1 result
|
16
|
-
|
17
|
-
When I search for eleven
|
18
|
-
Then I should get 0 results
|
19
|
-
|
20
|
-
Scenario: Delta Index should fire when jobs are run
|
21
|
-
Given Sphinx is running
|
22
|
-
And I am searching on thetas
|
23
|
-
When I search for two
|
24
|
-
Then I should get 1 result
|
25
|
-
|
26
|
-
When I change the name of theta two to twelve
|
27
|
-
And I wait for Sphinx to catch up
|
28
|
-
And I search for twelve
|
29
|
-
Then I should get 0 results
|
30
|
-
|
31
|
-
When I index the theta datetime delta
|
32
|
-
And I wait for Sphinx to catch up
|
33
|
-
And I search for twelve
|
34
|
-
Then I should get 1 result
|
35
|
-
|
36
|
-
When I search for two
|
37
|
-
Then I should get 0 results
|
38
|
-
|
39
|
-
Scenario: New records should be merged into the core index
|
40
|
-
Given Sphinx is running
|
41
|
-
And I am searching on thetas
|
42
|
-
When I search for thirteen
|
43
|
-
Then I should get 0 results
|
44
|
-
|
45
|
-
When I create a new theta named thirteen
|
46
|
-
And I search for thirteen
|
47
|
-
Then I should get 0 results
|
48
|
-
|
49
|
-
When I index the theta datetime delta
|
50
|
-
And I wait for Sphinx to catch up
|
51
|
-
And I search for thirteen
|
52
|
-
Then I should get 1 result
|
53
|
-
|
54
|
-
When I search for the document id of theta thirteen in the theta_core index
|
55
|
-
Then it should exist
|
56
|
-
|
57
|
-
Scenario: Deleting records
|
58
|
-
Given Sphinx is running
|
59
|
-
And I am searching on thetas
|
60
|
-
When I search for three
|
61
|
-
Then I should get 1 result
|
62
|
-
|
63
|
-
When I delete the theta named three
|
64
|
-
And I wait for Sphinx to catch up
|
65
|
-
And I search for three
|
66
|
-
Then I should get 0 results
|
@@ -1,37 +0,0 @@
|
|
1
|
-
Feature: Delayed Delta Indexing
|
2
|
-
In order to have delta indexing on frequently-updated sites
|
3
|
-
Developers
|
4
|
-
Should be able to use delayed_job to handle delta indexes to lower system load
|
5
|
-
|
6
|
-
Scenario: Delta Index should not fire automatically
|
7
|
-
Given Sphinx is running
|
8
|
-
And I am searching on delayed betas
|
9
|
-
When I search for one
|
10
|
-
Then I should get 1 result
|
11
|
-
|
12
|
-
When I change the name of delayed beta one to eleven
|
13
|
-
And I wait for Sphinx to catch up
|
14
|
-
And I search for one
|
15
|
-
Then I should get 1 result
|
16
|
-
|
17
|
-
When I search for eleven
|
18
|
-
Then I should get 0 results
|
19
|
-
|
20
|
-
Scenario: Delta Index should fire when jobs are run
|
21
|
-
Given Sphinx is running
|
22
|
-
And I am searching on delayed betas
|
23
|
-
When I search for one
|
24
|
-
Then I should get 1 result
|
25
|
-
|
26
|
-
When I change the name of delayed beta two to twelve
|
27
|
-
And I wait for Sphinx to catch up
|
28
|
-
And I search for twelve
|
29
|
-
Then I should get 0 results
|
30
|
-
|
31
|
-
When I run the delayed jobs
|
32
|
-
And I wait for Sphinx to catch up
|
33
|
-
And I search for twelve
|
34
|
-
Then I should get 1 result
|
35
|
-
|
36
|
-
When I search for two
|
37
|
-
Then I should get 0 results
|
@@ -1,15 +0,0 @@
|
|
1
|
-
When /^I index the theta datetime delta$/ do
|
2
|
-
Theta.sphinx_indexes.first.delta_object.delayed_index(Theta)
|
3
|
-
end
|
4
|
-
|
5
|
-
When /^I change the name of theta (\w+) to (\w+)$/ do |current, replacement|
|
6
|
-
Theta.find_by_name(current).update_attributes(:name => replacement)
|
7
|
-
end
|
8
|
-
|
9
|
-
When /^I create a new theta named (\w+)$/ do |name|
|
10
|
-
Theta.create(:name => name)
|
11
|
-
end
|
12
|
-
|
13
|
-
When /^I delete the theta named (\w+)$/ do |name|
|
14
|
-
Theta.find_by_name(name).destroy
|
15
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
DelayedBeta.create :name => "one"
|
2
|
-
DelayedBeta.create :name => "two"
|
3
|
-
DelayedBeta.create :name => "three"
|
4
|
-
DelayedBeta.create :name => "four"
|
5
|
-
DelayedBeta.create :name => "five"
|
6
|
-
DelayedBeta.create :name => "six"
|
7
|
-
DelayedBeta.create :name => "seven"
|
8
|
-
DelayedBeta.create :name => "eight"
|
9
|
-
DelayedBeta.create :name => "nine"
|
10
|
-
DelayedBeta.create :name => "ten"
|
@@ -1,10 +0,0 @@
|
|
1
|
-
Theta.create :name => "one"
|
2
|
-
Theta.create :name => "two"
|
3
|
-
Theta.create :name => "three"
|
4
|
-
Theta.create :name => "four"
|
5
|
-
Theta.create :name => "five"
|
6
|
-
Theta.create :name => "six"
|
7
|
-
Theta.create :name => "seven"
|
8
|
-
Theta.create :name => "eight"
|
9
|
-
Theta.create :name => "nine"
|
10
|
-
Theta.create :name => "ten"
|
@@ -1,17 +0,0 @@
|
|
1
|
-
ActiveRecord::Base.connection.create_table :delayed_betas, :force => true do |t|
|
2
|
-
t.column :name, :string, :null => false
|
3
|
-
t.column :delta, :boolean, :null => false, :default => false
|
4
|
-
end
|
5
|
-
|
6
|
-
ActiveRecord::Base.connection.create_table :delayed_jobs, :force => true do |t|
|
7
|
-
t.column :priority, :integer, :default => 0
|
8
|
-
t.column :attempts, :integer, :default => 0
|
9
|
-
t.column :handler, :text
|
10
|
-
t.column :last_error, :string
|
11
|
-
t.column :run_at, :datetime
|
12
|
-
t.column :locked_at, :datetime
|
13
|
-
t.column :failed_at, :datetime
|
14
|
-
t.column :locked_by, :string
|
15
|
-
t.column :created_at, :datetime
|
16
|
-
t.column :updated_at, :datetime
|
17
|
-
end
|
data/features/support/z.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
# This file exists because Cucumber likes to auto-load all ruby files
|
2
|
-
puts <<-MESSAGE
|
3
|
-
Cucumber 0.1.13 defaults to loading all ruby files within the features folder,
|
4
|
-
with something approaching reverse-alphabetical order, and preferring the
|
5
|
-
features/support folder over everything else. This is annoying, because some
|
6
|
-
files need to be loaded before others (and others perhaps not at all, given
|
7
|
-
missing dependencies). Hence this place-holder imaginatively named 'z.rb', to
|
8
|
-
force this message.
|
9
|
-
|
10
|
-
A work-around is to use cucumber profiles. You will find the default profile in
|
11
|
-
cucumber.yml should serve your needs fine, unless you add new step definitions.
|
12
|
-
When you do that, you can regenerate the YAML file by running:
|
13
|
-
rake cucumber_defaults
|
14
|
-
|
15
|
-
And then run specific features as follows is slightly more verbose, but it
|
16
|
-
works, whereas this doesn't.
|
17
|
-
cucumber -p default features/something.feature
|
18
|
-
MESSAGE
|
19
|
-
exit 0
|
@@ -1,50 +0,0 @@
|
|
1
|
-
module ThinkingSphinx
|
2
|
-
module Deltas
|
3
|
-
class DatetimeDelta < ThinkingSphinx::Deltas::DefaultDelta
|
4
|
-
attr_accessor :column, :threshold
|
5
|
-
|
6
|
-
def initialize(index, options)
|
7
|
-
@index = index
|
8
|
-
@column = options.delete(:delta_column) || :updated_at
|
9
|
-
@threshold = options.delete(:threshold) || 1.day
|
10
|
-
end
|
11
|
-
|
12
|
-
def index(model, instance = nil)
|
13
|
-
# do nothing
|
14
|
-
true
|
15
|
-
end
|
16
|
-
|
17
|
-
def delayed_index(model)
|
18
|
-
config = ThinkingSphinx::Configuration.instance
|
19
|
-
rotate = ThinkingSphinx.sphinx_running? ? "--rotate" : ""
|
20
|
-
|
21
|
-
output = `#{config.bin_path}#{config.indexer_binary_name} --config #{config.config_file} #{rotate} #{delta_index_name model}`
|
22
|
-
output += `#{config.bin_path}#{config.indexer_binary_name} --config #{config.config_file} #{rotate} --merge #{core_index_name model} #{delta_index_name model} --merge-dst-range sphinx_deleted 0 0`
|
23
|
-
puts output unless ThinkingSphinx.suppress_delta_output?
|
24
|
-
|
25
|
-
true
|
26
|
-
end
|
27
|
-
|
28
|
-
def toggle(instance)
|
29
|
-
# do nothing
|
30
|
-
end
|
31
|
-
|
32
|
-
def toggled(instance)
|
33
|
-
instance.send(@column) > @threshold.ago
|
34
|
-
end
|
35
|
-
|
36
|
-
def reset_query(model)
|
37
|
-
nil
|
38
|
-
end
|
39
|
-
|
40
|
-
def clause(model, toggled)
|
41
|
-
if toggled
|
42
|
-
"#{model.quoted_table_name}.#{model.connection.quote_column_name(@column.to_s)}" +
|
43
|
-
" > #{adapter.time_difference(@threshold)}"
|
44
|
-
else
|
45
|
-
nil
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
begin
|
2
|
-
require 'delayed_job'
|
3
|
-
rescue LoadError
|
4
|
-
raise "You must have delayed_job installed as a gem or plugin to use a delayed delta"
|
5
|
-
end
|
6
|
-
|
7
|
-
require 'thinking_sphinx/deltas/delayed_delta/delta_job'
|
8
|
-
require 'thinking_sphinx/deltas/delayed_delta/flag_as_deleted_job'
|
9
|
-
require 'thinking_sphinx/deltas/delayed_delta/job'
|
10
|
-
|
11
|
-
module ThinkingSphinx
|
12
|
-
module Deltas
|
13
|
-
class DelayedDelta < ThinkingSphinx::Deltas::DefaultDelta
|
14
|
-
def index(model, instance = nil)
|
15
|
-
return true unless ThinkingSphinx.updates_enabled? && ThinkingSphinx.deltas_enabled?
|
16
|
-
return true if instance && !toggled(instance)
|
17
|
-
|
18
|
-
ThinkingSphinx::Deltas::Job.enqueue(
|
19
|
-
ThinkingSphinx::Deltas::DeltaJob.new(delta_index_name(model)),
|
20
|
-
ThinkingSphinx::Configuration.instance.delayed_job_priority
|
21
|
-
)
|
22
|
-
|
23
|
-
Delayed::Job.enqueue(
|
24
|
-
ThinkingSphinx::Deltas::FlagAsDeletedJob.new(
|
25
|
-
core_index_name(model), instance.sphinx_document_id
|
26
|
-
),
|
27
|
-
ThinkingSphinx::Configuration.instance.delayed_job_priority
|
28
|
-
) if instance
|
29
|
-
|
30
|
-
true
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module ThinkingSphinx
|
2
|
-
module Deltas
|
3
|
-
class DeltaJob
|
4
|
-
attr_accessor :index
|
5
|
-
|
6
|
-
def initialize(index)
|
7
|
-
@index = index
|
8
|
-
end
|
9
|
-
|
10
|
-
def perform
|
11
|
-
return true unless ThinkingSphinx.updates_enabled? &&
|
12
|
-
ThinkingSphinx.deltas_enabled?
|
13
|
-
|
14
|
-
config = ThinkingSphinx::Configuration.instance
|
15
|
-
client = Riddle::Client.new config.address, config.port
|
16
|
-
|
17
|
-
output = `#{config.bin_path}#{config.indexer_binary_name} --config #{config.config_file} --rotate #{index}`
|
18
|
-
puts output unless ThinkingSphinx.suppress_delta_output?
|
19
|
-
|
20
|
-
true
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module ThinkingSphinx
|
2
|
-
module Deltas
|
3
|
-
class FlagAsDeletedJob
|
4
|
-
attr_accessor :index, :document_id
|
5
|
-
|
6
|
-
def initialize(index, document_id)
|
7
|
-
@index, @document_id = index, document_id
|
8
|
-
end
|
9
|
-
|
10
|
-
def perform
|
11
|
-
return true unless ThinkingSphinx.updates_enabled?
|
12
|
-
|
13
|
-
config = ThinkingSphinx::Configuration.instance
|
14
|
-
client = Riddle::Client.new config.address, config.port
|
15
|
-
|
16
|
-
client.update(
|
17
|
-
@index,
|
18
|
-
['sphinx_deleted'],
|
19
|
-
{@document_id => [1]}
|
20
|
-
) if ThinkingSphinx.sphinx_running? &&
|
21
|
-
ThinkingSphinx::Search.search_for_id(@document_id, @index)
|
22
|
-
|
23
|
-
true
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module ThinkingSphinx
|
2
|
-
module Deltas
|
3
|
-
class Job < Delayed::Job
|
4
|
-
def self.enqueue(object, priority = 0)
|
5
|
-
super unless duplicates_exist(object)
|
6
|
-
end
|
7
|
-
|
8
|
-
def self.cancel_thinking_sphinx_jobs
|
9
|
-
if connection.tables.include?("delayed_jobs")
|
10
|
-
delete_all("handler LIKE '--- !ruby/object:ThinkingSphinx::Deltas::%'")
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def self.duplicates_exist(object)
|
17
|
-
count(
|
18
|
-
:conditions => {
|
19
|
-
:handler => object.to_yaml,
|
20
|
-
:locked_at => nil
|
21
|
-
}
|
22
|
-
) > 0
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'spec/spec_helper'
|
2
|
-
|
3
|
-
describe ThinkingSphinx::Deltas::Job do
|
4
|
-
describe '.cancel_thinking_sphinx_jobs' do
|
5
|
-
before :each do
|
6
|
-
ThinkingSphinx::Deltas::Job.stub!(:delete_all => true)
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should not delete any rows if the delayed_jobs table does not exist" do
|
10
|
-
ThinkingSphinx::Deltas::Job.connection.stub!(:tables => [])
|
11
|
-
ThinkingSphinx::Deltas::Job.should_not_receive(:delete_all)
|
12
|
-
|
13
|
-
ThinkingSphinx::Deltas::Job.cancel_thinking_sphinx_jobs
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should delete rows if the delayed_jobs table does exist" do
|
17
|
-
ThinkingSphinx::Deltas::Job.connection.stub!(:tables => ['delayed_jobs'])
|
18
|
-
ThinkingSphinx::Deltas::Job.should_receive(:delete_all)
|
19
|
-
|
20
|
-
ThinkingSphinx::Deltas::Job.cancel_thinking_sphinx_jobs
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should delete only Thinking Sphinx jobs" do
|
24
|
-
ThinkingSphinx::Deltas::Job.connection.stub!(:tables => ['delayed_jobs'])
|
25
|
-
ThinkingSphinx::Deltas::Job.should_receive(:delete_all) do |sql|
|
26
|
-
sql.should match(/handler LIKE '--- !ruby\/object:ThinkingSphinx::Deltas::\%'/)
|
27
|
-
end
|
28
|
-
|
29
|
-
ThinkingSphinx::Deltas::Job.cancel_thinking_sphinx_jobs
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|