Skip to content

Commit d746480

Browse files
committed
Adding collect_mode to terms aggretation descriptor
1 parent cf2807b commit d746480

File tree

4 files changed

+88
-0
lines changed

4 files changed

+88
-0
lines changed

src/Nest/DSL/Aggregations/TermsAggregationDescriptor.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ public interface ITermsAggregator : IBucketAggregator
3939

4040
[JsonProperty("params")]
4141
IDictionary<string, object> Params { get; set; }
42+
43+
[JsonProperty("collect_mode")]
44+
TermsAggregationCollectMode? CollectMode { get; set; }
4245
}
4346

4447
public class TermsAggregator : BucketAggregator, ITermsAggregator
@@ -53,6 +56,7 @@ public class TermsAggregator : BucketAggregator, ITermsAggregator
5356
public TermsIncludeExclude Include { get; set; }
5457
public TermsIncludeExclude Exclude { get; set; }
5558
public IDictionary<string, object> Params { get; set; }
59+
public TermsAggregationCollectMode? CollectMode { get; set; }
5660
}
5761

5862

@@ -80,6 +84,8 @@ public class TermsAggregationDescriptor<T> : BucketAggregationBaseDescriptor<Ter
8084

8185
IDictionary<string, object> ITermsAggregator.Params { get; set; }
8286

87+
TermsAggregationCollectMode? ITermsAggregator.CollectMode { get; set; }
88+
8389
public TermsAggregationDescriptor<T> Field(string field)
8490
{
8591
Self.Field = field;
@@ -152,5 +158,10 @@ public TermsAggregationDescriptor<T> Exclude(string excludePattern, string regex
152158
Self.Exclude = new TermsIncludeExclude() { Pattern = excludePattern, Flags = regexFlags };
153159
return this;
154160
}
161+
public TermsAggregationDescriptor<T> CollectMode(TermsAggregationCollectMode collectMode)
162+
{
163+
Self.CollectMode = collectMode;
164+
return this;
165+
}
155166
}
156167
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System.Runtime.Serialization;
2+
using Newtonsoft.Json;
3+
using Newtonsoft.Json.Converters;
4+
using System;
5+
6+
namespace Nest
7+
{
8+
/// <summary>
9+
/// Determines how the terms aggregation is executed
10+
/// </summary>
11+
[JsonConverter(typeof(StringEnumConverter))]
12+
public enum TermsAggregationCollectMode
13+
{
14+
/// <summary>
15+
/// Order by using field values directly in order to aggregate data per-bucket
16+
/// </summary>
17+
[EnumMember(Value = "depth_first")]
18+
DepthFirst,
19+
/// <summary>
20+
/// Order by using ordinals of the field values instead of the values themselves
21+
/// </summary>
22+
[EnumMember(Value = "breadth_first")]
23+
BreadthFirst
24+
}
25+
}

src/Nest/Nest.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,7 @@
398398
<Compile Include="Enums\RangeExecution.cs" />
399399
<Compile Include="Enums\RoutingAllocationEnableOption.cs" />
400400
<Compile Include="Enums\ScriptLang.cs" />
401+
<Compile Include="Enums\TermsAggregationCollectMode.cs" />
401402
<Compile Include="Exception\RestoreException.cs" />
402403
<Compile Include="Exception\SnapshotException.cs" />
403404
<Compile Include="ExposedInternals\NestSerializer.cs" />

src/Tests/Nest.Tests.Integration/Aggregations/TermsAggregationTests.cs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,5 +95,56 @@ public void NestedEmptyAggregationThreeLevelDeeps()
9595
}
9696
}
9797
}
98+
99+
[Test]
100+
public void NestedEmptyAggregationThreeLevelDeepsWithBFS()
101+
{
102+
var results = this.Client.Search<ElasticsearchProject>(s => s
103+
.Size(0)
104+
.Aggregations(a => a
105+
.Terms("countries", t => t
106+
.Field(p => p.Country)
107+
.CollectMode(TermsAggregationCollectMode.BreadthFirst)
108+
.Aggregations(aa => aa
109+
.Terms("noop", tt => tt.Field("noop"))
110+
.Terms("names", tt => tt
111+
.Field(p => p.Name)
112+
.Aggregations(aaa => aaa
113+
.Average("avg_loc", avg => avg.Field(p => p.LOC))
114+
)
115+
)
116+
)
117+
)
118+
)
119+
);
120+
results.IsValid.Should().BeTrue();
121+
var termBucket = results.Aggs.Terms("countries");
122+
termBucket.Should().NotBeNull();
123+
termBucket.Items.Should().NotBeEmpty()
124+
.And.OnlyContain(i => !i.Key.IsNullOrEmpty())
125+
.And.OnlyContain(i => i.DocCount > 0);
126+
127+
foreach (var term in termBucket.Items)
128+
{
129+
var country = term.Key;
130+
country.Should().NotBeNullOrWhiteSpace();
131+
132+
var noop = term.Terms("noop");
133+
noop.Should().NotBeNull();
134+
noop.Items.Should().BeEmpty();
135+
136+
var names = term.Terms("names");
137+
names.Should().NotBeNull();
138+
names.Items.Should().NotBeEmpty();
139+
140+
foreach (var nameTerm in names.Items)
141+
{
142+
var name = nameTerm.Key;
143+
var average = nameTerm.Average("avg_loc");
144+
average.Should().NotBeNull();
145+
average.Value.Should().HaveValue();
146+
}
147+
}
148+
}
98149
}
99150
}

0 commit comments

Comments
 (0)