elasticsearch-dsl-builder 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -0
  3. data/Gemfile.lock +9 -1
  4. data/elasticsearch-dsl-builder.gemspec +3 -1
  5. data/lib/elasticsearch_dsl_builder/dsl/search.rb +14 -4
  6. data/lib/elasticsearch_dsl_builder/dsl/search/aggregation.rb +4 -0
  7. data/lib/elasticsearch_dsl_builder/dsl/search/aggregations/terms.rb +44 -0
  8. data/lib/elasticsearch_dsl_builder/dsl/search/queries/bool.rb +1 -0
  9. data/lib/elasticsearch_dsl_builder/dsl/search/queries/exists.rb +1 -2
  10. data/lib/elasticsearch_dsl_builder/dsl/search/queries/has_child.rb +1 -2
  11. data/lib/elasticsearch_dsl_builder/dsl/search/queries/match.rb +3 -3
  12. data/lib/elasticsearch_dsl_builder/dsl/search/queries/multi_match.rb +4 -3
  13. data/lib/elasticsearch_dsl_builder/dsl/search/queries/nested.rb +1 -2
  14. data/lib/elasticsearch_dsl_builder/dsl/search/queries/range.rb +4 -4
  15. data/lib/elasticsearch_dsl_builder/dsl/search/queries/term.rb +6 -5
  16. data/lib/elasticsearch_dsl_builder/dsl/search/queries/terms.rb +7 -7
  17. data/lib/elasticsearch_dsl_builder/dsl/search/sort.rb +7 -0
  18. data/lib/elasticsearch_dsl_builder/exceptions.rb +2 -2
  19. data/spec/lib/dsl/search/aggregations/terms_spec.rb +31 -0
  20. data/spec/lib/dsl/search/queries/bool_spec.rb +46 -0
  21. data/spec/lib/dsl/search/queries/exists_spec.rb +14 -0
  22. data/spec/lib/dsl/search/queries/function_score_spec.rb +33 -0
  23. data/spec/lib/dsl/search/queries/has_child_spec.rb +18 -0
  24. data/spec/lib/dsl/search/queries/has_parent_spec.rb +23 -0
  25. data/spec/lib/dsl/search/queries/match_spec.rb +20 -0
  26. data/spec/lib/dsl/search/queries/multi_match_spec.rb +21 -0
  27. data/spec/lib/dsl/search/queries/nested_spec.rb +19 -0
  28. data/spec/lib/dsl/search/queries/range_spec.rb +28 -0
  29. data/spec/lib/dsl/search/queries/term_spec.rb +25 -0
  30. data/spec/lib/dsl/search/queries/terms_spec.rb +20 -0
  31. data/spec/lib/dsl/search/sort_spec.rb +18 -0
  32. data/spec/lib/dsl/search_spec.rb +73 -0
  33. data/spec/lib/dsl_spec.rb +12 -0
  34. data/spec/spec_helper.rb +12 -0
  35. metadata +51 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 206c3398edd90fbfa998b106308ba95da121a9ef
4
- data.tar.gz: f7dc3a66f02bbe956d5797ecf90d0cd3938693fe
3
+ metadata.gz: 6aa1d929fa40df01a07f94c5de9fc34955bc1b28
4
+ data.tar.gz: 9536873ac5cb305a3b8ea204b90790644122db15
5
5
  SHA512:
6
- metadata.gz: 252809b487ac6cf57bbaa0f09f36fd62db89f0be7a1f8e7250eaa326f952f7d636f153de7952d2be963a63bb216fef6472d31bfe516d0b678727fa11feb94dc9
7
- data.tar.gz: 6ef757b531ada6a76894b4e4787708c31d7ffdb3c045d636812153d4cb515558762debca6c46862374634d67562dd75ccd0260e3e6b382cc2ee1c5963f7f9d0c
6
+ metadata.gz: a51f818dfed959576d50bf568ae913c67108ed98c89399de4b6fb08c3a60b99831fe7514b73f94585a5f73a44d500cf8d84891efda4764dd5e07237b13ea5bf8
7
+ data.tar.gz: 0c536b02879489f756f066d3f945394fafa6299e34c78db5074c5196ae8bd85311164639a0b71d478bc88e28502445737b9ba8216adb454e499b7cb8467f2e68
data/.rubocop.yml CHANGED
@@ -196,3 +196,7 @@ WordArray:
196
196
 
197
197
  FrozenStringLiteralComment:
198
198
  Enabled: false
199
+
200
+ Metrics/BlockLength:
201
+ Exclude:
202
+ - "**/*_spec.rb"
data/Gemfile.lock CHANGED
@@ -1,13 +1,15 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- elasticsearch-dsl-builder (0.0.10)
4
+ elasticsearch-dsl-builder (0.0.11)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  ast (2.3.0)
10
10
  diff-lcs (1.3)
11
+ docile (1.1.5)
12
+ json (2.1.0)
11
13
  parallel (1.12.0)
12
14
  parser (2.4.0.0)
13
15
  ast (~> 2.2)
@@ -36,6 +38,11 @@ GEM
36
38
  ruby-progressbar (~> 1.7)
37
39
  unicode-display_width (~> 1.0, >= 1.0.1)
38
40
  ruby-progressbar (1.9.0)
