Skip to content

Commit 0c425c2

Browse files
committed
Feature/7.x/cumulative cardinality agg (#4147)
* Add Cumulative Cardinality agg (and Data Science plugin) Addresses elastic/elasticsearch#43661 * skipversion on cumulative cardinality api tests
1 parent 2638c1e commit 0c425c2

File tree

9 files changed

+137
-1
lines changed

9 files changed

+137
-1
lines changed

src/Nest/Aggregations/AggregateDictionary.cs

+2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ internal static string[] TypedKeyTokens(string key)
5555

5656
public ValueAggregate CumulativeSum(string key) => TryGet<ValueAggregate>(key);
5757

58+
public ValueAggregate CumulativeCardinality(string key) => TryGet<ValueAggregate>(key);
59+
5860
public ValueAggregate BucketScript(string key) => TryGet<ValueAggregate>(key);
5961

6062
public ValueAggregate SerialDifferencing(string key) => TryGet<ValueAggregate>(key);

src/Nest/Aggregations/AggregationContainer.cs

+13
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ public interface IAggregationContainer
113113
[DataMember(Name = "cumulative_sum")]
114114
ICumulativeSumAggregation CumulativeSum { get; set; }
115115

116+
[DataMember(Name = "cumulative_cardinality")]
117+
ICumulativeCardinalityAggregation CumulativeCardinality { get; set; }
118+
116119
[DataMember(Name = "date_histogram")]
117120
IDateHistogramAggregation DateHistogram { get; set; }
118121

@@ -282,6 +285,8 @@ public class AggregationContainer : IAggregationContainer
282285

283286
public ICumulativeSumAggregation CumulativeSum { get; set; }
284287

288+
public ICumulativeCardinalityAggregation CumulativeCardinality { get; set; }
289+
285290
public IDateHistogramAggregation DateHistogram { get; set; }
286291

287292
public IAutoDateHistogramAggregation AutoDateHistogram { get; set; }
@@ -358,6 +363,7 @@ public class AggregationContainer : IAggregationContainer
358363
public IStatsAggregation Stats { get; set; }
359364

360365
public IStatsBucketAggregation StatsBucket { get; set; }
366+
361367
public ISumAggregation Sum { get; set; }
362368

363369
public ISumBucketAggregation SumBucket { get; set; }
@@ -425,6 +431,8 @@ public class AggregationContainerDescriptor<T> : DescriptorBase<AggregationConta
425431

426432
ICumulativeSumAggregation IAggregationContainer.CumulativeSum { get; set; }
427433

434+
ICumulativeCardinalityAggregation IAggregationContainer.CumulativeCardinality { get; set; }
435+
428436
IDateHistogramAggregation IAggregationContainer.DateHistogram { get; set; }
429437

430438
IAutoDateHistogramAggregation IAggregationContainer.AutoDateHistogram { get; set; }
@@ -750,6 +758,11 @@ Func<CumulativeSumAggregationDescriptor, ICumulativeSumAggregation> selector
750758
) =>
751759
_SetInnerAggregation(name, selector, (a, d) => a.CumulativeSum = d);
752760

761+
public AggregationContainerDescriptor<T> CumulativeCardinality(string name,
762+
Func<CumulativeCardinalityAggregationDescriptor, ICumulativeCardinalityAggregation> selector
763+
) =>
764+
_SetInnerAggregation(name, selector, (a, d) => a.CumulativeCardinality = d);
765+
753766
public AggregationContainerDescriptor<T> SerialDifferencing(string name,
754767
Func<SerialDifferencingAggregationDescriptor, ISerialDifferencingAggregation> selector
755768
) =>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using Elasticsearch.Net.Utf8Json;
2+
3+
namespace Nest
4+
{
5+
[InterfaceDataContract]
6+
[ReadAs(typeof(CumulativeCardinalityAggregation))]
7+
public interface ICumulativeCardinalityAggregation : IPipelineAggregation { }
8+
9+
public class CumulativeCardinalityAggregation
10+
: PipelineAggregationBase, ICumulativeCardinalityAggregation
11+
{
12+
internal CumulativeCardinalityAggregation() { }
13+
14+
public CumulativeCardinalityAggregation(string name, SingleBucketsPath bucketsPath)
15+
: base(name, bucketsPath) { }
16+
17+
internal override void WrapInContainer(AggregationContainer c) => c.CumulativeCardinality = this;
18+
}
19+
20+
public class CumulativeCardinalityAggregationDescriptor
21+
: PipelineAggregationDescriptorBase<CumulativeCardinalityAggregationDescriptor, ICumulativeCardinalityAggregation, SingleBucketsPath>
22+
, ICumulativeCardinalityAggregation { }
23+
}

src/Nest/Aggregations/Visitor/AggregationVisitor.cs

+4
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ public interface IAggregationVisitor
110110

111111
void Visit(ICumulativeSumAggregation aggregation);
112112

113+
void Visit(ICumulativeCardinalityAggregation aggregation);
114+
113115
void Visit(ISerialDifferencingAggregation aggregation);
114116

115117
void Visit(IBucketScriptAggregation aggregation);
@@ -179,6 +181,8 @@ public virtual void Visit(IPercentilesBucketAggregation aggregation) { }
179181

180182
public virtual void Visit(ICumulativeSumAggregation aggregation) { }
181183

