thinking-sphinx 3.2.0 → 3.3.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +6 -2
- data/Appraisals +13 -0
- data/Gemfile +2 -1
- data/HISTORY +19 -0
- data/README.textile +3 -2
- data/gemfiles/rails_3_2.gemfile +2 -1
- data/gemfiles/rails_4_0.gemfile +2 -1
- data/gemfiles/rails_4_1.gemfile +2 -1
- data/gemfiles/rails_4_2.gemfile +2 -1
- data/gemfiles/rails_5_0.gemfile +12 -0
- data/lib/thinking_sphinx.rb +2 -0
- data/lib/thinking_sphinx/active_record/attribute/type.rb +17 -3
- data/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb +12 -4
- data/lib/thinking_sphinx/active_record/database_adapters.rb +1 -1
- data/lib/thinking_sphinx/active_record/sql_builder/query.rb +4 -0
- data/lib/thinking_sphinx/active_record/sql_source.rb +1 -1
- data/lib/thinking_sphinx/configuration.rb +3 -2
- data/lib/thinking_sphinx/connection.rb +23 -10
- data/lib/thinking_sphinx/deltas/index_job.rb +6 -2
- data/lib/thinking_sphinx/errors.rb +25 -0
- data/lib/thinking_sphinx/middlewares/active_record_translator.rb +14 -2
- data/lib/thinking_sphinx/railtie.rb +1 -1
- data/lib/thinking_sphinx/rake_interface.rb +71 -23
- data/lib/thinking_sphinx/real_time/callbacks/real_time_callbacks.rb +15 -7
- data/lib/thinking_sphinx/real_time/populator.rb +3 -3
- data/lib/thinking_sphinx/tasks.rb +7 -8
- data/lib/thinking_sphinx/wildcard.rb +1 -1
- data/spec/acceptance/association_scoping_spec.rb +5 -5
- data/spec/acceptance/attribute_access_spec.rb +4 -4
- data/spec/acceptance/attribute_updates_spec.rb +3 -3
- data/spec/acceptance/batch_searching_spec.rb +4 -4
- data/spec/acceptance/big_integers_spec.rb +6 -6
- data/spec/acceptance/connection_spec.rb +23 -0
- data/spec/acceptance/excerpts_spec.rb +8 -8
- data/spec/acceptance/facets_spec.rb +13 -13
- data/spec/acceptance/geosearching_spec.rb +8 -8
- data/spec/acceptance/grouping_by_attributes_spec.rb +10 -10
- data/spec/acceptance/index_options_spec.rb +16 -16
- data/spec/acceptance/indexing_spec.rb +3 -3
- data/spec/acceptance/paginating_search_results_spec.rb +3 -3
- data/spec/acceptance/real_time_updates_spec.rb +4 -4
- data/spec/acceptance/remove_deleted_records_spec.rb +12 -12
- data/spec/acceptance/search_counts_spec.rb +2 -2
- data/spec/acceptance/search_for_just_ids_spec.rb +2 -2
- data/spec/acceptance/searching_across_models_spec.rb +6 -6
- data/spec/acceptance/searching_across_schemas_spec.rb +10 -10
- data/spec/acceptance/searching_on_fields_spec.rb +9 -9
- data/spec/acceptance/searching_with_filters_spec.rb +16 -16
- data/spec/acceptance/searching_with_sti_spec.rb +9 -9
- data/spec/acceptance/searching_within_a_model_spec.rb +17 -17
- data/spec/acceptance/sorting_search_results_spec.rb +6 -6
- data/spec/acceptance/specifying_sql_spec.rb +62 -62
- data/spec/acceptance/sphinx_scopes_spec.rb +9 -9
- data/spec/acceptance/sql_deltas_spec.rb +7 -7
- data/spec/acceptance/support/database_cleaner.rb +1 -1
- data/spec/acceptance/support/sphinx_controller.rb +4 -1
- data/spec/acceptance/support/sphinx_helpers.rb +4 -0
- data/spec/acceptance/suspended_deltas_spec.rb +9 -9
- data/spec/internal/app/indices/article_index.rb +2 -2
- data/spec/internal/app/indices/book_index.rb +2 -1
- data/spec/internal/app/indices/product_index.rb +0 -2
- data/spec/internal/app/models/categorisation.rb +8 -1
- data/spec/spec_helper.rb +2 -0
- data/spec/support/json_column.rb +5 -1
- data/spec/support/multi_schema.rb +3 -1
- data/spec/support/sphinx_yaml_helpers.rb +1 -1
- data/spec/thinking_sphinx/active_record/association_spec.rb +1 -1
- data/spec/thinking_sphinx/active_record/attribute/type_spec.rb +41 -38
- data/spec/thinking_sphinx/active_record/base_spec.rb +29 -29
- data/spec/thinking_sphinx/active_record/callbacks/delete_callbacks_spec.rb +10 -10
- data/spec/thinking_sphinx/active_record/callbacks/delta_callbacks_spec.rb +48 -25
- data/spec/thinking_sphinx/active_record/callbacks/update_callbacks_spec.rb +8 -8
- data/spec/thinking_sphinx/active_record/column_spec.rb +13 -13
- data/spec/thinking_sphinx/active_record/column_sql_presenter_spec.rb +5 -5
- data/spec/thinking_sphinx/active_record/database_adapters/abstract_adapter_spec.rb +5 -5
- data/spec/thinking_sphinx/active_record/database_adapters/mysql_adapter_spec.rb +11 -11
- data/spec/thinking_sphinx/active_record/database_adapters/postgresql_adapter_spec.rb +13 -13
- data/spec/thinking_sphinx/active_record/database_adapters_spec.rb +48 -48
- data/spec/thinking_sphinx/active_record/field_spec.rb +7 -7
- data/spec/thinking_sphinx/active_record/filter_reflection_spec.rb +32 -32
- data/spec/thinking_sphinx/active_record/index_spec.rb +35 -36
- data/spec/thinking_sphinx/active_record/interpreter_spec.rb +51 -51
- data/spec/thinking_sphinx/active_record/polymorpher_spec.rb +14 -14
- data/spec/thinking_sphinx/active_record/property_sql_presenter_spec.rb +67 -67
- data/spec/thinking_sphinx/active_record/sql_builder_spec.rb +140 -140
- data/spec/thinking_sphinx/active_record/sql_source_spec.rb +97 -95
- data/spec/thinking_sphinx/configuration_spec.rb +81 -81
- data/spec/thinking_sphinx/connection_spec.rb +13 -13
- data/spec/thinking_sphinx/deletion_spec.rb +11 -11
- data/spec/thinking_sphinx/deltas/default_delta_spec.rb +20 -20
- data/spec/thinking_sphinx/deltas_spec.rb +12 -12
- data/spec/thinking_sphinx/errors_spec.rb +30 -30
- data/spec/thinking_sphinx/excerpter_spec.rb +7 -7
- data/spec/thinking_sphinx/facet_search_spec.rb +16 -16
- data/spec/thinking_sphinx/index_set_spec.rb +7 -7
- data/spec/thinking_sphinx/index_spec.rb +24 -24
- data/spec/thinking_sphinx/masks/pagination_mask_spec.rb +20 -20
- data/spec/thinking_sphinx/masks/scopes_mask_spec.rb +18 -18
- data/spec/thinking_sphinx/middlewares/active_record_translator_spec.rb +22 -22
- data/spec/thinking_sphinx/middlewares/geographer_spec.rb +9 -9
- data/spec/thinking_sphinx/middlewares/glazier_spec.rb +4 -4
- data/spec/thinking_sphinx/middlewares/inquirer_spec.rb +7 -7
- data/spec/thinking_sphinx/middlewares/sphinxql_spec.rb +53 -53
- data/spec/thinking_sphinx/middlewares/stale_id_checker_spec.rb +5 -5
- data/spec/thinking_sphinx/middlewares/stale_id_filter_spec.rb +15 -15
- data/spec/thinking_sphinx/panes/attributes_pane_spec.rb +1 -1
- data/spec/thinking_sphinx/panes/distance_pane_spec.rb +4 -4
- data/spec/thinking_sphinx/panes/excerpts_pane_spec.rb +5 -5
- data/spec/thinking_sphinx/panes/weight_pane_spec.rb +1 -1
- data/spec/thinking_sphinx/rake_interface_spec.rb +66 -53
- data/spec/thinking_sphinx/real_time/attribute_spec.rb +13 -13
- data/spec/thinking_sphinx/real_time/callbacks/real_time_callbacks_spec.rb +107 -23
- data/spec/thinking_sphinx/real_time/field_spec.rb +14 -14
- data/spec/thinking_sphinx/real_time/index_spec.rb +29 -30
- data/spec/thinking_sphinx/real_time/interpreter_spec.rb +30 -30
- data/spec/thinking_sphinx/scopes_spec.rb +5 -5
- data/spec/thinking_sphinx/search/glaze_spec.rb +15 -15
- data/spec/thinking_sphinx/search/query_spec.rb +10 -10
- data/spec/thinking_sphinx/search_spec.rb +28 -28
- data/spec/thinking_sphinx/wildcard_spec.rb +16 -11
- data/spec/thinking_sphinx_spec.rb +6 -6
- data/thinking-sphinx.gemspec +4 -4
- metadata +12 -9
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
class ThinkingSphinx::Middlewares::ActiveRecordTranslator <
|
|
2
2
|
ThinkingSphinx::Middlewares::Middleware
|
|
3
3
|
|
|
4
|
+
NO_MODEL = Struct.new(:primary_key).new(:id).freeze
|
|
5
|
+
|
|
4
6
|
def call(contexts)
|
|
5
7
|
contexts.each do |context|
|
|
6
8
|
Inner.new(context).call
|
|
@@ -42,6 +44,16 @@ class ThinkingSphinx::Middlewares::ActiveRecordTranslator <
|
|
|
42
44
|
}.uniq
|
|
43
45
|
end
|
|
44
46
|
|
|
47
|
+
def primary_key
|
|
48
|
+
@primary_key ||= primary_key_for NO_MODEL
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def primary_key_for(model)
|
|
52
|
+
model = NO_MODEL unless model.respond_to?(:primary_key)
|
|
53
|
+
|
|
54
|
+
context.configuration.settings['primary_key'] || model.primary_key || :id
|
|
55
|
+
end
|
|
56
|
+
|
|
45
57
|
def reset_memos
|
|
46
58
|
@model_names = nil
|
|
47
59
|
@results_for_models = nil
|
|
@@ -49,7 +61,7 @@ class ThinkingSphinx::Middlewares::ActiveRecordTranslator <
|
|
|
49
61
|
|
|
50
62
|
def result_for(row)
|
|
51
63
|
results_for_models[row['sphinx_internal_class']].detect { |record|
|
|
52
|
-
record.
|
|
64
|
+
record.public_send(primary_key) == row['sphinx_internal_id']
|
|
53
65
|
}
|
|
54
66
|
end
|
|
55
67
|
|
|
@@ -57,7 +69,7 @@ class ThinkingSphinx::Middlewares::ActiveRecordTranslator <
|
|
|
57
69
|
@results_for_models ||= model_names.inject({}) do |hash, name|
|
|
58
70
|
model = name.constantize
|
|
59
71
|
hash[name] = model_relation_with_sql_options(model.unscoped).where(
|
|
60
|
-
(
|
|
72
|
+
primary_key_for(model) => ids_for_model(name)
|
|
61
73
|
)
|
|
62
74
|
|
|
63
75
|
hash
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
class ThinkingSphinx::RakeInterface
|
|
2
|
+
def initialize(options = {})
|
|
3
|
+
@options = options
|
|
4
|
+
@options[:verbose] = false if @options[:silent]
|
|
5
|
+
end
|
|
6
|
+
|
|
2
7
|
def clear_all
|
|
3
8
|
[
|
|
4
9
|
configuration.indices_location,
|
|
@@ -9,6 +14,7 @@ class ThinkingSphinx::RakeInterface
|
|
|
9
14
|
end
|
|
10
15
|
|
|
11
16
|
def clear_real_time
|
|
17
|
+
configuration.preload_indices
|
|
12
18
|
indices = configuration.indices.select { |index| index.type == 'rt' }
|
|
13
19
|
indices.each do |index|
|
|
14
20
|
index.render
|
|
@@ -20,7 +26,7 @@ class ThinkingSphinx::RakeInterface
|
|
|
20
26
|
end
|
|
21
27
|
|
|
22
28
|
def configure
|
|
23
|
-
|
|
29
|
+
log "Generating configuration to #{configuration.configuration_file}"
|
|
24
30
|
configuration.render_to_file
|
|
25
31
|
end
|
|
26
32
|
|
|
@@ -36,6 +42,8 @@ class ThinkingSphinx::RakeInterface
|
|
|
36
42
|
FileUtils.mkdir_p configuration.indices_location
|
|
37
43
|
ThinkingSphinx.before_index_hooks.each { |hook| hook.call }
|
|
38
44
|
controller.index :verbose => verbose
|
|
45
|
+
rescue Riddle::CommandFailedError => error
|
|
46
|
+
handle_command_failure 'indexing', error.command_result
|
|
39
47
|
end
|
|
40
48
|
|
|
41
49
|
def prepare
|
|
@@ -45,30 +53,18 @@ class ThinkingSphinx::RakeInterface
|
|
|
45
53
|
FileUtils.mkdir_p configuration.indices_location
|
|
46
54
|
end
|
|
47
55
|
|
|
48
|
-
def start
|
|
49
|
-
|
|
56
|
+
def start
|
|
57
|
+
if running?
|
|
58
|
+
raise ThinkingSphinx::SphinxAlreadyRunning, 'searchd is already running'
|
|
59
|
+
end
|
|
50
60
|
|
|
51
61
|
FileUtils.mkdir_p configuration.indices_location
|
|
52
62
|
|
|
53
|
-
|
|
54
|
-
unless pid = fork
|
|
55
|
-
controller.start(options)
|
|
56
|
-
end
|
|
57
|
-
Signal.trap('TERM') { Process.kill(:TERM, pid); }
|
|
58
|
-
Signal.trap('INT') { Process.kill(:TERM, pid); }
|
|
59
|
-
Process.wait(pid)
|
|
60
|
-
else
|
|
61
|
-
controller.start(options)
|
|
62
|
-
if controller.running?
|
|
63
|
-
puts "Started searchd successfully (pid: #{controller.pid})."
|
|
64
|
-
else
|
|
65
|
-
puts "Failed to start searchd. Check the log files for more information."
|
|
66
|
-
end
|
|
67
|
-
end
|
|
63
|
+
options[:nodetach] ? start_attached : start_detached
|
|
68
64
|
end
|
|
69
65
|
|
|
70
66
|
def status
|
|
71
|
-
if
|
|
67
|
+
if running?
|
|
72
68
|
puts "The Sphinx daemon searchd is currently running."
|
|
73
69
|
else
|
|
74
70
|
puts "The Sphinx daemon searchd is not currently running."
|
|
@@ -76,23 +72,75 @@ class ThinkingSphinx::RakeInterface
|
|
|
76
72
|
end
|
|
77
73
|
|
|
78
74
|
def stop
|
|
79
|
-
unless
|
|
80
|
-
|
|
75
|
+
unless running?
|
|
76
|
+
log 'searchd is not currently running.' and return
|
|
81
77
|
end
|
|
82
78
|
|
|
83
79
|
pid = controller.pid
|
|
84
|
-
until
|
|
80
|
+
until !running? do
|
|
81
|
+
controller.stop options
|
|
85
82
|
sleep(0.5)
|
|
86
83
|
end
|
|
87
84
|
|
|
88
|
-
|
|
85
|
+
log "Stopped searchd daemon (pid: #{pid})."
|
|
86
|
+
rescue Riddle::CommandFailedError => error
|
|
87
|
+
handle_command_failure 'stop', error.command_result
|
|
89
88
|
end
|
|
90
89
|
|
|
91
90
|
private
|
|
92
91
|
|
|
92
|
+
attr_reader :options
|
|
93
|
+
|
|
93
94
|
delegate :controller, :to => :configuration
|
|
95
|
+
delegate :running?, :to => :controller
|
|
96
|
+
|
|
97
|
+
def command_output(output)
|
|
98
|
+
return "See above\n" if output.nil?
|
|
99
|
+
|
|
100
|
+
"\n\t" + output.gsub("\n", "\n\t")
|
|
101
|
+
end
|
|
94
102
|
|
|
95
103
|
def configuration
|
|
96
104
|
ThinkingSphinx::Configuration.instance
|
|
97
105
|
end
|
|
106
|
+
|
|
107
|
+
def handle_command_failure(type, result)
|
|
108
|
+
puts <<-TXT
|
|
109
|
+
|
|
110
|
+
The Sphinx #{type} command failed:
|
|
111
|
+
Command: #{result.command}
|
|
112
|
+
Status: #{result.status}
|
|
113
|
+
Output: #{command_output result.output}
|
|
114
|
+
There may be more information about the failure in #{configuration.searchd.log}.
|
|
115
|
+
TXT
|
|
116
|
+
exit result.status
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def log(message)
|
|
120
|
+
return if options[:silent]
|
|
121
|
+
|
|
122
|
+
puts message
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def start_attached
|
|
126
|
+
unless pid = fork
|
|
127
|
+
controller.start :verbose => options[:verbose]
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
Signal.trap('TERM') { Process.kill(:TERM, pid); }
|
|
131
|
+
Signal.trap('INT') { Process.kill(:TERM, pid); }
|
|
132
|
+
Process.wait(pid)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def start_detached
|
|
136
|
+
result = controller.start :verbose => options[:verbose]
|
|
137
|
+
|
|
138
|
+
if running?
|
|
139
|
+
log "Started searchd successfully (pid: #{controller.pid})."
|
|
140
|
+
else
|
|
141
|
+
handle_command_failure 'start', result
|
|
142
|
+
end
|
|
143
|
+
rescue Riddle::CommandFailedError => error
|
|
144
|
+
handle_command_failure 'start', error.command_result
|
|
145
|
+
end
|
|
98
146
|
end
|
|
@@ -3,14 +3,12 @@ class ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks
|
|
|
3
3
|
@reference, @path, @block = reference, path, block
|
|
4
4
|
end
|
|
5
5
|
|
|
6
|
-
def
|
|
7
|
-
|
|
6
|
+
def after_commit(instance)
|
|
7
|
+
persist_changes instance
|
|
8
|
+
end
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
ThinkingSphinx::RealTime::Transcriber.new(index).copy object
|
|
12
|
-
end
|
|
13
|
-
end
|
|
10
|
+
def after_save(instance)
|
|
11
|
+
persist_changes instance
|
|
14
12
|
end
|
|
15
13
|
|
|
16
14
|
private
|
|
@@ -40,6 +38,16 @@ class ThinkingSphinx::RealTime::Callbacks::RealTimeCallbacks
|
|
|
40
38
|
Array results
|
|
41
39
|
end
|
|
42
40
|
|
|
41
|
+
def persist_changes(instance)
|
|
42
|
+
return unless real_time_indices? && callbacks_enabled?
|
|
43
|
+
|
|
44
|
+
real_time_indices.each do |index|
|
|
45
|
+
objects_for(instance).each do |object|
|
|
46
|
+
ThinkingSphinx::RealTime::Transcriber.new(index).copy object
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
43
51
|
def real_time_indices?
|
|
44
52
|
real_time_indices.any?
|
|
45
53
|
end
|
|
@@ -12,7 +12,7 @@ class ThinkingSphinx::RealTime::Populator
|
|
|
12
12
|
|
|
13
13
|
remove_files
|
|
14
14
|
|
|
15
|
-
scope.find_in_batches do |instances|
|
|
15
|
+
scope.find_in_batches(:batch_size => batch_size) do |instances|
|
|
16
16
|
transcriber.copy *instances
|
|
17
17
|
instrument 'populated', :instances => instances
|
|
18
18
|
end
|
|
@@ -25,8 +25,8 @@ class ThinkingSphinx::RealTime::Populator
|
|
|
25
25
|
|
|
26
26
|
attr_reader :index
|
|
27
27
|
|
|
28
|
-
delegate :controller, :to => :configuration
|
|
29
|
-
delegate :scope,
|
|
28
|
+
delegate :controller, :batch_size, :to => :configuration
|
|
29
|
+
delegate :scope, :to => :index
|
|
30
30
|
|
|
31
31
|
def configuration
|
|
32
32
|
ThinkingSphinx::Configuration.instance
|
|
@@ -6,10 +6,7 @@ namespace :ts do
|
|
|
6
6
|
|
|
7
7
|
desc 'Generate the Sphinx configuration file and process all indices'
|
|
8
8
|
task :index => :environment do
|
|
9
|
-
interface.index(
|
|
10
|
-
ENV['INDEX_ONLY'] != 'true',
|
|
11
|
-
!Rake.application.options.silent
|
|
12
|
-
)
|
|
9
|
+
interface.index(ENV['INDEX_ONLY'] != 'true')
|
|
13
10
|
end
|
|
14
11
|
|
|
15
12
|
desc 'Clear out Sphinx files'
|
|
@@ -39,9 +36,7 @@ namespace :ts do
|
|
|
39
36
|
|
|
40
37
|
desc 'Start the Sphinx daemon'
|
|
41
38
|
task :start => :environment do
|
|
42
|
-
|
|
43
|
-
options[:nodetach] = true if ENV['NODETACH'] == 'true'
|
|
44
|
-
interface.start(options)
|
|
39
|
+
interface.start
|
|
45
40
|
end
|
|
46
41
|
|
|
47
42
|
desc 'Stop the Sphinx daemon'
|
|
@@ -55,6 +50,10 @@ namespace :ts do
|
|
|
55
50
|
end
|
|
56
51
|
|
|
57
52
|
def interface
|
|
58
|
-
@interface ||= ThinkingSphinx::RakeInterface.new
|
|
53
|
+
@interface ||= ThinkingSphinx::RakeInterface.new(
|
|
54
|
+
:verbose => Rake::FileUtilsExt.verbose_flag,
|
|
55
|
+
:silent => Rake.application.options.silent,
|
|
56
|
+
:nodetach => (ENV['NODETACH'] == 'true')
|
|
57
|
+
)
|
|
59
58
|
end
|
|
60
59
|
end
|
|
@@ -14,7 +14,7 @@ class ThinkingSphinx::Wildcard
|
|
|
14
14
|
query.gsub(extended_pattern) do
|
|
15
15
|
pre, proper, post = $`, $&, $'
|
|
16
16
|
# E.g. "@foo", "/2", "~3", but not as part of a token pattern
|
|
17
|
-
is_operator = pre
|
|
17
|
+
is_operator = pre.match(%r{@$}) ||
|
|
18
18
|
pre.match(%r{([^\\]+|\A)[~/]\Z}) ||
|
|
19
19
|
pre.match(%r{(\W|^)@\([^\)]*$})
|
|
20
20
|
# E.g. "foo bar", with quotes
|
|
@@ -9,7 +9,7 @@ describe 'Scoping association search calls by foreign keys', :live => true do
|
|
|
9
9
|
dublin = Article.create :title => 'Guide to Dublin', :user => paul
|
|
10
10
|
index
|
|
11
11
|
|
|
12
|
-
pat.articles.search('Guide').to_a.
|
|
12
|
+
expect(pat.articles.search('Guide').to_a).to eq([melbourne])
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
it "limits id-only results to those matching the foreign key" do
|
|
@@ -19,7 +19,7 @@ describe 'Scoping association search calls by foreign keys', :live => true do
|
|
|
19
19
|
dublin = Article.create :title => 'Guide to Dublin', :user => paul
|
|
20
20
|
index
|
|
21
21
|
|
|
22
|
-
pat.articles.search_for_ids('Guide').to_a.
|
|
22
|
+
expect(pat.articles.search_for_ids('Guide').to_a).to eq([melbourne.id])
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
25
|
|
|
@@ -31,7 +31,7 @@ describe 'Scoping association search calls by foreign keys', :live => true do
|
|
|
31
31
|
audi = Manufacturer.create :name => 'Audi'
|
|
32
32
|
r_eight = Car.create :name => 'R8 Spyder', :manufacturer => audi
|
|
33
33
|
|
|
34
|
-
porsche.cars.search('Spyder').to_a.
|
|
34
|
+
expect(porsche.cars.search('Spyder').to_a).to eq([spyder])
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
it "limits id-only results to those matching the foreign key" do
|
|
@@ -41,7 +41,7 @@ describe 'Scoping association search calls by foreign keys', :live => true do
|
|
|
41
41
|
audi = Manufacturer.create :name => 'Audi'
|
|
42
42
|
r_eight = Car.create :name => 'R8 Spyder', :manufacturer => audi
|
|
43
43
|
|
|
44
|
-
porsche.cars.search_for_ids('Spyder').to_a.
|
|
44
|
+
expect(porsche.cars.search_for_ids('Spyder').to_a).to eq([spyder.id])
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
|
|
@@ -57,7 +57,7 @@ describe 'Scoping association search calls by foreign keys', :live => true do
|
|
|
57
57
|
pancakes.categories << flat
|
|
58
58
|
waffles.categories << food
|
|
59
59
|
|
|
60
|
-
flat.products.search('Low').to_a.
|
|
60
|
+
expect(flat.products.search('Low').to_a).to eq([pancakes])
|
|
61
61
|
end
|
|
62
62
|
end
|
|
63
63
|
end
|
|
@@ -8,7 +8,7 @@ describe 'Accessing attributes directly via search results', :live => true do
|
|
|
8
8
|
search = Book.search('gods')
|
|
9
9
|
search.context[:panes] << ThinkingSphinx::Panes::AttributesPane
|
|
10
10
|
|
|
11
|
-
search.first.sphinx_attributes['year'].
|
|
11
|
+
expect(search.first.sphinx_attributes['year']).to eq(2001)
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
it "provides direct access to the search weight/relevance scores" do
|
|
@@ -19,7 +19,7 @@ describe 'Accessing attributes directly via search results', :live => true do
|
|
|
19
19
|
:select => "*, #{ThinkingSphinx::SphinxQL.weight[:select]}"
|
|
20
20
|
search.context[:panes] << ThinkingSphinx::Panes::WeightPane
|
|
21
21
|
|
|
22
|
-
search.first.weight.
|
|
22
|
+
expect(search.first.weight).to eq(2500)
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
it "can enumerate with the weight" do
|
|
@@ -34,8 +34,8 @@ describe 'Accessing attributes directly via search results', :live => true do
|
|
|
34
34
|
search.each_with_weight do |result, weight|
|
|
35
35
|
expectation = expectations.shift
|
|
36
36
|
|
|
37
|
-
result.
|
|
38
|
-
weight.
|
|
37
|
+
expect(result).to eq(expectation.first)
|
|
38
|
+
expect(weight).to eq(expectation.last)
|
|
39
39
|
end
|
|
40
40
|
end
|
|
41
41
|
end
|
|
@@ -5,12 +5,12 @@ describe 'Update attributes automatically where possible', :live => true do
|
|
|
5
5
|
article = Article.create :title => 'Pancakes', :published => false
|
|
6
6
|
index
|
|
7
7
|
|
|
8
|
-
Article.search('pancakes', :with => {:published => true}).
|
|
8
|
+
expect(Article.search('pancakes', :with => {:published => true})).to be_empty
|
|
9
9
|
|
|
10
10
|
article.published = true
|
|
11
11
|
article.save
|
|
12
12
|
|
|
13
|
-
Article.search('pancakes', :with => {:published => true}).to_a
|
|
14
|
-
.
|
|
13
|
+
expect(Article.search('pancakes', :with => {:published => true}).to_a)
|
|
14
|
+
.to eq([article])
|
|
15
15
|
end
|
|
16
16
|
end
|
|
@@ -12,10 +12,10 @@ describe 'Executing multiple searches in one Sphinx call', :live => true do
|
|
|
12
12
|
|
|
13
13
|
batch.populate
|
|
14
14
|
|
|
15
|
-
batch.searches.first.
|
|
16
|
-
batch.searches.first.
|
|
15
|
+
expect(batch.searches.first).to include(pancakes)
|
|
16
|
+
expect(batch.searches.first).not_to include(waffles)
|
|
17
17
|
|
|
18
|
-
batch.searches.last.
|
|
19
|
-
batch.searches.last.
|
|
18
|
+
expect(batch.searches.last).to include(waffles)
|
|
19
|
+
expect(batch.searches.last).not_to include(pancakes)
|
|
20
20
|
end
|
|
21
21
|
end
|
|
@@ -21,17 +21,17 @@ describe '64 bit integer support' do
|
|
|
21
21
|
[small_index, large_index, real_time_index]
|
|
22
22
|
).reconcile
|
|
23
23
|
|
|
24
|
-
large_index.sources.first.attributes.detect { |attribute|
|
|
24
|
+
expect(large_index.sources.first.attributes.detect { |attribute|
|
|
25
25
|
attribute.name == 'sphinx_internal_id'
|
|
26
|
-
}.type.
|
|
26
|
+
}.type).to eq(:bigint)
|
|
27
27
|
|
|
28
|
-
small_index.sources.first.attributes.detect { |attribute|
|
|
28
|
+
expect(small_index.sources.first.attributes.detect { |attribute|
|
|
29
29
|
attribute.name == 'sphinx_internal_id'
|
|
30
|
-
}.type.
|
|
30
|
+
}.type).to eq(:bigint)
|
|
31
31
|
|
|
32
|
-
real_time_index.attributes.detect { |attribute|
|
|
32
|
+
expect(real_time_index.attributes.detect { |attribute|
|
|
33
33
|
attribute.name == 'sphinx_internal_id'
|
|
34
|
-
}.type.
|
|
34
|
+
}.type).to eq(:bigint)
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
37
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'acceptance/spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe 'Connections', :live => true do
|
|
4
|
+
let(:maximum) { (2 ** 23) - 1 }
|
|
5
|
+
let(:query) { "SELECT * FROM book_core WHERE MATCH('')" }
|
|
6
|
+
let(:difference) { maximum - query.length }
|
|
7
|
+
|
|
8
|
+
it 'allows normal length queries through' do
|
|
9
|
+
expect {
|
|
10
|
+
ThinkingSphinx::Connection.take do |connection|
|
|
11
|
+
connection.execute query.insert(-3, 'a' * difference)
|
|
12
|
+
end
|
|
13
|
+
}.to_not raise_error#(ThinkingSphinx::QueryLengthError)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'does not allow overly long queries' do
|
|
17
|
+
expect {
|
|
18
|
+
ThinkingSphinx::Connection.take do |connection|
|
|
19
|
+
connection.execute query.insert(-3, 'a' * (difference + 1))
|
|
20
|
+
end
|
|
21
|
+
}.to raise_error(ThinkingSphinx::QueryLengthError)
|
|
22
|
+
end
|
|
23
|
+
end
|