thinking-sphinx 5.0.0 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7f0e9705ca201e4e4aad6aee89116b150a6dbef077ae949eeddc594d8b3c2c50
4
- data.tar.gz: 336af45f825119fde255c8bb373094e4d63f2ae6a98d01495410e68165534555
3
+ metadata.gz: 6245e3b98964aeb5e2540fd59d908458ee5596ed3eb8a1210dee732d95a8e061
4
+ data.tar.gz: 78e991ec45835c311bba7db38c6c1ba8d2c97fec02c448b6e63a667debeb90d9
5
5
  SHA512:
6
- metadata.gz: b8d6ec2efdace6c3b214ca488f0b1befdceb61de3b2287d8eb0ce6d6eeb489619bdda92402448b51e7655936b959bfc33d94bc173b171ad542bf02133b6fe394
7
- data.tar.gz: ca5e3308d74888ec60cbc0144f7972dfc5602552f6e03396f29f2ab010e7bbfebc0a2f8781d2345eeddc97a3cafcaaba24221e3c560e231a5fb51cd4180f6f57
6
+ metadata.gz: 043e7a4c5670d5e2371e38c27be22d7dae0c762e16f4f7e9c020c7794200cb9ce5c3f0455e692bfb8dba4fb7a8b4aa47de88a7add179c81f6f4fb294bc4b6d9c
7
+ data.tar.gz: 6800fe7314fff4316b347f71f216702cb340b7e6ca7df7a609b93b082375b86dba044ea06efcdb56b3f898a1647cedbd486dd833d82ed7ad1a5c8de8625fa81d
@@ -0,0 +1,150 @@
1
+ version: 2.1
2
+
3
+ orbs:
4
+ ruby: circleci/ruby@1.0
5
+
6
+ workflows:
7
+ test:
8
+ jobs:
9
+ - test:
10
+ name: "Sphinx 2.2.11 with MySQL"
11
+ database: mysql2
12
+ sphinx_version: 2.2.11
13
+ sphinx_engine: sphinx
14
+ debian: jessie
15
+ ruby: '2.4.6'
16
+ - test:
17
+ name: "Sphinx 2.2.11 with PostgreSQL"
18
+ database: postgresql
19
+ sphinx_version: 2.2.11
20
+ sphinx_engine: sphinx
21
+ debian: jessie
22
+ ruby: '2.4.6'
23
+ - test:
24
+ name: "Sphinx 3.3.1 with MySQL"
25
+ database: mysql2
26
+ sphinx_version: 3.3.1
27
+ sphinx_engine: sphinx
28
+ debian: buster
29
+ matrix:
30
+ parameters:
31
+ ruby: [ '2.4.9', '2.5.8', '2.6.6', '2.7.2' ]
32
+ # - test:
33
+ # database: postgresql
34
+ # sphinx_version: 3.3.1
35
+ # sphinx_engine: sphinx
36
+ # matrix:
37
+ # parameters:
38
+ # ruby: [ '2.4', '2.5', '2.6', '2.7' ]
39
+ - test:
40
+ name: "Manticore 2.8.2 with MySQL"
41
+ database: mysql2
42
+ sphinx_version: 2.8.2
43
+ sphinx_engine: manticore
44
+ debian: stretch
45
+ matrix:
46
+ parameters:
47
+ ruby: [ '2.4.9', '2.5.8', '2.6.6' ]
48
+ - test:
49
+ name: "Manticore 2.8.2 with PostgreSQL"
50
+ database: postgresql
51
+ sphinx_version: 2.8.2
52
+ sphinx_engine: manticore
53
+ debian: stretch
54
+ matrix:
55
+ parameters:
56
+ ruby: [ '2.4.9', '2.5.8', '2.6.6' ]
57
+ - test:
58
+ name: "Manticore 3.5.4 with MySQL"
59
+ database: mysql2
60
+ sphinx_version: 3.5.4
61
+ sphinx_engine: manticore
62
+ debian: buster
63
+ matrix:
64
+ parameters:
65
+ ruby: [ '2.4.9', '2.5.8', '2.6.6', '2.7.2' ]
66
+ - test:
67
+ name: "Manticore 3.5.4 with PostgreSQL"
68
+ database: postgresql
69
+ sphinx_version: 3.5.4
70
+ sphinx_engine: manticore
71
+ debian: buster
72
+ matrix:
73
+ parameters:
74
+ ruby: [ '2.4.9', '2.5.8', '2.6.6', '2.7.2' ]
75
+
76
+ jobs:
77
+ test:
78
+ parameters:
79
+ ruby:
80
+ type: string
81
+ database:
82
+ type: string
83
+ sphinx_version:
84
+ type: string
85
+ sphinx_engine:
86
+ type: string
87
+ debian:
88
+ type: string
89
+
90
+ docker:
91
+ - image: circleci/ruby:<< parameters.ruby >>-<< parameters.debian >>
92
+
93
+ - image: circleci/postgres:10
94
+ environment:
95
+ POSTGRES_USER: postgres
96
+ POSTGRES_PASSWORD: thinking_sphinx
97
+ POSTGRES_DB: thinking_sphinx
98
+
99
+ - image: circleci/mysql:5.7
100
+ environment:
101
+ MYSQL_ROOT_PASSWORD: thinking_sphinx
102
+ MYSQL_DATABASE: thinking_sphinx
103
+
104
+ working_directory: ~/app
105
+
106
+ steps:
107
+ - checkout
108
+
109
+ - restore_cache:
110
+ keys:
111
+ - v1-dependencies-<< parameters.ruby >>
112
+
113
+ - run:
114
+ name: install bundler
115
+ command: |
116
+ if [ "<< parameters.ruby >>" == "2.7.2" ]; then
117
+ export BUNDLER_VERSION=2.1.4
118
+ else
119
+ export BUNDLER_VERSION=1.17.3
120
+ fi
121
+ export BUNDLE_PATH=vendor/bundle
122
+ gem install bundler:$BUNDLER_VERSION
123
+
124
+ - run:
125
+ name: install dependencies
126
+ command: |
127
+ bundle install --jobs=4 --retry=3 --path vendor/bundle
128
+ bundle update
129
+
130
+ - run:
131
+ name: set up appraisal
132
+ command: bundle exec appraisal update
133
+
134
+ - save_cache:
135
+ paths:
136
+ - ./vendor/bundle
137
+ key: v1-dependencies-<< parameters.ruby >>
138
+
139
+ - run:
140
+ name: set up sphinx
141
+ command: "./bin/loadsphinx << parameters.sphinx_version >> << parameters.sphinx_engine >>"
142
+
143
+ - run:
144
+ name: tests
145
+ environment:
146
+ CI: "true"
147
+ DATABASE: << parameters.database >>
148
+ SPHINX_VERSION: << parameters.sphinx_version >>
149
+ SPHINX_ENGINE: << parameters.sphinx_engine >>
150
+ command: bundle exec appraisal rspec
@@ -19,12 +19,12 @@ env:
19
19
  matrix:
