diff --git a/src/Nest/Aggregations/Bucket/Composite/CompositeAggregationSource.cs b/src/Nest/Aggregations/Bucket/Composite/CompositeAggregationSource.cs index 55aec5cd0a5..a5d98777adb 100644 --- a/src/Nest/Aggregations/Bucket/Composite/CompositeAggregationSource.cs +++ b/src/Nest/Aggregations/Bucket/Composite/CompositeAggregationSource.cs @@ -98,6 +98,12 @@ public CompositeAggregationSourcesDescriptor DateHistogram(string name, Func, IDateHistogramCompositeAggregationSource> selector ) => Assign(selector?.Invoke(new DateHistogramCompositeAggregationSourceDescriptor(name)), (a, v) => a.Add(v)); + + /// + public CompositeAggregationSourcesDescriptor GeoTileGrid(string name, + Func, IGeoTileGridCompositeAggregationSource> selector + ) => + Assign(selector?.Invoke(new GeoTileGridCompositeAggregationSourceDescriptor(name)), (a, v) => a.Add(v)); } /// @@ -154,6 +160,9 @@ public void Serialize(ref JsonWriter writer, ICompositeAggregationSource value, case IHistogramCompositeAggregationSource histogramCompositeAggregationSource: Serialize(ref writer, histogramCompositeAggregationSource, formatterResolver); break; + case IGeoTileGridCompositeAggregationSource geoTileGridCompositeAggregationSource: + Serialize(ref writer, geoTileGridCompositeAggregationSource, formatterResolver); + break; default: Serialize(ref writer, value, formatterResolver); break; @@ -176,6 +185,7 @@ IJsonFormatterResolver formatterResolver { "terms", 0 }, { "date_histogram", 1 }, { "histogram", 2 }, + { "geotile_grid", 3 }, }; public ICompositeAggregationSource Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver) @@ -208,6 +218,10 @@ public ICompositeAggregationSource Deserialize(ref JsonReader reader, IJsonForma compositeAggregationSource = formatterResolver.GetFormatter() .Deserialize(ref reader, formatterResolver); break; + case 3: + compositeAggregationSource = formatterResolver.GetFormatter() + .Deserialize(ref reader, formatterResolver); + break; } } else diff --git a/src/Nest/Aggregations/Bucket/Composite/GeoTileGridCompositeAggregationSource.cs b/src/Nest/Aggregations/Bucket/Composite/GeoTileGridCompositeAggregationSource.cs new file mode 100644 index 00000000000..194b520436e --- /dev/null +++ b/src/Nest/Aggregations/Bucket/Composite/GeoTileGridCompositeAggregationSource.cs @@ -0,0 +1,43 @@ +using System; +using System.Runtime.Serialization; + +namespace Nest +{ + /// + /// A values source that is equivalent to a simple Geo aggregation. + /// + public interface IGeoTileGridCompositeAggregationSource : ICompositeAggregationSource + { + /// + /// The zoom of the key used to define cells/buckets in the results. + /// + [DataMember(Name ="precision")] + GeoTilePrecision? Precision { get; set; } + } + + /// + public class GeoTileGridCompositeAggregationSource : CompositeAggregationSourceBase, IGeoTileGridCompositeAggregationSource + { + public GeoTileGridCompositeAggregationSource(string name) : base(name) { } + + /// + public GeoTilePrecision? Precision { get; set; } + + /// + protected override string SourceType => "geotile_grid"; + } + + /// + public class GeoTileGridCompositeAggregationSourceDescriptor + : CompositeAggregationSourceDescriptorBase, IGeoTileGridCompositeAggregationSource, T>, + IGeoTileGridCompositeAggregationSource + { + public GeoTileGridCompositeAggregationSourceDescriptor(string name) : base(name, "geotile_grid") { } + + GeoTilePrecision? IGeoTileGridCompositeAggregationSource.Precision { get; set; } + + /// + public GeoTileGridCompositeAggregationSourceDescriptor Precision(GeoTilePrecision? precision) => + Assign(precision, (a, v) => a.Precision = v); + } +} diff --git a/src/Tests/Tests/Aggregations/Bucket/Composite/CompositeAggregationUsageTests.cs b/src/Tests/Tests/Aggregations/Bucket/Composite/CompositeAggregationUsageTests.cs index fce94c916ec..7610deafa7e 100644 --- a/src/Tests/Tests/Aggregations/Bucket/Composite/CompositeAggregationUsageTests.cs +++ b/src/Tests/Tests/Aggregations/Bucket/Composite/CompositeAggregationUsageTests.cs @@ -28,7 +28,7 @@ namespace Tests.Aggregations.Bucket.Composite * * Be sure to read the Elasticsearch documentation on {ref_current}/search-aggregations-bucket-composite-aggregation.html[Composite Aggregation]. */ - [SkipVersion("<6.1.0", "Composite Aggregation is only available in Elasticsearch 6.1.0+")] + [SkipVersion("<7.5.0", "Geo tile grid composite agg added in 7.5.0, rest available in 6.1.0+")] public class CompositeAggregationUsageTests : ProjectsOnlyAggregationUsageTestBase { public CompositeAggregationUsageTests(ReadOnlyCluster i, EndpointUsage usage) : base(i, usage) { } @@ -73,6 +73,17 @@ public CompositeAggregationUsageTests(ReadOnlyCluster i, EndpointUsage usage) : } } }, + new + { + geo = new + { + geotile_grid = new + { + field = "locationPoint", + precision = 12 + } + } + }, } }, aggs = new @@ -109,6 +120,10 @@ public CompositeAggregationUsageTests(ReadOnlyCluster i, EndpointUsage usage) : .Field(f => f.RequiredBranches) .Interval(1) ) + .GeoTileGrid("geo", h => h + .Field(f => f.LocationPoint) + .Precision(GeoTilePrecision.Precision12) + ) ) .Aggregations(childAggs => childAggs .Nested("project_tags", n => n @@ -138,6 +153,11 @@ public CompositeAggregationUsageTests(ReadOnlyCluster i, EndpointUsage usage) : { Field = Field(f => f.RequiredBranches), Interval = 1 + }, + new GeoTileGridCompositeAggregationSource("geo") + { + Field = Field(f => f.LocationPoint), + Precision = GeoTilePrecision.Precision12 } }, Aggregations = new NestedAggregation("project_tags") @@ -164,8 +184,8 @@ protected override void ExpectResponse(ISearchResponse response) composite.AfterKey.Should().NotBeNull(); if (TestConfiguration.Instance.InRange(">=6.3.0")) composite.AfterKey.Should() - .HaveCount(3) - .And.ContainKeys("branches", "started", "branch_count"); + .HaveCount(4) + .And.ContainKeys("branches", "started", "branch_count", "geo"); foreach (var item in composite.Buckets) { var key = item.Key;