Skip to content

Commit ec109a8

Browse files
committed
Add Cumulative Cardinality agg (and Data Science plugin)
Addresses elastic/elasticsearch#43661
1 parent 91a3ba9 commit ec109a8

File tree

9 files changed

+135
-1
lines changed

9 files changed

+135
-1
lines changed

src/Nest/Aggregations/AggregateDictionary.cs

Lines changed: 2 additions & 0 deletions
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

Lines changed: 13 additions & 0 deletions
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
) =>
Lines changed: 23 additions & 0 deletions
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

Lines changed: 4 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 3 additions & 0 deletions
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

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

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

Lines changed: 1 addition & 1 deletion
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)