searchkick 2.3.2 → 5.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +377 -84
  3. data/LICENSE.txt +1 -1
  4. data/README.md +859 -602
  5. data/lib/searchkick/bulk_reindex_job.rb +13 -9
  6. data/lib/searchkick/controller_runtime.rb +40 -0
  7. data/lib/searchkick/hash_wrapper.rb +12 -0
  8. data/lib/searchkick/index.rb +281 -356
  9. data/lib/searchkick/index_cache.rb +30 -0
  10. data/lib/searchkick/index_options.rb +487 -281
  11. data/lib/searchkick/indexer.rb +15 -8
  12. data/lib/searchkick/log_subscriber.rb +57 -0
  13. data/lib/searchkick/middleware.rb +9 -2
  14. data/lib/searchkick/model.rb +72 -118
  15. data/lib/searchkick/multi_search.rb +9 -10
  16. data/lib/searchkick/process_batch_job.rb +12 -15
  17. data/lib/searchkick/process_queue_job.rb +22 -13
  18. data/lib/searchkick/query.rb +458 -217
  19. data/lib/searchkick/railtie.rb +7 -0
  20. data/lib/searchkick/record_data.rb +128 -0
  21. data/lib/searchkick/record_indexer.rb +164 -0
  22. data/lib/searchkick/reindex_queue.rb +51 -9
  23. data/lib/searchkick/reindex_v2_job.rb +10 -32
  24. data/lib/searchkick/relation.rb +247 -0
  25. data/lib/searchkick/relation_indexer.rb +155 -0
  26. data/lib/searchkick/results.rb +201 -82
  27. data/lib/searchkick/version.rb +1 -1
  28. data/lib/searchkick/where.rb +11 -0
  29. data/lib/searchkick.rb +269 -97
  30. data/lib/tasks/searchkick.rake +37 -0
  31. metadata +24 -178
  32. data/.gitignore +0 -22
  33. data/.travis.yml +0 -39
  34. data/Gemfile +0 -16
  35. data/Rakefile +0 -20
  36. data/benchmark/Gemfile +0 -23
  37. data/benchmark/benchmark.rb +0 -97
  38. data/lib/searchkick/logging.rb +0 -242
  39. data/lib/searchkick/tasks.rb +0 -33
  40. data/searchkick.gemspec +0 -28
  41. data/test/aggs_test.rb +0 -197
  42. data/test/autocomplete_test.rb +0 -75
  43. data/test/boost_test.rb +0 -202
  44. data/test/callbacks_test.rb +0 -59
  45. data/test/ci/before_install.sh +0 -17
  46. data/test/errors_test.rb +0 -19
  47. data/test/gemfiles/activerecord31.gemfile +0 -7
  48. data/test/gemfiles/activerecord32.gemfile +0 -7
  49. data/test/gemfiles/activerecord40.gemfile +0 -8
  50. data/test/gemfiles/activerecord41.gemfile +0 -8
  51. data/test/gemfiles/activerecord42.gemfile +0 -7
  52. data/test/gemfiles/activerecord50.gemfile +0 -7
  53. data/test/gemfiles/apartment.gemfile +0 -8
  54. data/test/gemfiles/cequel.gemfile +0 -8
  55. data/test/gemfiles/mongoid2.gemfile +0 -7
  56. data/test/gemfiles/mongoid3.gemfile +0 -6
  57. data/test/gemfiles/mongoid4.gemfile +0 -7
  58. data/test/gemfiles/mongoid5.gemfile +0 -7
  59. data/test/gemfiles/mongoid6.gemfile +0 -12
  60. data/test/gemfiles/nobrainer.gemfile +0 -8
  61. data/test/gemfiles/parallel_tests.gemfile +0 -8
  62. data/test/geo_shape_test.rb +0 -175
  63. data/test/highlight_test.rb +0 -78
  64. data/test/index_test.rb +0 -166
  65. data/test/inheritance_test.rb +0 -83
  66. data/test/marshal_test.rb +0 -8
  67. data/test/match_test.rb +0 -276
  68. data/test/misspellings_test.rb +0 -56
  69. data/test/model_test.rb +0 -42
  70. data/test/multi_search_test.rb +0 -36
  71. data/test/multi_tenancy_test.rb +0 -22
  72. data/test/order_test.rb +0 -46
  73. data/test/pagination_test.rb +0 -70
  74. data/test/partial_reindex_test.rb +0 -58
  75. data/test/query_test.rb +0 -35
  76. data/test/records_test.rb +0 -10
  77. data/test/reindex_test.rb +0 -64
  78. data/test/reindex_v2_job_test.rb +0 -32
  79. data/test/routing_test.rb +0 -23
  80. data/test/should_index_test.rb +0 -32
  81. data/test/similar_test.rb +0 -28
  82. data/test/sql_test.rb +0 -214
  83. data/test/suggest_test.rb +0 -95
  84. data/test/support/kaminari.yml +0 -21
  85. data/test/synonyms_test.rb +0 -67
  86. data/test/test_helper.rb +0 -567
  87. data/test/where_test.rb +0 -223
