thinking-sphinx 4.4.1 → 5.4.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/.circleci/config.yml +218 -0
- data/.travis.yml +12 -21
- data/Appraisals +16 -19
- data/CHANGELOG.markdown +93 -0
- data/README.textile +17 -17
- data/bin/loadsphinx +22 -4
- data/lib/thinking_sphinx/active_record/association_proxy/attribute_finder.rb +1 -1
- data/lib/thinking_sphinx/active_record/attribute/sphinx_presenter.rb +1 -1
- data/lib/thinking_sphinx/active_record/base.rb +2 -6
- data/lib/thinking_sphinx/active_record/callbacks/association_delta_callbacks.rb +21 -0
- data/lib/thinking_sphinx/active_record/callbacks/delete_callbacks.rb +6 -2
- data/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb +3 -2
- data/lib/thinking_sphinx/active_record/callbacks/update_callbacks.rb +1 -1
- data/lib/thinking_sphinx/active_record/interpreter.rb +4 -4
- data/lib/thinking_sphinx/active_record/sql_source/template.rb +2 -2
- data/lib/thinking_sphinx/active_record/sql_source.rb +12 -0
- data/lib/thinking_sphinx/active_record.rb +3 -0
- data/lib/thinking_sphinx/callbacks/appender.rb +63 -0
- data/lib/thinking_sphinx/callbacks.rb +9 -0
- data/lib/thinking_sphinx/connection/client.rb +6 -1
- data/lib/thinking_sphinx/connection.rb +4 -0
- data/lib/thinking_sphinx/core/index.rb +1 -2
- data/lib/thinking_sphinx/deletion.rb +18 -17
- data/lib/thinking_sphinx/errors.rb +1 -1
- data/lib/thinking_sphinx/index_set.rb +7 -3
- data/lib/thinking_sphinx/middlewares/sphinxql.rb +1 -1
- data/lib/thinking_sphinx/railtie.rb +20 -7
- data/lib/thinking_sphinx/real_time/index/template.rb +12 -0
- data/lib/thinking_sphinx/real_time/index.rb +5 -3
- data/lib/thinking_sphinx/real_time/interpreter.rb +8 -6
- data/lib/thinking_sphinx/real_time/populator.rb +4 -1
- data/lib/thinking_sphinx/real_time/transcriber.rb +41 -19
- data/lib/thinking_sphinx/real_time/translator.rb +1 -0
- data/lib/thinking_sphinx/search/stale_ids_exception.rb +2 -1
- data/lib/thinking_sphinx/search.rb +1 -1
- data/lib/thinking_sphinx/settings.rb +13 -9
- data/lib/thinking_sphinx/sinatra.rb +1 -1
- data/lib/thinking_sphinx/test.rb +1 -1
- data/lib/thinking_sphinx.rb +0 -3
- data/spec/acceptance/attribute_access_spec.rb +10 -2
- data/spec/acceptance/big_integers_spec.rb +1 -1
- data/spec/acceptance/geosearching_spec.rb +13 -3
- data/spec/acceptance/merging_spec.rb +1 -1
- data/spec/acceptance/paginating_search_results_spec.rb +18 -2
- data/spec/acceptance/real_time_updates_spec.rb +2 -2
- data/spec/acceptance/searching_with_filters_spec.rb +3 -3
- data/spec/acceptance/sql_deltas_spec.rb +16 -4
- data/spec/acceptance/support/sphinx_controller.rb +6 -4
- data/spec/acceptance/support/sphinx_helpers.rb +4 -4
- data/spec/acceptance/suspended_deltas_spec.rb +3 -3
- data/spec/internal/app/indices/article_index.rb +0 -1
- data/spec/internal/app/indices/colour_index.rb +7 -0
- data/spec/internal/app/models/admin/person.rb +3 -1
- data/spec/internal/app/models/album.rb +3 -1
- data/spec/internal/app/models/animal.rb +1 -0
- data/spec/internal/app/models/article.rb +2 -0
- data/spec/internal/app/models/bird.rb +1 -0
- data/spec/internal/app/models/book.rb +2 -0
- data/spec/internal/app/models/car.rb +1 -1
- data/spec/internal/app/models/city.rb +2 -0
- data/spec/internal/app/models/colour.rb +2 -0
- data/spec/internal/app/models/product.rb +1 -1
- data/spec/internal/app/models/tee.rb +5 -0
- data/spec/internal/app/models/user.rb +2 -0
- data/spec/internal/config/database.yml +6 -1
- data/spec/internal/db/schema.rb +1 -0
- data/spec/thinking_sphinx/active_record/callbacks/update_callbacks_spec.rb +2 -1
- data/spec/thinking_sphinx/active_record/index_spec.rb +3 -13
- data/spec/thinking_sphinx/active_record/interpreter_spec.rb +15 -14
- data/spec/thinking_sphinx/active_record/sql_source_spec.rb +41 -3
- data/spec/thinking_sphinx/connection/mri_spec.rb +49 -0
- data/spec/thinking_sphinx/deletion_spec.rb +5 -4
- data/spec/thinking_sphinx/index_set_spec.rb +28 -12
- data/spec/thinking_sphinx/middlewares/sphinxql_spec.rb +2 -1
- data/spec/thinking_sphinx/real_time/index_spec.rb +51 -13
- data/spec/thinking_sphinx/real_time/interpreter_spec.rb +14 -14
- data/spec/thinking_sphinx/real_time/transcriber_spec.rb +9 -1
- data/thinking-sphinx.gemspec +3 -3
- metadata +17 -12
- data/spec/acceptance/connection_spec.rb +0 -25
@@ -11,14 +11,16 @@ class ThinkingSphinx::Settings
|
|
11
11
|
lemmatizer_base mysql_ssl_cert mysql_ssl_key mysql_ssl_ca
|
12
12
|
].freeze
|
13
13
|
DEFAULTS = {
|
14
|
-
"configuration_file"
|
15
|
-
"indices_location"
|
16
|
-
"pid_file"
|
17
|
-
"log"
|
18
|
-
"query_log"
|
19
|
-
"binlog_path"
|
20
|
-
"workers"
|
21
|
-
"mysql_encoding"
|
14
|
+
"configuration_file" => "config/ENVIRONMENT.sphinx.conf",
|
15
|
+
"indices_location" => "db/sphinx/ENVIRONMENT",
|
16
|
+
"pid_file" => "log/ENVIRONMENT.sphinx.pid",
|
17
|
+
"log" => "log/ENVIRONMENT.searchd.log",
|
18
|
+
"query_log" => "log/ENVIRONMENT.searchd.query.log",
|
19
|
+
"binlog_path" => "tmp/binlog/ENVIRONMENT",
|
20
|
+
"workers" => "threads",
|
21
|
+
"mysql_encoding" => "utf8",
|
22
|
+
"maximum_statement_length" => (2 ** 23) - 5,
|
23
|
+
"real_time_tidy" => false
|
22
24
|
}.freeze
|
23
25
|
|
24
26
|
def self.call(configuration)
|
@@ -62,7 +64,9 @@ class ThinkingSphinx::Settings
|
|
62
64
|
|
63
65
|
def defaults
|
64
66
|
DEFAULTS.inject({}) do |hash, (key, value)|
|
65
|
-
|
67
|
+
if value.is_a?(String)
|
68
|
+
value = value.gsub("ENVIRONMENT", framework.environment)
|
69
|
+
end
|
66
70
|
|
67
71
|
if FILE_KEYS.include?(key)
|
68
72
|
hash[key] = absolute value
|
data/lib/thinking_sphinx/test.rb
CHANGED
data/lib/thinking_sphinx.rb
CHANGED
@@ -17,8 +17,6 @@ require 'active_support/core_ext/module/delegation'
|
|
17
17
|
require 'active_support/core_ext/module/attribute_accessors'
|
18
18
|
|
19
19
|
module ThinkingSphinx
|
20
|
-
MAXIMUM_STATEMENT_LENGTH = (2 ** 23) - 5
|
21
|
-
|
22
20
|
def self.count(query = '', options = {})
|
23
21
|
search_for_ids(query, options).total_entries
|
24
22
|
end
|
@@ -98,7 +96,6 @@ require 'thinking_sphinx/test'
|
|
98
96
|
require 'thinking_sphinx/utf8'
|
99
97
|
require 'thinking_sphinx/wildcard'
|
100
98
|
# Extended
|
101
|
-
require 'thinking_sphinx/active_record'
|
102
99
|
require 'thinking_sphinx/deltas'
|
103
100
|
require 'thinking_sphinx/distributed'
|
104
101
|
require 'thinking_sphinx/logger'
|
@@ -20,7 +20,11 @@ describe 'Accessing attributes directly via search results', :live => true do
|
|
20
20
|
search = Book.search 'gods', :select => "*, weight()"
|
21
21
|
search.context[:panes] << ThinkingSphinx::Panes::WeightPane
|
22
22
|
|
23
|
-
|
23
|
+
if ENV["SPHINX_ENGINE"] == "sphinx" && ENV["SPHINX_VERSION"].to_f > 3.3
|
24
|
+
expect(search.first.weight).to eq(20_000.0)
|
25
|
+
else
|
26
|
+
expect(search.first.weight).to eq(2500)
|
27
|
+
end
|
24
28
|
end
|
25
29
|
|
26
30
|
it "provides direct access to the weight with alternative primary keys" do
|
@@ -39,7 +43,11 @@ describe 'Accessing attributes directly via search results', :live => true do
|
|
39
43
|
search = Book.search 'gods', :select => "*, weight()"
|
40
44
|
search.masks << ThinkingSphinx::Masks::WeightEnumeratorMask
|
41
45
|
|
42
|
-
|
46
|
+
if ENV["SPHINX_ENGINE"] == "sphinx" && ENV["SPHINX_VERSION"].to_f > 3.3
|
47
|
+
expectations = [[gods, 20_000.0]]
|
48
|
+
else
|
49
|
+
expectations = [[gods, 2500]]
|
50
|
+
end
|
43
51
|
search.each_with_weight do |result, weight|
|
44
52
|
expectation = expectations.shift
|
45
53
|
|
@@ -52,7 +52,7 @@ describe '64 bit document ids', :live => true do
|
|
52
52
|
context 'with Real-Time' do
|
53
53
|
it 'handles large 32 bit integers with an offset multiplier' do
|
54
54
|
product = Product.create! :name => "Widget"
|
55
|
-
product.
|
55
|
+
product.update :id => 980190962
|
56
56
|
expect(
|
57
57
|
Product.search('widget', :indices => ['product_core']).to_a
|
58
58
|
).to eq([product])
|
@@ -38,10 +38,20 @@ describe 'Searching by latitude and longitude', :live => true do
|
|
38
38
|
expected = {:mysql => 250326.906250, :postgresql => 250331.234375}
|
39
39
|
end
|
40
40
|
|
41
|
-
|
42
|
-
|
41
|
+
adapter = nil
|
42
|
+
|
43
|
+
if ActiveRecord::VERSION::STRING.to_f > 6.0
|
44
|
+
adapter = ActiveRecord::Base.configurations.configs_for.first.adapter
|
45
|
+
elsif ActiveRecord::VERSION::STRING.to_f > 5.2
|
46
|
+
adapter = ActiveRecord::Base.configurations.configs_for.first.config["adapter"]
|
47
|
+
else
|
48
|
+
adapter = ActiveRecord::Base.configurations['test']['adapter']
|
49
|
+
end
|
50
|
+
|
51
|
+
if adapter[/postgres/]
|
52
|
+
expect(cities.first.geodist).to be_within(0.01).of(expected[:postgresql])
|
43
53
|
else # mysql
|
44
|
-
expect(cities.first.geodist).to
|
54
|
+
expect(cities.first.geodist).to be_within(0.01).of(expected[:mysql])
|
45
55
|
end
|
46
56
|
end
|
47
57
|
|
@@ -34,7 +34,7 @@ describe "Merging deltas", :live => true do
|
|
34
34
|
Book.search("Space", :indices => ["book_core"]).to_a
|
35
35
|
).to eq([race])
|
36
36
|
|
37
|
-
race.reload.
|
37
|
+
race.reload.update :title => "The Hate Race"
|
38
38
|
sleep 0.25
|
39
39
|
expect(
|
40
40
|
Book.search("Race", :indices => ["book_delta"]).to_a
|
@@ -4,13 +4,22 @@ require 'acceptance/spec_helper'
|
|
4
4
|
|
5
5
|
describe 'Paginating search results', :live => true do
|
6
6
|
it "tracks how many results there are in total" do
|
7
|
+
expect(Article.search.total_entries).to be_zero
|
8
|
+
|
7
9
|
21.times { |number| Article.create :title => "Article #{number}" }
|
8
10
|
index
|
9
11
|
|
10
|
-
|
12
|
+
if ENV["SPHINX_ENGINE"] == "manticore" && ENV["SPHINX_VERSION"].to_f >= 4.0
|
13
|
+
# I suspect this is a bug in Manticore?
|
14
|
+
expect(Article.search.total_entries).to eq(22)
|
15
|
+
else
|
16
|
+
expect(Article.search.total_entries).to eq(21)
|
17
|
+
end
|
11
18
|
end
|
12
19
|
|
13
20
|
it "paginates the result set by default" do
|
21
|
+
expect(Article.search.total_entries).to be_zero
|
22
|
+
|
14
23
|
21.times { |number| Article.create :title => "Article #{number}" }
|
15
24
|
index
|
16
25
|
|
@@ -18,9 +27,16 @@ describe 'Paginating search results', :live => true do
|
|
18
27
|
end
|
19
28
|
|
20
29
|
it "tracks the number of pages" do
|
30
|
+
expect(Article.search.total_entries).to be_zero
|
31
|
+
|
21
32
|
21.times { |number| Article.create :title => "Article #{number}" }
|
22
33
|
index
|
23
34
|
|
24
|
-
|
35
|
+
if ENV["SPHINX_ENGINE"] == "manticore" && ENV["SPHINX_VERSION"].to_f >= 4.0
|
36
|
+
# I suspect this is a bug in Manticore?
|
37
|
+
expect(Article.search.total_pages).to eq(1)
|
38
|
+
else
|
39
|
+
expect(Article.search.total_pages).to eq(2)
|
40
|
+
end
|
25
41
|
end
|
26
42
|
end
|
@@ -11,7 +11,7 @@ describe 'Updates to records in real-time indices', :live => true do
|
|
11
11
|
|
12
12
|
it "handles attributes for sortable fields accordingly" do
|
13
13
|
product = Product.create! :name => 'Red Fish'
|
14
|
-
product.
|
14
|
+
product.update :name => 'Blue Fish'
|
15
15
|
|
16
16
|
expect(Product.search('blue fish', :indices => ['product_core']).to_a).
|
17
17
|
to eq([product])
|
@@ -22,7 +22,7 @@ describe 'Updates to records in real-time indices', :live => true do
|
|
22
22
|
|
23
23
|
expect(Admin::Person.search('Death').to_a).to eq([person])
|
24
24
|
|
25
|
-
person.
|
25
|
+
person.update :name => 'Mort'
|
26
26
|
|
27
27
|
expect(Admin::Person.search('Death').to_a).to be_empty
|
28
28
|
expect(Admin::Person.search('Mort').to_a).to eq([person])
|
@@ -17,7 +17,7 @@ describe 'Searching with filters', :live => true do
|
|
17
17
|
grave = Book.create! :title => 'The Graveyard Book', :year => 2009
|
18
18
|
index
|
19
19
|
|
20
|
-
expect(Book.search(:with => {:year => [2001, 2005]}).to_a).to
|
20
|
+
expect(Book.search(:with => {:year => [2001, 2005]}).to_a).to match_array([gods, boys])
|
21
21
|
end
|
22
22
|
|
23
23
|
it "limits results by a ranged filter" do
|
@@ -31,7 +31,7 @@ describe 'Searching with filters', :live => true do
|
|
31
31
|
index
|
32
32
|
|
33
33
|
expect(Book.search(:with => {:created_at => 6.days.ago..2.days.ago}).to_a).
|
34
|
-
to
|
34
|
+
to match_array([gods, boys])
|
35
35
|
end
|
36
36
|
|
37
37
|
it "limits results by exclusive filters on single values" do
|
@@ -154,6 +154,6 @@ describe 'Searching with filters', :live => true do
|
|
154
154
|
expect(products.to_a).to eq([pancakes])
|
155
155
|
|
156
156
|
products = Product.search :with => {"options.sugar" => 1}
|
157
|
-
expect(products.to_a).to
|
157
|
+
expect(products.to_a).to match_array([pancakes, waffles])
|
158
158
|
end if JSONColumn.call
|
159
159
|
end
|
@@ -16,7 +16,7 @@ describe 'SQL delta indexing', :live => true do
|
|
16
16
|
)
|
17
17
|
sleep 0.25
|
18
18
|
|
19
|
-
expect(Book.search('Terry Pratchett').to_a).to
|
19
|
+
expect(Book.search('Terry Pratchett').to_a).to match_array([guards, men])
|
20
20
|
end
|
21
21
|
|
22
22
|
it "automatically indexes updated records" do
|
@@ -25,7 +25,7 @@ describe 'SQL delta indexing', :live => true do
|
|
25
25
|
|
26
26
|
expect(Book.search('Harry').to_a).to eq([book])
|
27
27
|
|
28
|
-
book.reload.
|
28
|
+
book.reload.update(:author => 'Terry Pratchett')
|
29
29
|
sleep 0.25
|
30
30
|
|
31
31
|
expect(Book.search('Terry').to_a).to eq([book])
|
@@ -37,7 +37,7 @@ describe 'SQL delta indexing', :live => true do
|
|
37
37
|
|
38
38
|
expect(Book.search('Harry').to_a).to eq([book])
|
39
39
|
|
40
|
-
book.reload.
|
40
|
+
book.reload.update(:author => 'Terry Pratchett')
|
41
41
|
sleep 0.25
|
42
42
|
|
43
43
|
expect(Book.search('Harry')).to be_empty
|
@@ -49,7 +49,7 @@ describe 'SQL delta indexing', :live => true do
|
|
49
49
|
|
50
50
|
expect(Album.search('Whitloms').to_a).to eq([album])
|
51
51
|
|
52
|
-
album.reload.
|
52
|
+
album.reload.update(:artist => 'The Whitlams')
|
53
53
|
sleep 0.25
|
54
54
|
|
55
55
|
expect(Book.search('Whitloms')).to be_empty
|
@@ -63,4 +63,16 @@ describe 'SQL delta indexing', :live => true do
|
|
63
63
|
|
64
64
|
expect(Book.search('Gaiman').to_a).to eq([book])
|
65
65
|
end
|
66
|
+
|
67
|
+
it "updates associated models" do
|
68
|
+
colour = Colour.create(:name => 'green')
|
69
|
+
sleep 0.25
|
70
|
+
|
71
|
+
expect(Colour.search('green').to_a).to eq([colour])
|
72
|
+
|
73
|
+
tee = colour.tees.create
|
74
|
+
sleep 0.25
|
75
|
+
|
76
|
+
expect(Colour.search(:with => {:tee_ids => tee.id}).to_a).to eq([colour])
|
77
|
+
end
|
66
78
|
end
|
@@ -12,11 +12,13 @@ class SphinxController
|
|
12
12
|
|
13
13
|
ThinkingSphinx::Configuration.reset
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
if Rails::VERSION::MAJOR < 7
|
16
|
+
ActiveSupport::Dependencies.loaded.each do |path|
|
17
|
+
$LOADED_FEATURES.delete "#{path}.rb"
|
18
|
+
end
|
18
19
|
|
19
|
-
|
20
|
+
ActiveSupport::Dependencies.clear
|
21
|
+
end
|
20
22
|
|
21
23
|
config.searchd.mysql41 = 9307
|
22
24
|
config.settings['quiet_deltas'] = true
|
@@ -6,22 +6,22 @@ module SphinxHelpers
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def index(*indices)
|
9
|
-
sleep 0.5 if ENV['
|
9
|
+
sleep 0.5 if ENV['CI']
|
10
10
|
|
11
11
|
yield if block_given?
|
12
12
|
|
13
13
|
sphinx.index *indices
|
14
14
|
sleep 0.25
|
15
|
-
sleep 0.5 if ENV['
|
15
|
+
sleep 0.5 if ENV['CI']
|
16
16
|
end
|
17
17
|
|
18
18
|
def merge
|
19
|
-
sleep 0.5 if ENV['
|
19
|
+
sleep 0.5 if ENV['CI']
|
20
20
|
sleep 0.5
|
21
21
|
|
22
22
|
sphinx.merge
|
23
23
|
sleep 1.5
|
24
|
-
sleep 0.5 if ENV['
|
24
|
+
sleep 0.5 if ENV['CI']
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -10,7 +10,7 @@ describe 'Suspend deltas for a given action', :live => true do
|
|
10
10
|
expect(Book.search('Harry').to_a).to eq([book])
|
11
11
|
|
12
12
|
ThinkingSphinx::Deltas.suspend :book do
|
13
|
-
book.reload.
|
13
|
+
book.reload.update(:author => 'Terry Pratchett')
|
14
14
|
sleep 0.25
|
15
15
|
|
16
16
|
expect(Book.search('Terry').to_a).to eq([])
|
@@ -27,7 +27,7 @@ describe 'Suspend deltas for a given action', :live => true do
|
|
27
27
|
expect(Book.search('Harry').to_a).to eq([book])
|
28
28
|
|
29
29
|
ThinkingSphinx::Deltas.suspend :book do
|
30
|
-
book.reload.
|
30
|
+
book.reload.update(:author => 'Terry Pratchett')
|
31
31
|
sleep 0.25
|
32
32
|
|
33
33
|
expect(Book.search('Terry').to_a).to eq([])
|
@@ -44,7 +44,7 @@ describe 'Suspend deltas for a given action', :live => true do
|
|
44
44
|
expect(Book.search('Harry').to_a).to eq([book])
|
45
45
|
|
46
46
|
ThinkingSphinx::Deltas.suspend_and_update :book do
|
47
|
-
book.reload.
|
47
|
+
book.reload.update(:author => 'Terry Pratchett')
|
48
48
|
sleep 0.25
|
49
49
|
|
50
50
|
expect(Book.search('Terry').to_a).to eq([])
|
@@ -10,7 +10,6 @@ ThinkingSphinx::Index.define :article, :with => :active_record do
|
|
10
10
|
has taggings.created_at, :as => :taggings_at, :type => :timestamp
|
11
11
|
|
12
12
|
set_property :min_infix_len => 4
|
13
|
-
set_property :enable_star => true
|
14
13
|
end
|
15
14
|
|
16
15
|
ThinkingSphinx::Index.define :article, :with => :active_record,
|
@@ -6,7 +6,9 @@ class Album < ActiveRecord::Base
|
|
6
6
|
before_validation :set_id, :on => :create
|
7
7
|
before_validation :set_integer_id, :on => :create
|
8
8
|
|
9
|
-
|
9
|
+
ThinkingSphinx::Callbacks.append(
|
10
|
+
self, :behaviours => [:sql, :real_time, :deltas]
|
11
|
+
)
|
10
12
|
|
11
13
|
validates :id, :presence => true, :uniqueness => true
|
12
14
|
validates :integer_id, :presence => true, :uniqueness => true
|
@@ -1,6 +1,11 @@
|
|
1
1
|
test:
|
2
2
|
adapter: <%= ENV['DATABASE'] || 'mysql2' %>
|
3
3
|
database: thinking_sphinx
|
4
|
-
username: <%= ENV['DATABASE'] == 'postgresql' ?
|
4
|
+
username: <%= ENV['DATABASE'] == 'postgresql' ? 'postgres' : 'root' %>
|
5
|
+
<% if ENV["CI"] %>
|
6
|
+
password: thinking_sphinx
|
7
|
+
host: 127.0.0.1
|
8
|
+
port: <%= ENV['DATABASE'] == 'postgresql' ? 5432 : 3306 %>
|
9
|
+
<% end %>
|
5
10
|
min_messages: warning
|
6
11
|
encoding: utf8
|
data/spec/internal/db/schema.rb
CHANGED
@@ -19,12 +19,13 @@ describe ThinkingSphinx::ActiveRecord::Callbacks::UpdateCallbacks do
|
|
19
19
|
let(:klass) { double(:name => 'Article') }
|
20
20
|
let(:configuration) { double('configuration',
|
21
21
|
:settings => {'attribute_updates' => true},
|
22
|
-
:indices_for_references => [index]) }
|
22
|
+
:indices_for_references => [index], :index_set_class => set_class) }
|
23
23
|
let(:connection) { double('connection', :execute => '') }
|
24
24
|
let(:index) { double 'index', :name => 'article_core',
|
25
25
|
:sources => [source], :document_id_for_key => 3, :distributed? => false,
|
26
26
|
:type => 'plain', :primary_key => :id}
|
27
27
|
let(:source) { double('source', :attributes => []) }
|
28
|
+
let(:set_class) { double(:reference_name => :article) }
|
28
29
|
|
29
30
|
before :each do
|
30
31
|
stub_const 'ThinkingSphinx::Configuration',
|
@@ -5,7 +5,9 @@ require 'spec_helper'
|
|
5
5
|
describe ThinkingSphinx::ActiveRecord::Index do
|
6
6
|
let(:index) { ThinkingSphinx::ActiveRecord::Index.new :user }
|
7
7
|
let(:config) { double('config', :settings => {},
|
8
|
-
:indices_location => 'location', :next_offset => 8
|
8
|
+
:indices_location => 'location', :next_offset => 8,
|
9
|
+
:index_set_class => index_set_class) }
|
10
|
+
let(:index_set_class) { double :reference_name => :user }
|
9
11
|
|
10
12
|
before :each do
|
11
13
|
allow(ThinkingSphinx::Configuration).to receive_messages :instance => config
|
@@ -94,18 +96,6 @@ describe ThinkingSphinx::ActiveRecord::Index do
|
|
94
96
|
end
|
95
97
|
end
|
96
98
|
|
97
|
-
describe '#docinfo' do
|
98
|
-
it "defaults to extern" do
|
99
|
-
expect(index.docinfo).to eq(:extern)
|
100
|
-
end
|
101
|
-
|
102
|
-
it "can be disabled" do
|
103
|
-
config.settings["skip_docinfo"] = true
|
104
|
-
|
105
|
-
expect(index.docinfo).to be_nil
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
99
|
describe '#document_id_for_key' do
|
110
100
|
it "calculates the document id based on offset and number of indices" do
|
111
101
|
allow(config).to receive_message_chain(:indices, :count).and_return(5)
|
@@ -15,8 +15,13 @@ describe ThinkingSphinx::ActiveRecord::Interpreter do
|
|
15
15
|
let(:block) { Proc.new { } }
|
16
16
|
|
17
17
|
before :each do
|
18
|
-
allow(ThinkingSphinx::ActiveRecord::SQLSource).to receive_messages
|
19
|
-
|
18
|
+
allow(ThinkingSphinx::ActiveRecord::SQLSource).to receive_messages(
|
19
|
+
:new => source
|
20
|
+
)
|
21
|
+
|
22
|
+
allow(source).to receive_messages(
|
23
|
+
:model => model, :add_attribute => nil, :add_field => nil
|
24
|
+
)
|
20
25
|
end
|
21
26
|
|
22
27
|
describe '.translate!' do
|
@@ -94,17 +99,15 @@ describe ThinkingSphinx::ActiveRecord::Interpreter do
|
|
94
99
|
end
|
95
100
|
|
96
101
|
it "adds an attribute to the source" do
|
97
|
-
|
102
|
+
expect(source).to receive(:add_attribute).with(attribute)
|
98
103
|
|
99
|
-
|
104
|
+
instance.has column
|
100
105
|
end
|
101
106
|
|
102
107
|
it "adds multiple attributes when passed multiple columns" do
|
103
|
-
|
108
|
+
expect(source).to receive(:add_attribute).with(attribute).twice
|
104
109
|
|
105
|
-
|
106
|
-
saved_attribute == attribute
|
107
|
-
}.length).to eq(2)
|
110
|
+
instance.has column, column
|
108
111
|
end
|
109
112
|
end
|
110
113
|
|
@@ -144,17 +147,15 @@ describe ThinkingSphinx::ActiveRecord::Interpreter do
|
|
144
147
|
end
|
145
148
|
|
146
149
|
it "adds a field to the source" do
|
147
|
-
|
150
|
+
expect(source).to receive(:add_field).with(field)
|
148
151
|
|
149
|
-
|
152
|
+
instance.indexes column
|
150
153
|
end
|
151
154
|
|
152
155
|
it "adds multiple fields when passed multiple columns" do
|
153
|
-
|
156
|
+
expect(source).to receive(:add_field).with(field).twice
|
154
157
|
|
155
|
-
|
156
|
-
saved_field == field
|
157
|
-
}.length).to eq(2)
|
158
|
+
instance.indexes column, column
|
158
159
|
end
|
159
160
|
end
|
160
161
|
|