41
+ simplecov (0.15.1)
42
+ docile (~> 1.1.0)
43
+ json (>= 1.8, < 3)
44
+ simplecov-html (~> 0.10.0)
45
+ simplecov-html (0.10.2)
39
46
  unicode-display_width (1.3.0)
40
47
 
41
48
  PLATFORMS
@@ -46,6 +53,7 @@ DEPENDENCIES
46
53
  elasticsearch-dsl-builder!
47
54
  rspec (= 3.6.0)
48
55
  rubocop (= 0.50.0)
56
+ simplecov (= 0.15.1)
49
57
 
50
58
  RUBY VERSION
51
59
  ruby 2.3.2p217
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'elasticsearch-dsl-builder'
3
- s.version = '0.0.10'
3
+ s.version = '0.0.11'
4
4
  s.date = '2017-10-06'
5
5
  s.summary = 'Library utilizing builder pattern providing Ruby API for the Elasticsearch Query DSL'
6
6
  s.description = 'TBD'
@@ -16,7 +16,9 @@ Gem::Specification.new do |s|
16
16
  s.extra_rdoc_files = ['README.md', 'LICENSE']
17
17
  s.rdoc_options = ['--charset=UTF-8']
18
18
 
19
+ s.required_ruby_version = '~> 2.3'
19
20
  s.add_development_dependency 'bundler', '1.14.6'
20
21
  s.add_development_dependency 'rubocop', '0.50.0'
21
22
  s.add_development_dependency 'rspec', '3.6.0'
23
+ s.add_development_dependency 'simplecov', '0.15.1'
22
24
  end
@@ -6,12 +6,18 @@ module ElasticsearchDslBuilder
6
6
  #
7
7
  # @return [self, Query]
8
8
  def query(query)
9
+ raise ArgumentError, 'query must extend type Queries::Query' unless query.is_a?(Queries::Query)
10
+
9
11
  @query = query
10
12
  self
11
13
  end
12
14
 
13
15
  def aggregation(name, aggregation)
14
- @aggregations ||= AggregationsCollection.new
16
+ name_valid = name.instance_of?(String) || name.instance_of?(Symbol)
17
+ raise ArgumentError, 'name must be a String or Symbol' unless name_valid
18
+ raise ArgumentError, 'aggregation must extend Aggregation' unless aggregation.is_a?(Aggregations::Aggregation)
19
+
20
+ @aggregations ||= Aggregations::AggregationsCollection.new
15
21
  @aggregations[name.to_sym] = aggregation
16
22
  self
17
23
  end
@@ -23,30 +29,34 @@ module ElasticsearchDslBuilder
23
29
  end
24
30
 
25
31
  def size(value)
32
+ raise ArgumentError, 'value must be Numeric' unless value.is_a? Numeric
26
33
  @size = value
27
34
  self
28
35
  end
29
36
 
30
37
  def from(value)
38
+ raise ArgumentError, 'value must be Numeric' unless value.is_a? Numeric
31
39
  @from = value
32
40
  self
33
41
  end
34
42
 
35
43
  def search_after(*values)
36
- raise ArgunmentError, 'must pass at least 1 value' if values.nil? || values.empty?
44
+ raise ArgumentError, 'must pass at least 1 value' if values.nil? || values.empty?
37
45
  @search_after = values.flatten
38
46
  self
39
47
  end
40
48
 
41
49
  def include_fields(*fields)
42
- raise ArgunmentError, 'must pass at least 1 field' if fields.nil? || fields.empty?
50
+ fields_valid = !fields.nil? && !fields.empty? && fields.all? { |f| f.instance_of?(String) }
51
+ raise ArgumentError, 'must pass at least 1 field' unless fields_valid
43
52
  @included_fields ||= []
44
53
  @included_fields.concat fields.flatten
45
54
  self
46
55
  end
47
56
 
48
57
  def exclude_fields(*fields)
49
- raise ArgunmentError, 'must pass at least 1 field' if fields.nil? || fields.empty?
58
+ fields_valid = !fields.nil? && !fields.empty? && fields.all? { |f| f.instance_of?(String) }
59
+ raise ArgumentError, 'must pass at least 1 field' unless fields_valid
50
60
  @excluded_fields ||= []
51
61
  @excluded_fields.concat fields.flatten
52
62
  self
@@ -13,6 +13,10 @@ module ElasticsearchDslBuilder
13
13
  class Aggregation
14
14
  # Defines an aggregation nested in another one
15
15
  def aggregation(name, aggregation)
16
+ name_valid = name.instance_of?(String) || name.instance_of?(Symbol)
17
+ raise ArgumentError, 'name must be a String or Symbol' unless name_valid
18
+ raise ArgumentError, 'aggregation must extend Aggregation' unless aggregation.is_a?(Aggregation)
19
+
16
20
  @aggregations ||= AggregationsCollection.new
17
21
  @aggregations[name.to_sym] = aggregation
18
22
  self
