Skip to content

Commit 1e5b55b

Browse files
committed
Merge pull request #1243 from robertlyson/feature/RangeFilterExecution
Missing execution parameter in RangeFilter
2 parents 4073686 + f887be7 commit 1e5b55b

File tree

11 files changed

+250
-83
lines changed

11 files changed

+250
-83
lines changed

src/Nest/DSL/Filter/FilterDescriptor.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -660,12 +660,13 @@ public FilterContainer MatchAll()
660660
/// Filters documents with fields that have terms within a certain range.
661661
/// Similar to range query, except that it acts as a filter.
662662
/// </summary>
663-
public FilterContainer Range(Action<RangeFilterDescriptor<T>> rangeSelector)
663+
public FilterContainer Range(Action<RangeFilterDescriptor<T>> rangeSelector, RangeExecution? execution = null)
664664
{
665665
var filter = new RangeFilterDescriptor<T>();
666666
if (rangeSelector != null)
667667
rangeSelector(filter);
668-
668+
filter.Execution(execution);
669+
669670
return this.New(filter, f=>f.Range = filter);
670671
}
671672
/// <summary>

src/Nest/DSL/Filter/IFilterContainer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public interface IFilterContainer
8585
IHasParentFilter HasParent { get; set; }
8686

8787
[JsonProperty(PropertyName = "range")]
88-
[JsonConverter(typeof(FieldNameFilterConverter<RangeFilter>))]
88+
[JsonConverter(typeof(RangeFilterJsonConverter))]
8989
IRangeFilter Range { get; set; }
9090

9191
[JsonProperty(PropertyName = "prefix")]

src/Nest/DSL/Filter/RangeFilterDescriptor.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
using System.Globalization;
44
using System.Linq;
55
using Nest.Resolvers.Converters;
6+
using Nest.Resolvers.Converters.Filters;
67
using Newtonsoft.Json;
78
using System.Linq.Expressions;
89

910
namespace Nest
1011
{
12+
[JsonConverter(typeof(RangeFilterJsonConverter))]
1113
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
1214
public interface IRangeFilter : IFieldNameFilter
1315
{
@@ -29,6 +31,9 @@ public interface IRangeFilter : IFieldNameFilter
2931

3032
[JsonProperty("time_zone")]
3133
string TimeZone { get; set; }
34+
35+
[JsonProperty("execution")]
36+
RangeExecution? Execution { get; set; }
3237
}
3338

3439
public class RangeFilter : PlainFilter, IRangeFilter
@@ -42,6 +47,7 @@ protected internal override void WrapInContainer(IFilterContainer container)
4247
public string GreaterThan { get; set; }
4348
public string LowerThan { get; set; }
4449
public string TimeZone { get; set; }
50+
public RangeExecution? Execution { get; set; }
4551
public PropertyPathMarker Field { get; set; }
4652
}
4753

@@ -57,6 +63,8 @@ public class RangeFilterDescriptor<T> : FilterBase, IRangeFilter where T : class
5763

5864
string IRangeFilter.TimeZone { get; set; }
5965

66+
RangeExecution? IRangeFilter.Execution { get; set; }
67+
6068
PropertyPathMarker IFieldNameFilter.Field { get; set; }
6169

6270
private IRangeFilter Self { get { return this; } }
@@ -73,7 +81,7 @@ bool IFilter.IsConditionless
7381
);
7482
}
7583
}
76-
84+
7785
public RangeFilterDescriptor<T> OnField(string field)
7886
{
7987
this.Self.Field = field;
@@ -193,5 +201,11 @@ public RangeFilterDescriptor<T> TimeZone(string timeZone)
193201
this.Self.TimeZone = timeZone;
194202
return this;
195203
}
204+
205+
public RangeFilterDescriptor<T> Execution(RangeExecution? execution)
206+
{
207+
this.Self.Execution = execution;
208+
return this;
209+
}
196210
}
197211
}

