Skip to content

Commit 2c84e00

Browse files
committed
Support for include/exclude as arrays on terms aggregation
Closes #1430
1 parent ea2c781 commit 2c84e00

File tree

8 files changed

+133
-25
lines changed

8 files changed

+133
-25
lines changed

src/Nest/DSL/Aggregations/TermsAggregationDescriptor.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using System.Linq.Expressions;
45
using Nest.Resolvers.Converters;
56
using Newtonsoft.Json;
@@ -152,12 +153,25 @@ public TermsAggregationDescriptor<T> Include(string includePattern, string regex
152153
Self.Include = new TermsIncludeExclude() { Pattern = includePattern, Flags = regexFlags };
153154
return this;
154155
}
156+
157+
public TermsAggregationDescriptor<T> Include(IEnumerable<string> values)
158+
{
159+
Self.Include = new TermsIncludeExclude { Values = values };
160+
return this;
161+
}
155162

156163
public TermsAggregationDescriptor<T> Exclude(string excludePattern, string regexFlags = null)
157164
{
158165
Self.Exclude = new TermsIncludeExclude() { Pattern = excludePattern, Flags = regexFlags };
159166
return this;
160167
}
168+
169+
public TermsAggregationDescriptor<T> Exclude(IEnumerable<string> values)
170+
{
171+
Self.Exclude = new TermsIncludeExclude { Values = values };
172+
return this;
173+
}
174+
161175
public TermsAggregationDescriptor<T> CollectMode(TermsAggregationCollectMode collectMode)
162176
{
163177
Self.CollectMode = collectMode;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
1+
using Nest.Resolvers.Converters;
12
using Newtonsoft.Json;
3+
using System.Collections.Generic;
24

35
namespace Nest
46
{
7+
[JsonConverter(typeof(TermsIncludeExcludeConverter))]
58
public class TermsIncludeExclude
69
{
710
[JsonProperty("pattern")]
811
public string Pattern { get; set; }
12+
913
[JsonProperty("flags")]
1014
public string Flags { get; set; }
15+
16+
[JsonIgnore]
17+
public IEnumerable<string> Values { get; set; }
1118
}
1219
}

src/Nest/Nest.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -993,6 +993,7 @@
993993
<Compile Include="Resolvers\Converters\DynamicMappingOptionConverter.cs" />
994994
<Compile Include="Resolvers\Converters\DictionaryKeysAreNotPropertyNamesJsonConverter.cs" />
995995
<Compile Include="Resolvers\Converters\IndexNameMarkerConverter.cs" />
996+
<Compile Include="Resolvers\Converters\TermsIncludeExcludeConverter.cs" />
996997
<Compile Include="Resolvers\Converters\TokenFilterCollectionConverter.cs" />
997998
<Compile Include="Resolvers\Converters\TokenizerCollectionConverter.cs" />
998999
<Compile Include="Resolvers\Converters\TypeNameMarkerConverter.cs" />
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using Newtonsoft.Json;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
7+
namespace Nest.Resolvers.Converters
8+
{
9+
public class TermsIncludeExcludeConverter : JsonConverter
10+
{
11+
public override bool CanConvert(Type objectType)
12+
{
13+
return (objectType == typeof(TermsIncludeExcludeConverter));
14+
}
15+
16+
public override bool CanRead { get { return false; } }
17+
18+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
19+
{
20+
throw new NotImplementedException();
21+
}
22+
23+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
24+
{
25+
var termsIncludeExclude = value as TermsIncludeExclude;
26+
27+
if (termsIncludeExclude.Values != null)
28+
{
29+
serializer.Serialize(writer, termsIncludeExclude.Values);
30+
}
31+
else
32+
{
33+
writer.WriteStartObject();
34+
writer.WritePropertyName("pattern");
35+
writer.WriteValue(termsIncludeExclude.Pattern);
36+
if (!termsIncludeExclude.Flags.IsNullOrEmpty())
37+
{
38+
writer.WritePropertyName("flags");
39+
writer.WriteValue(termsIncludeExclude.Flags);
40+
}
41+
writer.WriteEndObject();
42+
}
43+
}
44+
}
45+
}

src/Tests/Nest.Tests.Unit/Nest.Tests.Unit.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@
420420
<Compile Include="Reproduce\Reproduce926Tests.cs" />
421421
<Compile Include="Search\Aggregations\ScriptedMetricJson.cs" />
422422
<Compile Include="Search\Aggregations\SingleBucketAggregationTests.cs" />
423-
<Compile Include="Search\Aggregations\Terms\TermAggregationTests.cs" />
423+
<Compile Include="Search\Aggregations\Terms\TermsAggregationTests.cs" />
424424
<Compile Include="Search\Failures\ShardFailureTests.cs" />
425425
<Compile Include="Search\Fields\FieldsTests.cs" />
426426
<Compile Include="Search\Filter\Modes\ConditionlessFilterJson.cs" />
@@ -857,7 +857,7 @@
857857
<None Include="Reproduce\PatchedTermsAggSort.json">
858858
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
859859
</None>
860-
<None Include="Search\Aggregations\Terms\TermAggregationSerializes.json">
860+
<None Include="Search\Aggregations\Terms\TermsAggregationSerializes.json">
861861
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
862862
</None>
863863
<None Include="Search\Failures\ShardFailuresResult.json">

src/Tests/Nest.Tests.Unit/Search/Aggregations/Terms/TermAggregationTests.cs

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using System.Reflection;
2+
using Nest.Tests.MockData.Domain;
3+
using NUnit.Framework;
4+
5+
namespace Nest.Tests.Unit.Search.Aggregations.Terms
6+
{
7+
[TestFixture]
8+
public class TermsAggregationTests : BaseJsonTests
9+
{
10+
[Test]
11+
public void TermsAggregationSerializes()
12+
{
13+
var s = new TermsAggregationDescriptor<ElasticsearchProject>()
14+
.CollectMode(TermsAggregationCollectMode.BreadthFirst)
15+
.ExecutionHint(TermsAggregationExecutionHint.GlobalOrdinalsLowCardinality)
16+
.Field(p => p.Country)
17+
.MinimumDocumentCount(1)
18+
.OrderAscending("_count");
19+
20+
this.JsonEquals(s, MethodBase.GetCurrentMethod());
21+
}
22+
23+
[Test]
24+
public void TermsAggregation_IncludeExclude_Array_Serializes()
25+
{
26+
var s = new TermsAggregationDescriptor<ElasticsearchProject>()
27+
.Field(p => p.Name)
28+
.Include(new[] { "value1", "value2" })
29+
.Exclude(new[] { "value3" });
30+
31+
var expected = @"{
32+
field: ""name"",
33+
include: [ ""value1"", ""value2"" ],
34+
exclude: [ ""value3"" ]
35+
}";
36+
37+
var actual = TestElasticClient.Serialize(s);
38+
Assert.True(actual.JsonEquals(expected));
39+
}
40+
41+
[Test]
42+
public void TermsAggregation_IncludeExclude_Pattern_Serializes()
43+
{
44+
var s = new TermsAggregationDescriptor<ElasticsearchProject>()
45+
.Field(p => p.Name)
46+
.Include("elastic*", "CANON_EQ|CASE_INSENSITIVE")
47+
.Exclude("nest*");
48+
49+
var expected = @"{
50+
field: ""name"",
51+
include: {
52+
pattern: ""elastic*"",
53+
flags: ""CANON_EQ|CASE_INSENSITIVE""
54+
},
55+
exclude: {
56+
pattern: ""nest*""
57+
}
58+
}";
59+
60+
var actual = TestElasticClient.Serialize(s);
61+
Assert.True(actual.JsonEquals(expected));
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)