@@ -0,0 +1,44 @@
1
+ module ElasticsearchDslBuilder
2
+ module DSL
3
+ module Search
4
+ module Aggregations
5
+ class Terms < Aggregation
6
+ def initialize(field = nil)
7
+ @type = :terms
8
+ field(field)
9
+ super()
10
+ end
11
+
12
+ def field(field)
13
+ raise ArgumentError, 'field must be a String' unless field.instance_of?(String)
14
+ @field = field
15
+ self
16
+ end
17
+
18
+ def include(include)
19
+ include_valid = include.instance_of?(String) ||
20
+ (include.instance_of?(Array) && include.all? { |i| i.instance_of?(String)})
21
+ raise ArgumentError, 'include argument must be a String or Array of Strings' unless include_valid
22
+ @include = include
23
+ self
24
+ end
25
+
26
+ def exclude(exclude)
27
+ exclude_valid = exclude.instance_of?(String) ||
28
+ (exclude.instance_of?(Array) && exclude.all? { |i| i.instance_of?(String)})
29
+ raise ArgumentError, 'exclude argument must be a String or Array of Strings' unless exclude_valid
30
+ @exclude = exclude
31
+ self
32
+ end
33
+
34
+ def to_hash
35
+ @aggregation = { field: @field }
36
+ @aggregation.update(include: @include) if @include
37
+ @aggregation.update(exclude: @exclude) if @exclude
38
+ super
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -16,6 +16,7 @@ module ElasticsearchDslBuilder
16
16
  end
17
17
 
18
18
  def minimum_should_match(value)
19
+ raise ArgumentError, 'minimum_should_match must be Numeric' unless value.is_a?(Numeric)
19
20
  @minimum_should_match = value
20
21
  self
21
22
  end
@@ -16,8 +16,7 @@ module ElasticsearchDslBuilder
16
16
  end
17
17
 
18
18
  def to_hash
19
- @query = {}
20
- @query.update(field: @field) if @field
19
+ @query = { field: @field }
21
20
  super
22
21
  end
23
22
  end
@@ -24,8 +24,7 @@ module ElasticsearchDslBuilder
24
24
  end
25
25
 
26
26
  def to_hash
27
- @query = {}
28
- @query.update(type: @child_type) if @child_type
27
+ @query = { type: @child_type }
29
28
  @query.update(query: @nested_query) if @nested_query
30
29
  super
31
30
  end
@@ -11,7 +11,8 @@ module ElasticsearchDslBuilder
11
11
  end
12
12
 
13
13
  def field(field)
14
- raise ArgumentError, 'field must be a String' unless field.instance_of?(String)
14
+ field_valid = field.instance_of?(String) || field.instance_of?(Symbol)
15
+ raise ArgumentError, 'field must be a String or Symbol' unless field_valid
15
16
  @field = field.to_sym
16
17
  self
17
18
  end
@@ -23,8 +24,7 @@ module ElasticsearchDslBuilder
23
24
  end
24
25
 
25
26
  def to_hash
26
- @query = {}
27
- @query.update(@field => @value) if @field && @value
27
+ @query = { @field => @value }
28
28
  super
29
29
  end
30
30
  end
@@ -10,9 +10,10 @@ module ElasticsearchDslBuilder
10
10
  super()
11
11
  end
12
12
 
13
- def fields(fields)
14
- valid = fields.instance_of?(Array) && !fields.empty? && fields.all? { |f| f.instance_of?(String) }
15
- raise ArgumentError, 'fields must be a non-empty Array of Strings' unless valid
13
+ def fields(*fields)
14
+ fields = fields.flatten
15
+ valid = !fields.empty? && fields.all? { |f| f.instance_of?(String) }
16
+ raise ArgumentError, 'fields must be array of Strings' unless valid
16
17
  @fields = fields
17
18
  self
18
19
  end
@@ -23,8 +23,7 @@ module ElasticsearchDslBuilder
23
23
  end
24
24
 
25
25
  def to_hash
26
- @query = {}
27
- @query.update(path: @path) if @path
26
+ @query = { path: @path }
28
27
  @query.update(query: @nested_query) if @nested_query
29
28
  super
30
29
  end
@@ -10,8 +10,9 @@ module ElasticsearchDslBuilder
10
10
  end
11
11
 
12
12
  def field(field)
13
- raise ArgumentError, 'field must be a String' unless field.instance_of?(String)
14
- @field = field
13
+ field_valid = field.instance_of?(String) || field.instance_of?(Symbol)
14
+ raise ArgumentError, 'field must be a String' unless field_valid
15
+ @field = field.to_sym
15
16
  self
16
17
  end
17
18
 
@@ -49,8 +50,7 @@ module ElasticsearchDslBuilder
49
50
  nested_query.update(lte: @lte) if @lte
50
51
  nested_query.update(format: @format) if @format
51
52
 
52
- @query = {}
53
- @query.update(@field => nested_query) unless nested_query.nil? || nested_query.empty?
53
+ @query = { @field => nested_query }
54
54
  super
55
55
  end
56
56
  end
@@ -5,13 +5,14 @@ module ElasticsearchDslBuilder
5
5
  class Term < Query
6
6
  def initialize(field = nil, value = nil)
7
7
  @type = :term
8
- field(field)
9
- value(value)
8
+ field(field) unless field.nil?
9
+ value(value) unless value.nil?
10
10
  super()
11
11
  end
12
12
 
13
13
  def field(field)
14
- raise ArgumentError, 'field must be a String' unless field.instance_of?(String)
14
+ field_valid = field.instance_of?(String) || field.instance_of?(Symbol)
15
+ raise ArgumentError, 'field must be a String or Symbol' unless field_valid
15
16
  @field = field.to_sym
