elasticsearch-dsl 0.1.3 → 0.1.4

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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -3
  3. data/elasticsearch-dsl.gemspec +5 -1
  4. data/lib/elasticsearch/dsl/search.rb +1 -1
  5. data/lib/elasticsearch/dsl/search/aggregations/missing.rb +36 -0
  6. data/lib/elasticsearch/dsl/search/aggregations/pipeline/avg_bucket.rb +34 -0
  7. data/lib/elasticsearch/dsl/search/aggregations/pipeline/bucket_script.rb +36 -0
  8. data/lib/elasticsearch/dsl/search/aggregations/pipeline/bucket_selector.rb +35 -0
  9. data/lib/elasticsearch/dsl/search/aggregations/pipeline/cumulative_sum.rb +33 -0
  10. data/lib/elasticsearch/dsl/search/aggregations/pipeline/derivative.rb +34 -0
  11. data/lib/elasticsearch/dsl/search/aggregations/pipeline/extended_stats_bucket.rb +34 -0
  12. data/lib/elasticsearch/dsl/search/aggregations/pipeline/max_bucket.rb +34 -0
  13. data/lib/elasticsearch/dsl/search/aggregations/pipeline/min_bucket.rb +34 -0
  14. data/lib/elasticsearch/dsl/search/aggregations/pipeline/moving_avg.rb +42 -0
  15. data/lib/elasticsearch/dsl/search/aggregations/pipeline/percentiles_bucket.rb +36 -0
  16. data/lib/elasticsearch/dsl/search/aggregations/pipeline/serial_diff.rb +36 -0
  17. data/lib/elasticsearch/dsl/search/aggregations/pipeline/stats_bucket.rb +34 -0
  18. data/lib/elasticsearch/dsl/search/aggregations/pipeline/sum_bucket.rb +34 -0
  19. data/lib/elasticsearch/dsl/search/queries/bool.rb +10 -0
  20. data/lib/elasticsearch/dsl/search/sort.rb +11 -2
  21. data/lib/elasticsearch/dsl/version.rb +1 -1
  22. data/test/integration/search_test.rb +60 -0
  23. data/test/unit/aggregations/missing_test.rb +39 -0
  24. data/test/unit/aggregations/pipeline/avg_bucket_test.rb +39 -0
  25. data/test/unit/aggregations/pipeline/bucket_script_test.rb +39 -0
  26. data/test/unit/aggregations/pipeline/bucket_selector_test.rb +38 -0
  27. data/test/unit/aggregations/pipeline/cumulative_sum_test.rb +37 -0
  28. data/test/unit/aggregations/pipeline/derivative_test.rb +39 -0
  29. data/test/unit/aggregations/pipeline/extended_stats_bucket_test.rb +38 -0
  30. data/test/unit/aggregations/pipeline/max_bucket_test.rb +38 -0
  31. data/test/unit/aggregations/pipeline/min_bucket_test.rb +38 -0
  32. data/test/unit/aggregations/pipeline/moving_avg_test.rb +41 -0
  33. data/test/unit/aggregations/pipeline/percentiles_bucket_test.rb +39 -0
  34. data/test/unit/aggregations/pipeline/serial_diff_test.rb +39 -0
  35. data/test/unit/aggregations/pipeline/stats_bucket_test.rb +38 -0
  36. data/test/unit/aggregations/pipeline/sum_bucket_test.rb +38 -0
  37. data/test/unit/queries/bool_test.rb +9 -0
  38. data/test/unit/search_sort_test.rb +25 -0
  39. data/test/unit/search_test.rb +34 -0
  40. metadata +50 -6
