searchkick 0.9.1 → 1.0.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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +10 -9
  3. data/CHANGELOG.md +14 -0
  4. data/README.md +190 -14
  5. data/lib/searchkick.rb +1 -0
  6. data/lib/searchkick/index.rb +8 -8
  7. data/lib/searchkick/logging.rb +4 -2
  8. data/lib/searchkick/model.rb +13 -10
  9. data/lib/searchkick/query.rb +107 -39
  10. data/lib/searchkick/reindex_job.rb +0 -2
  11. data/lib/searchkick/reindex_v2_job.rb +0 -1
  12. data/lib/searchkick/results.rb +18 -1
  13. data/lib/searchkick/tasks.rb +0 -2
  14. data/lib/searchkick/version.rb +1 -1
  15. data/test/aggs_test.rb +102 -0
  16. data/test/autocomplete_test.rb +1 -3
  17. data/test/boost_test.rb +1 -3
  18. data/{ci → test/ci}/before_install.sh +4 -3
  19. data/test/facets_test.rb +4 -6
  20. data/{gemfiles → test/gemfiles}/activerecord31.gemfile +1 -1
  21. data/{gemfiles → test/gemfiles}/activerecord32.gemfile +1 -1
  22. data/{gemfiles → test/gemfiles}/activerecord40.gemfile +1 -1
  23. data/{gemfiles → test/gemfiles}/activerecord41.gemfile +1 -1
  24. data/{gemfiles → test/gemfiles}/mongoid2.gemfile +1 -1
  25. data/{gemfiles → test/gemfiles}/mongoid3.gemfile +1 -1
  26. data/{gemfiles → test/gemfiles}/mongoid4.gemfile +1 -1
  27. data/test/gemfiles/mongoid5.gemfile +7 -0
  28. data/{gemfiles → test/gemfiles}/nobrainer.gemfile +1 -1
  29. data/test/highlight_test.rb +2 -4
  30. data/test/index_test.rb +20 -9
  31. data/test/inheritance_test.rb +1 -3
  32. data/test/match_test.rb +8 -7
  33. data/test/model_test.rb +2 -4
  34. data/test/query_test.rb +1 -3
  35. data/test/records_test.rb +0 -2
  36. data/test/reindex_job_test.rb +1 -3
  37. data/test/reindex_v2_job_test.rb +1 -3
  38. data/test/routing_test.rb +4 -3
  39. data/test/should_index_test.rb +1 -3
  40. data/test/similar_test.rb +1 -3
  41. data/test/sql_test.rb +7 -9
  42. data/test/suggest_test.rb +1 -3
  43. data/test/synonyms_test.rb +1 -3
  44. data/test/test_helper.rb +23 -10
  45. metadata +24 -11
@@ -1,7 +1,6 @@
1
1
  require_relative "test_helper"
2
2
 
3
- class TestBoost < Minitest::Test
4
-
3
+ class BoostTest < Minitest::Test
5
4
  # conversions
6
5
 
7
6
  def test_conversions
@@ -133,5 +132,4 @@ class TestBoost < Minitest::Test
133
132
  ]
134
133
  assert_order "san", ["San Francisco", "San Antonio", "San Marino"], boost_by_distance: {field: :location, origin: [37, -122], scale: "1000mi"}
135
134
  end
136
-
137
135
  end
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
- wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.3.2.deb
4
- sudo dpkg -i elasticsearch-1.3.2.deb
5
- sudo service elasticsearch restart
3
+ sudo apt-get purge elasticsearch
4
+ wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.7.3.deb
5
+ sudo dpkg -i elasticsearch-1.7.3.deb
6
+ sudo service elasticsearch start
6
7
 
7
8
  if [ -n "$NOBRAINER" ]; then
8
9
  source /etc/lsb-release && echo "deb http://download.rethinkdb.com/apt $DISTRIB_CODENAME main" | sudo tee /etc/apt/sources.list.d/rethinkdb.list
@@ -1,9 +1,8 @@
1
1
  require_relative "test_helper"
2
- require "active_support/core_ext"
3
-
4
- class TestFacets < Minitest::Test
5
2
 
