thinking-sphinx 4.4.1 → 5.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|