elastic_record 4.1.8 → 5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +15 -8
- data/Gemfile +1 -1
- data/README.md +29 -21
- data/elastic_record.gemspec +1 -1
- data/lib/elastic_record.rb +25 -13
- data/lib/elastic_record/aggregation_response/aggregation.rb +19 -0
- data/lib/elastic_record/aggregation_response/bucket.rb +24 -0
- data/lib/elastic_record/aggregation_response/builder.rb +55 -0
- data/lib/elastic_record/aggregation_response/has_aggregations.rb +9 -0
- data/lib/elastic_record/aggregation_response/multi_bucket_aggregation.rb +9 -0
- data/lib/elastic_record/aggregation_response/multi_value_aggregation.rb +6 -0
- data/lib/elastic_record/aggregation_response/single_bucket_aggregation.rb +8 -0
- data/lib/elastic_record/aggregation_response/single_value_aggregation.rb +7 -0
- data/lib/elastic_record/as_document.rb +33 -16
- data/lib/elastic_record/callbacks.rb +1 -1
- data/lib/elastic_record/config.rb +3 -0
- data/lib/elastic_record/connection.rb +4 -4
- data/lib/elastic_record/errors.rb +7 -1
- data/lib/elastic_record/index.rb +6 -8
- data/lib/elastic_record/index/analyze.rb +10 -0
- data/lib/elastic_record/index/deferred.rb +2 -2
- data/lib/elastic_record/index/documents.rb +42 -29
- data/lib/elastic_record/index/manage.rb +6 -8
- data/lib/elastic_record/index/mapping.rb +16 -8
- data/lib/elastic_record/index/mapping_type.rb +16 -0
- data/lib/elastic_record/index/mapping_type_test.rb +18 -0
- data/lib/elastic_record/index/settings.rb +6 -17
- data/lib/elastic_record/model.rb +2 -14
- data/lib/elastic_record/percolator_model.rb +11 -19
- data/lib/elastic_record/relation.rb +9 -30
- data/lib/elastic_record/relation/batches.rb +5 -3
- data/lib/elastic_record/relation/delegation.rb +8 -4
- data/lib/elastic_record/relation/finder_methods.rb +8 -0
- data/lib/elastic_record/relation/hits.rb +34 -0
- data/lib/elastic_record/relation/search_methods.rb +17 -22
- data/lib/elastic_record/relation/value_methods.rb +1 -1
- data/test/dummy/app/models/project.rb +16 -4
- data/test/dummy/app/models/warehouse.rb +5 -16
- data/test/dummy/app/models/widget.rb +23 -12
- data/test/dummy/app/models/widget_query.rb +1 -0
- data/test/dummy/db/migrate/20151211225259_create_warehouses.rb +7 -0
- data/test/dummy/db/migrate/20180215140125_create_widgets.rb +11 -0
- data/test/dummy/db/schema.rb +10 -3
- data/test/elastic_record/aggregation_response/bucket_test.rb +8 -0
- data/test/elastic_record/aggregation_response/multi_bucket_aggregation_test.rb +33 -0
- data/test/elastic_record/aggregation_response/single_bucket_aggregation_test.rb +15 -0
- data/test/elastic_record/as_document_test.rb +55 -29
- data/test/elastic_record/callbacks_test.rb +7 -11
- data/test/elastic_record/connection_test.rb +3 -16
- data/test/elastic_record/index/documents_test.rb +56 -11
- data/test/elastic_record/index/manage_test.rb +0 -7
- data/test/elastic_record/index/mapping_test.rb +18 -5
- data/test/elastic_record/index/settings_test.rb +1 -7
- data/test/elastic_record/index_test.rb +0 -4
- data/test/elastic_record/integration/active_record_test.rb +6 -9
- data/test/elastic_record/model_test.rb +5 -2
- data/test/elastic_record/percolator_model_test.rb +25 -11
- data/test/elastic_record/relation/batches_test.rb +29 -47
- data/test/elastic_record/relation/delegation_test.rb +1 -1
- data/test/elastic_record/relation/finder_methods_test.rb +17 -31
- data/test/elastic_record/relation/hits_test.rb +49 -0
- data/test/elastic_record/relation/search_methods_test.rb +20 -16
- data/test/elastic_record/relation_test.rb +19 -50
- data/test/helper.rb +7 -3
- metadata +20 -9
- data/lib/elastic_record/doctype.rb +0 -43
- data/lib/elastic_record/json.rb +0 -29
- data/lib/elastic_record/name_cache.rb +0 -23
- data/test/dummy/db/migrate/20151211225259_create_projects.rb +0 -7
- data/test/elastic_record/doctype_test.rb +0 -45
- data/test/elastic_record/name_cache_test.rb +0 -16
@@ -7,10 +7,6 @@ class ElasticRecord::IndexTest < MiniTest::Test
|
|
7
7
|
refute_equal copied.settings.object_id, index.settings.object_id
|
8
8
|
end
|
9
9
|
|
10
|
-
def test_doctypes
|
11
|
-
assert_equal [Widget.doctype], index.doctypes
|
12
|
-
end
|
13
|
-
|
14
10
|
def test_alias_name
|
15
11
|
assert_equal 'widgets', index.alias_name
|
16
12
|
end
|
@@ -2,20 +2,17 @@ require 'helper'
|
|
2
2
|
|
3
3
|
class ElasticRecord::ActiveRecordTest < MiniTest::Test
|
4
4
|
def test_ordering
|
5
|
-
poo_product =
|
6
|
-
bear_product =
|
7
|
-
Project.elastic_index.refresh
|
5
|
+
poo_product = Warehouse.create! name: "Poo"
|
6
|
+
bear_product = Warehouse.create! name: "Bear"
|
8
7
|
|
9
|
-
assert_equal [bear_product, poo_product],
|
10
|
-
assert_equal [poo_product, bear_product],
|
8
|
+
assert_equal [bear_product, poo_product], Warehouse.elastic_relation.order(name: 'asc')
|
9
|
+
assert_equal [poo_product, bear_product], Warehouse.elastic_relation.order(name: 'desc')
|
11
10
|
end
|
12
11
|
|
13
12
|
def test_update_callback
|
14
|
-
project =
|
15
|
-
Project.elastic_index.refresh
|
13
|
+
project = Warehouse.create! name: "Ideas"
|
16
14
|
project.update! name: 'Terrible Stuff'
|
17
|
-
Project.elastic_index.refresh
|
18
15
|
|
19
|
-
assert_equal [project],
|
16
|
+
assert_equal [project], Warehouse.elastic_relation.filter(name: 'Terrible Stuff')
|
20
17
|
end
|
21
18
|
end
|
@@ -17,8 +17,11 @@ class ElasticRecord::ModelTest < MiniTest::Test
|
|
17
17
|
assert_equal Widget, index.model
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
20
|
+
def test_elastic_index_inheritance
|
21
21
|
refute_equal Widget.elastic_index.object_id, InheritedModel.elastic_index.object_id
|
22
|
-
|
22
|
+
assert_equal Widget.elastic_index.mapping_type, InheritedModel.elastic_index.mapping_type
|
23
|
+
assert_equal 'widgets', InheritedModel.elastic_index.alias_name
|
24
|
+
assert_equal InheritedModel, InheritedModel.elastic_index.model
|
25
|
+
assert_equal 'widget', InheritedModel.elastic_index.mapping_type
|
23
26
|
end
|
24
27
|
end
|
@@ -2,15 +2,35 @@ require 'helper'
|
|
2
2
|
|
3
3
|
class ElasticRecord::PercolatorModelTest < MiniTest::Test
|
4
4
|
def test_elastic_index
|
5
|
-
|
5
|
+
index = WidgetQuery.elastic_index
|
6
|
+
|
7
|
+
expected_mapping = {
|
8
|
+
"widget"=> {
|
9
|
+
"properties"=> {
|
10
|
+
"color"=> {"type" => "keyword" },
|
11
|
+
"name"=> {
|
12
|
+
"type" => "text",
|
13
|
+
"fields" => {
|
14
|
+
"raw" => { "type" => "keyword" }
|
15
|
+
}
|
16
|
+
},
|
17
|
+
"price" => { "type" => "long" },
|
18
|
+
"query" => { "type" => "percolator" },
|
19
|
+
"warehouse_id" => { "type" => "keyword" },
|
20
|
+
"widget_part" => {
|
21
|
+
"properties" => {
|
22
|
+
"name" => { "type" => "keyword" }
|
23
|
+
}
|
24
|
+
}
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
assert_equal expected_mapping, index.get_mapping
|
6
30
|
refute index.partial_updates
|
7
31
|
assert_equal({}, index.settings)
|
8
32
|
end
|
9
33
|
|
10
|
-
def test_doctype
|
11
|
-
assert_equal ElasticRecord::Doctype.percolator_doctype, WidgetQuery.doctype
|
12
|
-
end
|
13
|
-
|
14
34
|
def test_as_search_document
|
15
35
|
query = WidgetQuery.new(name: 'foo', color: 'red')
|
16
36
|
|
@@ -45,10 +65,4 @@ class ElasticRecord::PercolatorModelTest < MiniTest::Test
|
|
45
65
|
|
46
66
|
assert_equal [query], WidgetQuery.percolate(should_hit)
|
47
67
|
end
|
48
|
-
|
49
|
-
private
|
50
|
-
|
51
|
-
def index
|
52
|
-
@index ||= WidgetQuery.elastic_index
|
53
|
-
end
|
54
68
|
end
|
@@ -3,79 +3,61 @@ require 'helper'
|
|
3
3
|
class ElasticRecord::Relation::BatchesTest < MiniTest::Test
|
4
4
|
def setup
|
5
5
|
super
|
6
|
-
|
6
|
+
@red_widget = Widget.create!(color: 'red')
|
7
|
+
@blue_widget = Widget.create!(color: 'blue')
|
8
|
+
@green_widget = Widget.create!(color: 'green')
|
7
9
|
end
|
8
10
|
|
9
|
-
def test_find_each
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
11
|
+
# def test_find_each
|
12
|
+
# results = []
|
13
|
+
# Widget.elastic_relation.find_each do |widget|
|
14
|
+
# results << widget
|
15
|
+
# end
|
16
|
+
# assert_equal [@red_widget, @blue_widget, @green_widget].to_set, results.to_set
|
17
|
+
# end
|
16
18
|
|
17
19
|
def test_find_ids_in_batches
|
18
20
|
results = []
|
19
21
|
Widget.elastic_relation.find_ids_in_batches do |ids|
|
20
22
|
results << ids
|
21
23
|
end
|
22
|
-
assert_equal [[
|
24
|
+
assert_equal [[@red_widget.id.to_s, @blue_widget.id.to_s, @green_widget.id.to_s].to_set], results.map(&:to_set)
|
23
25
|
end
|
24
26
|
|
25
|
-
def
|
27
|
+
def test_find_in_batches
|
26
28
|
results = []
|
27
|
-
Widget.elastic_relation.
|
28
|
-
results <<
|
29
|
+
Widget.elastic_relation.find_in_batches do |widgets|
|
30
|
+
results << widgets
|
29
31
|
end
|
30
|
-
|
31
|
-
assert_equal [['10', '15', '5']], results
|
32
|
+
assert_equal [[@red_widget, @blue_widget, @green_widget].to_set], results.map(&:to_set)
|
32
33
|
end
|
33
34
|
|
34
|
-
def
|
35
|
+
def test_find_in_batches_with_order
|
35
36
|
results = []
|
36
|
-
Widget.elastic_relation.
|
37
|
-
results <<
|
37
|
+
Widget.elastic_relation.order(color: :asc).find_in_batches do |records|
|
38
|
+
results << records
|
38
39
|
end
|
39
40
|
|
40
|
-
assert_equal
|
41
|
-
assert_equal 2, results[0].size
|
42
|
-
assert_equal 1, results[1].size
|
43
|
-
assert_equal ['5', '10', '15'].to_set, results.flatten.to_set
|
41
|
+
assert_equal [[@blue_widget, @green_widget, @red_widget]], results
|
44
42
|
end
|
45
43
|
|
46
|
-
def
|
44
|
+
def test_find_in_batches_with_size
|
47
45
|
results = []
|
48
|
-
Widget.elastic_relation.find_in_batches do |
|
49
|
-
results <<
|
46
|
+
Widget.elastic_relation.find_in_batches(batch_size: 2) do |records|
|
47
|
+
results << records
|
50
48
|
end
|
51
|
-
|
49
|
+
|
50
|
+
assert_equal 2, results.size
|
51
|
+
assert_equal 2, results[0].size
|
52
|
+
assert_equal 1, results[1].size
|
53
|
+
assert_equal [@red_widget, @blue_widget, @green_widget].to_set, results.flatten.to_set
|
52
54
|
end
|
53
55
|
|
54
56
|
def test_find_in_batches_with_scope
|
55
57
|
results = []
|
56
58
|
Widget.elastic_relation.filter(color: %w(red blue)).find_in_batches do |widgets|
|
57
|
-
results << widgets
|
58
|
-
end
|
59
|
-
assert_equal [['5', '10'].to_set], results.map(&:to_set)
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_find_with_batch_size
|
63
|
-
results = []
|
64
|
-
Widget.elastic_relation.find_ids_in_batches(batch_size: 1) do |ids|
|
65
|
-
results << ids
|
59
|
+
results << widgets
|
66
60
|
end
|
67
|
-
|
68
|
-
assert_equal 3, results.size
|
69
|
-
results.each { |r| assert_equal 1, r.size }
|
70
|
-
assert_equal ['5', '10', '15'].to_set, results.flatten.to_set
|
61
|
+
assert_equal [[@red_widget, @blue_widget].to_set], results.map(&:to_set)
|
71
62
|
end
|
72
|
-
|
73
|
-
private
|
74
|
-
def create_widgets
|
75
|
-
Widget.elastic_index.bulk_add [
|
76
|
-
Widget.new(id: 5, color: 'red'),
|
77
|
-
Widget.new(id: 10, color: 'blue'),
|
78
|
-
Widget.new(id: 15, color: 'green')
|
79
|
-
]
|
80
|
-
end
|
81
63
|
end
|
@@ -3,23 +3,23 @@ require 'helper'
|
|
3
3
|
class ElasticRecord::Relation::FinderMethodsTest < MiniTest::Test
|
4
4
|
def setup
|
5
5
|
super
|
6
|
-
|
6
|
+
@red_widget = Widget.create(color: 'red')
|
7
|
+
@blue_widget = Widget.create(color: 'blue')
|
7
8
|
end
|
8
9
|
|
9
10
|
def test_find
|
10
|
-
refute_nil Widget.elastic_relation.find(
|
11
|
-
refute_nil Widget.elastic_relation.filter('color' => 'red').find(
|
11
|
+
refute_nil Widget.elastic_relation.find(@red_widget.id)
|
12
|
+
refute_nil Widget.elastic_relation.filter('color' => 'red').find(@red_widget.id)
|
12
13
|
|
13
14
|
assert_raises ActiveRecord::RecordNotFound do
|
14
|
-
Widget.elastic_relation.filter('color' => 'blue').find(
|
15
|
+
Widget.elastic_relation.filter('color' => 'blue').find(@red_widget.id)
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
18
19
|
def test_find_passed_an_array
|
19
|
-
assert_equal 2, Widget.elastic_relation.find([
|
20
|
-
assert_equal 2, Widget.elastic_relation.filter('color' => ['red', 'blue']).find([
|
21
|
-
assert_equal 0, Widget.elastic_relation.
|
22
|
-
assert_equal 0, Widget.elastic_relation.filter('color' => ['purple', 'gold']).find(['05', '10']).size
|
20
|
+
assert_equal 2, Widget.elastic_relation.find([@red_widget.id, @blue_widget.id]).size
|
21
|
+
assert_equal 2, Widget.elastic_relation.filter('color' => ['red', 'blue']).find([@red_widget.id, @blue_widget.id]).size
|
22
|
+
assert_equal 0, Widget.elastic_relation.filter('color' => ['purple', 'gold']).find([@red_widget.id, @blue_widget.id]).size
|
23
23
|
end
|
24
24
|
|
25
25
|
def test_find_passed_an_empty_args
|
@@ -29,23 +29,23 @@ class ElasticRecord::Relation::FinderMethodsTest < MiniTest::Test
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def test_first
|
32
|
-
assert_equal '
|
33
|
-
assert_equal '
|
34
|
-
assert_equal '
|
32
|
+
assert_equal 'blue', Widget.elastic_relation.order('color').first.color
|
33
|
+
assert_equal 'red', Widget.elastic_relation.order('color').filter('color' => 'red').first.color
|
34
|
+
assert_equal 'blue', Widget.elastic_relation.order('color').filter('color' => 'blue').first.color
|
35
35
|
assert_nil Widget.elastic_relation.filter('color' => 'green').first
|
36
36
|
end
|
37
37
|
|
38
38
|
def test_first_with_bang
|
39
|
-
assert_equal '
|
39
|
+
assert_equal 'blue', Widget.elastic_relation.order('color').first!.color
|
40
40
|
assert_raises ActiveRecord::RecordNotFound do
|
41
41
|
Widget.elastic_relation.filter('color' => 'green').first!
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
45
|
def test_last
|
46
|
-
assert_equal '
|
47
|
-
assert_equal '
|
48
|
-
assert_equal '
|
46
|
+
assert_equal 'red', Widget.elastic_relation.order('color').last.color
|
47
|
+
assert_equal 'red', Widget.elastic_relation.order('color' => 'asc').last.color
|
48
|
+
assert_equal 'blue', Widget.elastic_relation.order('color' => 'desc').last.color
|
49
49
|
end
|
50
50
|
|
51
51
|
def test_all
|
@@ -54,24 +54,10 @@ class ElasticRecord::Relation::FinderMethodsTest < MiniTest::Test
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def test_find_by
|
57
|
-
Widget.
|
58
|
-
|
59
|
-
Widget.new(color: 'blue', id: '10'),
|
60
|
-
]
|
61
|
-
|
62
|
-
assert_equal '05', Widget.elastic_relation.find_by(color: 'red').id
|
63
|
-
assert_equal '05', Widget.elastic_relation.find_by!(color: 'red').id
|
57
|
+
assert_equal 'red', Widget.elastic_relation.find_by(color: 'red').color
|
58
|
+
assert_equal 'red', Widget.elastic_relation.find_by!(color: 'red').color
|
64
59
|
assert_raises ActiveRecord::RecordNotFound do
|
65
60
|
Widget.elastic_relation.find_by!(color: 'green')
|
66
61
|
end
|
67
62
|
end
|
68
|
-
|
69
|
-
private
|
70
|
-
|
71
|
-
def create_widgets
|
72
|
-
Widget.elastic_index.bulk_add [
|
73
|
-
Widget.new(color: 'red', id: '05'),
|
74
|
-
Widget.new(color: 'blue', id: '10'),
|
75
|
-
]
|
76
|
-
end
|
77
63
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class ElasticRecord::Relation::HitsTest < MiniTest::Test
|
4
|
+
def test_to_ids
|
5
|
+
red_widget = Widget.create(color: 'red')
|
6
|
+
blue_widget = Widget.create(color: 'red')
|
7
|
+
|
8
|
+
assert_equal [red_widget.id.to_s, blue_widget.id.to_s].to_set, Widget.elastic_relation.to_ids.to_set
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_to_a
|
12
|
+
red_widget = Widget.create(color: 'red')
|
13
|
+
blue_widget = Widget.create(color: 'red')
|
14
|
+
|
15
|
+
array = Widget.elastic_relation.to_a
|
16
|
+
|
17
|
+
assert_equal 2, array.size
|
18
|
+
assert array.first.is_a?(Widget)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_to_a_from_source
|
22
|
+
warehouses = [Project.new(name: 'Latte'), Project.new(name: 'Americano')]
|
23
|
+
result = Project.elastic_index.bulk_add(warehouses)
|
24
|
+
|
25
|
+
array = Project.elastic_relation.to_a
|
26
|
+
|
27
|
+
assert_equal 2, array.size
|
28
|
+
assert array.first.is_a?(Project)
|
29
|
+
names = array.map(&:name)
|
30
|
+
assert_includes names, 'Latte'
|
31
|
+
assert_includes names, 'Americano'
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_search_hits
|
35
|
+
coffees = [Project.new(name: 'Latte'), Project.new(name: 'Americano')]
|
36
|
+
Project.elastic_index.bulk_add(coffees)
|
37
|
+
|
38
|
+
array = Project.elastic_relation.search_hits
|
39
|
+
assert_equal %w(Latte Americano).to_set, array.map { |hit| hit["_source"]["name"] }.to_set
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_search_results
|
43
|
+
coffees = [Project.new(name: 'Latte'), Project.new(name: 'Americano')]
|
44
|
+
Project.elastic_index.bulk_add(coffees)
|
45
|
+
|
46
|
+
results = Project.elastic_relation.search_results
|
47
|
+
%w(took timed_out _shards hits).each { |key| assert results.key?(key) }
|
48
|
+
end
|
49
|
+
end
|
@@ -198,29 +198,33 @@ class ElasticRecord::Relation::SearchMethodsTest < MiniTest::Test
|
|
198
198
|
end
|
199
199
|
|
200
200
|
def test_select
|
201
|
-
|
202
|
-
def self.select(values)
|
203
|
-
@latest_select = values
|
204
|
-
self
|
205
|
-
end
|
206
|
-
end
|
201
|
+
scope = relation.select 'foo'
|
207
202
|
|
208
|
-
|
209
|
-
relation.to_a
|
210
|
-
|
211
|
-
assert_equal ['foo'], selectable_klass.instance_variable_get('@latest_select')
|
203
|
+
assert_equal ['foo'], scope.select_values
|
212
204
|
end
|
213
205
|
|
214
206
|
def test_select_with_block
|
215
|
-
Widget.
|
216
|
-
|
217
|
-
Widget.new(id: 10, color: 'blue')
|
218
|
-
]
|
207
|
+
red_widget = Widget.create(color: 'red')
|
208
|
+
blue_widget = Widget.create(color: 'blue')
|
219
209
|
|
220
|
-
records = relation.select { |record| record.id ==
|
210
|
+
records = relation.select { |record| record.id == blue_widget.id }
|
221
211
|
|
222
212
|
assert_equal 1, records.size
|
223
|
-
assert_equal
|
213
|
+
assert_equal blue_widget, records.first
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_includes
|
217
|
+
warehouse = Warehouse.create! name: 'Boeing'
|
218
|
+
widget = Widget.create! name: '747', color: 'red', warehouse: warehouse
|
219
|
+
widget = Widget.create! name: '747', color: 'green', warehouse: warehouse
|
220
|
+
|
221
|
+
widgets = relation.filter(color: 'red').includes(:warehouse)
|
222
|
+
assert_equal 1, widgets.count
|
223
|
+
assert widgets.first.association(:warehouse).loaded?
|
224
|
+
|
225
|
+
widgets = relation.filter(color: 'red')
|
226
|
+
assert_equal 1, widgets.count
|
227
|
+
refute widgets.first.association(:warehouse).loaded?
|
224
228
|
end
|
225
229
|
|
226
230
|
def test_extending_with_block
|
@@ -3,73 +3,47 @@ require 'helper'
|
|
3
3
|
class ElasticRecord::RelationTest < MiniTest::Test
|
4
4
|
def test_count
|
5
5
|
original_count = Widget.elastic_relation.count
|
6
|
-
|
6
|
+
Widget.create(color: 'red')
|
7
|
+
Widget.create(color: 'blue')
|
7
8
|
|
8
9
|
assert_equal 2, Widget.elastic_relation.count - original_count
|
9
10
|
end
|
10
11
|
|
11
12
|
def test_aggregations
|
12
|
-
|
13
|
+
Widget.create(color: 'red', price: 5)
|
14
|
+
Widget.create(color: 'blue', price: 10)
|
13
15
|
|
14
16
|
aggregations = Widget.elastic_relation.aggregate('popular_colors' => {'terms' => {'field' => 'color'}}).aggregations
|
15
17
|
|
16
|
-
assert_equal 2, aggregations['popular_colors']
|
17
|
-
assert_equal %w(red blue).to_set, aggregations['popular_colors']
|
18
|
+
assert_equal 2, aggregations['popular_colors'].buckets.size
|
19
|
+
assert_equal %w(red blue).to_set, aggregations['popular_colors'].buckets.map(&:key).to_set
|
20
|
+
|
21
|
+
aggregations = Widget.elastic_relation.aggregate('avg_price' => {'avg' => {'field' => 'price'}}).aggregations
|
22
|
+
assert_equal 7.5, aggregations['avg_price'].value
|
18
23
|
end
|
19
24
|
|
20
25
|
def test_explain
|
21
|
-
|
26
|
+
Widget.create(color: 'blue')
|
22
27
|
|
23
28
|
# explain = Widget.elastic_relation.filter(color: 'blue').explain('10')
|
24
29
|
end
|
25
30
|
|
26
|
-
def test_to_hits
|
27
|
-
# assert Widget.elastic_relation.search_results.is_a?(ElasticSearch::Api::Hits)
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_to_ids
|
31
|
-
create_widgets [Widget.new(id: 5, color: 'red'), Widget.new(id: 10, color: 'blue')]
|
32
|
-
|
33
|
-
assert_equal ['5', '10'].to_set, Widget.elastic_relation.to_ids.to_set
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_to_a
|
37
|
-
create_widgets [Widget.new(id: 5, color: 'red'), Widget.new(id: 10, color: 'blue')]
|
38
|
-
|
39
|
-
array = Widget.elastic_relation.to_a
|
40
|
-
|
41
|
-
assert_equal 2, array.size
|
42
|
-
assert array.first.is_a?(Widget)
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_to_a_from_source
|
46
|
-
warehouses = [Warehouse.new(name: 'Amazon'), Warehouse.new(name: 'Walmart')]
|
47
|
-
result = Warehouse.elastic_index.bulk_add(warehouses)
|
48
|
-
|
49
|
-
array = Warehouse.elastic_relation.to_a
|
50
|
-
|
51
|
-
assert_equal 2, array.size
|
52
|
-
assert array.first.is_a?(Warehouse)
|
53
|
-
names = array.map(&:name)
|
54
|
-
assert_includes names, 'Amazon'
|
55
|
-
assert_includes names, 'Walmart'
|
56
|
-
end
|
57
|
-
|
58
31
|
def test_delete_all
|
59
|
-
project_red =
|
60
|
-
project_blue =
|
32
|
+
project_red = Warehouse.create! name: 'Red'
|
33
|
+
project_blue = Warehouse.create! name: 'Blue'
|
61
34
|
|
62
|
-
|
35
|
+
Warehouse.elastic_relation.filter(name: 'Red').delete_all
|
63
36
|
|
64
|
-
assert_nil
|
65
|
-
assert_equal 0,
|
37
|
+
assert_nil Warehouse.find_by(id: project_red.id)
|
38
|
+
assert_equal 0, Warehouse.elastic_relation.filter(name: 'Red').count
|
66
39
|
|
67
|
-
refute_nil
|
68
|
-
assert_equal 1,
|
40
|
+
refute_nil Warehouse.find_by(id: project_blue.id)
|
41
|
+
assert_equal 1, Warehouse.elastic_relation.filter(name: 'Blue').count
|
69
42
|
end
|
70
43
|
|
71
44
|
def test_equal
|
72
|
-
|
45
|
+
Widget.create(color: 'red')
|
46
|
+
Widget.create(color: 'blue')
|
73
47
|
|
74
48
|
assert_equal Widget.elastic_relation.filter(color: 'red'), Widget.elastic_relation.filter(color: 'red')
|
75
49
|
refute_equal Widget.elastic_relation.filter(color: 'red'), Widget.elastic_relation.filter(color: 'blue')
|
@@ -80,9 +54,4 @@ class ElasticRecord::RelationTest < MiniTest::Test
|
|
80
54
|
def test_inspect
|
81
55
|
assert_equal [].inspect, Widget.elastic_relation.filter(color: 'magenta').inspect
|
82
56
|
end
|
83
|
-
|
84
|
-
private
|
85
|
-
def create_widgets(widgets)
|
86
|
-
Widget.elastic_index.bulk_add(widgets)
|
87
|
-
end
|
88
57
|
end
|