@@ -0,0 +1,36 @@
1
+ module Elasticsearch
2
+ module DSL
3
+ module Search
4
+ module Aggregations
5
+
6
+ # Serial differencing is a technique where values in a time series are subtracted from itself at different time lags or periods.
7
+ #
8
+ # @example Passing the options as a Hash
9
+ #
10
+ # aggregation :thirtieth_difference do
11
+ # serial_diff buckets_path: 'the_sum'
12
+ # end
13
+ #
14
+ # @example Passing the options as a block
15
+ #
16
+ # aggregation :thirtieth_difference do
17
+ # serial_diff do
18
+ # buckets_path 'the_sum'
19
+ # lag 30
20
+ # end
21
+ # end
22
+ #
23
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-serialdiff-aggregation.html
24
+ #
25
+ class SerialDiff
26
+ include BaseAggregationComponent
27
+
28
+ option_method :buckets_path
29
+ option_method :lag
30
+ option_method :gap_policy
31
+ option_method :format
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,34 @@
1
+ module Elasticsearch
2
+ module DSL
3
+ module Search
4
+ module Aggregations
5
+
6
+ # A sibling pipeline aggregation which calculates a variety of stats across all bucket of a specified metric in a sibling aggregation.
7
+ #
8
+ # @example Passing the options as a Hash
9
+ #
10
+ # aggregation :stats_monthly_sales do
11
+ # stats_bucket buckets_path: 'sales_per_month>sales'
12
+ # end
13
+ #
14
+ # @example Passing the options as a block
15
+ #
16
+ # aggregation :stats_monthly_sales do
17
+ # stats_bucket do
18
+ # buckets_path 'sales_per_month>sales'
19
+ # end
20
+ # end
21
+ #
22
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-stats-bucket-aggregation.html
23
+ #
24
+ class StatsBucket
25
+ include BaseAggregationComponent
26
+
27
+ option_method :buckets_path
28
+ option_method :gap_policy
29
+ option_method :format
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ module Elasticsearch
2
+ module DSL
3
+ module Search
4
+ module Aggregations
5
+
6
+ # A sibling pipeline aggregation which calculates the sum across all bucket of a specified metric in a sibling aggregation.
7
+ #
8
+ # @example Passing the options as a Hash
9
+ #
10
+ # aggregation :sum_monthly_sales do
11
+ # sum_bucket buckets_path: 'sales_per_month>sales'
12
+ # end
13
+ #
14
+ # @example Passing the options as a block
15
+ #
16
+ # aggregation :sum_monthly_sales do
17
+ # sum_bucket do
18
+ # buckets_path 'sales_per_month>sales'
19
+ # end
20
+ # end
21
+ #
22
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-sum-bucket-aggregation.html
23
+ #
24
+ class SumBucket
25
+ include BaseAggregationComponent
26
+
27
+ option_method :buckets_path
28
+ option_method :gap_policy
29
+ option_method :format
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -57,6 +57,11 @@ module Elasticsearch
57
57
  self
58
58
  end
59
59
 
60
+ def filter(*args, &block)
61
+ @filter = block ? Filter.new(*args, &block) : args.first
62
+ self
63
+ end
64
+
60
65
  def to_hash
61
66
  @hash[name].update(@args.to_hash) if @args.respond_to?(:to_hash)
62
67
 
@@ -66,6 +71,11 @@ module Elasticsearch
66
71
  @hash[name] = @args unless @args.nil? || @args.empty?
67
72
  end
68
73
 
74
+ if @filter
75
+ _filter = @filter.respond_to?(:to_hash) ? @filter.to_hash : @filter
76
+ @hash[name].update(filter: _filter)
77
+ end
78
+
69
79
  @hash
70
80
  end
71
81
  end
@@ -36,14 +36,23 @@ module Elasticsearch
36
36
  #
37
37
  def to_hash
38
38
  if @block
39
- call
39
+ call unless @block_called
40
+ @block_called = true
40
41
  else
41
- @value << @args if @args
42
+ @value << @args if @args && !@args.empty? && ! @value.include?(@args)
42
43
  end
43
44
 
44
45
  @hash = @value.flatten
45
46
  @hash
46
47
  end
48
+
49
+ # Return whether the definition is empty
50
+ #
51
+ # @return [Boolean]
52
+ #
53
+ def empty?
54
+ to_hash.empty?
55
+ end
47
56
  end
48
57
  end
49
58
  end
@@ -1,5 +1,5 @@
1
1
  module Elasticsearch
2
2
  module DSL
3
- VERSION = "0.1.3"
3
+ VERSION = "0.1.4"
4
4
  end
5
5
  end
