Skip to content

Commit a896887

Browse files
committed
Percentile ranks aggregation support
Closes #821
1 parent 5766d38 commit a896887

File tree

5 files changed

+79
-0
lines changed

5 files changed

+79
-0
lines changed

Diff for: src/Nest/DSL/Aggregations/AggregationDescriptor.cs

+18
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ public interface IAggregationContainer
7575
[JsonProperty("value_count")]
7676
IValueCountAggregator ValueCount { get; set; }
7777

78+
[JsonProperty("percentile_ranks")]
79+
IPercentileRanksAggregaor PercentileRanks { get; set; }
80+
7881
[JsonProperty("aggs")]
7982
[JsonConverter(typeof(DictionaryKeysAreNotPropertyNamesJsonConverter))]
8083
IDictionary<string, IAggregationContainer> Aggregations { get; set; }
@@ -98,6 +101,7 @@ public class AggregationContainer : IAggregationContainer
98101
private IRangeAggregator _range;
99102
private ITermsAggregator _terms;
100103
private ISignificantTermsAggregator _significantTerms;
104+
private IPercentileRanksAggregaor _percentileRanks;
101105
public IAverageAggregator Average { get; set; }
102106
public IValueCountAggregator ValueCount { get; set; }
103107
public IMaxAggregator Max { get; set; }
@@ -195,6 +199,12 @@ public ISignificantTermsAggregator SignificantTerms
195199
get { return _significantTerms; }
196200
set { _significantTerms = value; }
197201
}
202+
203+
public IPercentileRanksAggregaor PercentileRanks
204+
{
205+
get { return _percentileRanks; }
206+
set { _percentileRanks = value; }
207+
}
198208

199209
private void LiftAggregations(IBucketAggregator bucket)
200210
{
@@ -251,6 +261,8 @@ public class AggregationDescriptor<T> : IAggregationContainer
251261
IValueCountAggregator IAggregationContainer.ValueCount { get; set; }
252262

253263
ISignificantTermsAggregator IAggregationContainer.SignificantTerms { get; set; }
264+
265+
IPercentileRanksAggregaor IAggregationContainer.PercentileRanks { get;set; }
254266

255267
ITermsAggregator IAggregationContainer.Terms { get; set; }
256268

@@ -271,6 +283,12 @@ public AggregationDescriptor<T> Percentiles(string name,
271283
return _SetInnerAggregation(name, selector, (a, d) => a.Percentiles = d);
272284
}
273285

286+
public AggregationDescriptor<T> PercentileRanks(string name,
287+
Func<PercentileRanksAggregationDescriptor<T>, PercentileRanksAggregationDescriptor<T>> selector)
288+
{
289+
return _SetInnerAggregation(name, selector, (a, d) => a.PercentileRanks = d);
290+
}
291+
274292
public AggregationDescriptor<T> DateRange(string name,
275293
Func<DateRangeAggregationDescriptor<T>, DateRangeAggregationDescriptor<T>> selector)
276294
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using Nest.Resolvers.Converters;
2+
using Newtonsoft.Json;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Text;
7+
8+
namespace Nest
9+
{
10+
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
11+
[JsonConverter(typeof(ReadAsTypeConverter<CardinalityAggregator>))]
12+
public interface IPercentileRanksAggregaor : IMetricAggregator
13+
{
14+
[JsonProperty("values")]
15+
IEnumerable<double> Values { get; set; }
16+
}
17+
18+
public class PercentileRanksAggregation : MetricAggregator, IPercentileRanksAggregaor
19+
{
20+
public IEnumerable<double> Values { get; set; }
21+
}
22+
23+
public class PercentileRanksAggregationDescriptor<T>
24+
: MetricAggregationBaseDescriptor<PercentileRanksAggregationDescriptor<T>, T>, IPercentileRanksAggregaor
25+
where T : class
26+
{
27+
IPercentileRanksAggregaor Self { get { return this; } }
28+
IEnumerable<double> IPercentileRanksAggregaor.Values { get; set; }
29+
30+
public PercentileRanksAggregationDescriptor<T> Values(IEnumerable<double> values)
31+
{
32+
this.Self.Values = values;
33+
return this;
34+
}
35+
}
36+
}

Diff for: src/Nest/Domain/Aggregations/AggregationsHelper.cs

+6
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ public PercentilesMetric Percentiles(string key)
6969
{
7070
return this.TryGet<PercentilesMetric>(key);
7171
}
72+
73+
public PercentilesMetric PercentilesRank(string key)
74+
{
75+
return this.TryGet<PercentilesMetric>(key);
76+
}
77+
7278
public SingleBucket Global(string key)
7379
{
7480
return this.TryGet<SingleBucket>(key);

Diff for: src/Nest/Nest.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@
207207
<Compile Include="Domain\Stats\PercolateStats.cs" />
208208
<Compile Include="Domain\Stats\PluginStats.cs" />
209209
<Compile Include="Domain\Stats\SegmentsStats.cs" />
210+
<Compile Include="DSL\Aggregations\PercentileRanksAggregationDescriptor.cs" />
210211
<Compile Include="DSL\CatIndicesDescriptor.cs" />
211212
<Compile Include="DSL\CatShardsDescriptor.cs" />
212213
<Compile Include="DSL\CatThreadPoolDescriptor.cs" />

Diff for: src/Tests/Nest.Tests.Integration/Aggregations/MetricAggregationTests.cs

+18
Original file line numberDiff line numberDiff line change
@@ -119,5 +119,23 @@ public void ValueCount()
119119
termBucket.Should().NotBeNull();
120120
termBucket.Value.Should().HaveValue();
121121
}
122+
123+
[Test]
124+
public void PercentilesRank()
125+
{
126+
var results = this.Client.Search<ElasticsearchProject>(s => s
127+
.Size(0)
128+
.Aggregations(a => a
129+
.PercentileRanks("percentile_ranks_agg", pr => pr
130+
.Field(p => p.LongValue)
131+
.Values(new double [] { 15, 30 })
132+
)
133+
)
134+
);
135+
results.IsValid.Should().BeTrue();
136+
var percentiles = results.Aggs.PercentilesRank("percentile_ranks_agg");
137+
percentiles.Should().NotBeNull();
138+
percentiles.Items.Count.Should().BeGreaterThan(0);
139+
}
122140
}
123141
}

0 commit comments

Comments
 (0)