elasticsearch-dsl-builder 0.0.16 → 0.0.17
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/elasticsearch-dsl-builder.gemspec +1 -1
- data/lib/elasticsearch_dsl_builder/dsl.rb +1 -0
- data/lib/elasticsearch_dsl_builder/dsl/search/inner_hits.rb +57 -0
- data/lib/elasticsearch_dsl_builder/dsl/search/queries/has_child.rb +7 -0
- data/lib/elasticsearch_dsl_builder/dsl/search/queries/has_parent.rb +7 -0
- data/lib/elasticsearch_dsl_builder/dsl/search/queries/nested.rb +7 -0
- data/spec/lib/dsl/search/inner_hits_spec.rb +49 -0
- data/spec/lib/dsl/search/queries/has_child_spec.rb +25 -2
- data/spec/lib/dsl/search/queries/has_parent_spec.rb +27 -2
- data/spec/lib/dsl/search/queries/nested_spec.rb +24 -2
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e9f6de3a22231c91619745c3e9b547bb4719aaa
|
4
|
+
data.tar.gz: b95ba53e9bc8e28c4ad78b1103be51163bc87216
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ca5470e4df4234de616674ed79f28f07334c777663a8e059e77240d8a88169b8c6fbd6af848aadc77b0a4a24fe89e87c6c193d23b3c2dce3da4bc718e8dbda2
|
7
|
+
data.tar.gz: c05e3cc6dd26eb397ea0750c87109b93367901633e2883f473d68134bee7b092c1d20c6d70f03b2d172ee9d97299148512cdd7d690f890a67fe6225a3d5ea2ef
|
data/Gemfile.lock
CHANGED
@@ -2,6 +2,7 @@ require 'elasticsearch_dsl_builder/dsl/version'
|
|
2
2
|
|
3
3
|
require 'elasticsearch_dsl_builder/dsl/search/aggregation'
|
4
4
|
require 'elasticsearch_dsl_builder/dsl/search/query'
|
5
|
+
require 'elasticsearch_dsl_builder/dsl/search/inner_hits'
|
5
6
|
require 'elasticsearch_dsl_builder/dsl/search/script'
|
6
7
|
require 'elasticsearch_dsl_builder/dsl/search/sort'
|
7
8
|
require 'elasticsearch_dsl_builder/exceptions'
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module ElasticsearchDslBuilder
|
2
|
+
module DSL
|
3
|
+
module Search
|
4
|
+
class InnerHits
|
5
|
+
def size(value)
|
6
|
+
raise ArgumentError, 'value must be Numeric' unless value.is_a? Numeric
|
7
|
+
@size = value
|
8
|
+
self
|
9
|
+
end
|
10
|
+
|
11
|
+
def from(value)
|
12
|
+
raise ArgumentError, 'value must be Numeric' unless value.is_a? Numeric
|
13
|
+
@from = value
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
def sort_by(name, direction = nil)
|
18
|
+
@sort ||= Sort.new
|
19
|
+
@sort.by(name, direction)
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
def include_fields(*fields)
|
24
|
+
fields = fields.flatten
|
25
|
+
fields_valid = !fields.empty? && fields.all? { |f| f.instance_of?(String) }
|
26
|
+
raise ArgumentError, 'must pass at least 1 String field' unless fields_valid
|
27
|
+
@included_fields ||= []
|
28
|
+
@included_fields.concat fields
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
32
|
+
def exclude_fields(*fields)
|
33
|
+
fields = fields.flatten
|
34
|
+
fields_valid = !fields.empty? && fields.all? { |f| f.instance_of?(String) }
|
35
|
+
raise ArgumentError, 'must pass at least 1 String field' unless fields_valid
|
36
|
+
@excluded_fields ||= []
|
37
|
+
@excluded_fields.concat fields
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_hash
|
42
|
+
hash = {}
|
43
|
+
hash.update(sort: @sort.to_hash) if @sort
|
44
|
+
hash.update(size: @size) if @size
|
45
|
+
hash.update(from: @from) if @from
|
46
|
+
unless @included_fields.to_a.empty? && @excluded_fields.to_a.empty?
|
47
|
+
source = {}
|
48
|
+
source.update(includes: @included_fields) unless @included_fields.to_a.empty?
|
49
|
+
source.update(excludes: @excluded_fields) unless @excluded_fields.to_a.empty?
|
50
|
+
hash.update(_source: source)
|
51
|
+
end
|
52
|
+
hash
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -23,9 +23,16 @@ module ElasticsearchDslBuilder
|
|
23
23
|
self
|
24
24
|
end
|
25
25
|
|
26
|
+
def inner_hits(inner_hits)
|
27
|
+
raise ArgumentError, 'inner_hits must be an InnerHits object' unless inner_hits.instance_of?(InnerHits)
|
28
|
+
@inner_hits = inner_hits.to_hash
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
26
32
|
def to_hash
|
27
33
|
@query = { type: @child_type }
|
28
34
|
@query.update(query: @nested_query) if @nested_query
|
35
|
+
@query.update(inner_hits: @inner_hits) if @inner_hits
|
29
36
|
super
|
30
37
|
end
|
31
38
|
end
|
@@ -30,11 +30,18 @@ module ElasticsearchDslBuilder
|
|
30
30
|
self
|
31
31
|
end
|
32
32
|
|
33
|
+
def inner_hits(inner_hits)
|
34
|
+
raise ArgumentError, 'inner_hits must be an InnerHits object' unless inner_hits.instance_of?(InnerHits)
|
35
|
+
@inner_hits = inner_hits.to_hash
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
33
39
|
def to_hash
|
34
40
|
@query = {}
|
35
41
|
@query.update(parent_type: @parent_type) if @parent_type
|
36
42
|
@query.update(score: @score) if @score
|
37
43
|
@query.update(query: @nested_query) if @nested_query
|
44
|
+
@query.update(inner_hits: @inner_hits) if @inner_hits
|
38
45
|
super
|
39
46
|
end
|
40
47
|
end
|
@@ -22,9 +22,16 @@ module ElasticsearchDslBuilder
|
|
22
22
|
self
|
23
23
|
end
|
24
24
|
|
25
|
+
def inner_hits(inner_hits)
|
26
|
+
raise ArgumentError, 'inner_hits must be an InnerHits object' unless inner_hits.instance_of?(InnerHits)
|
27
|
+
@inner_hits = inner_hits.to_hash
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
25
31
|
def to_hash
|
26
32
|
@query = { path: @path }
|
27
33
|
@query.update(query: @nested_query) if @nested_query
|
34
|
+
@query.update(inner_hits: @inner_hits) if @inner_hits
|
28
35
|
super
|
29
36
|
end
|
30
37
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ElasticsearchDslBuilder::DSL::Search::InnerHits do
|
4
|
+
it 'should raise error if sort_by not valid' do
|
5
|
+
expect { InnerHits.new.sort_by(123, 'asc') }.to raise_error(ArgumentError)
|
6
|
+
expect { InnerHits.new.sort_by('valid', 'not_asc_or_desc') }.to raise_error(ArgumentError)
|
7
|
+
expect { InnerHits.new.sort_by('valid', 123) }.to raise_error(ArgumentError)
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should raise error if size not Numeric' do
|
11
|
+
expect { InnerHits.new.size('invalid') }.to raise_error(ArgumentError)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should raise error if from not Numeric' do
|
15
|
+
expect { InnerHits.new.from('invalid') }.to raise_error(ArgumentError)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should raise error if include_fields invalid' do
|
19
|
+
expect { InnerHits.new.include_fields }.to raise_error(ArgumentError)
|
20
|
+
expect { InnerHits.new.include_fields(123) }.to raise_error(ArgumentError)
|
21
|
+
expect { InnerHits.new.include_fields('valid', 123) }.to raise_error(ArgumentError)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should raise error if exclude_fields invalid' do
|
25
|
+
expect { InnerHits.new.exclude_fields }.to raise_error(ArgumentError)
|
26
|
+
expect { InnerHits.new.exclude_fields(123) }.to raise_error(ArgumentError)
|
27
|
+
expect { InnerHits.new.exclude_fields('valid', 123) }.to raise_error(ArgumentError)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should chain build an ES search' do
|
31
|
+
search = InnerHits.new.
|
32
|
+
sort_by('posted_at', 'desc').
|
33
|
+
size(5).from(2).
|
34
|
+
include_fields('id', 'content').
|
35
|
+
exclude_fields('no_show')
|
36
|
+
|
37
|
+
expect(search.to_hash).to eq(
|
38
|
+
sort: [
|
39
|
+
{ 'posted_at' => 'desc' }
|
40
|
+
],
|
41
|
+
size: 5,
|
42
|
+
from: 2,
|
43
|
+
_source: {
|
44
|
+
includes: ['id', 'content'],
|
45
|
+
excludes: ['no_show']
|
46
|
+
}
|
47
|
+
)
|
48
|
+
end
|
49
|
+
end
|
@@ -11,8 +11,31 @@ describe ElasticsearchDslBuilder::DSL::Search::Queries::HasChild do
|
|
11
11
|
expect { Queries::HasChild.new('child').query({}) }.to raise_error(ArgumentError)
|
12
12
|
end
|
13
13
|
|
14
|
+
it 'should fail if inner_hits argument not a InnerHits' do
|
15
|
+
expect { Queries::HasChild.new('child').inner_hits('invalid') }.to raise_error(ArgumentError)
|
16
|
+
expect { Queries::HasChild.new('child').inner_hits({}) }.to raise_error(ArgumentError)
|
17
|
+
end
|
18
|
+
|
14
19
|
it 'should chain create valid ES query hash' do
|
15
|
-
has_child = Queries::HasChild.new('child').
|
16
|
-
|
20
|
+
has_child = Queries::HasChild.new('child').
|
21
|
+
query(Queries::Term.new(:field_a, 'value')).
|
22
|
+
inner_hits(
|
23
|
+
InnerHits.new.size(1).from(0).sort_by('posted_at', 'asc').
|
24
|
+
include_fields('id', 'content').
|
25
|
+
exclude_fields('no_show')
|
26
|
+
)
|
27
|
+
|
28
|
+
expect(has_child.to_hash).to eq(
|
29
|
+
has_child: {
|
30
|
+
type: 'child', query: { term: { field_a: 'value' } },
|
31
|
+
inner_hits: {
|
32
|
+
sort: [{ 'posted_at' => 'asc' }], size: 1, from: 0,
|
33
|
+
_source: {
|
34
|
+
includes: ['id', 'content'],
|
35
|
+
excludes: ['no_show']
|
36
|
+
}
|
37
|
+
}
|
38
|
+
}
|
39
|
+
)
|
17
40
|
end
|
18
41
|
end
|
@@ -16,8 +16,33 @@ describe ElasticsearchDslBuilder::DSL::Search::Queries::HasParent do
|
|
16
16
|
expect { Queries::HasParent.new('parent').query({}) }.to raise_error(ArgumentError)
|
17
17
|
end
|
18
18
|
|
19
|
+
it 'should fail if inner_hits argument not a InnerHits' do
|
20
|
+
expect { Queries::HasParent.new('parent').inner_hits('invalid') }.to raise_error(ArgumentError)
|
21
|
+
expect { Queries::HasParent.new('parent').inner_hits({}) }.to raise_error(ArgumentError)
|
22
|
+
end
|
23
|
+
|
19
24
|
it 'should chain create valid ES query hash' do
|
20
|
-
has_parent = Queries::HasParent.new('parent').
|
21
|
-
|
25
|
+
has_parent = Queries::HasParent.new('parent').
|
26
|
+
score(true).
|
27
|
+
query(Queries::Term.new(:field_a, 'value')).
|
28
|
+
inner_hits(
|
29
|
+
InnerHits.new.size(1).from(0).sort_by('posted_at', 'asc').
|
30
|
+
include_fields('id', 'content').
|
31
|
+
exclude_fields('no_show')
|
32
|
+
)
|
33
|
+
expect(has_parent.to_hash).to eq(
|
34
|
+
has_parent: {
|
35
|
+
parent_type: 'parent',
|
36
|
+
score: true,
|
37
|
+
query: { term: { field_a: 'value' } },
|
38
|
+
inner_hits: {
|
39
|
+
sort: [{ 'posted_at' => 'asc' }], size: 1, from: 0,
|
40
|
+
_source: {
|
41
|
+
includes: ['id', 'content'],
|
42
|
+
excludes: ['no_show']
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
46
|
+
)
|
22
47
|
end
|
23
48
|
end
|
@@ -12,8 +12,30 @@ describe ElasticsearchDslBuilder::DSL::Search::Queries::Nested do
|
|
12
12
|
expect { Queries::Nested.new('path').query({}) }.to raise_error(ArgumentError)
|
13
13
|
end
|
14
14
|
|
15
|
+
it 'should fail if inner_hits argument not a InnerHits' do
|
16
|
+
expect { Queries::Nested.new('path').inner_hits('invalid') }.to raise_error(ArgumentError)
|
17
|
+
expect { Queries::Nested.new('path').inner_hits({}) }.to raise_error(ArgumentError)
|
18
|
+
end
|
19
|
+
|
15
20
|
it 'should chain create valid ES query hash' do
|
16
|
-
match = Queries::Nested.new('path').
|
17
|
-
|
21
|
+
match = Queries::Nested.new('path').
|
22
|
+
query(Queries::Exists.new('field_a')).
|
23
|
+
inner_hits(
|
24
|
+
InnerHits.new.size(1).from(0).sort_by('posted_at', 'asc').
|
25
|
+
include_fields('id', 'content').
|
26
|
+
exclude_fields('no_show')
|
27
|
+
)
|
28
|
+
expect(match.to_hash).to eq(
|
29
|
+
nested: {
|
30
|
+
path: 'path', query: { exists: { field: 'field_a' } },
|
31
|
+
inner_hits: {
|
32
|
+
sort: [{ 'posted_at' => 'asc' }], size: 1, from: 0,
|
33
|
+
_source: {
|
34
|
+
includes: ['id', 'content'],
|
35
|
+
excludes: ['no_show']
|
36
|
+
}
|
37
|
+
}
|
38
|
+
}
|
39
|
+
)
|
18
40
|
end
|
19
41
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elasticsearch-dsl-builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marvin Guerra
|
@@ -98,6 +98,7 @@ files:
|
|
98
98
|
- lib/elasticsearch_dsl_builder/dsl/search/aggregations/sum.rb
|
99
99
|
- lib/elasticsearch_dsl_builder/dsl/search/aggregations/sum_bucket.rb
|
100
100
|
- lib/elasticsearch_dsl_builder/dsl/search/aggregations/terms.rb
|
101
|
+
- lib/elasticsearch_dsl_builder/dsl/search/inner_hits.rb
|
101
102
|
- lib/elasticsearch_dsl_builder/dsl/search/queries/bool.rb
|
102
103
|
- lib/elasticsearch_dsl_builder/dsl/search/queries/exists.rb
|
103
104
|
- lib/elasticsearch_dsl_builder/dsl/search/queries/function_score.rb
|
@@ -129,6 +130,7 @@ files:
|
|
129
130
|
- spec/lib/dsl/search/aggregations/sum_bucket_spec.rb
|
130
131
|
- spec/lib/dsl/search/aggregations/sum_spec.rb
|
131
132
|
- spec/lib/dsl/search/aggregations/terms_spec.rb
|
133
|
+
- spec/lib/dsl/search/inner_hits_spec.rb
|
132
134
|
- spec/lib/dsl/search/queries/bool_spec.rb
|
133
135
|
- spec/lib/dsl/search/queries/exists_spec.rb
|
134
136
|
- spec/lib/dsl/search/queries/function_score_spec.rb
|
@@ -187,6 +189,7 @@ test_files:
|
|
187
189
|
- spec/lib/dsl/search/aggregations/sum_bucket_spec.rb
|
188
190
|
- spec/lib/dsl/search/aggregations/sum_spec.rb
|
189
191
|
- spec/lib/dsl/search/aggregations/terms_spec.rb
|
192
|
+
- spec/lib/dsl/search/inner_hits_spec.rb
|
190
193
|
- spec/lib/dsl/search/queries/bool_spec.rb
|
191
194
|
- spec/lib/dsl/search/queries/exists_spec.rb
|
192
195
|
- spec/lib/dsl/search/queries/function_score_spec.rb
|