16
17
  self
17
18
  end
@@ -22,8 +23,8 @@ module ElasticsearchDslBuilder
22
23
  end
23
24
 
24
25
  def to_hash
25
- @query = {}
26
- @query.update(@field => @value) if @field && @value
26
+ raise InvalidQuery, 'field and value must be provided for Term Query' unless @field && @value
27
+ @query = { @field => @value }
27
28
  super
28
29
  end
29
30
  end
@@ -10,22 +10,22 @@ module ElasticsearchDslBuilder
10
10
  super()
11
11
  end
12
12
 
13
- def values(values)
14
- valid = values.instance_of?(Array) && !values.empty?
15
- raise ArgumentError, 'values must be a non-empty Array' unless valid
13
+ def values(*values)
14
+ values = values.flatten
15
+ raise ArgumentError, 'values must be a non-empty Array' if values.empty? || values.any?(&:nil?)
16
16
  @values = values
17
17
  self
18
18
  end
19
19
 
20
20
  def field(field)
21
- raise ArgumentError, 'field must be a String' unless field.instance_of?(String)
22
- @field = field
21
+ field_valid = field.instance_of?(String) || field.instance_of?(Symbol)
22
+ raise ArgumentError, 'field must be a String' unless field_valid
23
+ @field = field.to_sym
23
24
  self
24
25
  end
25
26
 
26
27
  def to_hash
27
- @query = {}
28
- @query.update(@field => @values) if @field && @values
28
+ @query = { @field => @values }
29
29
  super
30
30
  end
31
31
  end
@@ -10,6 +10,13 @@ module ElasticsearchDslBuilder
10
10
 
11
11
  # DSL method to specify sorting item
12
12
  def by(name, direction = nil)
13
+ raise ArgumentError, 'name must be non empty String' unless name.instance_of?(String) && !name.empty?
14
+ direction_valid = direction.nil? ||
15
+ (direction.instance_of?(String) && !direction.empty? && ['asc', 'desc'].include?(direction.downcase))
16
+ unless direction.nil?
17
+ raise ArgumentError, 'direction must be non empty String' unless direction_valid
18
+ end
19
+
13
20
  @value << (direction ? { name => direction } : name)
14
21
  self
15
22
  end
@@ -2,6 +2,6 @@ module ElasticsearchDslBuilder
2
2
  # @abstact Exceptions raised by ElasticsearchDslBuilder inherit from Error
3
3
  class Error < StandardError; end
4
4
 
5
- # Exception raised when argument type is not supported
6
- class UnsupportedArgumentType < Error; end
5
+ # Exception raised when Queries::Query.to_hash attempts to build invalid query
6
+ class InvalidQuery < Error; end
7
7
  end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL::Search::Aggregations::Terms do
