Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/Nest/DSL/Filter/FilterDescriptor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -660,12 +660,13 @@ public FilterContainer MatchAll()
/// Filters documents with fields that have terms within a certain range.
/// Similar to range query, except that it acts as a filter.
/// </summary>
public FilterContainer Range(Action<RangeFilterDescriptor<T>> rangeSelector)
public FilterContainer Range(Action<RangeFilterDescriptor<T>> rangeSelector, RangeExecution? execution = null)
{
var filter = new RangeFilterDescriptor<T>();
if (rangeSelector != null)
rangeSelector(filter);

filter.Execution(execution);

return this.New(filter, f=>f.Range = filter);
}
/// <summary>
Expand Down
2 changes: 1 addition & 1 deletion src/Nest/DSL/Filter/IFilterContainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public interface IFilterContainer
IHasParentFilter HasParent { get; set; }

[JsonProperty(PropertyName = "range")]
[JsonConverter(typeof(FieldNameFilterConverter<RangeFilter>))]
[JsonConverter(typeof(RangeFilterJsonConverter))]
IRangeFilter Range { get; set; }

[JsonProperty(PropertyName = "prefix")]
Expand Down
16 changes: 15 additions & 1 deletion src/Nest/DSL/Filter/RangeFilterDescriptor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
using System.Globalization;
using System.Linq;
using Nest.Resolvers.Converters;
using Nest.Resolvers.Converters.Filters;
using Newtonsoft.Json;
using System.Linq.Expressions;

namespace Nest
{
[JsonConverter(typeof(RangeFilterJsonConverter))]
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public interface IRangeFilter : IFieldNameFilter
{
Expand All @@ -29,6 +31,9 @@ public interface IRangeFilter : IFieldNameFilter

[JsonProperty("time_zone")]
string TimeZone { get; set; }

[JsonProperty("execution")]
RangeExecution? Execution { get; set; }
}

public class RangeFilter : PlainFilter, IRangeFilter
Expand All @@ -42,6 +47,7 @@ protected internal override void WrapInContainer(IFilterContainer container)
public string GreaterThan { get; set; }
public string LowerThan { get; set; }
public string TimeZone { get; set; }
public RangeExecution? Execution { get; set; }
public PropertyPathMarker Field { get; set; }
}

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

string IRangeFilter.TimeZone { get; set; }

RangeExecution? IRangeFilter.Execution { get; set; }

PropertyPathMarker IFieldNameFilter.Field { get; set; }

private IRangeFilter Self { get { return this; } }
Expand All @@ -73,7 +81,7 @@ bool IFilter.IsConditionless
);
}
}

public RangeFilterDescriptor<T> OnField(string field)
{
this.Self.Field = field;
Expand Down Expand Up @@ -193,5 +201,11 @@ public RangeFilterDescriptor<T> TimeZone(string timeZone)
this.Self.TimeZone = timeZone;
return this;
}

