searchkick 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -0
- data/CHANGELOG.md +4 -0
- data/README.md +4 -4
- data/lib/searchkick/query.rb +4 -4
- data/lib/searchkick/version.rb +1 -1
- data/test/aggs_test.rb +3 -3
- data/test/dangerous_reindex_test.rb +27 -0
- data/test/index_test.rb +6 -28
- data/test/misspellings_test.rb +36 -0
- data/test/order_test.rb +38 -0
- data/test/pagination_test.rb +53 -0
- data/test/sql_test.rb +4 -259
- data/test/synonyms_test.rb +5 -4
- data/test/where_test.rb +138 -0
- metadata +13 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12242ee03581e51bcb73eb5301309a0ba85b0c8b
|
4
|
+
data.tar.gz: 94f6e444569e05c8d1a56054da8f079cdf43bf50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56a50ceacda73f6aee353c22b84191d721afe481808ed69beb7d79601d4e6cd57deed76ac8f70f4ccc37d753ee4d16758b5b269359cbd79ec363180290c4ee99
|
7
|
+
data.tar.gz: 71953014b0b9233519f0088da6d3246a2f45fa3babff843dcce2143b0b9f24b8ddeb0523418b5b764485785921c11a2ad6f723b028cd84d420162bba15bf4438
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -280,7 +280,7 @@ Call `Product.reindex` after changing synonyms.
|
|
280
280
|
|
281
281
|
### WordNet
|
282
282
|
|
283
|
-
Prepopulate English synonyms with the [WordNet database](
|
283
|
+
Prepopulate English synonyms with the [WordNet database](https://en.wikipedia.org/wiki/WordNet).
|
284
284
|
|
285
285
|
Download [WordNet 3.0](http://wordnetcode.princeton.edu/3.0/WNprolog-3.0.tar.gz) to each Elasticsearch server and move `wn_s.pl` to the `/var/lib` directory.
|
286
286
|
|
@@ -301,7 +301,7 @@ end
|
|
301
301
|
|
302
302
|
### Misspellings
|
303
303
|
|
304
|
-
By default, Searchkick handles misspelled queries by returning results with an [edit distance](
|
304
|
+
By default, Searchkick handles misspelled queries by returning results with an [edit distance](https://en.wikipedia.org/wiki/Levenshtein_distance) of one.
|
305
305
|
|
306
306
|
You can change this with:
|
307
307
|
|
@@ -893,7 +893,7 @@ Searchkick uses `ENV["ELASTICSEARCH_URL"]` for the Elasticsearch server. This d
|
|
893
893
|
|
894
894
|
### Heroku
|
895
895
|
|
896
|
-
Choose an add-on: [SearchBox](https://
|
896
|
+
Choose an add-on: [SearchBox](https://elements.heroku.com/addons/searchbox), [Bonsai](https://elements.heroku.com/addons/bonsai), or [Found](https://addons.heroku.com/foundelasticsearch).
|
897
897
|
|
898
898
|
```sh
|
899
899
|
# SearchBox
|
@@ -1318,7 +1318,7 @@ For convenience, this is set by default in the test environment.
|
|
1318
1318
|
|
1319
1319
|
## Thanks
|
1320
1320
|
|
1321
|
-
Thanks to Karel Minarik for [Elasticsearch Ruby](https://github.com/elasticsearch/elasticsearch-ruby) and [Tire](https://github.com/karmi/
|
1321
|
+
Thanks to Karel Minarik for [Elasticsearch Ruby](https://github.com/elasticsearch/elasticsearch-ruby) and [Tire](https://github.com/karmi/retire), Jaroslav Kalistsuk for [zero downtime reindexing](https://gist.github.com/jarosan/3124884), and Alex Leschenko for [Elasticsearch autocomplete](https://github.com/leschenko/elasticsearch_autocomplete).
|
1322
1322
|
|
1323
1323
|
## Roadmap
|
1324
1324
|
|
data/lib/searchkick/query.rb
CHANGED
@@ -49,7 +49,7 @@ module Searchkick
|
|
49
49
|
|
50
50
|
# pagination
|
51
51
|
page = [options[:page].to_i, 1].max
|
52
|
-
per_page = (options[:limit] || options[:per_page] ||
|
52
|
+
per_page = (options[:limit] || options[:per_page] || 1_000).to_i
|
53
53
|
padding = [options[:padding].to_i, 0].max
|
54
54
|
offset = options[:offset] || (page - 1) * per_page + padding
|
55
55
|
|
@@ -300,7 +300,7 @@ module Searchkick
|
|
300
300
|
facets.each do |field, facet_options|
|
301
301
|
# ask for extra facets due to
|
302
302
|
# https://github.com/elasticsearch/elasticsearch/issues/1305
|
303
|
-
size = facet_options[:limit] ? facet_options[:limit] + 150 :
|
303
|
+
size = facet_options[:limit] ? facet_options[:limit] + 150 : 1_000
|
304
304
|
|
305
305
|
if facet_options[:ranges]
|
306
306
|
payload[:facets][field] = {
|
@@ -347,10 +347,10 @@ module Searchkick
|
|
347
347
|
aggs = options[:aggs]
|
348
348
|
payload[:aggs] = {}
|
349
349
|
|
350
|
-
aggs = aggs.map { |f| [f, {}] }
|
350
|
+
aggs = Hash[aggs.map { |f| [f, {}] }] if aggs.is_a?(Array) # convert to more advanced syntax
|
351
351
|
|
352
352
|
aggs.each do |field, agg_options|
|
353
|
-
size = agg_options[:limit] ? agg_options[:limit] :
|
353
|
+
size = agg_options[:limit] ? agg_options[:limit] : 1_000
|
354
354
|
shared_agg_options = agg_options.slice(:order)
|
355
355
|
|
356
356
|
if agg_options[:ranges]
|
data/lib/searchkick/version.rb
CHANGED
data/test/aggs_test.rb
CHANGED
@@ -95,7 +95,7 @@ class AggsTest < Minitest::Test
|
|
95
95
|
protected
|
96
96
|
|
97
97
|
def buckets_as_hash(agg)
|
98
|
-
agg["buckets"].map { |v| [v["key"], v["doc_count"]] }
|
98
|
+
Hash[agg["buckets"].map { |v| [v["key"], v["doc_count"]] }]
|
99
99
|
end
|
100
100
|
|
101
101
|
def store_agg(options, agg_key = "store_id")
|
@@ -104,8 +104,8 @@ class AggsTest < Minitest::Test
|
|
104
104
|
end
|
105
105
|
|
106
106
|
def store_multiple_aggs(options)
|
107
|
-
Product.search("Product", options).aggs.map do |field, filtered_agg|
|
107
|
+
Hash[Product.search("Product", options).aggs.map do |field, filtered_agg|
|
108
108
|
[field, buckets_as_hash(filtered_agg)]
|
109
|
-
end
|
109
|
+
end]
|
110
110
|
end
|
111
111
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class DangerousReindexTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
skip if mongoid2? || nobrainer? || activerecord_below41?
|
6
|
+
super
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_dangerous_reindex
|
10
|
+
assert_raises(Searchkick::DangerousOperation) { Product.where(id: [1, 2, 3]).reindex }
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_dangerous_index_associations
|
14
|
+
Store.create!(name: "Test")
|
15
|
+
assert_raises(Searchkick::DangerousOperation) { Store.first.products.reindex }
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_dangerous_reindex_accepted
|
19
|
+
store_names ["Product A", "Product B"]
|
20
|
+
Product.where(name: "Product A").reindex(accept_danger: true)
|
21
|
+
assert_search "product", ["Product A"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_dangerous_reindex_inheritance
|
25
|
+
assert_raises(Searchkick::DangerousOperation) { Dog.where(id: [1, 2, 3]).reindex }
|
26
|
+
end
|
27
|
+
end
|
data/test/index_test.rb
CHANGED
@@ -102,34 +102,12 @@ class IndexTest < Minitest::Test
|
|
102
102
|
assert_raises(Searchkick::InvalidQueryError) { Product.search(query: {boom: true}) }
|
103
103
|
end
|
104
104
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
def test_dangerous_index_associations
|
111
|
-
Store.create!(name: "Test")
|
112
|
-
assert_raises(Searchkick::DangerousOperation) { Store.first.products.reindex }
|
113
|
-
end
|
114
|
-
|
115
|
-
def test_dangerous_reindex_accepted
|
116
|
-
store_names ["Product A", "Product B"]
|
117
|
-
Product.where(name: "Product A").reindex(accept_danger: true)
|
118
|
-
assert_search "product", ["Product A"]
|
119
|
-
end
|
120
|
-
|
121
|
-
def test_dangerous_reindex_inheritance
|
122
|
-
assert_raises(Searchkick::DangerousOperation) { Dog.where(id: [1, 2, 3]).reindex }
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
if defined?(ActiveRecord)
|
127
|
-
def test_transaction
|
128
|
-
Product.transaction do
|
129
|
-
store_names ["Product A"]
|
130
|
-
raise ActiveRecord::Rollback
|
131
|
-
end
|
132
|
-
assert_search "product", []
|
105
|
+
def test_transaction
|
106
|
+
skip unless defined?(ActiveRecord)
|
107
|
+
Product.transaction do
|
108
|
+
store_names ["Product A"]
|
109
|
+
raise ActiveRecord::Rollback
|
133
110
|
end
|
111
|
+
assert_search "product", []
|
134
112
|
end
|
135
113
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class MisspellingsTest < Minitest::Test
|
4
|
+
def test_misspellings
|
5
|
+
store_names ["abc", "abd", "aee"]
|
6
|
+
assert_search "abc", ["abc"], misspellings: false
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_misspellings_distance
|
10
|
+
store_names ["abbb", "aabb"]
|
11
|
+
assert_search "aaaa", ["aabb"], misspellings: {distance: 2}
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_misspellings_prefix_length
|
15
|
+
store_names ["ap", "api", "apt", "any", "nap", "ah", "ahi"]
|
16
|
+
assert_search "ap", ["ap"], misspellings: {prefix_length: 2}
|
17
|
+
assert_search "api", ["ap", "api", "apt"], misspellings: {prefix_length: 2}
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_misspellings_prefix_length_operator
|
21
|
+
store_names ["ap", "api", "apt", "any", "nap", "ah", "aha"]
|
22
|
+
assert_search "ap ah", ["ap", "ah"], operator: "or", misspellings: {prefix_length: 2}
|
23
|
+
assert_search "api ahi", ["ap", "api", "apt", "ah", "aha"], operator: "or", misspellings: {prefix_length: 2}
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_misspellings_fields_operator
|
27
|
+
store [
|
28
|
+
{name: "red", color: "red"},
|
29
|
+
{name: "blue", color: "blue"},
|
30
|
+
{name: "cyan", color: "blue green"},
|
31
|
+
{name: "magenta", color: "red blue"},
|
32
|
+
{name: "green", color: "green"}
|
33
|
+
]
|
34
|
+
assert_search "red blue", ["red", "blue", "cyan", "magenta"], operator: "or", fields: ["color"], misspellings: false
|
35
|
+
end
|
36
|
+
end
|
data/test/order_test.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class OrderTest < Minitest::Test
|
4
|
+
def test_order_hash
|
5
|
+
store_names ["Product A", "Product B", "Product C", "Product D"]
|
6
|
+
assert_order "product", ["Product D", "Product C", "Product B", "Product A"], order: {name: :desc}
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_order_string
|
10
|
+
store_names ["Product A", "Product B", "Product C", "Product D"]
|
11
|
+
assert_order "product", ["Product A", "Product B", "Product C", "Product D"], order: "name"
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_order_id
|
15
|
+
store_names ["Product A", "Product B"]
|
16
|
+
product_a = Product.where(name: "Product A").first
|
17
|
+
product_b = Product.where(name: "Product B").first
|
18
|
+
assert_order "product", [product_a, product_b].sort_by(&:id).map(&:name), order: {id: :asc}
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_order_multiple
|
22
|
+
store [
|
23
|
+
{name: "Product A", color: "blue", store_id: 1},
|
24
|
+
{name: "Product B", color: "red", store_id: 3},
|
25
|
+
{name: "Product C", color: "red", store_id: 2}
|
26
|
+
]
|
27
|
+
assert_order "product", ["Product A", "Product B", "Product C"], order: {color: :asc, store_id: :desc}
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_order_ignore_unmapped
|
31
|
+
assert_order "product", [], order: {not_mapped: {ignore_unmapped: true}}
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_order_array
|
35
|
+
store [{name: "San Francisco", latitude: 37.7833, longitude: -122.4167}]
|
36
|
+
assert_order "francisco", ["San Francisco"], order: [{_geo_distance: {location: "0,0"}}]
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class PaginationTest < Minitest::Test
|
4
|
+
def test_limit
|
5
|
+
store_names ["Product A", "Product B", "Product C", "Product D"]
|
6
|
+
assert_order "product", ["Product A", "Product B"], order: {name: :asc}, limit: 2
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_no_limit
|
10
|
+
names = 20.times.map { |i| "Product #{i}" }
|
11
|
+
store_names names
|
12
|
+
assert_search "product", names
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_offset
|
16
|
+
store_names ["Product A", "Product B", "Product C", "Product D"]
|
17
|
+
assert_order "product", ["Product C", "Product D"], order: {name: :asc}, offset: 2
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_pagination
|
21
|
+
store_names ["Product A", "Product B", "Product C", "Product D", "Product E", "Product F"]
|
22
|
+
products = Product.search("product", order: {name: :asc}, page: 2, per_page: 2, padding: 1)
|
23
|
+
assert_equal ["Product D", "Product E"], products.map(&:name)
|
24
|
+
assert_equal "product", products.entry_name
|
25
|
+
assert_equal 2, products.current_page
|
26
|
+
assert_equal 1, products.padding
|
27
|
+
assert_equal 2, products.per_page
|
28
|
+
assert_equal 2, products.size
|
29
|
+
assert_equal 2, products.length
|
30
|
+
assert_equal 3, products.total_pages
|
31
|
+
assert_equal 6, products.total_count
|
32
|
+
assert_equal 6, products.total_entries
|
33
|
+
assert_equal 2, products.limit_value
|
34
|
+
assert_equal 3, products.offset_value
|
35
|
+
assert_equal 3, products.offset
|
36
|
+
assert_equal 3, products.next_page
|
37
|
+
assert_equal 1, products.previous_page
|
38
|
+
assert_equal 1, products.prev_page
|
39
|
+
assert !products.first_page?
|
40
|
+
assert !products.last_page?
|
41
|
+
assert !products.empty?
|
42
|
+
assert !products.out_of_range?
|
43
|
+
assert products.any?
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_pagination_nil_page
|
47
|
+
store_names ["Product A", "Product B", "Product C", "Product D", "Product E"]
|
48
|
+
products = Product.search("product", order: {name: :asc}, page: nil, per_page: 2)
|
49
|
+
assert_equal ["Product A", "Product B"], products.map(&:name)
|
50
|
+
assert_equal 1, products.current_page
|
51
|
+
assert products.first_page?
|
52
|
+
end
|
53
|
+
end
|
data/test/sql_test.rb
CHANGED
@@ -1,226 +1,6 @@
|
|
1
1
|
require_relative "test_helper"
|
2
2
|
|
3
3
|
class SqlTest < Minitest::Test
|
4
|
-
def test_limit
|
5
|
-
store_names ["Product A", "Product B", "Product C", "Product D"]
|
6
|
-
assert_order "product", ["Product A", "Product B"], order: {name: :asc}, limit: 2
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_no_limit
|
10
|
-
names = 20.times.map { |i| "Product #{i}" }
|
11
|
-
store_names names
|
12
|
-
assert_search "product", names
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_offset
|
16
|
-
store_names ["Product A", "Product B", "Product C", "Product D"]
|
17
|
-
assert_order "product", ["Product C", "Product D"], order: {name: :asc}, offset: 2
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_pagination
|
21
|
-
store_names ["Product A", "Product B", "Product C", "Product D", "Product E", "Product F"]
|
22
|
-
products = Product.search("product", order: {name: :asc}, page: 2, per_page: 2, padding: 1)
|
23
|
-
assert_equal ["Product D", "Product E"], products.map(&:name)
|
24
|
-
assert_equal "product", products.entry_name
|
25
|
-
assert_equal 2, products.current_page
|
26
|
-
assert_equal 1, products.padding
|
27
|
-
assert_equal 2, products.per_page
|
28
|
-
assert_equal 2, products.size
|
29
|
-
assert_equal 2, products.length
|
30
|
-
assert_equal 3, products.total_pages
|
31
|
-
assert_equal 6, products.total_count
|
32
|
-
assert_equal 6, products.total_entries
|
33
|
-
assert_equal 2, products.limit_value
|
34
|
-
assert_equal 3, products.offset_value
|
35
|
-
assert_equal 3, products.offset
|
36
|
-
assert_equal 3, products.next_page
|
37
|
-
assert_equal 1, products.previous_page
|
38
|
-
assert_equal 1, products.prev_page
|
39
|
-
assert !products.first_page?
|
40
|
-
assert !products.last_page?
|
41
|
-
assert !products.empty?
|
42
|
-
assert !products.out_of_range?
|
43
|
-
assert products.any?
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_pagination_nil_page
|
47
|
-
store_names ["Product A", "Product B", "Product C", "Product D", "Product E"]
|
48
|
-
products = Product.search("product", order: {name: :asc}, page: nil, per_page: 2)
|
49
|
-
assert_equal ["Product A", "Product B"], products.map(&:name)
|
50
|
-
assert_equal 1, products.current_page
|
51
|
-
assert products.first_page?
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_where
|
55
|
-
now = Time.now
|
56
|
-
store [
|
57
|
-
{name: "Product A", store_id: 1, in_stock: true, backordered: true, created_at: now, orders_count: 4, user_ids: [1, 2, 3]},
|
58
|
-
{name: "Product B", store_id: 2, in_stock: true, backordered: false, created_at: now - 1, orders_count: 3, user_ids: [1]},
|
59
|
-
{name: "Product C", store_id: 3, in_stock: false, backordered: true, created_at: now - 2, orders_count: 2, user_ids: [1, 3]},
|
60
|
-
{name: "Product D", store_id: 4, in_stock: false, backordered: false, created_at: now - 3, orders_count: 1}
|
61
|
-
]
|
62
|
-
assert_search "product", ["Product A", "Product B"], where: {in_stock: true}
|
63
|
-
# date
|
64
|
-
assert_search "product", ["Product A"], where: {created_at: {gt: now - 1}}
|
65
|
-
assert_search "product", ["Product A", "Product B"], where: {created_at: {gte: now - 1}}
|
66
|
-
assert_search "product", ["Product D"], where: {created_at: {lt: now - 2}}
|
67
|
-
assert_search "product", ["Product C", "Product D"], where: {created_at: {lte: now - 2}}
|
68
|
-
# integer
|
69
|
-
assert_search "product", ["Product A"], where: {store_id: {lt: 2}}
|
70
|
-
assert_search "product", ["Product A", "Product B"], where: {store_id: {lte: 2}}
|
71
|
-
assert_search "product", ["Product D"], where: {store_id: {gt: 3}}
|
72
|
-
assert_search "product", ["Product C", "Product D"], where: {store_id: {gte: 3}}
|
73
|
-
# range
|
74
|
-
assert_search "product", ["Product A", "Product B"], where: {store_id: 1..2}
|
75
|
-
assert_search "product", ["Product A"], where: {store_id: 1...2}
|
76
|
-
assert_search "product", ["Product A", "Product B"], where: {store_id: [1, 2]}
|
77
|
-
assert_search "product", ["Product B", "Product C", "Product D"], where: {store_id: {not: 1}}
|
78
|
-
assert_search "product", ["Product C", "Product D"], where: {store_id: {not: [1, 2]}}
|
79
|
-
assert_search "product", ["Product A"], where: {user_ids: {lte: 2, gte: 2}}
|
80
|
-
# or
|
81
|
-
assert_search "product", ["Product A", "Product B", "Product C"], where: {or: [[{in_stock: true}, {store_id: 3}]]}
|
82
|
-
assert_search "product", ["Product A", "Product B", "Product C"], where: {or: [[{orders_count: [2, 4]}, {store_id: [1, 2]}]]}
|
83
|
-
assert_search "product", ["Product A", "Product D"], where: {or: [[{orders_count: 1}, {created_at: {gte: now - 1}, backordered: true}]]}
|
84
|
-
# all
|
85
|
-
assert_search "product", ["Product A", "Product C"], where: {user_ids: {all: [1, 3]}}
|
86
|
-
assert_search "product", [], where: {user_ids: {all: [1, 2, 3, 4]}}
|
87
|
-
# any / nested terms
|
88
|
-
assert_search "product", ["Product B", "Product C"], where: {user_ids: {not: [2], in: [1, 3]}}
|
89
|
-
# not / exists
|
90
|
-
assert_search "product", ["Product D"], where: {user_ids: nil}
|
91
|
-
assert_search "product", ["Product A", "Product B", "Product C"], where: {user_ids: {not: nil}}
|
92
|
-
assert_search "product", ["Product A", "Product C", "Product D"], where: {user_ids: [3, nil]}
|
93
|
-
assert_search "product", ["Product B"], where: {user_ids: {not: [3, nil]}}
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_regexp
|
97
|
-
store_names ["Product A"]
|
98
|
-
assert_search "*", ["Product A"], where: {name: /Pro.+/}
|
99
|
-
end
|
100
|
-
|
101
|
-
def test_alternate_regexp
|
102
|
-
store_names ["Product A", "Item B"]
|
103
|
-
assert_search "*", ["Product A"], where: {name: {regexp: "Pro.+"}}
|
104
|
-
end
|
105
|
-
|
106
|
-
def test_where_string
|
107
|
-
store [
|
108
|
-
{name: "Product A", color: "RED"}
|
109
|
-
]
|
110
|
-
assert_search "product", ["Product A"], where: {color: "RED"}
|
111
|
-
end
|
112
|
-
|
113
|
-
def test_where_nil
|
114
|
-
store [
|
115
|
-
{name: "Product A"},
|
116
|
-
{name: "Product B", color: "red"}
|
117
|
-
]
|
118
|
-
assert_search "product", ["Product A"], where: {color: nil}
|
119
|
-
end
|
120
|
-
|
121
|
-
def test_where_id
|
122
|
-
store_names ["Product A"]
|
123
|
-
product = Product.last
|
124
|
-
assert_search "product", ["Product A"], where: {id: product.id.to_s}
|
125
|
-
end
|
126
|
-
|
127
|
-
def test_where_empty
|
128
|
-
store_names ["Product A"]
|
129
|
-
assert_search "product", ["Product A"], where: {}
|
130
|
-
end
|
131
|
-
|
132
|
-
def test_where_empty_array
|
133
|
-
store_names ["Product A"]
|
134
|
-
assert_search "product", [], where: {store_id: []}
|
135
|
-
end
|
136
|
-
|
137
|
-
# http://elasticsearch-users.115913.n3.nabble.com/Numeric-range-quey-or-filter-in-an-array-field-possible-or-not-td4042967.html
|
138
|
-
# https://gist.github.com/jprante/7099463
|
139
|
-
def test_where_range_array
|
140
|
-
store [
|
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]},
|
143
|
-
{name: "Product C", user_ids: [101, 230, 150, 200]}
|
144
|
-
]
|
145
|
-
assert_search "product", ["Product A"], where: {user_ids: {gt: 10, lt: 24}}
|
146
|
-
end
|
147
|
-
|
148
|
-
def test_where_range_array_again
|
149
|
-
store [
|
150
|
-
{name: "Product A", user_ids: [19, 32, 42]},
|
151
|
-
{name: "Product B", user_ids: [13, 40, 52]}
|
152
|
-
]
|
153
|
-
assert_search "product", ["Product A"], where: {user_ids: {gt: 26, lt: 36}}
|
154
|
-
end
|
155
|
-
|
156
|
-
def test_near
|
157
|
-
store [
|
158
|
-
{name: "San Francisco", latitude: 37.7833, longitude: -122.4167},
|
159
|
-
{name: "San Antonio", latitude: 29.4167, longitude: -98.5000}
|
160
|
-
]
|
161
|
-
assert_search "san", ["San Francisco"], where: {location: {near: [37.5, -122.5]}}
|
162
|
-
end
|
163
|
-
|
164
|
-
def test_near_within
|
165
|
-
store [
|
166
|
-
{name: "San Francisco", latitude: 37.7833, longitude: -122.4167},
|
167
|
-
{name: "San Antonio", latitude: 29.4167, longitude: -98.5000},
|
168
|
-
{name: "San Marino", latitude: 43.9333, longitude: 12.4667}
|
169
|
-
]
|
170
|
-
assert_search "san", ["San Francisco", "San Antonio"], where: {location: {near: [37, -122], within: "2000mi"}}
|
171
|
-
end
|
172
|
-
|
173
|
-
def test_top_left_bottom_right
|
174
|
-
store [
|
175
|
-
{name: "San Francisco", latitude: 37.7833, longitude: -122.4167},
|
176
|
-
{name: "San Antonio", latitude: 29.4167, longitude: -98.5000}
|
177
|
-
]
|
178
|
-
assert_search "san", ["San Francisco"], where: {location: {top_left: [38, -123], bottom_right: [37, -122]}}
|
179
|
-
end
|
180
|
-
|
181
|
-
def test_multiple_locations
|
182
|
-
store [
|
183
|
-
{name: "San Francisco", latitude: 37.7833, longitude: -122.4167},
|
184
|
-
{name: "San Antonio", latitude: 29.4167, longitude: -98.5000}
|
185
|
-
]
|
186
|
-
assert_search "san", ["San Francisco"], where: {multiple_locations: {near: [37.5, -122.5]}}
|
187
|
-
end
|
188
|
-
|
189
|
-
def test_order_hash
|
190
|
-
store_names ["Product A", "Product B", "Product C", "Product D"]
|
191
|
-
assert_order "product", ["Product D", "Product C", "Product B", "Product A"], order: {name: :desc}
|
192
|
-
end
|
193
|
-
|
194
|
-
def test_order_string
|
195
|
-
store_names ["Product A", "Product B", "Product C", "Product D"]
|
196
|
-
assert_order "product", ["Product A", "Product B", "Product C", "Product D"], order: "name"
|
197
|
-
end
|
198
|
-
|
199
|
-
def test_order_id
|
200
|
-
store_names ["Product A", "Product B"]
|
201
|
-
product_a = Product.where(name: "Product A").first
|
202
|
-
product_b = Product.where(name: "Product B").first
|
203
|
-
assert_order "product", [product_a, product_b].sort_by(&:id).map(&:name), order: {id: :asc}
|
204
|
-
end
|
205
|
-
|
206
|
-
def test_order_multiple
|
207
|
-
store [
|
208
|
-
{name: "Product A", color: "blue", store_id: 1},
|
209
|
-
{name: "Product B", color: "red", store_id: 3},
|
210
|
-
{name: "Product C", color: "red", store_id: 2}
|
211
|
-
]
|
212
|
-
assert_order "product", ["Product A", "Product B", "Product C"], order: {color: :asc, store_id: :desc}
|
213
|
-
end
|
214
|
-
|
215
|
-
def test_order_ignore_unmapped
|
216
|
-
assert_order "product", [], order: {not_mapped: {ignore_unmapped: true}}
|
217
|
-
end
|
218
|
-
|
219
|
-
def test_order_array
|
220
|
-
store [{name: "San Francisco", latitude: 37.7833, longitude: -122.4167}]
|
221
|
-
assert_order "francisco", ["San Francisco"], order: [{_geo_distance: {location: "0,0"}}]
|
222
|
-
end
|
223
|
-
|
224
4
|
def test_partial
|
225
5
|
store_names ["Honey"]
|
226
6
|
assert_search "fresh honey", []
|
@@ -233,39 +13,6 @@ class SqlTest < Minitest::Test
|
|
233
13
|
assert_search "fresh honey", ["Honey"], operator: "or"
|
234
14
|
end
|
235
15
|
|
236
|
-
def test_misspellings
|
237
|
-
store_names ["abc", "abd", "aee"]
|
238
|
-
assert_search "abc", ["abc"], misspellings: false
|
239
|
-
end
|
240
|
-
|
241
|
-
def test_misspellings_distance
|
242
|
-
store_names ["abbb", "aabb"]
|
243
|
-
assert_search "aaaa", ["aabb"], misspellings: {distance: 2}
|
244
|
-
end
|
245
|
-
|
246
|
-
def test_misspellings_prefix_length
|
247
|
-
store_names ["ap", "api", "apt", "any", "nap", "ah", "ahi"]
|
248
|
-
assert_search "ap", ["ap"], misspellings: {prefix_length: 2}
|
249
|
-
assert_search "api", ["ap", "api", "apt"], misspellings: {prefix_length: 2}
|
250
|
-
end
|
251
|
-
|
252
|
-
def test_misspellings_prefix_length_operator
|
253
|
-
store_names ["ap", "api", "apt", "any", "nap", "ah", "aha"]
|
254
|
-
assert_search "ap ah", ["ap", "ah"], operator: "or", misspellings: {prefix_length: 2}
|
255
|
-
assert_search "api ahi", ["ap", "api", "apt", "ah", "aha"], operator: "or", misspellings: {prefix_length: 2}
|
256
|
-
end
|
257
|
-
|
258
|
-
def test_misspellings_fields_operator
|
259
|
-
store [
|
260
|
-
{name: "red", color: "red"},
|
261
|
-
{name: "blue", color: "blue"},
|
262
|
-
{name: "cyan", color: "blue green"},
|
263
|
-
{name: "magenta", color: "red blue"},
|
264
|
-
{name: "green", color: "green"}
|
265
|
-
]
|
266
|
-
assert_search "red blue", ["red", "blue", "cyan", "magenta"], operator: "or", fields: ["color"], misspellings: false
|
267
|
-
end
|
268
|
-
|
269
16
|
def test_fields_operator
|
270
17
|
store [
|
271
18
|
{name: "red", color: "red"},
|
@@ -355,11 +102,9 @@ class SqlTest < Minitest::Test
|
|
355
102
|
assert_equal aisle, Product.search("product", load: false).first.aisle.to_hash
|
356
103
|
end
|
357
104
|
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
assert Product.search("product", include: [:store]).first.association(:store).loaded?
|
363
|
-
end
|
105
|
+
def test_include
|
106
|
+
skip unless defined?(ActiveRecord)
|
107
|
+
store_names ["Product A"]
|
108
|
+
assert Product.search("product", include: [:store]).first.association(:store).loaded?
|
364
109
|
end
|
365
110
|
end
|
data/test/synonyms_test.rb
CHANGED
@@ -41,8 +41,9 @@ class SynonymsTest < Minitest::Test
|
|
41
41
|
assert_search "scallions", ["Green Onions"]
|
42
42
|
end
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
44
|
+
def test_wordnet
|
45
|
+
skip unless ENV["TEST_WORDNET"]
|
46
|
+
store_names ["Creature", "Beast", "Dragon"], Animal
|
47
|
+
assert_search "animal", ["Creature", "Beast"], {}, Animal
|
48
|
+
end
|
48
49
|
end
|
data/test/where_test.rb
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class WhereTest < Minitest::Test
|
4
|
+
def test_where
|
5
|
+
now = Time.now
|
6
|
+
store [
|
7
|
+
{name: "Product A", store_id: 1, in_stock: true, backordered: true, created_at: now, orders_count: 4, user_ids: [1, 2, 3]},
|
8
|
+
{name: "Product B", store_id: 2, in_stock: true, backordered: false, created_at: now - 1, orders_count: 3, user_ids: [1]},
|
9
|
+
{name: "Product C", store_id: 3, in_stock: false, backordered: true, created_at: now - 2, orders_count: 2, user_ids: [1, 3]},
|
10
|
+
{name: "Product D", store_id: 4, in_stock: false, backordered: false, created_at: now - 3, orders_count: 1}
|
11
|
+
]
|
12
|
+
assert_search "product", ["Product A", "Product B"], where: {in_stock: true}
|
13
|
+
# date
|
14
|
+
assert_search "product", ["Product A"], where: {created_at: {gt: now - 1}}
|
15
|
+
assert_search "product", ["Product A", "Product B"], where: {created_at: {gte: now - 1}}
|
16
|
+
assert_search "product", ["Product D"], where: {created_at: {lt: now - 2}}
|
17
|
+
assert_search "product", ["Product C", "Product D"], where: {created_at: {lte: now - 2}}
|
18
|
+
# integer
|
19
|
+
assert_search "product", ["Product A"], where: {store_id: {lt: 2}}
|
20
|
+
assert_search "product", ["Product A", "Product B"], where: {store_id: {lte: 2}}
|
21
|
+
assert_search "product", ["Product D"], where: {store_id: {gt: 3}}
|
22
|
+
assert_search "product", ["Product C", "Product D"], where: {store_id: {gte: 3}}
|
23
|
+
# range
|
24
|
+
assert_search "product", ["Product A", "Product B"], where: {store_id: 1..2}
|
25
|
+
assert_search "product", ["Product A"], where: {store_id: 1...2}
|
26
|
+
assert_search "product", ["Product A", "Product B"], where: {store_id: [1, 2]}
|
27
|
+
assert_search "product", ["Product B", "Product C", "Product D"], where: {store_id: {not: 1}}
|
28
|
+
assert_search "product", ["Product C", "Product D"], where: {store_id: {not: [1, 2]}}
|
29
|
+
assert_search "product", ["Product A"], where: {user_ids: {lte: 2, gte: 2}}
|
30
|
+
# or
|
31
|
+
assert_search "product", ["Product A", "Product B", "Product C"], where: {or: [[{in_stock: true}, {store_id: 3}]]}
|
32
|
+
assert_search "product", ["Product A", "Product B", "Product C"], where: {or: [[{orders_count: [2, 4]}, {store_id: [1, 2]}]]}
|
33
|
+
assert_search "product", ["Product A", "Product D"], where: {or: [[{orders_count: 1}, {created_at: {gte: now - 1}, backordered: true}]]}
|
34
|
+
# all
|
35
|
+
assert_search "product", ["Product A", "Product C"], where: {user_ids: {all: [1, 3]}}
|
36
|
+
assert_search "product", [], where: {user_ids: {all: [1, 2, 3, 4]}}
|
37
|
+
# any / nested terms
|
38
|
+
assert_search "product", ["Product B", "Product C"], where: {user_ids: {not: [2], in: [1, 3]}}
|
39
|
+
# not / exists
|
40
|
+
assert_search "product", ["Product D"], where: {user_ids: nil}
|
41
|
+
assert_search "product", ["Product A", "Product B", "Product C"], where: {user_ids: {not: nil}}
|
42
|
+
assert_search "product", ["Product A", "Product C", "Product D"], where: {user_ids: [3, nil]}
|
43
|
+
assert_search "product", ["Product B"], where: {user_ids: {not: [3, nil]}}
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_regexp
|
47
|
+
store_names ["Product A"]
|
48
|
+
assert_search "*", ["Product A"], where: {name: /Pro.+/}
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_alternate_regexp
|
52
|
+
store_names ["Product A", "Item B"]
|
53
|
+
assert_search "*", ["Product A"], where: {name: {regexp: "Pro.+"}}
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_where_string
|
57
|
+
store [
|
58
|
+
{name: "Product A", color: "RED"}
|
59
|
+
]
|
60
|
+
assert_search "product", ["Product A"], where: {color: "RED"}
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_where_nil
|
64
|
+
store [
|
65
|
+
{name: "Product A"},
|
66
|
+
{name: "Product B", color: "red"}
|
67
|
+
]
|
68
|
+
assert_search "product", ["Product A"], where: {color: nil}
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_where_id
|
72
|
+
store_names ["Product A"]
|
73
|
+
product = Product.last
|
74
|
+
assert_search "product", ["Product A"], where: {id: product.id.to_s}
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_where_empty
|
78
|
+
store_names ["Product A"]
|
79
|
+
assert_search "product", ["Product A"], where: {}
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_where_empty_array
|
83
|
+
store_names ["Product A"]
|
84
|
+
assert_search "product", [], where: {store_id: []}
|
85
|
+
end
|
86
|
+
|
87
|
+
# http://elasticsearch-users.115913.n3.nabble.com/Numeric-range-quey-or-filter-in-an-array-field-possible-or-not-td4042967.html
|
88
|
+
# https://gist.github.com/jprante/7099463
|
89
|
+
def test_where_range_array
|
90
|
+
store [
|
91
|
+
{name: "Product A", user_ids: [11, 23, 13, 16, 17, 23]},
|
92
|
+
{name: "Product B", user_ids: [1, 2, 3, 4, 5, 6, 7, 8, 9]},
|
93
|
+
{name: "Product C", user_ids: [101, 230, 150, 200]}
|
94
|
+
]
|
95
|
+
assert_search "product", ["Product A"], where: {user_ids: {gt: 10, lt: 24}}
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_where_range_array_again
|
99
|
+
store [
|
100
|
+
{name: "Product A", user_ids: [19, 32, 42]},
|
101
|
+
{name: "Product B", user_ids: [13, 40, 52]}
|
102
|
+
]
|
103
|
+
assert_search "product", ["Product A"], where: {user_ids: {gt: 26, lt: 36}}
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_near
|
107
|
+
store [
|
108
|
+
{name: "San Francisco", latitude: 37.7833, longitude: -122.4167},
|
109
|
+
{name: "San Antonio", latitude: 29.4167, longitude: -98.5000}
|
110
|
+
]
|
111
|
+
assert_search "san", ["San Francisco"], where: {location: {near: [37.5, -122.5]}}
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_near_within
|
115
|
+
store [
|
116
|
+
{name: "San Francisco", latitude: 37.7833, longitude: -122.4167},
|
117
|
+
{name: "San Antonio", latitude: 29.4167, longitude: -98.5000},
|
118
|
+
{name: "San Marino", latitude: 43.9333, longitude: 12.4667}
|
119
|
+
]
|
120
|
+
assert_search "san", ["San Francisco", "San Antonio"], where: {location: {near: [37, -122], within: "2000mi"}}
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_top_left_bottom_right
|
124
|
+
store [
|
125
|
+
{name: "San Francisco", latitude: 37.7833, longitude: -122.4167},
|
126
|
+
{name: "San Antonio", latitude: 29.4167, longitude: -98.5000}
|
127
|
+
]
|
128
|
+
assert_search "san", ["San Francisco"], where: {location: {top_left: [38, -123], bottom_right: [37, -122]}}
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_multiple_locations
|
132
|
+
store [
|
133
|
+
{name: "San Francisco", latitude: 37.7833, longitude: -122.4167},
|
134
|
+
{name: "San Antonio", latitude: 29.4167, longitude: -98.5000}
|
135
|
+
]
|
136
|
+
assert_search "san", ["San Francisco"], where: {multiple_locations: {near: [37.5, -122.5]}}
|
137
|
+
end
|
138
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: searchkick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -123,6 +123,7 @@ files:
|
|
123
123
|
- test/autocomplete_test.rb
|
124
124
|
- test/boost_test.rb
|
125
125
|
- test/ci/before_install.sh
|
126
|
+
- test/dangerous_reindex_test.rb
|
126
127
|
- test/facets_test.rb
|
127
128
|
- test/gemfiles/activerecord31.gemfile
|
128
129
|
- test/gemfiles/activerecord32.gemfile
|
@@ -137,7 +138,10 @@ files:
|
|
137
138
|
- test/index_test.rb
|
138
139
|
- test/inheritance_test.rb
|
139
140
|
- test/match_test.rb
|
141
|
+
- test/misspellings_test.rb
|
140
142
|
- test/model_test.rb
|
143
|
+
- test/order_test.rb
|
144
|
+
- test/pagination_test.rb
|
141
145
|
- test/query_test.rb
|
142
146
|
- test/records_test.rb
|
143
147
|
- test/reindex_job_test.rb
|
@@ -149,6 +153,7 @@ files:
|
|
149
153
|
- test/suggest_test.rb
|
150
154
|
- test/synonyms_test.rb
|
151
155
|
- test/test_helper.rb
|
156
|
+
- test/where_test.rb
|
152
157
|
homepage: https://github.com/ankane/searchkick
|
153
158
|
licenses:
|
154
159
|
- MIT
|
@@ -169,7 +174,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
174
|
version: '0'
|
170
175
|
requirements: []
|
171
176
|
rubyforge_project:
|
172
|
-
rubygems_version: 2.4.5
|
177
|
+
rubygems_version: 2.4.5.1
|
173
178
|
signing_key:
|
174
179
|
specification_version: 4
|
175
180
|
summary: Searchkick learns what your users are looking for. As more people search,
|
@@ -180,6 +185,7 @@ test_files:
|
|
180
185
|
- test/autocomplete_test.rb
|
181
186
|
- test/boost_test.rb
|
182
187
|
- test/ci/before_install.sh
|
188
|
+
- test/dangerous_reindex_test.rb
|
183
189
|
- test/facets_test.rb
|
184
190
|
- test/gemfiles/activerecord31.gemfile
|
185
191
|
- test/gemfiles/activerecord32.gemfile
|
@@ -194,7 +200,10 @@ test_files:
|
|
194
200
|
- test/index_test.rb
|
195
201
|
- test/inheritance_test.rb
|
196
202
|
- test/match_test.rb
|
203
|
+
- test/misspellings_test.rb
|
197
204
|
- test/model_test.rb
|
205
|
+
- test/order_test.rb
|
206
|
+
- test/pagination_test.rb
|
198
207
|
- test/query_test.rb
|
199
208
|
- test/records_test.rb
|
200
209
|
- test/reindex_job_test.rb
|
@@ -206,4 +215,4 @@ test_files:
|
|
206
215
|
- test/suggest_test.rb
|
207
216
|
- test/synonyms_test.rb
|
208
217
|
- test/test_helper.rb
|
209
|
-
|
218
|
+
- test/where_test.rb
|