4
+ it 'should fail if field not valid' do
5
+ expect { Aggregations::Terms.new(123) }.to raise_error(ArgumentError)
6
+ expect { Aggregations::Terms.new(nil) }.to raise_error(ArgumentError)
7
+ expect { Aggregations::Terms.new('field_a').field(nil) }.to raise_error(ArgumentError)
8
+ end
9
+
10
+ it 'should fail if include not valid' do
11
+ expect { Aggregations::Terms.new('field_a').include(nil) }.to raise_error(ArgumentError)
12
+ expect { Aggregations::Terms.new('field_a').include({}) }.to raise_error(ArgumentError)
13
+ expect { Aggregations::Terms.new('field_a').include([1, 2]) }.to raise_error(ArgumentError)
14
+ end
15
+
16
+ it 'should fail if exclude not valid' do
17
+ expect { Aggregations::Terms.new('field_a').exclude(nil) }.to raise_error(ArgumentError)
18
+ expect { Aggregations::Terms.new('field_a').exclude({}) }.to raise_error(ArgumentError)
19
+ expect { Aggregations::Terms.new('field_a').exclude([1, 2]) }.to raise_error(ArgumentError)
20
+ end
21
+
22
+ it 'should chain create valid ES aggregation hash' do
23
+ terms = Aggregations::Terms.new('field_a').
24
+ include('*ball').exclude(%w(baseball racquetball)).
25
+ aggregation('nested_agg', Aggregations::Terms.new('field_b'))
26
+ expect(terms.to_hash).to eq(
27
+ terms: { field: 'field_a', include: '*ball', exclude: %w(baseball racquetball) },
28
+ aggregations: { nested_agg: { terms: { field: 'field_b' } } }
29
+ )
30
+ end
31
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL::Search::Queries::Bool do
4
+ it 'should fail if minimum_should_match not Numeric' do
5
+ expect { Queries::Bool.new.minimum_should_match('invalid') }.to raise_error(ArgumentError)
6
+ end
7
+
8
+ it 'should fail if must argument not a query' do
9
+ expect { Queries::Bool.new.must('invalid') }.to raise_error(ArgumentError)
10
+ expect { Queries::Bool.new.must({}) }.to raise_error(ArgumentError)
11
+ end
12
+
13
+ it 'should fail if must_not argument not a query' do
14
+ expect { Queries::Bool.new.must_not('invalid') }.to raise_error(ArgumentError)
15
+ expect { Queries::Bool.new.must_not({}) }.to raise_error(ArgumentError)
16
+ end
17
+
18
+ it 'should fail if should argument not a query' do
19
+ expect { Queries::Bool.new.should('invalid') }.to raise_error(ArgumentError)
20
+ expect { Queries::Bool.new.should({}) }.to raise_error(ArgumentError)
21
+ end
22
+
23
+ it 'should fail if filter argument not a query' do
24
+ expect { Queries::Bool.new.filter('invalid') }.to raise_error(ArgumentError)
25
+ expect { Queries::Bool.new.filter({}) }.to raise_error(ArgumentError)
26
+ end
27
+
28
+ it 'should chain create valid ES query hash' do
29
+ bool = Queries::Bool.new.
30
+ minimum_should_match(1).
31
+ must(Queries::Term.new(:field_a, 1)).
32
+ must_not(Queries::Term.new(:field_a, 2)).
33
+ should(Queries::Exists.new('posted_at')).
34
+ filter(Queries::Match.new('field_b', 'value'))
35
+
36
+ expect(bool.to_hash).to eq(
37
+ bool: {
38
+ minimum_should_match: 1,
39
+ must: [{ term: { field_a: 1 } }],
40
+ must_not: [{ term: { field_a: 2 } }],
41
+ should: [{ exists: { field: 'posted_at' } }],
42
+ filter: [{ match: { field_b: 'value' } }]
43
+ }
44
+ )
45
+ end
46
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL::Search::Queries::Exists do
4
+ it 'should fail if field not a String' do
5
+ expect { Queries::Exists.new(123) }.to raise_error(ArgumentError)
6
+ expect { Queries::Exists.new(nil) }.to raise_error(ArgumentError)
7
+ expect { Queries::Exists.new('valid').field(nil) }.to raise_error(ArgumentError)
8
+ end
9
+
10
+ it 'should chain create valid ES query hash' do
11
+ exists = Queries::Exists.new('field_a')
12
+ expect(exists.to_hash).to eq(exists: { field: 'field_a' })
13
+ end
14
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL::Search::Queries::FunctionScore do
4
+ it 'should fail if query argument not a Queries::Query' do
5
+ expect { Queries::FunctionScore.new.query('invalid') }.to raise_error(ArgumentError)
6
+ expect { Queries::FunctionScore.new.query({}) }.to raise_error(ArgumentError)
7
+ end
8
+
9
+ it 'should fail if score_mode argument not a String' do
10
+ expect { Queries::FunctionScore.new.score_mode(nil) }.to raise_error(ArgumentError)
11
+ expect { Queries::FunctionScore.new.score_mode({}) }.to raise_error(ArgumentError)
12
+ end
13
+
14
+ it 'should fail if script_score argument not a String' do
15
+ expect { Queries::FunctionScore.new.script_score(nil) }.to raise_error(ArgumentError)
16
+ expect { Queries::FunctionScore.new.script_score({}) }.to raise_error(ArgumentError)
17
+ end
18
+
19
+ it 'should chain create valid ES query hash' do
20
+ function_score = Queries::FunctionScore.new.
21
+ query(Queries::Term.new(:field_a, 'value')).
22
+ score_mode('sum').
23
+ script_score("doc['likes'].value")
24
+
25
+ expect(function_score.to_hash).to eq(
26
+ function_score: {
27
+ query: { term: { field_a: 'value' } },
28
+ score_mode: 'sum',
29
+ script_score: { script: "doc['likes'].value" }
30
+ }
31
+ )
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL::Search::Queries::HasChild do
4
+ it 'should fail if child_type not a String' do
5
+ expect { Queries::HasChild.new(123) }.to raise_error(ArgumentError)
6
+ expect { Queries::HasChild.new(nil) }.to raise_error(ArgumentError)
7
+ end
8
+
9
+ it 'should fail if query argument not a Queries::Query' do
10
+ expect { Queries::HasChild.new('child').query('invalid') }.to raise_error(ArgumentError)
11
+ expect { Queries::HasChild.new('child').query({}) }.to raise_error(ArgumentError)
12
+ end
13
+
14
+ it 'should chain create valid ES query hash' do
15
+ has_child = Queries::HasChild.new('child').query(Queries::Term.new(:field_a, 'value'))
16
+ expect(has_child.to_hash).to eq(has_child: { type: 'child', query: { term: { field_a: 'value' } } })
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL::Search::Queries::HasParent do
4
+ it 'should fail if parent_type not a String' do
5
+ expect { Queries::HasParent.new(123) }.to raise_error(ArgumentError)
6
+ expect { Queries::HasParent.new(nil) }.to raise_error(ArgumentError)
7
+ end
8
+
9
+ it 'should fail if score argument not a boolean' do
10
+ expect { Queries::HasParent.new('parent').score('invalid') }.to raise_error(ArgumentError)
11
+ expect { Queries::HasParent.new('parent').score({}) }.to raise_error(ArgumentError)
12
+ end
13
+
14
+ it 'should fail if query argument not a Queries::Query' do
15
+ expect { Queries::HasParent.new('parent').query('invalid') }.to raise_error(ArgumentError)
16
+ expect { Queries::HasParent.new('parent').query({}) }.to raise_error(ArgumentError)
17
+ end
18
+
19
+ it 'should chain create valid ES query hash' do
20
+ has_parent = Queries::HasParent.new('parent').score(true).query(Queries::Term.new(:field_a, 'value'))
21
+ expect(has_parent.to_hash).to eq(has_parent: { parent_type: 'parent', score: true, query: { term: { field_a: 'value' } } })
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL::Search::Queries::Match do
4
+ it 'should fail if field not a String or Symbol' do
5
+ expect { Queries::Match.new(123, 'value') }.to raise_error(ArgumentError)
6
+ expect { Queries::Match.new(nil, 'value') }.to raise_error(ArgumentError)
7
+ expect { Queries::Match.new('field_a', 'value').field({}) }.to raise_error(ArgumentError)
8
+ end
9
+
10
+ it 'should fail if value argument not a String' do
11
+ expect { Queries::Match.new('field_a', 123) }.to raise_error(ArgumentError)
12
+ expect { Queries::Match.new('field_a', nil) }.to raise_error(ArgumentError)
13
+ expect { Queries::Match.new('field_a', 'value').value({}) }.to raise_error(ArgumentError)
14
+ end
15
+
16
+ it 'should chain create valid ES query hash' do
17
+ match = Queries::Match.new(:field_a, 'value')
18
+ expect(match.to_hash).to eq(match: { field_a: 'value' })
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL::Search::Queries::MultiMatch do
4
+ it 'should fail if fields not Array of Strings' do
5
+ expect { Queries::MultiMatch.new(123, 'value') }.to raise_error(ArgumentError)
6
+ expect { Queries::MultiMatch.new(nil, 'value') }.to raise_error(ArgumentError)
7
+ expect { Queries::MultiMatch.new([], 'value') }.to raise_error(ArgumentError)
8
+ expect { Queries::MultiMatch.new(['field_a'], 'value').fields({}) }.to raise_error(ArgumentError)
9
+ end
10
+
11
+ it 'should fail if value argument not a String' do
12
+ expect { Queries::MultiMatch.new(['field_a'], 123) }.to raise_error(ArgumentError)
13
+ expect { Queries::MultiMatch.new(['field_a'], nil) }.to raise_error(ArgumentError)
14
+ expect { Queries::MultiMatch.new(['field_a'], 'value').value({}) }.to raise_error(ArgumentError)
15
+ end
16
+
17
+ it 'should chain create valid ES query hash' do
18
+ match = Queries::MultiMatch.new(['field_a'], 'value')
19
+ expect(match.to_hash).to eq(multi_match: { fields: ['field_a'], query: 'value' })
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL::Search::Queries::Nested do
4
+ it 'should fail if path not a String' do
5
+ expect { Queries::Nested.new(nil) }.to raise_error(ArgumentError)
6
+ expect { Queries::Nested.new(123) }.to raise_error(ArgumentError)
7
+ expect { Queries::Nested.new('path').path(nil) }.to raise_error(ArgumentError)
8
+ end
9
+
10
+ it 'should fail if query argument not a Queries::Query' do
11
+ expect { Queries::Nested.new('path').query(nil) }.to raise_error(ArgumentError)
12
+ expect { Queries::Nested.new('path').query({}) }.to raise_error(ArgumentError)
13
+ end
14
+
15
+ it 'should chain create valid ES query hash' do
16
+ match = Queries::Nested.new('path').query(Queries::Exists.new('field_a'))
17
+ expect(match.to_hash).to eq(nested: { path: 'path', query: { exists: { field: 'field_a' } } })
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL::Search::Queries::Range do
4
+ it 'should fail if field not a String' do
5
+ expect { Queries::Range.new(123) }.to raise_error(ArgumentError)
6
+ expect { Queries::Range.new(nil) }.to raise_error(ArgumentError)
7
+ expect { Queries::Range.new([]) }.to raise_error(ArgumentError)
8
+ expect { Queries::Range.new('field_a').field(nil) }.to raise_error(ArgumentError)
9
+ end
10
+
11
+ it 'should fail if format argument not a String' do
12
+ expect { Queries::Range.new(:field_a).format(nil) }.to raise_error(ArgumentError)
13
+ expect { Queries::Range.new('field_a').format(123) }.to raise_error(ArgumentError)
14
+ end
15
+
16
+ it 'should chain create valid ES query hash' do
17
+ range = Queries::Range.new(:field_a).
18
+ format('YYYY-MM').gt('2017-09').gte('2017-09').lt('2017-09').lte('2017-09')
19
+ expect(range.to_hash).to eq(
20
+ range: {
21
+ field_a: {
22
+ gt: '2017-09', gte: '2017-09', lt: '2017-09', lte: '2017-09',
23
+ format: 'YYYY-MM'
24
+ }
25
+ }
26
+ )
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL::Search::Queries::Term do
4
+ it 'should fail if field not valid' do
5
+ expect { Queries::Term.new(123) }.to raise_error(ArgumentError)
6
+ end
7
+
8
+ it 'should fail to create hash if invalid query' do
9
+ expect { Queries::Term.new.to_hash }.to raise_error(ElasticsearchDslBuilder::InvalidQuery)
10
+ expect { Queries::Term.new(:field_a).to_hash }.to raise_error(ElasticsearchDslBuilder::InvalidQuery)
11
+ end
12
+
13
+ it 'should chain create valid ES query hash' do
14
+ initialized_term = Queries::Term.new('field_a', 1)
15
+ chain_term = Queries::Term.new.field(:field_a).value(1)
16
+
17
+ [initialized_term, chain_term].each do |term|
18
+ expect(term.to_hash).to eq(
19
+ term: {
20
+ field_a: 1
21
+ }
22
+ )
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL::Search::Queries::Terms do
4
+ it 'should fail if field not valid' do
5
+ expect { Queries::Terms.new(123, [1, 2]) }.to raise_error(ArgumentError)
6
+ expect { Queries::Terms.new(nil, [1, 2]) }.to raise_error(ArgumentError)
7
+ expect { Queries::Terms.new(:field_a, [1, 2]).field(nil) }.to raise_error(ArgumentError)
8
+ end
9
+
10
+ it 'should fail if values not valid' do
11
+ expect { Queries::Terms.new(:field_a, []) }.to raise_error(ArgumentError)
12
+ expect { Queries::Terms.new(:field_a, nil) }.to raise_error(ArgumentError)
13
+ expect { Queries::Terms.new(:field_a, [1]).values(nil) }.to raise_error(ArgumentError)
14
+ end
15
+
16
+ it 'should chain create valid ES query hash' do
17
+ terms = Queries::Terms.new(:field_a, [1, 2])
18
+ expect(terms.to_hash).to eq({ terms: { field_a: [1, 2] } })
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL::Search::Sort do
4
+ it 'should raise error if by not valid' do
5
+ expect { Sort.new.by(123, 'asc') }.to raise_error(ArgumentError)
6
+ expect { Sort.new.by('valid', 'not_asc_or_desc') }.to raise_error(ArgumentError)
7
+ expect { Sort.new.by('valid', 123) }.to raise_error(ArgumentError)
8
+ end
9
+
10
+ it 'should chain build array of sort instructions' do
11
+ sort = Sort.new.
12
+ by('posted_at', 'desc').
13
+ by('id').
14
+ by('updated', 'desc')
15
+
16
+ expect(sort.to_hash).to eq([{ 'posted_at' => 'desc' }, 'id', { 'updated' => 'desc' }])
17
+ end
18
+ end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL::Search::Search do
4
+ it 'should raise error if query not a Queries::Query' do
5
+ expect { Search.new.query({}) }.to raise_error(ArgumentError)
6
+ end
7
+
8
+ it 'should raise error if sort_by not valid' do
9
+ expect { Search.new.sort_by(123, 'asc') }.to raise_error(ArgumentError)
10
+ expect { Search.new.sort_by('valid', 'not_asc_or_desc') }.to raise_error(ArgumentError)
11
+ expect { Search.new.sort_by('valid', 123) }.to raise_error(ArgumentError)
12
+ end
13
+
14
+ it 'should raise error if size not Numeric' do
15
+ expect { Search.new.size('invalid') }.to raise_error(ArgumentError)
16
+ end
17
+
18
+ it 'should raise error if from not Numeric' do
19
+ expect { Search.new.from('invalid') }.to raise_error(ArgumentError)
20
+ end
21
+
22
+ it 'should raise error if search_after contains no values' do
23
+ expect { Search.new.search_after }.to raise_error(ArgumentError)
24
+ end
25
+
26
+ it 'should raise error if include_fields invalid' do
27
+ expect { Search.new.include_fields }.to raise_error(ArgumentError)
28
+ expect { Search.new.include_fields(123) }.to raise_error(ArgumentError)
29
+ expect { Search.new.include_fields('valid', 123) }.to raise_error(ArgumentError)
30
+ end
31
+
32
+ it 'should raise error if exclude_fields invalid' do
33
+ expect { Search.new.exclude_fields }.to raise_error(ArgumentError)
34
+ expect { Search.new.exclude_fields(123) }.to raise_error(ArgumentError)
35
+ expect { Search.new.exclude_fields('valid', 123) }.to raise_error(ArgumentError)
36
+ end
37
+
38
+ it 'should raise error if aggregation name invalid' do
39
+ expect { Search.new.aggregation(nil, Aggregations::Terms.new('field_a')) }.to raise_error(ArgumentError)
40
+ expect { Search.new.aggregation(123, Aggregations::Terms.new('field_a')) }.to raise_error(ArgumentError)
41
+ end
42
+
43
+ it 'should raise error if aggregation doesnt extend Aggregation' do
44
+ expect { Search.new.aggregation('valid', nil) }.to raise_error(ArgumentError)
45
+ expect { Search.new.aggregation(:valid, {}) }.to raise_error(ArgumentError)
46
+ end
47
+
48
+ it 'should chain build an ES search' do
49
+ search = Search.new.
50
+ query(Queries::Bool.new).
51
+ sort_by('posted_at', 'desc').
52
+ size(5).from(2).
53
+ search_after(2, 1).
54
+ include_fields('id', 'content').
55
+ exclude_fields('no_show').
56
+ aggregation('my_agg', Aggregations::Terms.new('field_a'))
57
+
58
+ expect(search.to_hash).to eq(
59
+ query: { bool: {} },
60
+ aggregations: { my_agg: { terms: { field: 'field_a' } } },
61
+ sort: [
62
+ { 'posted_at' => 'desc' }
63
+ ],
64
+ size: 5,
65
+ from: 2,
66
+ search_after: [2, 1],
67
+ _source: {
68
+ includes: ['id', 'content'],
69
+ excludes: ['no_show']
70
+ }
71
+ )
72
+ end
73
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe ElasticsearchDslBuilder::DSL do
4
+ class SampleDSLUser
5
+ include ElasticsearchDslBuilder::DSL
6
+ end
7
+
8
+ it 'should include search modules' do
9
+ expect(SampleDSLUser.included_modules).to include ElasticsearchDslBuilder::DSL
10
+ expect(SampleDSLUser.included_modules).to include ElasticsearchDslBuilder::DSL::Search
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require 'rspec'
2
+
3
+ require 'simplecov'
4
+ SimpleCov.start
5
+
6
+ require 'elasticsearch_dsl_builder/dsl'
7
+ include ElasticsearchDslBuilder::DSL
8
+
9
+ RSpec.configure do |config|
10
+ config.fail_fast = 5
11
+ config.default_formatter = 'documentation'
12
+ 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.10
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marvin Guerra
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
54
  version: 3.6.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.15.1
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.15.1
55
69
  description: TBD