20
20
  - DATABASE=mysql2 SPHINX_VERSION=2.2.11 SPHINX_ENGINE=sphinx
21
21
  - DATABASE=postgresql SPHINX_VERSION=2.2.11 SPHINX_ENGINE=sphinx
22
- - DATABASE=mysql2 SPHINX_VERSION=3.2.1 SPHINX_ENGINE=sphinx
22
+ - DATABASE=mysql2 SPHINX_VERSION=3.3.1 SPHINX_ENGINE=sphinx
23
23
  - DATABASE=mysql2 SPHINX_VERSION=2.8.2 SPHINX_ENGINE=manticore
24
24
  - DATABASE=postgresql SPHINX_VERSION=2.8.2 SPHINX_ENGINE=manticore
25
- - DATABASE=mysql2 SPHINX_VERSION=3.4.2 SPHINX_ENGINE=manticore
26
- - DATABASE=postgresql SPHINX_VERSION=3.4.2 SPHINX_ENGINE=manticore
27
- # - DATABASE=postgresql SPHINX_VERSION=3.2.1 SPHINX_ENGINE=sphinx
25
+ - DATABASE=mysql2 SPHINX_VERSION=3.5.0 SPHINX_ENGINE=manticore
26
+ - DATABASE=postgresql SPHINX_VERSION=3.5.0 SPHINX_ENGINE=manticore
27
+ # - DATABASE=postgresql SPHINX_VERSION=3.3.1 SPHINX_ENGINE=sphinx
28
28
  sudo: false
29
29
  addons:
30
30
  postgresql: '9.4'