@@ -0,0 +1,60 @@
1
+ require 'test_helper'
2
+
3
+ module Elasticsearch
4
+ module Test
5
+ class SearchIntegrationTest < ::Elasticsearch::Test::IntegrationTestCase
6
+ include Elasticsearch::DSL::Search
7
+
8
+ class MySearch
9
+ include Elasticsearch::DSL::Search
10
+
11
+ def initialize(q)
12
+ @q = q
13
+ end
14
+
15
+ def tags
16
+ %w[ one two ]
17
+ end
18
+
19
+ def search_definition
20
+ search do |q|
21
+ q.query do |q|
22
+ q.bool do |q|
23
+ q.must do |q|
24
+ q.match title: @q
25
+ end
26
+ q.must do |q|
27
+ q.terms tags: tags
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ context "The Search class" do
36
+ startup do
37
+ Elasticsearch::Extensions::Test::Cluster.start(nodes: 1) if ENV['SERVER'] and not Elasticsearch::Extensions::Test::Cluster.running?
38
+ end
39
+
40
+ setup do
41
+ @client.indices.create index: 'test'
42
+ @client.index index: 'test', type: 'd', id: '1', body: { title: 'Test', tags: ['one'] }
43
+ @client.index index: 'test', type: 'd', id: '2', body: { title: 'Test', tags: ['one', 'two'] }
44
+ @client.index index: 'test', type: 'd', id: '3', body: { title: 'Test', tags: ['three'] }
45
+ @client.indices.refresh index: 'test'
46
+ end
47
+
48
+
49
+ should "have access to the calling context" do
50
+ s = MySearch.new('test')
51
+ response = @client.search index: 'test', body: s.search_definition.to_hash
52
+
53
+ assert_equal 2, response['hits']['total']
54
+ assert_equal 'Test', response['hits']['hits'][0]['_source']['title']
55
+ assert_same_elements ['1', '2'], response['hits']['hits'].map { |d| d['_id'] }
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ module Elasticsearch
4
+ module Test
5
+ module Aggregations
6
+ class MissingTest < ::Test::Unit::TestCase
7
+ include Elasticsearch::DSL::Search::Aggregations
8
+
9
+ context "Missing aggregation" do
10
+ subject { Missing.new }
11
+
12
+ should "be converted to a Hash" do
13
+ assert_equal({ missing: {} }, subject.to_hash)
14
+ end
15
+
16
+ should "take a Hash" do
17
+ subject = Missing.new( { field: 'foo' } )
18
+ assert_equal({ missing: { field: "foo" } }, subject.to_hash)
19
+ end
20
+
21
+ should "have option methods" do
22
+ subject.field 'foo'
23
+
24
+ assert_equal %w[ field ], subject.to_hash[:missing].keys.map(&:to_s).sort
25
+ assert_equal 'foo', subject.to_hash[:missing][:field]
26
+ end
27
+
28
+ should "take a block" do
29
+ subject = Missing.new do
30
+ field 'bar'
31
+ end
32
+
33
+ assert_equal({missing: { field: 'bar' } }, subject.to_hash)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ module Elasticsearch
4
+ module Test
5
+ module Aggregations
6
+ class AvgBucketTest < ::Test::Unit::TestCase
7
+ include Elasticsearch::DSL::Search::Aggregations
8
+
9
+ context "Avg Bucket agg" do
10
+ subject { AvgBucket.new }
11
+
12
+ should "be converted to a hash" do
13
+ assert_equal({ avg_bucket: {} }, subject.to_hash)
14
+ end
15
+
16
+ should "have option methods" do
17
+ subject = AvgBucket.new :foo
18
+
19
+ subject.buckets_path 'bar'
20
+ subject.gap_policy 'bar'
21
+ subject.format 'bar'
22
+
23
+ assert_equal %w[ buckets_path format gap_policy ],
24
+ subject.to_hash[:avg_bucket][:foo].keys.map(&:to_s).sort
25
+ assert_equal 'bar', subject.to_hash[:avg_bucket][:foo][:buckets_path]
26
+ end
27
+
28
+ should "take a block" do
29
+ subject = AvgBucket.new :foo do
30
+ format 'bar'
31
+ end
32
+ assert_equal({avg_bucket: { foo: { format: 'bar' } } }, subject.to_hash)
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ module Elasticsearch
4
+ module Test
5
+ module Aggregations
6
+ class BucketScriptTest < ::Test::Unit::TestCase
7
+ include Elasticsearch::DSL::Search::Aggregations
8
+
9
+ context "Bucket Script agg" do
10
+ subject { BucketScript.new }
11
+
12
+ should "be converted to a hash" do
13
+ assert_equal({ bucket_script: {} }, subject.to_hash)
14
+ end
15
+
16
+ should "have option methods" do
17
+ subject = BucketScript.new :foo
18
+
19
+ subject.buckets_path foo: 'foo', bar: 'bar'
20
+ subject.script 'bar'
21
+ subject.gap_policy 'skip'
22
+ subject.format 'bar'
23
+
24
+ assert_equal %w[ buckets_path format gap_policy script ],
25
+ subject.to_hash[:bucket_script][:foo].keys.map(&:to_s).sort
26
+ assert_equal 'bar', subject.to_hash[:bucket_script][:foo][:buckets_path][:bar]
27
+ end
28
+
29
+ should "take a block" do
30
+ subject = BucketScript.new :foo do
31
+ format 'bar'
32
+ end
33
+ assert_equal({bucket_script: { foo: { format: 'bar' } } }, subject.to_hash)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,38 @@
1
+ require 'test_helper'
2
+
3
+ module Elasticsearch
4
+ module Test
5
+ module Aggregations
6
+ class BucketSelectorTest < ::Test::Unit::TestCase
7
+ include Elasticsearch::DSL::Search::Aggregations
8
+
9
+ context "Bucket Selector agg" do
10
+ subject { BucketSelector.new }
11
+
12
+ should "be converted to a hash" do
13
+ assert_equal({ bucket_selector: {} }, subject.to_hash)
14
+ end
15
+
16
+ should "have option methods" do
17
+ subject = BucketSelector.new :foo
18
+
19
+ subject.buckets_path foo: 'foo', bar: 'bar'
20
+ subject.script 'bar'
21
+ subject.gap_policy 'skip'
22
+
23
+ assert_equal %w[ buckets_path gap_policy script ],
24
+ subject.to_hash[:bucket_selector][:foo].keys.map(&:to_s).sort
25
+ assert_equal 'bar', subject.to_hash[:bucket_selector][:foo][:buckets_path][:bar]
26
+ end
27
+
28
+ should "take a block" do
29
+ subject = BucketSelector.new :foo do
30
+ gap_policy 'skip'
31
+ end
32
+ assert_equal({bucket_selector: { foo: { gap_policy: 'skip' } } }, subject.to_hash)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,37 @@
1
+ require 'test_helper'
2
+
3
+ module Elasticsearch
4
+ module Test
5
+ module Aggregations
6
+ class CumulativeSumTest < ::Test::Unit::TestCase
7
+ include Elasticsearch::DSL::Search::Aggregations
8
+
9
+ context "Cumulative Sum Bucket agg" do
10
+ subject { CumulativeSum.new }
11
+
12
+ should "be converted to a hash" do
13
+ assert_equal({ cumulative_sum: {} }, subject.to_hash)
14
+ end
15
+
16
+ should "have option methods" do
17
+ subject = CumulativeSum.new :foo
18
+
19
+ subject.buckets_path 'bar'
20
+ subject.format 'bar'
21
+
22
+ assert_equal %w[ buckets_path format ],
23
+ subject.to_hash[:cumulative_sum][:foo].keys.map(&:to_s).sort
24
+ assert_equal 'bar', subject.to_hash[:cumulative_sum][:foo][:buckets_path]
25
+ end
26
+
27
+ should "take a block" do
28
+ subject = CumulativeSum.new :foo do
29
+ format 'bar'
30
+ end
31
+ assert_equal({cumulative_sum: { foo: { format: 'bar' } } }, subject.to_hash)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ module Elasticsearch
4
+ module Test
5
+ module Aggregations
6
+ class DerivativeTest < ::Test::Unit::TestCase
7
+ include Elasticsearch::DSL::Search::Aggregations
8
+
9
+ context "Derivative agg" do
10
+ subject { Derivative.new }
11
+
12
+ should "be converted to a hash" do
13
+ assert_equal({ derivative: {} }, subject.to_hash)
14
+ end
15
+
16
+ should "have option methods" do
17
+ subject = Derivative.new :foo
18
+
19
+ subject.buckets_path 'bar'
20
+ subject.gap_policy 'bar'
21
+ subject.format 'bar'
22
+
23
+ assert_equal %w[ buckets_path format gap_policy ],
24
+ subject.to_hash[:derivative][:foo].keys.map(&:to_s).sort
25
+ assert_equal 'bar', subject.to_hash[:derivative][:foo][:buckets_path]
26
+ end
27
+
28
+ should "take a block" do
29
+ subject = Derivative.new :foo do
30
+ format 'bar'
31
+ end
32
+ assert_equal({derivative: { foo: { format: 'bar' } } }, subject.to_hash)
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end