thinking-sphinx 1.2.12 → 1.2.13
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/README.textile +4 -17
- data/VERSION.yml +2 -1
- data/features/alternate_primary_key.feature +27 -0
- data/features/attribute_transformation.feature +22 -0
- data/features/attribute_updates.feature +33 -0
- data/features/datetime_deltas.feature +66 -0
- data/features/delayed_delta_indexing.feature +37 -0
- data/features/deleting_instances.feature +64 -0
- data/features/direct_attributes.feature +11 -0
- data/features/excerpts.feature +13 -0
- data/features/extensible_delta_indexing.feature +9 -0
- data/features/facets.feature +76 -0
- data/features/facets_across_model.feature +29 -0
- data/features/handling_edits.feature +92 -0
- data/features/retry_stale_indexes.feature +24 -0
- data/features/searching_across_models.feature +20 -0
- data/features/searching_by_model.feature +175 -0
- data/features/searching_with_find_arguments.feature +56 -0
- data/features/sphinx_detection.feature +25 -0
- data/features/sphinx_scopes.feature +35 -0
- data/features/step_definitions/alpha_steps.rb +3 -0
- data/features/step_definitions/beta_steps.rb +7 -0
- data/features/step_definitions/common_steps.rb +178 -0
- data/features/step_definitions/datetime_delta_steps.rb +15 -0
- data/features/step_definitions/delayed_delta_indexing_steps.rb +7 -0
- data/features/step_definitions/extensible_delta_indexing_steps.rb +7 -0
- data/features/step_definitions/facet_steps.rb +92 -0
- data/features/step_definitions/find_arguments_steps.rb +36 -0
- data/features/step_definitions/gamma_steps.rb +15 -0
- data/features/step_definitions/scope_steps.rb +11 -0
- data/features/step_definitions/search_steps.rb +89 -0
- data/features/step_definitions/sphinx_steps.rb +31 -0
- data/features/sti_searching.feature +14 -0
- data/features/support/database.example.yml +3 -0
- data/features/support/database.yml +5 -0
- data/features/support/db/active_record.rb +40 -0
- data/features/support/db/database.yml +5 -0
- data/features/support/db/fixtures/alphas.rb +10 -0
- data/features/support/db/fixtures/authors.rb +1 -0
- data/features/support/db/fixtures/betas.rb +10 -0
- data/features/support/db/fixtures/boxes.rb +9 -0
- data/features/support/db/fixtures/categories.rb +1 -0
- data/features/support/db/fixtures/cats.rb +3 -0
- data/features/support/db/fixtures/comments.rb +24 -0
- data/features/support/db/fixtures/delayed_betas.rb +10 -0
- data/features/support/db/fixtures/developers.rb +29 -0
- data/features/support/db/fixtures/dogs.rb +3 -0
- data/features/support/db/fixtures/extensible_betas.rb +10 -0
- data/features/support/db/fixtures/gammas.rb +10 -0
- data/features/support/db/fixtures/people.rb +1001 -0
- data/features/support/db/fixtures/posts.rb +6 -0
- data/features/support/db/fixtures/robots.rb +14 -0
- data/features/support/db/fixtures/tags.rb +27 -0
- data/features/support/db/fixtures/thetas.rb +10 -0
- data/features/support/db/migrations/create_alphas.rb +7 -0
- data/features/support/db/migrations/create_animals.rb +5 -0
- data/features/support/db/migrations/create_authors.rb +3 -0
- data/features/support/db/migrations/create_authors_posts.rb +6 -0
- data/features/support/db/migrations/create_betas.rb +5 -0
- data/features/support/db/migrations/create_boxes.rb +5 -0
- data/features/support/db/migrations/create_categories.rb +3 -0
- data/features/support/db/migrations/create_comments.rb +10 -0
- data/features/support/db/migrations/create_delayed_betas.rb +17 -0
- data/features/support/db/migrations/create_developers.rb +9 -0
- data/features/support/db/migrations/create_extensible_betas.rb +5 -0
- data/features/support/db/migrations/create_gammas.rb +3 -0
- data/features/support/db/migrations/create_people.rb +13 -0
- data/features/support/db/migrations/create_posts.rb +5 -0
- data/features/support/db/migrations/create_robots.rb +4 -0
- data/features/support/db/migrations/create_taggings.rb +5 -0
- data/features/support/db/migrations/create_tags.rb +4 -0
- data/features/support/db/migrations/create_thetas.rb +5 -0
- data/features/support/db/mysql.rb +3 -0
- data/features/support/db/postgresql.rb +3 -0
- data/features/support/env.rb +18 -0
- data/features/support/lib/generic_delta_handler.rb +8 -0
- data/features/support/models/alpha.rb +10 -0
- data/features/support/models/animal.rb +5 -0
- data/features/support/models/author.rb +3 -0
- data/features/support/models/beta.rb +8 -0
- data/features/support/models/box.rb +8 -0
- data/features/support/models/cat.rb +3 -0
- data/features/support/models/category.rb +4 -0
- data/features/support/models/comment.rb +10 -0
- data/features/support/models/delayed_beta.rb +7 -0
- data/features/support/models/developer.rb +16 -0
- data/features/support/models/dog.rb +3 -0
- data/features/support/models/extensible_beta.rb +9 -0
- data/features/support/models/gamma.rb +5 -0
- data/features/support/models/person.rb +23 -0
- data/features/support/models/post.rb +20 -0
- data/features/support/models/robot.rb +12 -0
- data/features/support/models/tag.rb +3 -0
- data/features/support/models/tagging.rb +4 -0
- data/features/support/models/theta.rb +7 -0
- data/features/support/post_database.rb +43 -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 +4 -2
- data/lib/thinking_sphinx/active_record.rb +1 -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 -4
- data/lib/thinking_sphinx/excerpter.rb +1 -1
- data/lib/thinking_sphinx/search.rb +1 -0
- data/lib/thinking_sphinx/source.rb +1 -1
- data/spec/lib/thinking_sphinx/active_record_spec.rb +0 -11
- data/spec/lib/thinking_sphinx/attribute_spec.rb +14 -7
- data/spec/lib/thinking_sphinx/deltas/job_spec.rb +32 -0
- data/spec/lib/thinking_sphinx/excerpter_spec.rb +8 -0
- data/spec/lib/thinking_sphinx/search_spec.rb +9 -0
- data/tasks/distribution.rb +4 -1
- data/tasks/testing.rb +8 -19
- metadata +99 -2
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
$:.unshift File.dirname(__FILE__) + '/../../lib'
|
|
2
|
+
|
|
3
|
+
require 'lib/thinking_sphinx'
|
|
4
|
+
|
|
5
|
+
%w( tmp/config tmp/log tmp/db/sphinx/development ).each do |path|
|
|
6
|
+
FileUtils.mkdir_p "#{Dir.pwd}/#{path}"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
Kernel.const_set :RAILS_ROOT, "#{Dir.pwd}/tmp" unless defined?(RAILS_ROOT)
|
|
10
|
+
|
|
11
|
+
at_exit do
|
|
12
|
+
ThinkingSphinx::Configuration.instance.controller.stop
|
|
13
|
+
sleep(1) # Ensure Sphinx has shut down completely
|
|
14
|
+
ActiveRecord::Base.logger.close
|
|
15
|
+
FileUtils.rm_r "#{Dir.pwd}/tmp"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Add log file
|
|
19
|
+
ActiveRecord::Base.logger = Logger.new open("tmp/active_record.log", "a")
|
|
20
|
+
|
|
21
|
+
# Set up database tables
|
|
22
|
+
Dir["features/support/db/migrations/*.rb"].each do |file|
|
|
23
|
+
require file.gsub(/\.rb$/, '')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Load Models
|
|
27
|
+
Dir["features/support/models/*.rb"].sort.each do |file|
|
|
28
|
+
require file.gsub(/\.rb$/, '')
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
ThinkingSphinx.deltas_enabled = false
|
|
32
|
+
|
|
33
|
+
# Load Fixtures
|
|
34
|
+
Dir["features/support/db/fixtures/*.rb"].each do |file|
|
|
35
|
+
require file.gsub(/\.rb$/, '')
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
ThinkingSphinx.deltas_enabled = true
|
|
39
|
+
ThinkingSphinx.suppress_delta_output = true
|
|
40
|
+
|
|
41
|
+
ThinkingSphinx::Configuration.instance.build
|
|
42
|
+
ThinkingSphinx::Configuration.instance.controller.index
|
|
43
|
+
ThinkingSphinx::Configuration.instance.controller.start
|
|
@@ -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
|
@@ -6,6 +6,7 @@ require 'active_record'
|
|
|
6
6
|
require 'riddle'
|
|
7
7
|
require 'after_commit'
|
|
8
8
|
require 'yaml'
|
|
9
|
+
require 'cgi'
|
|
9
10
|
|
|
10
11
|
require 'thinking_sphinx/core/array'
|
|
11
12
|
require 'thinking_sphinx/core/string'
|
|
@@ -130,12 +131,13 @@ module ThinkingSphinx
|
|
|
130
131
|
def self.suppress_delta_output=(value)
|
|
131
132
|
@@suppress_delta_output = value
|
|
132
133
|
end
|
|
133
|
-
|
|
134
|
+
|
|
135
|
+
@@use_group_by_shortcut = nil
|
|
134
136
|
# Checks to see if MySQL will allow simplistic GROUP BY statements. If not,
|
|
135
137
|
# or if not using MySQL, this will return false.
|
|
136
138
|
#
|
|
137
139
|
def self.use_group_by_shortcut?
|
|
138
|
-
!!(
|
|
140
|
+
@@use_group_by_shortcut ||= !!(
|
|
139
141
|
mysql? && ::ActiveRecord::Base.connection.select_all(
|
|
140
142
|
"SELECT @@global.sql_mode, @@session.sql_mode;"
|
|
141
143
|
).all? { |key,value| value.nil? || value[/ONLY_FULL_GROUP_BY/].nil? }
|
|
@@ -276,8 +276,7 @@ module ThinkingSphinx
|
|
|
276
276
|
"#{self.class.sphinx_indexes.first.name}_delta",
|
|
277
277
|
['sphinx_deleted'],
|
|
278
278
|
{self.sphinx_document_id => 1}
|
|
279
|
-
) if
|
|
280
|
-
self.class.sphinx_indexes.any? { |index| index.delta? } &&
|
|
279
|
+
) if self.class.sphinx_indexes.any? { |index| index.delta? } &&
|
|
281
280
|
self.toggled_delta?
|
|
282
281
|
rescue ::ThinkingSphinx::ConnectionError
|
|
283
282
|
# nothing
|
|
@@ -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,13 +101,14 @@ module ThinkingSphinx
|
|
|
101
101
|
when :datetime
|
|
102
102
|
adapter.cast_to_datetime(part)
|
|
103
103
|
when :multi
|
|
104
|
-
adapter.
|
|
104
|
+
part = adapter.cast_to_datetime(part) if is_many_datetimes?
|
|
105
|
+
part = adapter.convert_nulls(part, '0') if is_many_ints?
|
|
106
|
+
part
|
|
105
107
|
else
|
|
106
108
|
part
|
|
107
109
|
end
|
|
108
110
|
}.join(', ')
|
|
109
111
|
|
|
110
|
-
# clause = adapter.cast_to_datetime(clause) if type == :datetime
|
|
111
112
|
clause = adapter.crc(clause) if @crc
|
|
112
113
|
clause = adapter.concatenate(clause, separator) if concat_ws?
|
|
113
114
|
clause = adapter.group_concatenate(clause, separator) if is_many?
|
|
@@ -153,8 +154,6 @@ module ThinkingSphinx
|
|
|
153
154
|
def type
|
|
154
155
|
@type ||= begin
|
|
155
156
|
base_type = case
|
|
156
|
-
when is_many_datetimes?
|
|
157
|
-
:datetime
|
|
158
157
|
when is_many?, is_many_ints?
|
|
159
158
|
:multi
|
|
160
159
|
when @associations.values.flatten.length > 1
|
|
@@ -14,7 +14,7 @@ module ThinkingSphinx
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def method_missing(method, *args, &block)
|
|
17
|
-
string = @instance.send(method, *args, &block).to_s
|
|
17
|
+
string = CGI::escapeHTML @instance.send(method, *args, &block).to_s
|
|
18
18
|
|
|
19
19
|
@search.excerpt_for(string, @instance.class)
|
|
20
20
|
end
|
|
@@ -268,17 +268,6 @@ describe ThinkingSphinx::ActiveRecord do
|
|
|
268
268
|
@person.toggle_deleted
|
|
269
269
|
end
|
|
270
270
|
|
|
271
|
-
it "should not update the delta index if delta indexing is disabled" do
|
|
272
|
-
ThinkingSphinx.deltas_enabled = false
|
|
273
|
-
Person.sphinx_indexes.each { |index| index.stub!(:delta? => true) }
|
|
274
|
-
@person.delta = true
|
|
275
|
-
@client.should_not_receive(:update).with(
|
|
276
|
-
"person_delta", ["sphinx_deleted"], {@person.sphinx_document_id => 1}
|
|
277
|
-
)
|
|
278
|
-
|
|
279
|
-
@person.toggle_deleted
|
|
280
|
-
end
|
|
281
|
-
|
|
282
271
|
it "should not update either index if updates are disabled" do
|
|
283
272
|
ThinkingSphinx.updates_enabled = false
|
|
284
273
|
ThinkingSphinx.deltas_enabled = true
|
|
@@ -22,7 +22,7 @@ describe ThinkingSphinx::Attribute do
|
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
describe
|
|
25
|
+
describe '#unique_name' do
|
|
26
26
|
before :each do
|
|
27
27
|
@attribute = ThinkingSphinx::Attribute.new @source, [
|
|
28
28
|
stub('column', :__stack => [], :__name => "col_name")
|
|
@@ -47,7 +47,7 @@ describe ThinkingSphinx::Attribute do
|
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
-
describe
|
|
50
|
+
describe '#column_with_prefix' do
|
|
51
51
|
before :each do
|
|
52
52
|
@attribute = ThinkingSphinx::Attribute.new @source, [
|
|
53
53
|
ThinkingSphinx::Index::FauxColumn.new(:col_name)
|
|
@@ -101,7 +101,7 @@ describe ThinkingSphinx::Attribute do
|
|
|
101
101
|
end
|
|
102
102
|
end
|
|
103
103
|
|
|
104
|
-
describe
|
|
104
|
+
describe '#is_many?' do
|
|
105
105
|
before :each do
|
|
106
106
|
@assoc_a = stub('assoc', :is_many? => true)
|
|
107
107
|
@assoc_b = stub('assoc', :is_many? => true)
|
|
@@ -135,7 +135,7 @@ describe ThinkingSphinx::Attribute do
|
|
|
135
135
|
end
|
|
136
136
|
end
|
|
137
137
|
|
|
138
|
-
describe
|
|
138
|
+
describe '#is_string?' do
|
|
139
139
|
before :each do
|
|
140
140
|
@col_a = ThinkingSphinx::Index::FauxColumn.new("a")
|
|
141
141
|
@col_b = ThinkingSphinx::Index::FauxColumn.new("b")
|
|
@@ -163,7 +163,7 @@ describe ThinkingSphinx::Attribute do
|
|
|
163
163
|
end
|
|
164
164
|
end
|
|
165
165
|
|
|
166
|
-
describe
|
|
166
|
+
describe '#type' do
|
|
167
167
|
before :each do
|
|
168
168
|
@column = ThinkingSphinx::Index::FauxColumn.new(:col_name)
|
|
169
169
|
@attribute = ThinkingSphinx::Attribute.new(@source, [@column])
|
|
@@ -193,9 +193,16 @@ describe ThinkingSphinx::Attribute do
|
|
|
193
193
|
@column.send(:instance_variable_set, :@name, "id")
|
|
194
194
|
@attribute.send(:type).should == :integer
|
|
195
195
|
end
|
|
196
|
+
|
|
197
|
+
it "should return :multi if the columns return multiple datetimes" do
|
|
198
|
+
@attribute.stub!(:is_many? => true)
|
|
199
|
+
@attribute.stub!(:all_datetimes? => true)
|
|
200
|
+
|
|
201
|
+
@attribute.type.should == :multi
|
|
202
|
+
end
|
|
196
203
|
end
|
|
197
204
|
|
|
198
|
-
describe
|
|
205
|
+
describe '#all_ints?' do
|
|
199
206
|
it "should return true if all columns are integers" do
|
|
200
207
|
attribute = ThinkingSphinx::Attribute.new(@source,
|
|
201
208
|
[ ThinkingSphinx::Index::FauxColumn.new(:id),
|
|
@@ -230,7 +237,7 @@ describe ThinkingSphinx::Attribute do
|
|
|
230
237
|
end
|
|
231
238
|
end
|
|
232
239
|
|
|
233
|
-
describe
|
|
240
|
+
describe '#all_datetimes?' do
|
|
234
241
|
it "should return true if all columns are datetimes" do
|
|
235
242
|
attribute = ThinkingSphinx::Attribute.new(@source,
|
|
236
243
|
[ ThinkingSphinx::Index::FauxColumn.new(:created_at),
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|