184+
public virtual void Visit(ICumulativeCardinalityAggregation aggregation) { }
185+
182186
public virtual void Visit(IBucketScriptAggregation aggregation) { }
183187

184188
public virtual void Visit(ISamplerAggregation aggregation) { }

src/Nest/Aggregations/Visitor/AggregationWalker.cs

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public void Walk(IAggregationContainer aggregation, IAggregationVisitor visitor)
4848
Accept(v, d.Aggregations);
4949
});
5050
AcceptAggregation(aggregation.CumulativeSum, visitor, (v, d) => v.Visit(d));
51+
AcceptAggregation(aggregation.CumulativeCardinality, visitor, (v, d) => v.Visit(d));
5152
AcceptAggregation(aggregation.DateHistogram, visitor, (v, d) =>
5253
{
5354
v.Visit(d);

src/Nest/XPack/Info/XPackInfo/XPackInfoResponse.cs

+3
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ public class XPackFeatures
5353
[DataMember(Name = "flattened")]
5454
public XPackFeature Flattened { get; internal set; }
5555

56+
[DataMember(Name = "data_science")]
57+
public XPackFeature DataScience { get; internal set; }
58+
5659
[DataMember(Name = "graph")]
5760
public XPackFeature Graph { get; internal set; }
5861

src/Nest/XPack/Info/XPackUsage/XPackUsageResponse.cs

+3
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ public class XPackUsageResponse : ResponseBase
5151
[DataMember(Name = "flattened")]
5252
public XPackUsage Flattened { get; internal set; }
5353

54+
[DataMember(Name = "data_science")]
55+
public XPackUsage DataScience { get; internal set; }
56+
5457
[DataMember(Name = "ilm")]
5558
public IlmUsage IndexLifecycleManagement { get; internal set; }
5659

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
using System;
2+
using Elastic.Xunit.XunitPlumbing;
3+
using FluentAssertions;
4+
using Nest;
5+
using Tests.Core.Extensions;
6+
using Tests.Core.ManagedElasticsearch.Clusters;
7+
using Tests.Domain;
8+
using Tests.Framework.EndpointTests.TestState;
9+
10+
namespace Tests.Aggregations.Pipeline.CumulativeCardinality
11+
{
12+
[SkipVersion("<7.4.0", "Introduced in 7.4")]
13+
public class CumulativeCardinalityAggregationUsageTests : AggregationUsageTestBase
14+
{
15+
public CumulativeCardinalityAggregationUsageTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(cluster, usage) { }
16+
17+
protected override object AggregationJson => new
18+
{
19+
projects_started_per_month = new
20+
{
21+
date_histogram = new
22+
{
23+
field = "startedOn",
24+
calendar_interval = "month",
25+
},
26+
aggs = new
27+
{
28+
commits = new
29+
{
30+
cardinality = new
31+
{
32+
field = "numberOfCommits"
33+
}
34+
},
35+
cumulative_commits = new
36+
{
37+
cumulative_cardinality = new
38+
{
39+
buckets_path = "commits"
40+
}
41+
}
42+
}
43+
}
44+
};
45+
46+
protected override Func<AggregationContainerDescriptor<Project>, IAggregationContainer> FluentAggs => a => a
47+
.DateHistogram("projects_started_per_month", dh => dh
48+
.Field(p => p.StartedOn)
49+
.CalendarInterval(DateInterval.Month)
50+
.Aggregations(aa => aa
51+
.Cardinality("commits", sm => sm
52+
.Field(p => p.NumberOfCommits)
53+
)
54+
.CumulativeCardinality("cumulative_commits", d => d
55+
.BucketsPath("commits")
56+
)
57+
)
58+
);
59+
60+
protected override AggregationDictionary InitializerAggs =>
61+
new DateHistogramAggregation("projects_started_per_month")
62+
{
63+
Field = "startedOn",
64+
CalendarInterval = DateInterval.Month,
65+
Aggregations =
66+
new CardinalityAggregation("commits", "numberOfCommits") &&
67+
new CumulativeCardinalityAggregation("cumulative_commits", "commits")
68+
};
69+
70+
protected override void ExpectResponse(ISearchResponse<Project> response)
71+
{
72+
response.ShouldBeValid();
73+
74+
var projectsPerMonth = response.Aggregations.DateHistogram("projects_started_per_month");
75+
projectsPerMonth.Should().NotBeNull();
76+
projectsPerMonth.Buckets.Should().NotBeNull();
77+
projectsPerMonth.Buckets.Count.Should().BeGreaterThan(0);
78+
79+
foreach (var item in projectsPerMonth.Buckets)
80+
{
81+
var commitsDerivative = item.CumulativeCardinality("cumulative_commits");
82+
commitsDerivative.Should().NotBeNull();
83+
commitsDerivative.Value.Should().NotBe(null);
84+
}
85+
}
86+
}
87+
}

src/Tests/Tests/Aggregations/Pipeline/CumulativeSum/CumulativeSumAggregationUsageTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ protected override void ExpectResponse(ISearchResponse<Project> response)
7878

7979
foreach (var item in projectsPerMonth.Buckets)
8080
{
81-
var commitsDerivative = item.Derivative("cumulative_commits");
81+
var commitsDerivative = item.CumulativeSum("cumulative_commits");
8282
commitsDerivative.Should().NotBeNull();
8383
commitsDerivative.Value.Should().NotBe(null);
8484
}

0 commit comments

Comments
 (0)