From 48274b6a463367b1aa753869661077dbcf721cdd Mon Sep 17 00:00:00 2001 From: Adam Jahn Date: Mon, 17 Jan 2022 08:40:05 +0000 Subject: [PATCH] Allow nested aggregation to accept an Aggregation instance. For example: ```ruby nested = Aggregation.new do sum field: 'foo' end outer = Aggregation.new do aggregation(:nested_agg, nested) end ``` This matches the behavior of the top level query `aggregation` method. --- .../dsl/search/base_aggregation_component.rb | 8 +++++++- .../unit/search_base_aggregation_component_test.rb | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/elasticsearch/dsl/search/base_aggregation_component.rb b/lib/elasticsearch/dsl/search/base_aggregation_component.rb index 82553c4..faf7136 100644 --- a/lib/elasticsearch/dsl/search/base_aggregation_component.rb +++ b/lib/elasticsearch/dsl/search/base_aggregation_component.rb @@ -53,7 +53,13 @@ def method_missing(name, *args, &block) # def aggregation(*args, &block) @aggregations ||= AggregationsCollection.new - @aggregations.update args.first => Aggregation.new(*args, &block) + + if block + @aggregations.update args.first => Aggregation.new(*args, &block) + else + name = args.shift + @aggregations.update name => args.shift + end self end diff --git a/test/unit/search_base_aggregation_component_test.rb b/test/unit/search_base_aggregation_component_test.rb index f24e485..8748c5d 100644 --- a/test/unit/search_base_aggregation_component_test.rb +++ b/test/unit/search_base_aggregation_component_test.rb @@ -52,6 +52,20 @@ class ::Elasticsearch::DSL::Search::Aggregations::Dummy assert_equal 'foo', subject.to_hash[:aggregations][:inner][:dummy][:field] end + + should "add a nested aggregation instance" do + nested = Elasticsearch::DSL::Search::Aggregation.new do + dummy field: 'foo' + end + subject.aggregation :inner, nested + + assert !subject.aggregations.empty?, "#{subject.aggregations.inspect} is empty" + + assert_instance_of Elasticsearch::DSL::Search::Aggregation, subject.aggregations[:inner] + assert_equal({ dummy: { field: 'foo' } }, subject.aggregations[:inner].to_hash) + + assert_equal 'foo', subject.to_hash[:aggregations][:inner][:dummy][:field] + end end end end