public RangeFilterDescriptor<T> Execution(RangeExecution? execution)
{
this.Self.Execution = execution;
return this;
}
}
}
4 changes: 2 additions & 2 deletions src/Nest/Domain/DSL/Filter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -135,9 +135,9 @@ public static FilterContainer Query(Func<QueryDescriptor<T>, QueryContainer> que
{
return new FilterDescriptor<T>().Query(querySelector);
}
public static FilterContainer Range(Action<RangeFilterDescriptor<T>> rangeSelector)
public static FilterContainer Range(Action<RangeFilterDescriptor<T>> rangeSelector, RangeExecution? execution = null)
{
return new FilterDescriptor<T>().Range(rangeSelector);
return new FilterDescriptor<T>().Range(rangeSelector, execution);
}
public static FilterContainer Script(Action<ScriptFilterDescriptor> scriptSelector)
{
Expand Down
15 changes: 15 additions & 0 deletions src/Nest/Enums/RangeExecution.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.Runtime.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

namespace Nest
{
[JsonConverter(typeof(StringEnumConverter))]
public enum RangeExecution
{
[EnumMember(Value = "index")]
Index,
[EnumMember(Value = "fielddata")]
FieldData
}
}
3 changes: 2 additions & 1 deletion src/Nest/Nest.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,7 @@
<Compile Include="Enums\GeoShapeRelation.cs" />
<Compile Include="Enums\HighlighterType.cs" />
<Compile Include="Enums\NormsLoading.cs" />
<Compile Include="Enums\RangeExecution.cs" />
<Compile Include="Enums\RoutingAllocationEnableOption.cs" />
<Compile Include="Enums\ScriptLang.cs" />
<Compile Include="Exception\RestoreException.cs" />
Expand Down Expand Up @@ -864,7 +865,7 @@
<Compile Include="Resolvers\Converters\Queries\GeoShapeQueryJsonReader.cs" />
<Compile Include="Resolvers\Converters\SimilarityCollectionConverter.cs" />
<Compile Include="Resolvers\Converters\FuzzinessConverter.cs" />
<Compile Include="Resolvers\Converters\Filters\RangeFilterJsonReader.cs" />
<Compile Include="Resolvers\Converters\Filters\RangeFilterJsonConverter.cs" />
<Compile Include="Resolvers\Converters\Filters\RegexpFilterJsonReader.cs" />
<Compile Include="Resolvers\Converters\Filters\PrefixFilterConverter.cs" />
<Compile Include="Resolvers\Converters\Filters\TermFilterConverter.cs" />
Expand Down
132 changes: 132 additions & 0 deletions src/Nest/Resolvers/Converters/Filters/RangeFilterJsonConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace Nest.Resolvers.Converters.Filters
{
public class RangeFilterJsonConverter : JsonConverter
{
public override bool CanRead { get { return true; } }
public override bool CanWrite { get { return true; } }

public override bool CanConvert(Type objectType)
{
return true; //only to be used with attribute or contract registration.
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var f = value as IRangeFilter;
if (f == null || (f.IsConditionless && !f.IsVerbatim)) return;

var contract = serializer.ContractResolver as SettingsContractResolver;
if (contract == null)
return;

var field = contract.Infer.PropertyPath(f.Field);
if (field.IsNullOrEmpty())
return;

writer.WriteStartObject();
{
writer.WritePropertyName(field);
writer.WriteStartObject();
{
SerializeProperty(writer, serializer, "lt", f.LowerThan);
SerializeProperty(writer, serializer, "lte", f.LowerThanOrEqualTo);
SerializeProperty(writer, serializer, "gt", f.GreaterThan);
SerializeProperty(writer, serializer, "gte", f.GreaterThanOrEqualTo);
SerializeProperty(writer, serializer, "time_zone", f.TimeZone);
}
writer.WriteEndObject();

if (f.Execution.HasValue)
{
writer.WritePropertyName("execution");
serializer.Serialize(writer, f.Execution.Value);
}
WriteProperty(writer, "_cache", f.Cache);
WriteProperty(writer, "_cache_key", f.CacheKey);
WriteProperty(writer, "_name", f.FilterName);
}
writer.WriteEndObject();
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var j = JObject.Load(reader);
if (j == null || !j.HasValues)
return null;
IRangeFilter filter = new RangeFilterDescriptor<object>();
foreach (var jv in j)
{
switch (jv.Key)
{
case "execution":
var execution = jv.Value.Value<string>();
if(!string.IsNullOrEmpty(execution)) filter.Execution = execution.ToEnum<RangeExecution>();
break;
case "_cache":
filter.Cache = jv.Value.Value<bool>();
break;
case "_cache_key":
filter.CacheKey = jv.Value.Value<string>();
break;
case "_name":
filter.FilterName = jv.Value.Value<string>();
break;
default:
filter.Field = jv.Key;

var gte = jv.Value["gte"];
if (gte != null)
filter.GreaterThanOrEqualTo = ToString(gte);

var gt = jv.Value["gt"];
if (gt != null)
filter.GreaterThanOrEqualTo = ToString(gt);

var lte = jv.Value["lte"];
if (lte != null)
filter.LowerThanOrEqualTo = ToString(lte);

var lt = jv.Value["lt"];
if (lt != null)
filter.LowerThanOrEqualTo = ToString(lt);

break;
}
}

return filter;

}

private static void SerializeProperty(JsonWriter writer, JsonSerializer serializer, string field, object value)
{
if ((field.IsNullOrEmpty() || value == null))
return;
writer.WritePropertyName(field);
serializer.Serialize(writer, value);
}

private static void WriteProperty(JsonWriter writer, string field, object value)
{
if ((field.IsNullOrEmpty() || value == null))
return;
writer.WritePropertyName(field);
writer.WriteValue(value);
}

private static string ToString(JToken token)
{
if (token.Type == JTokenType.Date)
return token.Value<DateTime>().ToString("yyyy-MM-dd'T'HH:mm:ss.fff", CultureInfo.InvariantCulture);
return token.Value<string>();
}
}

}
76 changes: 0 additions & 76 deletions src/Nest/Resolvers/Converters/Filters/RangeFilterJsonReader.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ public void TestNotFiltered()

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

this.DoFilterTest(f => f.Range(range => range.OnField(e => e.Id).GreaterOrEquals(1), RangeExecution.FieldData), _LookFor, true);

this.DoFilterTest(f => f.Range(range => range.OnField(e => e.Name).LowerOrEquals(name), RangeExecution.Index), _LookFor, true);
}

/// <summary>
Expand Down
17 changes: 17 additions & 0 deletions src/Tests/Nest.Tests.Unit/QueryParsers/Filter/RangeFilterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,5 +78,22 @@ public void Range_Double_Deserializes(string cacheName, string cacheKey, bool ca
rangeFilter.LowerThanOrEqualTo.Should().Be("20.22");
}


[Test]
[TestCase("cacheName", "cacheKey", true)]
public void Range_Execution_Deserializes(string cacheName, string cacheKey, bool cache)
{
var rangeFilter = this.SerializeThenDeserialize(cacheName, cacheKey, cache,
f => f.Range,
f => f.Range(n => n
.OnField(p => p.LOC)
.GreaterOrEquals(20.1)
.LowerOrEquals(20.22), RangeExecution.FieldData)
);

rangeFilter.GreaterThanOrEqualTo.Should().Be("20.1");
rangeFilter.LowerThanOrEqualTo.Should().Be("20.22");
rangeFilter.Execution.Should().Be(RangeExecution.FieldData);
}
}
}
Loading