56
70
  email: marvin@marvinguerra.com
57
71
  executables: []
@@ -71,6 +85,7 @@ files:
71
85
  - lib/elasticsearch_dsl_builder/dsl.rb
72
86
  - lib/elasticsearch_dsl_builder/dsl/search.rb
73
87
  - lib/elasticsearch_dsl_builder/dsl/search/aggregation.rb
88
+ - lib/elasticsearch_dsl_builder/dsl/search/aggregations/terms.rb
74
89
  - lib/elasticsearch_dsl_builder/dsl/search/queries/bool.rb
75
90
  - lib/elasticsearch_dsl_builder/dsl/search/queries/exists.rb
76
91
  - lib/elasticsearch_dsl_builder/dsl/search/queries/function_score.rb
@@ -86,6 +101,22 @@ files:
86
101
  - lib/elasticsearch_dsl_builder/dsl/search/sort.rb
87
102
  - lib/elasticsearch_dsl_builder/dsl/version.rb
88
103
  - lib/elasticsearch_dsl_builder/exceptions.rb
104
+ - spec/lib/dsl/search/aggregations/terms_spec.rb
105
+ - spec/lib/dsl/search/queries/bool_spec.rb
106
+ - spec/lib/dsl/search/queries/exists_spec.rb
107
+ - spec/lib/dsl/search/queries/function_score_spec.rb
108
+ - spec/lib/dsl/search/queries/has_child_spec.rb
109
+ - spec/lib/dsl/search/queries/has_parent_spec.rb
110
+ - spec/lib/dsl/search/queries/match_spec.rb
111
+ - spec/lib/dsl/search/queries/multi_match_spec.rb
112
+ - spec/lib/dsl/search/queries/nested_spec.rb
113
+ - spec/lib/dsl/search/queries/range_spec.rb
114
+ - spec/lib/dsl/search/queries/term_spec.rb
115
+ - spec/lib/dsl/search/queries/terms_spec.rb
116
+ - spec/lib/dsl/search/sort_spec.rb
117
+ - spec/lib/dsl/search_spec.rb
118
+ - spec/lib/dsl_spec.rb
119
+ - spec/spec_helper.rb
89
120
  homepage: http://rubygems.org/gems/hola