3
+ class FacetsTest < Minitest::Test
6
4
  def setup
5
+ skip if elasticsearch2?
7
6
  super
8
7
  store [
9
8
  {name: "Product Show", latitude: 37.7833, longitude: 12.4167, store_id: 1, in_stock: true, color: "blue", price: 21, created_at: 2.days.ago},
@@ -79,14 +78,13 @@ class TestFacets < Minitest::Test
79
78
  skip if Gem::Version.new(Searchkick.server_version) >= Gem::Version.new("1.4.0")
80
79
  options = {where: {store_id: 2}, facets: {store_id: {stats: true}}}
81
80
  facets = Product.search("Product", options).facets["store_id"]["terms"]
82
- expected_facets_keys = %w[term count total_count min max total mean]
81
+ expected_facets_keys = %w(term count total_count min max total mean)
83
82
  assert_equal expected_facets_keys, facets.first.keys
84
83
  end
85
84
 
86
85
  protected
87
86
 
88
- def store_facet(options, facet_key="store_id")
87
+ def store_facet(options, facet_key = "store_id")
89
88
  Hash[Product.search("Product", options).facets[facet_key]["terms"].map { |v| [v["term"], v["count"]] }]
90
89
  end
91
-
92
90
  end
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../"
4
+ gemspec path: "../../"
5
5
 
6
6
  gem "sqlite3"
7
7
  gem "activerecord", "~> 3.1.0"
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../"
4
+ gemspec path: "../../"
5
5
 
6
6
  gem "sqlite3"
7
7
  gem "activerecord", "~> 3.2.0"
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../"
4
+ gemspec path: "../../"
5
5
 
6
6
  gem "sqlite3"
7
7
  gem "activerecord", "~> 4.0.0"
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../"
4
+ gemspec path: "../../"
5
5
 
6
6
  gem "sqlite3"
7
7
  gem "activerecord", "~> 4.1.0"
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../"
4
+ gemspec path: "../../"
5
5
 
6
6
  gem "mongoid", "~> 2"
7
7
  gem "bson_ext"
@@ -1,6 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../"
4
+ gemspec path: "../../"
5
5
 
6
6
  gem "mongoid", "~> 3.1.0"
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../"
4
+ gemspec path: "../../"
5
5
 
6
6
  gem "mongoid", "~> 4.0.0"
7
7
  gem "activejob_backport"
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in searchkick.gemspec
4
+ gemspec path: "../../"
5
+
6
+ gem "mongoid", "~> 5.0.0"
7
+ gem "activejob_backport"
@@ -1,6 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../"
4
+ gemspec path: "../../"
5
5
 
6
6
  gem "nobrainer", "0.27.0"
@@ -1,7 +1,6 @@
1
1
  require_relative "test_helper"
2
2
 
3
- class TestHighlight < Minitest::Test
4
-
3
+ class HighlightTest < Minitest::Test
5
4
  def test_basic
6
5
  store_names ["Two Door Cinema Club"]
7
6
  assert_equal "Two Door <em>Cinema</em> Club", Product.search("cinema", fields: [:name], highlight: true).with_details.first[1][:highlight][:name]
@@ -41,7 +40,7 @@ class TestHighlight < Minitest::Test
41
40
  json = {
42
41
  query: {
43
42
  match: {
44
- _all: "cinema"
43
+ "name.analyzed" => "cinema"
45
44
  }
46
45
  },
47
46
  highlight: {
@@ -54,5 +53,4 @@ class TestHighlight < Minitest::Test
54
53
  }
55
54
  assert_equal "Two Door <strong>Cinema</strong> Club", Product.search(json: json).with_details.first[1][:highlight][:"name.analyzed"]
56
55
  end
57
-
58
56
  end
@@ -1,7 +1,6 @@
1
1
  require_relative "test_helper"
2
2
 
3
- class TestIndex < Minitest::Test
4
-
3
+ class IndexTest < Minitest::Test
5
4
  def test_clean_indices
6
5
  old_index = Searchkick::Index.new("products_test_20130801000000000")
7
6
  different_index = Searchkick::Index.new("items_test_20130801000000000")
@@ -93,27 +92,39 @@ class TestIndex < Minitest::Test
93
92
  end
94
93
 
95
94
  def test_unsupported_version
96
- raises_exception = ->(s) { raise Elasticsearch::Transport::Transport::Error.new("[500] No query registered for [multi_match]") }
95
+ raises_exception = ->(_) { raise Elasticsearch::Transport::Transport::Error.new("[500] No query registered for [multi_match]") }
97
96
  Searchkick.client.stub :search, raises_exception do
98
97
  assert_raises(Searchkick::UnsupportedVersionError) { Product.search("test") }
99
98
  end
100
99
  end
101
100
 
102
101
  def test_invalid_query
103
- assert_raises(Searchkick::InvalidQueryError) { Product.search(query: {}) }
102
+ assert_raises(Searchkick::InvalidQueryError) { Product.search(query: {boom: true}) }
104
103
  end
105
104
 
106
- if defined?(ActiveRecord)
105
+ unless mongoid2? || nobrainer? || activerecord_below41?
106
+ def test_dangerous_reindex
107
+ assert_raises(Searchkick::DangerousOperation) { Product.where(id: [1, 2, 3]).reindex }
108
+ end
109
+
110
+ def test_dangerous_reindex_accepted
111
+ store_names ["Product A", "Product B"]
112
+ Product.where(name: "Product A").reindex(accept_danger: true)
113
+ assert_search "product", ["Product A"]
114
+ end
115
+
116
+ def test_dangerous_reindex_inheritance
117
+ assert_raises(Searchkick::DangerousOperation) { Dog.where(id: [1, 2, 3]).reindex }
118
+ end
119
+ end
107
120
 
121
+ if defined?(ActiveRecord)
108
122
  def test_transaction
109
123
  Product.transaction do
110
124
  store_names ["Product A"]
111
125
  raise ActiveRecord::Rollback
112
126
  end
113
-
114
- assert_search "product", []
127
+ assert_search "product", [], conversions: false
115
128
  end
116
-
117
129
  end
118
-
119
130
  end
@@ -1,7 +1,6 @@
1
1
  require_relative "test_helper"
2
2
 
3
- class TestInheritance < Minitest::Test
4
-
3
+ class InheritanceTest < Minitest::Test
5
4
  def test_child_reindex
6
5
  store_names ["Max"], Cat
7
6
  assert Dog.reindex
@@ -76,5 +75,4 @@ class TestInheritance < Minitest::Test
76
75
  store_names ["Product B"], Animal
77
76
  assert_search "product", ["Product A", "Product B"], index_name: [Product.searchkick_index.name, Animal.searchkick_index.name], conversions: false
78
77
  end
79
-
80
78
  end
@@ -1,9 +1,6 @@
1
- # encoding: utf-8
2
-
3
1
  require_relative "test_helper"
4
2
 
5
- class TestMatch < Minitest::Test
6
-
3
+ class MatchTest < Minitest::Test
7
4
  # exact
8
5
 
9
6
  def test_match
@@ -114,8 +111,8 @@ class TestMatch < Minitest::Test
114
111
 
115
112
  def test_misspelling_zucchini_transposition
116
113
  store_names ["zucchini"]
117
- assert_search "zuccihni", [] # doesn't work without transpositions:true option
118
- assert_search "zuccihni", ["zucchini"], misspellings: {transpositions: true}
114
+ assert_search "zuccihni", ["zucchini"]
115
+ assert_search "zuccihni", [], misspellings: {transpositions: false}
119
116
  end
120
117
 
121
118
  def test_misspelling_lasagna
@@ -133,6 +130,11 @@ class TestMatch < Minitest::Test
133
130
  assert_search "lasanga pasat", ["lasagna pasta"], misspellings: {transpositions: true} # both words misspelled with a transposition should still work
134
131
  end
135
132
 
133
+ def test_misspellings_word_start
134
+ store_names ["Sriracha"]
135
+ assert_search "siracha", ["Sriracha"], fields: [{name: :word_start}]
136
+ end
137
+
136
138
  # spaces
137
139
 
138
140
  def test_spaces_in_field
@@ -195,5 +197,4 @@ class TestMatch < Minitest::Test
195
197
  ]
196
198
  assert_search "almond", []
197
199
  end
198
-
199
200
  end
@@ -1,7 +1,6 @@
1
1
  require_relative "test_helper"
2
2
 
3
- class TestModel < Minitest::Test
4
-
3
+ class ModelTest < Minitest::Test
5
4
  def test_disable_callbacks_model
6
5
  store_names ["product a"]
7
6
 
@@ -20,7 +19,7 @@ class TestModel < Minitest::Test
20
19
  def test_disable_callbacks_global
21
20
  # make sure callbacks default to on
22
21
  assert Searchkick.callbacks?
23
-
22
+
24
23
  store_names ["product a"]
25
24
 
26
25
  Searchkick.disable_callbacks
@@ -34,5 +33,4 @@ class TestModel < Minitest::Test
34
33
 
35
34
  assert_search "product", ["product a", "product b"]
36
35
  end
37
-
38
36
  end
@@ -1,7 +1,6 @@
1
1
  require_relative "test_helper"
2
2
 
3
- class TestQuery < Minitest::Test
4
-
3
+ class QueryTest < Minitest::Test
5
4
  def test_basic
6
5
  store_names ["Milk", "Apple"]
7
6
  query = Product.search("milk", execute: false)
@@ -10,5 +9,4 @@ class TestQuery < Minitest::Test
10
9
  query.body[:query] = {match_all: {}}
11
10
  assert_equal ["Apple", "Milk"], query.execute.map(&:name).sort
12
11
  end
13
-
14
12
  end
@@ -1,10 +1,8 @@
1
1
  require_relative "test_helper"
2
2
 
3
3
  class RecordsTest < Minitest::Test
4
-
5
4
  def test_records
6
5
  store_names ["Milk", "Apple"]
7
6
  assert_equal Product.search("milk").records.where(name: "Milk").count, 1
8
7
  end
9
-
10
8
  end
@@ -1,7 +1,6 @@
1
1
  require_relative "test_helper"
2
2
 
3
- class TestReindexJob < Minitest::Test
4
-
3
+ class ReindexJobTest < Minitest::Test
5
4
  def setup
6
5
  super
7
6
  Searchkick.disable_callbacks
@@ -29,5 +28,4 @@ class TestReindexJob < Minitest::Test
29
28
  Product.searchkick_index.refresh
30
29
  assert_search "*", []
31
30
  end
32
-
33
31
  end
@@ -1,7 +1,6 @@
1
1
  require_relative "test_helper"
2
2
 
3
- class TestReindexV2Job < Minitest::Test
4
-
3
+ class ReindexV2JobTest < Minitest::Test
5
4
  def setup
6
5
  skip unless defined?(ActiveJob)
7
6
  super
@@ -30,5 +29,4 @@ class TestReindexV2Job < Minitest::Test
30
29
  Product.searchkick_index.refresh
31
30
  assert_search "*", []
32
31
  end
33
-
34
32
  end
@@ -1,14 +1,15 @@
1
1
  require_relative "test_helper"
2
2
 
3
- class TestRouting < Minitest::Test
4
-
3
+ class RoutingTest < Minitest::Test
5
4
  def test_routing_query
5
+ skip if elasticsearch2?
6
6
  query = Store.search("Dollar Tree", routing: "Dollar Tree", execute: false)
7
7
  assert_equal query.params[:routing], "Dollar Tree"
8
8
  end
9
9
 
10
10
  def test_routing_mappings
11
+ skip if elasticsearch2?
11
12
  index_options = Store.searchkick_index.index_options
12
- assert_equal index_options[:mappings][:_default_][:_routing], {required: true, path: "name"}
13
+ assert_equal index_options[:mappings][:_default_][:_routing], required: true, path: "name"
13
14
  end
14
15
  end
@@ -1,7 +1,6 @@
1
1
  require_relative "test_helper"
2
2
 
3
- class TestShouldIndex < Minitest::Test
4
-
3
+ class ShouldIndexTest < Minitest::Test
5
4
  def test_basic
6
5
  store_names ["INDEX", "DO NOT INDEX"]
7
6
  assert_search "index", ["INDEX"]
@@ -30,5 +29,4 @@ class TestShouldIndex < Minitest::Test
30
29
  Product.searchkick_index.refresh
31
30
  assert_search "index", []
32
31
  end
33
-
34
32
  end
@@ -1,7 +1,6 @@
1
1
  require_relative "test_helper"
2
2
 
3
- class TestSimilar < Minitest::Test
4
-
3
+ class SimilarTest < Minitest::Test
5
4
  def test_similar
6
5
  store_names ["Annie's Naturals Organic Shiitake & Sesame Dressing"]
7
6
  assert_search "Annie's Naturals Shiitake & Sesame Vinaigrette", ["Annie's Naturals Organic Shiitake & Sesame Dressing"], similar: true
@@ -16,5 +15,4 @@ class TestSimilar < Minitest::Test
16
15
  store_names ["Lucerne Milk Chocolate Fat Free", "Clover Fat Free Milk"]
17
16
  assert_order "Lucerne Fat Free Chocolate Milk", ["Lucerne Milk Chocolate Fat Free", "Clover Fat Free Milk"], similar: true
18
17
  end
19
-
20
18
  end
@@ -1,7 +1,6 @@
1
1
  require_relative "test_helper"
2
2
 
3
- class TestSql < Minitest::Test
4
-
3
+ class SqlTest < Minitest::Test
5
4
  def test_limit
6
5
  store_names ["Product A", "Product B", "Product C", "Product D"]
7
6
  assert_order "product", ["Product A", "Product B"], order: {name: :asc}, limit: 2
@@ -139,11 +138,11 @@ class TestSql < Minitest::Test
139
138
  # https://gist.github.com/jprante/7099463
140
139
  def test_where_range_array
141
140
  store [
142
- {name: "Product A", user_ids: [11, 23, 13, 16, 17, 23.6]},
143
- {name: "Product B", user_ids: [1, 2, 3, 4, 5, 6, 7, 8, 8.9, 9.1, 9.4]},
141
+ {name: "Product A", user_ids: [11, 23, 13, 16, 17, 23]},
142
+ {name: "Product B", user_ids: [1, 2, 3, 4, 5, 6, 7, 8, 9]},
144
143
  {name: "Product C", user_ids: [101, 230, 150, 200]}
145
144
  ]
146
- assert_search "product", ["Product A"], where: {user_ids: {gt: 10, lt: 23.9}}
145
+ assert_search "product", ["Product A"], where: {user_ids: {gt: 10, lt: 24}}
147
146
  end
148
147
 
149
148
  def test_where_range_array_again
@@ -301,9 +300,9 @@ class TestSql < Minitest::Test
301
300
 
302
301
  def test_big_decimal
303
302
  store [
304
- {name: "Product", latitude: 100.0}
303
+ {name: "Product", latitude: 80.0}
305
304
  ]
306
- assert_search "product", ["Product"], where: {latitude: {gt: 99}}
305
+ assert_search "product", ["Product"], where: {latitude: {gt: 79}}
307
306
  end
308
307
 
309
308
  # load
@@ -333,7 +332,7 @@ class TestSql < Minitest::Test
333
332
  def test_select
334
333
  store [{name: "Product A", store_id: 1}]
335
334
  result = Product.search("product", load: false, select: [:name, :store_id]).first
336
- assert_equal %w[id name store_id], result.keys.reject { |k| k.start_with?("_") }.sort
335
+ assert_equal %w(id name store_id), result.keys.reject { |k| k.start_with?("_") }.sort
337
336
  assert_equal ["Product A"], result.name # this is not great
338
337
  end
339
338
 
@@ -363,5 +362,4 @@ class TestSql < Minitest::Test
363
362
  assert Product.search("product", include: [:store]).first.association(:store).loaded?
364
363
  end
365
364
  end
366
-
367
365
  end