From 415549cc5e7376cffd54127c894de71039c91772 Mon Sep 17 00:00:00 2001 From: Adam Jahn Date: Tue, 16 Mar 2021 22:08:48 -0400 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/elasticsearch-dsl/lib/elasticsearch/dsl/search/base_aggregation_component.rb b/elasticsearch-dsl/lib/elasticsearch/dsl/search/base_aggregation_component.rb index 82553c489f..faf7136180 100644 --- a/elasticsearch-dsl/lib/elasticsearch/dsl/search/base_aggregation_component.rb +++ b/elasticsearch-dsl/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/elasticsearch-dsl/test/unit/search_base_aggregation_component_test.rb b/elasticsearch-dsl/test/unit/search_base_aggregation_component_test.rb index f24e485e7c..8748c5d7cd 100644 --- a/elasticsearch-dsl/test/unit/search_base_aggregation_component_test.rb +++ b/elasticsearch-dsl/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