src/Nest/Domain/DSL/Filter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,9 @@ public static FilterContainer Query(Func<QueryDescriptor<T>, QueryContainer> que
135135
{
136136
return new FilterDescriptor<T>().Query(querySelector);
137137
}
138-
public static FilterContainer Range(Action<RangeFilterDescriptor<T>> rangeSelector)
138+
public static FilterContainer Range(Action<RangeFilterDescriptor<T>> rangeSelector, RangeExecution? execution = null)
139139
{
140-
return new FilterDescriptor<T>().Range(rangeSelector);
140+
return new FilterDescriptor<T>().Range(rangeSelector, execution);
141141
}
142142
public static FilterContainer Script(Action<ScriptFilterDescriptor> scriptSelector)
143143
{

src/Nest/Enums/RangeExecution.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System.Runtime.Serialization;
2+
using Newtonsoft.Json;
3+
using Newtonsoft.Json.Converters;
4+
5+
namespace Nest
6+
{
7+
[JsonConverter(typeof(StringEnumConverter))]
8+
public enum RangeExecution
9+
{
10+
[EnumMember(Value = "index")]
11+
Index,
12+
[EnumMember(Value = "fielddata")]
13+
FieldData
14+
}
15+
}

src/Nest/Nest.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@
392392
<Compile Include="Enums\GeoShapeRelation.cs" />
393393
<Compile Include="Enums\HighlighterType.cs" />
394394
<Compile Include="Enums\NormsLoading.cs" />
395+
<Compile Include="Enums\RangeExecution.cs" />
395396
<Compile Include="Enums\RoutingAllocationEnableOption.cs" />
396397
<Compile Include="Enums\ScriptLang.cs" />
397398
<Compile Include="Exception\RestoreException.cs" />
@@ -864,7 +865,7 @@
864865
<Compile Include="Resolvers\Converters\Queries\GeoShapeQueryJsonReader.cs" />
865866
<Compile Include="Resolvers\Converters\SimilarityCollectionConverter.cs" />
866867
<Compile Include="Resolvers\Converters\FuzzinessConverter.cs" />
867-
<Compile Include="Resolvers\Converters\Filters\RangeFilterJsonReader.cs" />
868+
<Compile Include="Resolvers\Converters\Filters\RangeFilterJsonConverter.cs" />
868869
<Compile Include="Resolvers\Converters\Filters\RegexpFilterJsonReader.cs" />
869870
<Compile Include="Resolvers\Converters\Filters\PrefixFilterConverter.cs" />
870871
<Compile Include="Resolvers\Converters\Filters\TermFilterConverter.cs" />
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Globalization;
4+
using System.Linq;
5+
using Newtonsoft.Json;
6+
using Newtonsoft.Json.Linq;
7+
8+
namespace Nest.Resolvers.Converters.Filters
9+
{
10+
public class RangeFilterJsonConverter : JsonConverter
11+
{
12+
public override bool CanRead { get { return true; } }
13+
public override bool CanWrite { get { return true; } }
14+
15+
public override bool CanConvert(Type objectType)
16+
{
17+
return true; //only to be used with attribute or contract registration.
18+
}
19+
20+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
21+
{
22+
var f = value as IRangeFilter;
23+
if (f == null || (f.IsConditionless && !f.IsVerbatim)) return;
24+
25+
var contract = serializer.ContractResolver as SettingsContractResolver;
26+
if (contract == null)
27+
return;
28+
29+
var field = contract.Infer.PropertyPath(f.Field);
30+
if (field.IsNullOrEmpty())
31+
return;
32+
33+
writer.WriteStartObject();
34+
{
35+
writer.WritePropertyName(field);
36+
writer.WriteStartObject();
37+
{
38+
SerializeProperty(writer, serializer, "lt", f.LowerThan);
39+
SerializeProperty(writer, serializer, "lte", f.LowerThanOrEqualTo);
40+
SerializeProperty(writer, serializer, "gt", f.GreaterThan);
41+
SerializeProperty(writer, serializer, "gte", f.GreaterThanOrEqualTo);
42+
SerializeProperty(writer, serializer, "time_zone", f.TimeZone);
43+
}
44+
writer.WriteEndObject();
45+
46+
if (f.Execution.HasValue)
47+
{
48+
writer.WritePropertyName("execution");
49+
serializer.Serialize(writer, f.Execution.Value);
50+
}
51+
WriteProperty(writer, "_cache", f.Cache);
52+
WriteProperty(writer, "_cache_key", f.CacheKey);
53+
WriteProperty(writer, "_name", f.FilterName);
54+
}
55+
writer.WriteEndObject();
56+
}
57+
58+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
59+
{
60+
var j = JObject.Load(reader);
61+
if (j == null || !j.HasValues)
62+
return null;
63+
IRangeFilter filter = new RangeFilterDescriptor<object>();
64+
foreach (var jv in j)
65+
{
66+
switch (jv.Key)
67+
{
68+
case "execution":
69+
var execution = jv.Value.Value<string>();
70+
if(!string.IsNullOrEmpty(execution)) filter.Execution = execution.ToEnum<RangeExecution>();
71+
break;
72+
case "_cache":
73+
filter.Cache = jv.Value.Value<bool>();
74+
break;
75+
case "_cache_key":
76+
filter.CacheKey = jv.Value.Value<string>();
77+
break;
78+
case "_name":
79+
filter.FilterName = jv.Value.Value<string>();
80+
break;
81+
default:
82+
filter.Field = jv.Key;
83+
84+
var gte = jv.Value["gte"];
85+
if (gte != null)
86+
filter.GreaterThanOrEqualTo = ToString(gte);
87+
88+
var gt = jv.Value["gt"];
89+
if (gt != null)
90+
filter.GreaterThanOrEqualTo = ToString(gt);
91+
92+
var lte = jv.Value["lte"];
93+
if (lte != null)
94+
filter.LowerThanOrEqualTo = ToString(lte);
95+
96+
var lt = jv.Value["lt"];
97+
if (lt != null)
98+
filter.LowerThanOrEqualTo = ToString(lt);
99+
100+
break;
101+
}
102+
}
103+
104+
return filter;
105+
106+
}
107+
108+
private static void SerializeProperty(JsonWriter writer, JsonSerializer serializer, string field, object value)
109+
{
110+
if ((field.IsNullOrEmpty() || value == null))
111+
return;
112+
writer.WritePropertyName(field);
113+
serializer.Serialize(writer, value);
114+
}
115+
116+
private static void WriteProperty(JsonWriter writer, string field, object value)
117+
{
118+
if ((field.IsNullOrEmpty() || value == null))
119+
return;
120+
writer.WritePropertyName(field);
121+
writer.WriteValue(value);
122+
}
123+
124+
private static string ToString(JToken token)
125+
{
126+
if (token.Type == JTokenType.Date)
127+
return token.Value<DateTime>().ToString("yyyy-MM-dd'T'HH:mm:ss.fff", CultureInfo.InvariantCulture);
128+
return token.Value<string>();
129+
}
130+
}
131+
132+
}

src/Nest/Resolvers/Converters/Filters/RangeFilterJsonReader.cs

Lines changed: 0 additions & 76 deletions
This file was deleted.

src/Tests/Nest.Tests.Integration/Search/Filter/RangeFilterTests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ public void TestNotFiltered()
4444

4545
this.DoFilterTest(f => f.Range(range => range.OnField(e => e.Name).LowerOrEquals(name)), _LookFor, true);
4646

47+
this.DoFilterTest(f => f.Range(range => range.OnField(e => e.Id).GreaterOrEquals(1), RangeExecution.FieldData), _LookFor, true);
48+
49+
this.DoFilterTest(f => f.Range(range => range.OnField(e => e.Name).LowerOrEquals(name), RangeExecution.Index), _LookFor, true);
4750
}
4851

4952
/// <summary>

src/Tests/Nest.Tests.Unit/QueryParsers/Filter/RangeFilterTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,22 @@ public void Range_Double_Deserializes(string cacheName, string cacheKey, bool ca
7878
rangeFilter.LowerThanOrEqualTo.Should().Be("20.22");
7979
}
8080

81+
82+
[Test]
83+
[TestCase("cacheName", "cacheKey", true)]
84+
public void Range_Execution_Deserializes(string cacheName, string cacheKey, bool cache)
85+
{
86+
var rangeFilter = this.SerializeThenDeserialize(cacheName, cacheKey, cache,
87+
f => f.Range,
88+
f => f.Range(n => n
89+
.OnField(p => p.LOC)
90+
.GreaterOrEquals(20.1)
91+
.LowerOrEquals(20.22), RangeExecution.FieldData)
92+
);
93+
94+
rangeFilter.GreaterThanOrEqualTo.Should().Be("20.1");
95+
rangeFilter.LowerThanOrEqualTo.Should().Be("20.22");
96+
rangeFilter.Execution.Should().Be(RangeExecution.FieldData);
97+
}
8198
}
8299
}

0 commit comments

Comments
 (0)