data/Appraisals CHANGED
@@ -33,3 +33,9 @@ appraise 'rails_6_0' do
33
33
  gem 'mysql2', '~> 0.5.0', :platform => :ruby
34
34
  gem 'pg', '~> 1.0', :platform => :ruby
35
35
  end if RUBY_PLATFORM != 'java' && RUBY_VERSION.to_f >= 2.5
36
+
37
+ appraise 'rails_6_1' do
38
+ gem 'rails', '~> 6.1.0'
39
+ gem 'mysql2', '~> 0.5.0', :platform => :ruby
40
+ gem 'pg', '~> 1.0', :platform => :ruby
41
+ end if RUBY_PLATFORM != 'java' && RUBY_VERSION.to_f >= 2.5
@@ -2,6 +2,26 @@
2
2
 
3
3
  All notable changes to this project (at least, from v3.0.0 onwards) are documented in this file.
4
4
 
5
+ ## 5.1.0 - 2020-12-28
6
+
7
+ [Release Notes](https://github.com/pat/thinking-sphinx/releases/tag/v5.1.0)
8
+
9
+ ### Added
10
+
11
+ * Support for Sphinx v3.3 and Manticore v3.5.
12
+ * Support for Rails 6.1 (via [joiner](https://rubygems.org/gems/joiner) v0.6.0).
13
+
14
+ ### Changed
15
+
16
+ * `enable_star` is no longer available as a configuration option, as it's been enabled by default in Sphinx since v2.2.2, and is no longer allowed in Sphinx v3.3.1.
17
+ * All timestamp attributes are now considered plain integer values from Sphinx's perspective. Sphinx was already expecting integers, but since Sphinx v3.3.1 it doesn't recognise timestamps as a data type. There is no functional difference with this change - Thinking Sphinx was always converting times to their UNIX epoch integer values.
18
+ * Allow configuration of the maximum statement length ([@kalsan](https://github.com/kalsan) in [#1179](https://github.com/pat/thinking-sphinx/pull/1179)).
19
+ * Respect `:path` values to navigate associations for Thinking Sphinx callbacks on SQL-backed indices. Discussed in [#1182](https://github.com/pat/thinking-sphinx/issues/1182).
20
+
21
+ ### Fixed
22
+
23
+ * Don't attempt to update delta flags on frozen model instances.
24
+
5
25
  ## 5.0.0 - 2020-07-20
6
26
 
7
27
  [Release Notes](https://github.com/pat/thinking-sphinx/releases/tag/v5.0.0)
@@ -20,7 +40,7 @@ All notable changes to this project (at least, from v3.0.0 onwards) are document
20
40
  * Remove internal uses of `send`, replaced with `public_send` as that's available in all supported Ruby versions.
21
41
  * Deletion statements are simplified by avoiding the need to calculate document keys/offsets (@njakobsen via [#1134](https://github.com/pat/thinking-sphinx/issues/1134)).
22
42
  * Real-time data is deleted before replacing it, to avoid duplicate data when offsets change (@njakobsen via [#1134](https://github.com/pat/thinking-sphinx/issues/1134)).
23
- * Use `reference_name` as per custom `index_set_class` definitions. Previously, the class method was called on `ThinkingSphinx::IndexSet` even if a custom subclass was configured. (As per discussinos with @kalsan in [#1172](https://github.com/pat/thinking-sphinx/issues/1172).)
43
+ * Use `reference_name` as per custom `index_set_class` definitions. Previously, the class method was called on `ThinkingSphinx::IndexSet` even if a custom subclass was configured. (As per discussions with @kalsan in [#1172](https://github.com/pat/thinking-sphinx/issues/1172).)
24
44
 
25
45
  ## 4.4.1 - 2019-08-23
26
46
 
@@ -1,6 +1,6 @@
1
1
  h1. Thinking Sphinx
2
2
 
3
- Thinking Sphinx is a library for connecting ActiveRecord to the Sphinx full-text search tool, and integrates closely with Rails (but also works with other Ruby web frameworks). The current release is v5.0.0.
3
+ Thinking Sphinx is a library for connecting ActiveRecord to the Sphinx full-text search tool, and integrates closely with Rails (but also works with other Ruby web frameworks). The current release is v5.1.0.
4
4
 
5
5
  h2. Upgrading
6
6
 
@@ -14,7 +14,7 @@ It's a gem, so install it like you would any other gem. You will also need to sp
14
14
 
15
15
  <pre><code>gem 'mysql2', '~> 0.4', :platform => :ruby
16
16
  gem 'jdbc-mysql', '~> 5.1.35', :platform => :jruby
17
- gem 'thinking-sphinx', '~> 5.0'</code></pre>
17
+ gem 'thinking-sphinx', '~> 5.1'</code></pre>
18
18
 
19
19
  The MySQL gems mentioned are required for connecting to Sphinx, so please include it even when you're using PostgreSQL for your database.
20
20
 
@@ -14,7 +14,7 @@ load_sphinx () {
14
14
  format="deb"
15
15
  distro="trusty";;
16
16
  2.2.11)
17
- url="http://sphinxsearch.com/files/sphinxsearch_2.2.11-release-1~xenial_amd64.deb"
17
+ url="http://sphinxsearch.com/files/sphinxsearch_2.2.11-release-1~jessie_amd64.deb"
18
18
  format="deb";;
19
19
  3.0.3)
20
20
  url="http://sphinxsearch.com/files/sphinx-3.0.3-facc3fb-linux-amd64.tar.gz"
@@ -23,7 +23,10 @@ load_sphinx () {
23
23
  url="http://sphinxsearch.com/files/sphinx-3.1.1-612d99f-linux-amd64.tar.gz"
24
24
  format="gz";;
25
25
  3.2.1)
26
- url="http://www.sphinxsearch.com/files/sphinx-3.2.1-f152e0b-linux-amd64.tar.gz"
26
+ url="http://sphinxsearch.com/files/sphinx-3.2.1-f152e0b-linux-amd64.tar.gz"
27
+ format="gz";;
28
+ 3.3.1)
29
+ url="http://sphinxsearch.com/files/sphinx-3.3.1-b72d67b-linux-amd64.tar.gz"
27
30
  format="gz";;
28
31
  *)
29
32
  echo "No Sphinx version $version available"
@@ -37,7 +40,9 @@ load_sphinx () {
37
40
 
38
41
  if [ "$format" == "deb" ]; then
39
42
  curl --location $url -o sphinx.deb
40
- sudo apt-get install ./sphinx.deb
43
+ sudo apt-get install libodbc1
44
+ sudo dpkg -i ./sphinx.deb
45
+ sudo apt-get install -f
41
46
  else
42
47
  curl $url -o sphinx.tar.gz
43
48
  tar -zxvf sphinx.tar.gz
@@ -54,16 +59,19 @@ load_manticore () {
54
59
  2.7.5)
55
60
  url="https://github.com/manticoresoftware/manticoresearch/releases/download/2.7.5/manticore_2.7.5-181204-4a31c54-release-stemmer.xenial_amd64-bin.deb";;
56
61
  2.8.2)
57
- url="https://github.com/manticoresoftware/manticoresearch/releases/download/2.8.2/manticore_2.8.2-190402-4e81114-release-stemmer.xenial_amd64-bin.deb";;
62
+ url="https://github.com/manticoresoftware/manticoresearch/releases/download/2.8.2/manticore_2.8.2-190402-4e81114d-release-stemmer.stretch_amd64-bin.deb";;
58
63
  3.4.2)
59
64
  url="https://github.com/manticoresoftware/manticoresearch/releases/download/3.4.2/manticore_3.4.2-200410-6903305-release.xenial_amd64-bin.deb";;
65
+ 3.5.4)
66
+ url="https://repo.manticoresearch.com/repository/manticoresearch_buster/pool/m/manticore/manticore_3.5.4-201211-13f8d08d_amd64.deb";;
60
67
  *)
61
68
  echo "No Manticore version $version available"
62
69
  exit 1;;
63
70
  esac
64
71
 
65
72
  curl --location $url -o manticore.deb
66
- sudo apt-get install ./manticore.deb
73
+ sudo dpkg -i ./manticore.deb
74
+ sudo apt-get install -f
67
75
  }
68
76
 
69
77
  if [ "$engine" == "sphinx" ]; then
@@ -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
@@ -29,6 +29,7 @@ require 'thinking_sphinx/active_record/source_joins'
29
29
  require 'thinking_sphinx/active_record/sql_builder'
30
30
  require 'thinking_sphinx/active_record/sql_source'
31
31
 
32
+ require 'thinking_sphinx/active_record/callbacks/association_delta_callbacks'
32
33
  require 'thinking_sphinx/active_record/callbacks/delete_callbacks'
33
34
  require 'thinking_sphinx/active_record/callbacks/delta_callbacks'
34
35
  require 'thinking_sphinx/active_record/callbacks/update_callbacks'
@@ -4,7 +4,7 @@ class ThinkingSphinx::ActiveRecord::Attribute::SphinxPresenter
4
4
  SPHINX_TYPES = {
5
5
  :integer => :uint,
6
6
  :boolean => :bool,
7
- :timestamp => :timestamp,
7
+ :timestamp => :uint,
8
8
  :float => :float,
9
9
  :string => :string,
10
10
  :bigint => :bigint,
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ThinkingSphinx::ActiveRecord::Callbacks::AssociationDeltaCallbacks
4
+ def initialize(path)
5
+ @path = path
6
+ end
7
+
8
+ def after_commit(instance)
9
+ Array(objects_for(instance)).each do |object|
10
+ object.update :delta => true unless object.frozen?
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ attr_reader :path
17
+
18
+ def objects_for(instance)
19
+ path.inject(instance) { |object, method| object.send method }
20
+ end
21
+ end
@@ -13,29 +13,41 @@ class ThinkingSphinx::Callbacks::Appender
13
13
  end
14
14
 
15
15
  def call
16
+ add_core_callbacks
17
+ add_delta_callbacks if behaviours.include?(:deltas)
18
+ add_real_time_callbacks if behaviours.include?(:real_time)
19
+ add_update_callbacks if behaviours.include?(:updates)
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :model, :reference, :options, :block
25
+
26
+ def add_core_callbacks
16
27
  model.after_destroy ThinkingSphinx::ActiveRecord::Callbacks::DeleteCallbacks
28
+ end
17
29
 
18
- if behaviours.include?(:deltas)
30
+ def add_delta_callbacks
31
+ if path.empty?
19
32
  model.before_save ThinkingSphinx::ActiveRecord::Callbacks::DeltaCallbacks
20
33
  model.after_commit ThinkingSphinx::ActiveRecord::Callbacks::DeltaCallbacks
21
- end
22
-
23
- if behaviours.include?(:real_time)
24
- model.after_save ThinkingSphinx::RealTime.callback_for(
25
- reference, path, &block
26
- )
27
- end
28
-
29
- if behaviours.include?(:updates)
30
- model.after_update(
31
- ThinkingSphinx::ActiveRecord::Callbacks::UpdateCallbacks
34
+ else
35
+ model.after_commit(
36
+ ThinkingSphinx::ActiveRecord::Callbacks::AssociationDeltaCallbacks
37
+ .new(path)
32
38
  )
33
39
  end
34
40
  end
35
41
 
36
- private
42
+ def add_real_time_callbacks
43
+ model.after_save ThinkingSphinx::RealTime.callback_for(
44
+ reference, path, &block
45
+ )
46
+ end
37
47
 
38
- attr_reader :model, :reference, :options, :block
48
+ def add_update_callbacks
49
+ model.after_update ThinkingSphinx::ActiveRecord::Callbacks::UpdateCallbacks
50
+ end
39
51
 
40
52
  def behaviours
41
53
  options[:behaviours] || []
@@ -16,6 +16,10 @@ module ThinkingSphinx::Connection
16
16
  connection_class.new options
17
17
  end
18
18
 
19
+ def self.clear
20
+ @pool = nil
21
+ end
22
+
19
23
  def self.connection_class
20
24
  return ThinkingSphinx::Connection::JRuby if RUBY_PLATFORM == 'java'
21
25
 
@@ -39,7 +39,7 @@ class ThinkingSphinx::Connection::Client
39
39
  private
40
40
 
41
41
  def check(statements)
42
- if statements.length > ThinkingSphinx::MAXIMUM_STATEMENT_LENGTH
42
+ if statements.length > maximum_statement_length
43
43
  exception = ThinkingSphinx::QueryLengthError.new
44
44
  exception.statement = statements
45
45
  raise exception
@@ -56,6 +56,11 @@ class ThinkingSphinx::Connection::Client
56
56
  @client = nil
57
57
  end
58
58
 
59
+ def maximum_statement_length
60
+ @maximum_statement_length ||= ThinkingSphinx::Configuration.instance.
61
+ settings['maximum_statement_length']
62
+ end
63
+
59
64
  def perform(statements)
60
65
  results_for statements
61
66
  rescue => error
@@ -38,7 +38,7 @@ end
38
38
  class ThinkingSphinx::QueryLengthError < ThinkingSphinx::SphinxError
39
39
  def message
40
40
  <<-MESSAGE
41
- The supplied SphinxQL statement is #{statement.length} characters long. The maximum allowed length is #{ThinkingSphinx::MAXIMUM_STATEMENT_LENGTH}.
41
+ The supplied SphinxQL statement is #{statement.length} characters long. The maximum allowed length is #{ThinkingSphinx::Configuration.instance.settings['maximum_statement_length']}.
42
42
 
43
43
  If this error has been raised during real-time index population, it's probably due to overly large batches of records being processed at once. The default is 1000, but you can lower it on a per-environment basis in config/thinking_sphinx.yml:
44
44
 
@@ -65,12 +65,10 @@ class ThinkingSphinx::RealTime::Index < Riddle::Configuration::RealtimeIndex
65
65
 
66
66
  def collection_for(attribute)
67
67
  case attribute.type
68
- when :integer, :boolean
68
+ when :integer, :boolean, :timestamp
69
69
  attribute.multi? ? @rt_attr_multi : @rt_attr_uint
70
70
  when :string
71
71
  @rt_attr_string
72
- when :timestamp
73
- @rt_attr_timestamp
74
72
  when :float
75
73
  @rt_attr_float
76
74
  when :bigint
@@ -11,14 +11,15 @@ 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" => "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"
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
22
23
  }.freeze
23
24
 
24
25
  def self.call(configuration)
@@ -62,7 +63,9 @@ class ThinkingSphinx::Settings
62
63
 
63
64
  def defaults
64
65
  DEFAULTS.inject({}) do |hash, (key, value)|
65
- value = value.gsub("ENVIRONMENT", framework.environment)
66
+ if value.is_a?(String)
67
+ value = value.gsub("ENVIRONMENT", framework.environment)
68
+ end
66
69
 
67
70
  if FILE_KEYS.include?(key)
68
71
  hash[key] = absolute value
@@ -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
- if ActiveRecord::Base.configurations['test']['adapter'][/postgres/]
42
- expect(cities.first.geodist).to eq(expected[:postgresql])
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 eq(expected[:mysql])
54
+ expect(cities.first.geodist).to be_within(0.01).of(expected[:mysql])
45
55
  end
46
56
  end
47
57
 
@@ -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
@@ -6,22 +6,22 @@ module SphinxHelpers
6
6
  end
7
7
 
8
8
  def index(*indices)
9
- sleep 0.5 if ENV['TRAVIS']
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['TRAVIS']
15
+ sleep 0.5 if ENV['CI']
16
16
  end
17
17
 
18
18
  def merge
19
- sleep 0.5 if ENV['TRAVIS']
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['TRAVIS']
24
+ sleep 0.5 if ENV['CI']
25
25
  end
26
26
  end
27
27
 
@@ -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,
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ ThinkingSphinx::Index.define :colour, :with => :active_record, :delta => true do
4
+ indexes name
5
+
6
+ has tees.id, :as => :tee_ids
7
+ end
@@ -2,4 +2,6 @@
2
2
 
3
3
  class Colour < ActiveRecord::Base
4
4
  has_many :tees
5
+
6
+ ThinkingSphinx::Callbacks.append(self, behaviours: [:sql, :deltas])
5
7
  end
@@ -4,4 +4,7 @@ class Tee < ActiveRecord::Base
4
4
  belongs_to :colour
5
5
 
6
6
  ThinkingSphinx::Callbacks.append(self, :behaviours => [:sql])
7
+ ThinkingSphinx::Callbacks.append(
8
+ self, behaviours: [:sql, :deltas], :path => [:colour]
9
+ )
7
10
  end
@@ -1,6 +1,11 @@
1
1
  test:
2
2
  adapter: <%= ENV['DATABASE'] || 'mysql2' %>
3
3
  database: thinking_sphinx
4
- username: <%= ENV['DATABASE'] == 'postgresql' ? ENV['USER'] : 'root' %>
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
@@ -68,6 +68,7 @@ ActiveRecord::Schema.define do
68
68
 
69
69
  create_table(:colours, :force => true) do |t|
70
70
  t.string :name
71
+ t.boolean :delta, :null => false, :default => true
71
72
  t.timestamps null: false
72
73
  end
73
74
 
@@ -325,14 +325,14 @@ describe ThinkingSphinx::ActiveRecord::SQLSource do
325
325
  expect(source.sql_attr_string).to include('name')
326
326
  end
327
327
 
328
- it "adds timestamp attributes to sql_attr_timestamp" do
328
+ it "adds timestamp attributes to sql_attr_uint" do
329
329
  source.attributes << double('attribute')
330
330
  allow(presenter).to receive_messages :declaration => 'created_at',
331
- :collection_type => :timestamp
331
+ :collection_type => :uint
332
332
 
333
333
  source.render
334
334
 
335
- expect(source.sql_attr_timestamp).to include('created_at')
335
+ expect(source.sql_attr_uint).to include('created_at')
336
336
  end
337
337
 
338
338
  it "adds float attributes to sql_attr_float" do
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe ThinkingSphinx::Connection::MRI do
4
+ subject { described_class.new :host => "127.0.0.1", :port => 9306 }
5
+
6
+ let(:client) { double :client, :query => "result", :next_result => false }
7
+
8
+ before :each do
9
+ allow(Mysql2::Client).to receive(:new).and_return(client)
10
+ end
11
+
12
+ after :each do
13
+ ThinkingSphinx::Configuration.reset
14
+ end
15
+
16
+ describe "#execute" do
17
+ it "sends the query to the client" do
18
+ subject.execute "SELECT QUERY"
19
+
20
+ expect(client).to have_received(:query).with("SELECT QUERY")
21
+ end
22
+
23
+ it "returns a result" do
24
+ expect(subject.execute("SELECT QUERY")).to eq("result")
25
+ end
26
+
27
+ context "with long queries" do
28
+ let(:maximum) { (2 ** 23) - 5 }
29
+ let(:query) { String.new "SELECT * FROM book_core WHERE MATCH('')" }
30
+ let(:difference) { maximum - query.length }
31
+
32
+ it 'does not allow overly long queries' do
33
+ expect {
34
+ subject.execute(query.insert(-3, 'a' * (difference + 5)))
35
+ }.to raise_error(ThinkingSphinx::QueryLengthError)
36
+ end
37
+
38
+ it 'does not allow queries longer than specified in the settings' do
39
+ ThinkingSphinx::Configuration.reset
40
+
41
+ write_configuration('maximum_statement_length' => maximum - 5)
42
+
43
+ expect {
44
+ subject.execute(query.insert(-3, 'a' * (difference)))
45
+ }.to raise_error(ThinkingSphinx::QueryLengthError)
46
+ end
47
+ end
48
+ end
49
+ end if RUBY_PLATFORM != 'java'
@@ -5,7 +5,7 @@ $:.push File.expand_path('../lib', __FILE__)
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = 'thinking-sphinx'
8
- s.version = '5.0.0'
8
+ s.version = '5.1.0'
9
9
  s.platform = Gem::Platform::RUBY
10
10
  s.authors = ["Pat Allan"]
11
11
  s.email = ["pat@freelancing-gods.com"]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thinking-sphinx
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0
4
+ version: 5.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pat Allan
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-20 00:00:00.000000000 Z
11
+ date: 2020-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -174,6 +174,7 @@ executables:
174
174
  extensions: []
175
175
  extra_rdoc_files: []
176
176
  files:
177
+ - ".circleci/config.yml"
177
178
  - ".gitignore"
178
179
  - ".travis.yml"
179
180
  - Appraisals
@@ -197,6 +198,7 @@ files:
197
198
  - lib/thinking_sphinx/active_record/attribute/type.rb
198
199
  - lib/thinking_sphinx/active_record/attribute/values.rb
199
200
  - lib/thinking_sphinx/active_record/base.rb
201
+ - lib/thinking_sphinx/active_record/callbacks/association_delta_callbacks.rb
200
202
  - lib/thinking_sphinx/active_record/callbacks/delete_callbacks.rb
201
203
  - lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb
202
204
  - lib/thinking_sphinx/active_record/callbacks/update_callbacks.rb
@@ -356,7 +358,6 @@ files:
356
358
  - spec/acceptance/attribute_updates_spec.rb
357
359
  - spec/acceptance/batch_searching_spec.rb
358
360
  - spec/acceptance/big_integers_spec.rb
359
- - spec/acceptance/connection_spec.rb
360
361
  - spec/acceptance/excerpts_spec.rb
361
362
  - spec/acceptance/facets_spec.rb
362
363
  - spec/acceptance/geosearching_spec.rb
@@ -393,6 +394,7 @@ files:
393
394
  - spec/internal/app/indices/book_index.rb
394
395
  - spec/internal/app/indices/car_index.rb
395
396
  - spec/internal/app/indices/city_index.rb
397
+ - spec/internal/app/indices/colour_index.rb
396
398
  - spec/internal/app/indices/product_index.rb
397
399
  - spec/internal/app/indices/tee_index.rb
398
400
  - spec/internal/app/indices/user_index.rb
@@ -461,6 +463,7 @@ files:
461
463
  - spec/thinking_sphinx/commands/stop_spec.rb
462
464
  - spec/thinking_sphinx/configuration/minimum_fields_spec.rb
463
465
  - spec/thinking_sphinx/configuration_spec.rb
466
+ - spec/thinking_sphinx/connection/mri_spec.rb
464
467
  - spec/thinking_sphinx/connection_spec.rb
465
468
  - spec/thinking_sphinx/deletion_spec.rb
466
469
  - spec/thinking_sphinx/deltas/default_delta_spec.rb
@@ -508,7 +511,7 @@ homepage: https://pat.github.io/thinking-sphinx/
508
511
  licenses:
509
512
  - MIT
510
513
  metadata: {}
511
- post_install_message:
514
+ post_install_message:
512
515
  rdoc_options: []
513
516
  require_paths:
514
517
  - lib
@@ -524,7 +527,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
524
527
  version: '0'
525
528
  requirements: []
526
529
  rubygems_version: 3.0.3
527
- signing_key:
530
+ signing_key:
528
531
  specification_version: 4
529
532
  summary: A smart wrapper over Sphinx for ActiveRecord
530
533
  test_files:
@@ -533,7 +536,6 @@ test_files:
533
536
  - spec/acceptance/attribute_updates_spec.rb
534
537
  - spec/acceptance/batch_searching_spec.rb
535
538
  - spec/acceptance/big_integers_spec.rb
536
- - spec/acceptance/connection_spec.rb
537
539
  - spec/acceptance/excerpts_spec.rb
538
540
  - spec/acceptance/facets_spec.rb
539
541
  - spec/acceptance/geosearching_spec.rb
@@ -570,6 +572,7 @@ test_files:
570
572
  - spec/internal/app/indices/book_index.rb
571
573
  - spec/internal/app/indices/car_index.rb
572
574
  - spec/internal/app/indices/city_index.rb
575
+ - spec/internal/app/indices/colour_index.rb
573
576
  - spec/internal/app/indices/product_index.rb
574
577
  - spec/internal/app/indices/tee_index.rb
575
578
  - spec/internal/app/indices/user_index.rb
@@ -638,6 +641,7 @@ test_files:
638
641
  - spec/thinking_sphinx/commands/stop_spec.rb
639
642
  - spec/thinking_sphinx/configuration/minimum_fields_spec.rb
640
643
  - spec/thinking_sphinx/configuration_spec.rb
644
+ - spec/thinking_sphinx/connection/mri_spec.rb
641
645
  - spec/thinking_sphinx/connection_spec.rb
642
646
  - spec/thinking_sphinx/deletion_spec.rb
643
647
  - spec/thinking_sphinx/deltas/default_delta_spec.rb
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'acceptance/spec_helper'
4
-
5
- RSpec.describe 'Connections', :live => true do
6
- let(:maximum) { (2 ** 23) - 5 }
7
- let(:query) { String.new "SELECT * FROM book_core WHERE MATCH('')" }
8
- let(:difference) { maximum - query.length }
9
-
10
- it 'allows normal length queries through' do
11
- expect {
12
- ThinkingSphinx::Connection.take do |connection|
13
- connection.execute query.insert(-3, 'a' * difference)
14
- end
15
- }.to_not raise_error
16
- end
17
-
18
- it 'does not allow overly long queries' do
19
- expect {
20
- ThinkingSphinx::Connection.take do |connection|
21
- connection.execute query.insert(-3, 'a' * (difference + 5))
22
- end
23
- }.to raise_error(ThinkingSphinx::QueryLengthError)
24
- end
25
- end