From 8b0deb1361ba8859e7ffe4a781f307bde0b1417a Mon Sep 17 00:00:00 2001 From: Stuart Cam Date: Thu, 8 Aug 2019 14:45:39 +1000 Subject: [PATCH] Add numeric_type sorting option. (#3998) For numeric fields it is also possible to cast the values from one type to another using this option. This can be useful for cross-index search if the sort field is mapped differently on some indices. (cherry picked from commit 98a9427d4cb29b789d7af0084eb8846d22022883) --- src/Nest/Search/Search/Sort/NumericType.cs | 25 ++++++++++++++ src/Nest/Search/Search/Sort/SortBase.cs | 13 +++++++ .../Tests/Search/Request/SortUsageTests.cs | 34 +++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 src/Nest/Search/Search/Sort/NumericType.cs diff --git a/src/Nest/Search/Search/Sort/NumericType.cs b/src/Nest/Search/Search/Sort/NumericType.cs new file mode 100644 index 00000000000..ff4af74e338 --- /dev/null +++ b/src/Nest/Search/Search/Sort/NumericType.cs @@ -0,0 +1,25 @@ +using System.Runtime.Serialization; +using Elasticsearch.Net; + +namespace Nest +{ + /// + /// For numeric fields it is also possible to cast the values from one type to another using this option. This can be useful for cross-index + /// search if the sort field is mapped differently on some indices. + /// + [StringEnum] + public enum NumericType + { + [EnumMember(Value = "long")] + Long, + + [EnumMember(Value = "double")] + Double, + + [EnumMember(Value = "date")] + Date, + + [EnumMember(Value = "date_nanos")] + DateNanos + } +} diff --git a/src/Nest/Search/Search/Sort/SortBase.cs b/src/Nest/Search/Search/Sort/SortBase.cs index c41a749e0ba..78b464ca2a7 100644 --- a/src/Nest/Search/Search/Sort/SortBase.cs +++ b/src/Nest/Search/Search/Sort/SortBase.cs @@ -22,6 +22,12 @@ public interface ISort [DataMember(Name ="mode")] SortMode? Mode { get; set; } + /// + /// Set a single resolution for the sort + /// + [DataMember(Name ="numeric_type")] + NumericType? NumericType { get; set; } + /// /// Specifies the path and filter to apply when sorting on a nested field /// @@ -49,6 +55,9 @@ public abstract class SortBase : ISort /// public SortMode? Mode { get; set; } + /// + public NumericType? NumericType { get; set; } + /// public INestedSort Nested { get; set; } @@ -76,6 +85,7 @@ public abstract class SortDescriptorBase : Descripto object ISort.Missing { get; set; } SortMode? ISort.Mode { get; set; } + NumericType? ISort.NumericType { get; set; } INestedSort ISort.Nested { get; set; } SortOrder? ISort.Order { get; set; } Field ISort.SortKey => SortKey; @@ -93,6 +103,9 @@ public abstract class SortDescriptorBase : Descripto /// public virtual TDescriptor Order(SortOrder? order) => Assign(order, (a, v) => a.Order = v); + /// + public virtual TDescriptor NumericType(NumericType? numericType) => Assign(numericType, (a, v) => a.NumericType = v); + /// public virtual TDescriptor Mode(SortMode? mode) => Assign(mode, (a, v) => a.Mode = v); diff --git a/src/Tests/Tests/Search/Request/SortUsageTests.cs b/src/Tests/Tests/Search/Request/SortUsageTests.cs index 1cb6ed0c219..2f391683a99 100644 --- a/src/Tests/Tests/Search/Request/SortUsageTests.cs +++ b/src/Tests/Tests/Search/Request/SortUsageTests.cs @@ -331,4 +331,38 @@ public GeoDistanceIgnoreUnmappedUsageTests(ReadOnlyCluster cluster, EndpointUsag } }; } + + //hide + [SkipVersion("<7.2.0", "numeric_type added in 7.2.0")] + public class NumericTypeUsageTests : SearchUsageTestBase + { + public NumericTypeUsageTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(cluster, usage) { } + + protected override object ExpectJson => + new + { + sort = new object[] + { + new { startedOn = new { numeric_type = "date", order = "asc" } } + } + }; + + protected override Func, ISearchRequest> Fluent => s => s + .Sort(ss => ss + .Field(g => g + .Field(p => p.StartedOn) + .NumericType(NumericType.Date) + .Ascending() + ) + ); + + protected override SearchRequest Initializer => + new SearchRequest + { + Sort = new List + { + new FieldSort { Field = "startedOn", NumericType = NumericType.Date, Order = SortOrder.Ascending }, + } + }; + } }