data/test/boost_test.rb DELETED
@@ -1,202 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class BoostTest < Minitest::Test
4
- # conversions
5
-
6
- def test_conversions
7
- store [
8
- {name: "Tomato A", conversions: {"tomato" => 1}},
9
- {name: "Tomato B", conversions: {"tomato" => 2}},
10
- {name: "Tomato C", conversions: {"tomato" => 3}}
11
- ]
12
- assert_order "tomato", ["Tomato C", "Tomato B", "Tomato A"]
13
- assert_equal_scores "tomato", conversions: false
14
- end
15
-
16
- def test_multiple_conversions
17
- store [
18
- {name: "Speaker A", conversions_a: {"speaker" => 1}, conversions_b: {"speaker" => 6}},
19
- {name: "Speaker B", conversions_a: {"speaker" => 2}, conversions_b: {"speaker" => 5}},
20
- {name: "Speaker C", conversions_a: {"speaker" => 3}, conversions_b: {"speaker" => 4}}
21
- ], Speaker
22
-
23
- assert_equal_scores "speaker", {conversions: false}, Speaker
24
- assert_equal_scores "speaker", {}, Speaker
25
- assert_equal_scores "speaker", {conversions: ["conversions_a", "conversions_b"]}, Speaker
26
- assert_equal_scores "speaker", {conversions: ["conversions_b", "conversions_a"]}, Speaker
27
- assert_order "speaker", ["Speaker C", "Speaker B", "Speaker A"], {conversions: "conversions_a"}, Speaker
28
- assert_order "speaker", ["Speaker A", "Speaker B", "Speaker C"], {conversions: "conversions_b"}, Speaker
29
- end
30
-
31
- def test_multiple_conversions_with_boost_term
32
- store [
33
- {name: "Speaker A", conversions_a: {"speaker" => 4, "speaker_1" => 1}},
34
- {name: "Speaker B", conversions_a: {"speaker" => 3, "speaker_1" => 2}},
35
- {name: "Speaker C", conversions_a: {"speaker" => 2, "speaker_1" => 3}},
36
- {name: "Speaker D", conversions_a: {"speaker" => 1, "speaker_1" => 4}}
37
- ], Speaker
38
-
39
- assert_order "speaker", ["Speaker A", "Speaker B", "Speaker C", "Speaker D"], {conversions: "conversions_a"}, Speaker
40
- assert_order "speaker", ["Speaker D", "Speaker C", "Speaker B", "Speaker A"], {conversions: "conversions_a", conversions_term: "speaker_1"}, Speaker
41
- end
42
-
43
- def test_conversions_stemmed
44
- store [
45
- {name: "Tomato A", conversions: {"tomato" => 1, "tomatos" => 1, "Tomatoes" => 1}},
46
- {name: "Tomato B", conversions: {"tomato" => 2}}
47
- ]
48
- assert_order "tomato", ["Tomato A", "Tomato B"]
49
- end
50
-
51
- # global boost
52
-
53
- def test_boost
54
- store [
55
- {name: "Tomato A"},
56
- {name: "Tomato B", orders_count: 10},
57
- {name: "Tomato C", orders_count: 100}
58
- ]
59
- assert_order "tomato", ["Tomato C", "Tomato B", "Tomato A"], boost: "orders_count"
60
- end
61
-
62
- def test_boost_zero
63
- store [
64
- {name: "Zero Boost", orders_count: 0}
65
- ]
66
- assert_order "zero", ["Zero Boost"], boost: "orders_count"
67
- end
68
-
69
- def test_conversions_weight
70
- store [
71
- {name: "Product Boost", orders_count: 20},
72
- {name: "Product Conversions", conversions: {"product" => 10}}
73
- ]
74
- assert_order "product", ["Product Conversions", "Product Boost"], boost: "orders_count"
75
- end
76
-
77
- def test_boost_fields
78
- store [
79
- {name: "Red", color: "White"},
80
- {name: "White", color: "Red Red Red"}
81
- ]
82
- assert_order "red", ["Red", "White"], fields: ["name^10", "color"]
83
- end
84
-
85
- def test_boost_fields_decimal
86
- store [
87
- {name: "Red", color: "White"},
88
- {name: "White", color: "Red Red Red"}
89
- ]
90
- assert_order "red", ["Red", "White"], fields: ["name^10.5", "color"]
91
- end
92
-
93
- def test_boost_fields_word_start
94
- store [
95
- {name: "Red", color: "White"},
96
- {name: "White", color: "Red Red Red"}
97
- ]
98
- assert_order "red", ["Red", "White"], fields: [{"name^10" => :word_start}, "color"]
99
- end
100
-
101
- # for issue #855
102
- def test_apostrophes
103
- store_names ["Valentine's Day Special"]
104
- assert_search "Valentines", ["Valentine's Day Special"], fields: ["name^5"]
105
- assert_search "Valentine's", ["Valentine's Day Special"], fields: ["name^5"]
106
- assert_search "Valentine", ["Valentine's Day Special"], fields: ["name^5"]
107
- end
108
-
109
- def test_boost_by
110
- store [
111
- {name: "Tomato A"},
112
- {name: "Tomato B", orders_count: 10},
113
- {name: "Tomato C", orders_count: 100}
114
- ]
115
- assert_order "tomato", ["Tomato C", "Tomato B", "Tomato A"], boost_by: [:orders_count]
116
- assert_order "tomato", ["Tomato C", "Tomato B", "Tomato A"], boost_by: {orders_count: {factor: 10}}
117
- end
118
-
119
- def test_boost_by_missing
120
- store [
121
- {name: "Tomato A"},
122
- {name: "Tomato B", orders_count: 10},
123
- ]
124
-
125
- if elasticsearch_below50?
126
- assert_raises(ArgumentError) do
127
- assert_order "tomato", ["Tomato A", "Tomato B"], boost_by: {orders_count: {missing: 100}}
128
- end
129
- else
130
- assert_order "tomato", ["Tomato A", "Tomato B"], boost_by: {orders_count: {missing: 100}}
131
- end
132
- end
133
-
134
- def test_boost_by_boost_mode_multiply
135
- store [
136
- {name: "Tomato A", found_rate: 0.9},
137
- {name: "Tomato B"},
138
- {name: "Tomato C", found_rate: 0.5}
139
- ]
140
-
141
- assert_order "tomato", ["Tomato B", "Tomato A", "Tomato C"], boost_by: {found_rate: {boost_mode: "multiply"}}
142
- end
143
-
144
- def test_boost_where
145
- store [
146
- {name: "Tomato A"},
147
- {name: "Tomato B", user_ids: [1, 2]},
148
- {name: "Tomato C", user_ids: [3]}
149
- ]
150
- assert_first "tomato", "Tomato B", boost_where: {user_ids: 2}
151
- assert_first "tomato", "Tomato B", boost_where: {user_ids: 1..2}
152
- assert_first "tomato", "Tomato B", boost_where: {user_ids: [1, 4]}
153
- assert_first "tomato", "Tomato B", boost_where: {user_ids: {value: 2, factor: 10}}
154
- assert_first "tomato", "Tomato B", boost_where: {user_ids: {value: [1, 4], factor: 10}}
155
- assert_order "tomato", ["Tomato C", "Tomato B", "Tomato A"], boost_where: {user_ids: [{value: 1, factor: 10}, {value: 3, factor: 20}]}
156
- end
157
-
158
- def test_boost_by_distance
159
- store [
160
- {name: "San Francisco", latitude: 37.7833, longitude: -122.4167},
161
- {name: "San Antonio", latitude: 29.4167, longitude: -98.5000},
162
- {name: "San Marino", latitude: 43.9333, longitude: 12.4667}
163
- ]
164
- assert_order "san", ["San Francisco", "San Antonio", "San Marino"], boost_by_distance: {field: :location, origin: [37, -122], scale: "1000mi"}
165
- end
166
-
167
- def test_boost_by_distance_hash
168
- store [
169
- {name: "San Francisco", latitude: 37.7833, longitude: -122.4167},
170
- {name: "San Antonio", latitude: 29.4167, longitude: -98.5000},
171
- {name: "San Marino", latitude: 43.9333, longitude: 12.4667}
172
- ]
173
- assert_order "san", ["San Francisco", "San Antonio", "San Marino"], boost_by_distance: {field: :location, origin: {lat: 37, lon: -122}, scale: "1000mi"}
174
- end
175
-
176
- def test_boost_by_distance_v2
177
- store [
178
- {name: "San Francisco", latitude: 37.7833, longitude: -122.4167},
179
- {name: "San Antonio", latitude: 29.4167, longitude: -98.5000},
180
- {name: "San Marino", latitude: 43.9333, longitude: 12.4667}
181
- ]
182
- assert_order "san", ["San Francisco", "San Antonio", "San Marino"], boost_by_distance: {location: {origin: [37, -122], scale: "1000mi"}}
183
- end
184
-
185
- def test_boost_by_distance_v2_hash
186
- store [
187
- {name: "San Francisco", latitude: 37.7833, longitude: -122.4167},
188
- {name: "San Antonio", latitude: 29.4167, longitude: -98.5000},
189
- {name: "San Marino", latitude: 43.9333, longitude: 12.4667}
190
- ]
191
- assert_order "san", ["San Francisco", "San Antonio", "San Marino"], boost_by_distance: {location: {origin: {lat: 37, lon: -122}, scale: "1000mi"}}
192
- end
193
-
194
- def test_boost_by_indices
195
- skip if cequel?
196
-
197
- store_names ["Rex"], Animal
198
- store_names ["Rexx"], Product
199
-
200
- assert_order "Rex", ["Rexx", "Rex"], {index_name: [Animal, Product], indices_boost: {Animal => 1, Product => 200}, fields: [:name]}, Store
201
- end
202
- end
@@ -1,59 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class CallbacksTest < Minitest::Test
4
- def test_true_create
5
- Searchkick.callbacks(true) do
6
- store_names ["Product A", "Product B"]
7
- end
8
- Product.searchkick_index.refresh
9
- assert_search "product", ["Product A", "Product B"]
10
- end
11
-
12
- def test_false_create
13
- Searchkick.callbacks(false) do
14
- store_names ["Product A", "Product B"]
15
- end
16
- Product.searchkick_index.refresh
17
- assert_search "product", []
18
- end
19
-
20
- def test_bulk_create
21
- Searchkick.callbacks(:bulk) do
22
- store_names ["Product A", "Product B"]
23
- end
24
- Product.searchkick_index.refresh
25
- assert_search "product", ["Product A", "Product B"]
26
- end
27
-
28
- def test_queue
29
- skip unless defined?(ActiveJob) && defined?(Redis)
30
-
31
- reindex_queue = Product.searchkick_index.reindex_queue
32
- reindex_queue.clear
33
-
34
- Searchkick.callbacks(:queue) do
35
- store_names ["Product A", "Product B"]
36
- end
37
- Product.searchkick_index.refresh
38
- assert_search "product", [], load: false, conversions: false
39
- assert_equal 2, reindex_queue.length
40
-
41
- Searchkick::ProcessQueueJob.perform_later(class_name: "Product")
42
- Product.searchkick_index.refresh
43
- assert_search "product", ["Product A", "Product B"], load: false
44
- assert_equal 0, reindex_queue.length
45
-
46
- Searchkick.callbacks(:queue) do
47
- Product.where(name: "Product B").destroy_all
48
- Product.create!(name: "Product C")
49
- end
50
- Product.searchkick_index.refresh
51
- assert_search "product", ["Product A", "Product B"], load: false
52
- assert_equal 2, reindex_queue.length
53
-
54
- Searchkick::ProcessQueueJob.perform_later(class_name: "Product")
55
- Product.searchkick_index.refresh
56
- assert_search "product", ["Product A", "Product C"], load: false
57
- assert_equal 0, reindex_queue.length
58
- end
59
- end
@@ -1,17 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- set -e
4
-
5
- gem install bundler
6
-
7
- if [[ $ELASTICSEARCH_VERSION == 1* ]]; then
8
- curl -L -O https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-$ELASTICSEARCH_VERSION.tar.gz
9
- elif [[ $ELASTICSEARCH_VERSION == 2* ]]; then
10
- curl -L -O https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/$ELASTICSEARCH_VERSION/elasticsearch-$ELASTICSEARCH_VERSION.tar.gz
11
- else
12
- curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-$ELASTICSEARCH_VERSION.tar.gz
13
- fi
14
- tar -xvf elasticsearch-$ELASTICSEARCH_VERSION.tar.gz
15
- cd elasticsearch-$ELASTICSEARCH_VERSION/bin
16
- ./elasticsearch -d
17
- wget -O- --waitretry=1 --tries=30 --retry-connrefused -v http://127.0.0.1:9200/
data/test/errors_test.rb DELETED
@@ -1,19 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class ErrorsTest < Minitest::Test
4
- def test_bulk_import_raises_error
5
- valid_dog = Product.create(name: "2016-01-02")
6
- invalid_dog = Product.create(name: "Ol' One-Leg")
7
- index = Searchkick::Index.new "dogs", mappings: {
8
- dog: {
9
- properties: {
10
- name: {type: "date"}
11
- }
12
- }
13
- }
14
- index.store valid_dog
15
- assert_raises(Searchkick::ImportError) do
16
- index.bulk_index [valid_dog, invalid_dog]
17
- end
18
- end
19
- end
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 3.1.0"
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 3.2.0"
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 4.0.0"
8
- gem "activejob_backport"
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 4.1.0"
8
- gem "activejob_backport"
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 4.2.0"
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 5.0.0"
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 4.2.0"
8
- gem "apartment"
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "cequel"
7
- gem "activejob"
8
- gem "redis"
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "mongoid", "~> 2"
7
- gem "bson_ext"
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "mongoid", "~> 3.1.0"
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "mongoid", "~> 4.0.0"
7
- gem "activejob_backport"
@@ -1,7 +0,0 @@
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"
@@ -1,12 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "mongoid", "~> 6.0.0"
7
- gem "activejob"
8
- gem "redis"
9
-
10
- # kaminari
11
- gem "actionpack"
12
- gem "kaminari"
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "nobrainer", ">= 0.21.0"
7
- gem "activejob"
8
- gem "redis"
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 5.0.0"
8
- gem "parallel_tests"
@@ -1,175 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class GeoShapeTest < Minitest::Test
4
- def setup
5
- Region.destroy_all
6
- store [
7
- {
8
- name: "Region A",
9
- text: "The witch had a cat",
10
- territory: {
11
- type: "polygon",
12
- coordinates: [[[30, 40], [35, 45], [40, 40], [40, 30], [30, 30], [30, 40]]]
13
- }
14
- },
15
- {
16
- name: "Region B",
17
- text: "and a very tall hat",
18
- territory: {
19
- type: "polygon",
20
- coordinates: [[[50, 60], [55, 65], [60, 60], [60, 50], [50, 50], [50, 60]]]
21
- }
22
- },
23
- {
24
- name: "Region C",
25
- text: "and long ginger hair which she wore in a plait",
26
- territory: {
27
- type: "polygon",
28
- coordinates: [[[10, 20], [15, 25], [20, 20], [20, 10], [10, 10], [10, 20]]]
29
- }
30
- }
31
- ], Region
32
- end
33
-
34
- def test_circle
35
- assert_search "*", ["Region A"], {
36
- where: {
37
- territory: {
38
- geo_shape: {
39
- type: "circle",
40
- coordinates: {lat: 28.0, lon: 38.0},
41
- radius: "444000m"
42
- }
43
- }
44
- }
45
- }, Region
46
- end
47
-
48
- def test_envelope
49
- assert_search "*", ["Region A"], {
50
- where: {
51
- territory: {
52
- geo_shape: {
53
- type: "envelope",
54
- coordinates: [[28, 42], [32, 38]]
55
- }
56
- }
57
- }
58
- }, Region
59
- end
60
-
61
- def test_polygon
62
- assert_search "*", ["Region A"], {
63
- where: {
64
- territory: {
65
- geo_shape: {
66
- type: "polygon",
67
- coordinates: [[[38, 42], [42, 42], [42, 38], [38, 38], [38, 42]]]
68
- }
69
- }
70
- }
71
- }, Region
72
- end
73
-
74
- def test_multipolygon
75
- assert_search "*", ["Region A", "Region B"], {
76
- where: {
77
- territory: {
78
- geo_shape: {
79
- type: "multipolygon",
80
- coordinates: [
81
- [[[38, 42], [42, 42], [42, 38], [38, 38], [38, 42]]],
82
- [[[58, 62], [62, 62], [62, 58], [58, 58], [58, 62]]]
83
- ]
84
- }
85
- }
86
- }
87
- }, Region
88
- end
89
-
90
- def test_disjoint
91
- assert_search "*", ["Region B", "Region C"], {
92
- where: {
93
- territory: {
94
- geo_shape: {
95
- type: "envelope",
96
- relation: "disjoint",
97
- coordinates: [[28, 42], [32, 38]]
98
- }
99
- }
100
- }
101
- }, Region
102
- end
103
-
104
- def test_within
105
- assert_search "*", ["Region A"], {
106
- where: {
107
- territory: {
108
- geo_shape: {
109
- type: "envelope",
110
- relation: "within",
111
- coordinates: [[20, 50], [50, 20]]
112
- }
113
- }
114
- }
115
- }, Region
116
- end
117
-
118
- def test_search_math
119
- # TODO find out why this is failing
120
- skip unless elasticsearch_below60?
121
-
122
- assert_search "witch", ["Region A"], {
123
- where: {
124
- territory: {
125
- geo_shape: {
126
- type: "envelope",
127
- coordinates: [[28, 42], [32, 38]]
128
- }
129
- }
130
- }
131
- }, Region
132
- end
133
-
134
- def test_search_no_match
135
- assert_search "ginger hair", [], {
136
- where: {
137
- territory: {
138
- geo_shape: {
139
- type: "envelope",
140
- coordinates: [[28, 42], [32, 38]]
141
- }
142
- }
143
- }
144
- }, Region
145
- end
146
-
147
- def test_contains
148
- skip if elasticsearch_below22?
149
- assert_search "*", ["Region C"], {
150
- where: {
151
- territory: {
152
- geo_shape: {
153
- type: "envelope",
154
- relation: "contains",
155
- coordinates: [[12, 13], [13, 12]]
156
- }
157
- }
158
- }
159
- }, Region
160
- end
161
-
162
- def test_latlon
163
- assert_search "*", ["Region A"], {
164
- where: {
165
- territory: {
166
- geo_shape: {
167
- type: "envelope",
168
- coordinates: [{lat: 42, lon: 28}, {lat: 38, lon: 32}]
169
- }
170
- }
171
- }
172
- }, Region
173
- end
174
-
175
- end