90
121
  licenses:
91
122
  - MIT
@@ -97,9 +128,9 @@ require_paths:
97
128
  - lib
98
129
  required_ruby_version: !ruby/object:Gem::Requirement
99
130
  requirements:
100
- - - ">="
131
+ - - "~>"
101
132
  - !ruby/object:Gem::Version
102
- version: '0'
133
+ version: '2.3'
103
134
  required_rubygems_version: !ruby/object:Gem::Requirement
104
135
  requirements:
105
136
  - - ">="
@@ -112,4 +143,20 @@ signing_key:
112
143
  specification_version: 4
113
144
  summary: Library utilizing builder pattern providing Ruby API for the Elasticsearch
114
145
  Query DSL
115
- test_files: []
146
+ test_files:
147
+ - spec/lib/dsl/search/aggregations/terms_spec.rb
148
+ - spec/lib/dsl/search/queries/bool_spec.rb
149
+ - spec/lib/dsl/search/queries/exists_spec.rb
150
+ - spec/lib/dsl/search/queries/function_score_spec.rb
151
+ - spec/lib/dsl/search/queries/has_child_spec.rb
152
+ - spec/lib/dsl/search/queries/has_parent_spec.rb
153
+ - spec/lib/dsl/search/queries/match_spec.rb
154
+ - spec/lib/dsl/search/queries/multi_match_spec.rb
155
+ - spec/lib/dsl/search/queries/nested_spec.rb
156
+ - spec/lib/dsl/search/queries/range_spec.rb
157
+ - spec/lib/dsl/search/queries/term_spec.rb
158
+ - spec/lib/dsl/search/queries/terms_spec.rb
159
+ - spec/lib/dsl/search/sort_spec.rb
160
+ - spec/lib/dsl/search_spec.rb
161
+ - spec/lib/dsl_spec.rb
162
+ - spec/spec_helper.rb