From adaa0b21b2ad96ce3a488159d61b7fd53da7e27b Mon Sep 17 00:00:00 2001 From: Mike Goodfellow Date: Wed, 10 Jun 2015 11:48:55 +0100 Subject: [PATCH 1/2] ADDED: MultiSortExtensions to allow easy sorting across multiple fields --- .../MultiSortExtensions.cs | 48 +++++++++++++++++++ src/Nest/Nest.csproj | 1 + 2 files changed, 49 insertions(+) create mode 100644 src/Nest/ConvenienceExtensions/MultiSortExtensions.cs diff --git a/src/Nest/ConvenienceExtensions/MultiSortExtensions.cs b/src/Nest/ConvenienceExtensions/MultiSortExtensions.cs new file mode 100644 index 00000000000..7fae139479d --- /dev/null +++ b/src/Nest/ConvenienceExtensions/MultiSortExtensions.cs @@ -0,0 +1,48 @@ +namespace Nest +{ + using System; + using System.Collections.Generic; + + /// + /// Provides MultiSort extensions that allow easy sorting across multiple fields + /// + public static class MultiSortExtensions + { + public static SearchDescriptor MultiSort( + this SearchDescriptor instance, + params Func, IFieldSort>[] sorts) where T : class + { + foreach (var sort in sorts) + { + instance.Sort(sort); + } + + return instance; + } + + public static SearchDescriptor MultiSort( + this SearchDescriptor instance, + IEnumerable, IFieldSort>> sorts) where T : class + { + foreach (var sort in sorts) + { + instance.Sort(sort); + } + + return instance; + } + + public static SearchDescriptor MultiSort( + this SearchDescriptor instance, + IEnumerable> sorts) where T : class + { + foreach (var sort in sorts) + { + var copy = sort; + instance.Sort(s => copy); + } + + return instance; + } + } +} diff --git a/src/Nest/Nest.csproj b/src/Nest/Nest.csproj index b461ecd9ff1..42c13306e1f 100644 --- a/src/Nest/Nest.csproj +++ b/src/Nest/Nest.csproj @@ -72,6 +72,7 @@ + From 032a9afc648212f8e089c4be8aa829a85cc29b79 Mon Sep 17 00:00:00 2001 From: Mike Goodfellow Date: Fri, 12 Jun 2015 21:15:50 +0100 Subject: [PATCH 2/2] CHANGED: Make SortMulti() functions instance methods ADDED: Tests for SortMulti() --- .../MultiSortExtensions.cs | 48 ----------------- src/Nest/DSL/SearchDescriptor.cs | 29 +++++++++++ src/Nest/Nest.csproj | 1 - .../Search/Sorting/SortTests.cs | 52 ++++++++++++++++++- 4 files changed, 80 insertions(+), 50 deletions(-) delete mode 100644 src/Nest/ConvenienceExtensions/MultiSortExtensions.cs diff --git a/src/Nest/ConvenienceExtensions/MultiSortExtensions.cs b/src/Nest/ConvenienceExtensions/MultiSortExtensions.cs deleted file mode 100644 index 7fae139479d..00000000000 --- a/src/Nest/ConvenienceExtensions/MultiSortExtensions.cs +++ /dev/null @@ -1,48 +0,0 @@ -namespace Nest -{ - using System; - using System.Collections.Generic; - - /// - /// Provides MultiSort extensions that allow easy sorting across multiple fields - /// - public static class MultiSortExtensions - { - public static SearchDescriptor MultiSort( - this SearchDescriptor instance, - params Func, IFieldSort>[] sorts) where T : class - { - foreach (var sort in sorts) - { - instance.Sort(sort); - } - - return instance; - } - - public static SearchDescriptor MultiSort( - this SearchDescriptor instance, - IEnumerable, IFieldSort>> sorts) where T : class - { - foreach (var sort in sorts) - { - instance.Sort(sort); - } - - return instance; - } - - public static SearchDescriptor MultiSort( - this SearchDescriptor instance, - IEnumerable> sorts) where T : class - { - foreach (var sort in sorts) - { - var copy = sort; - instance.Sort(s => copy); - } - - return instance; - } - } -} diff --git a/src/Nest/DSL/SearchDescriptor.cs b/src/Nest/DSL/SearchDescriptor.cs index d5e8731588a..b6c1525262d 100644 --- a/src/Nest/DSL/SearchDescriptor.cs +++ b/src/Nest/DSL/SearchDescriptor.cs @@ -750,6 +750,35 @@ public SearchDescriptor Sort(Func, IFieldSort> sortSel return this; } + /// + /// SortMulti allows multiple sorts to be provided on one search descriptor + /// + /// + public SearchDescriptor SortMulti(params Func, IFieldSort>[] sorts) + { + foreach (var sort in sorts) + { + this.Sort(sort); + } + + return this; + } + + /// + /// SortMulti allows multiple sorts to be provided on one search descriptor + /// + /// + public SearchDescriptor SortMulti(IEnumerable> sorts) + { + foreach (var sort in sorts) + { + var copy = sort; + this.Sort(s => copy); + } + + return this; + } + /// /// SortGeoDistance() allows you to sort by a distance from a geo point. /// diff --git a/src/Nest/Nest.csproj b/src/Nest/Nest.csproj index 42c13306e1f..b461ecd9ff1 100644 --- a/src/Nest/Nest.csproj +++ b/src/Nest/Nest.csproj @@ -72,7 +72,6 @@ - diff --git a/src/Tests/Nest.Tests.Unit/Search/Sorting/SortTests.cs b/src/Tests/Nest.Tests.Unit/Search/Sorting/SortTests.cs index 064eda612a6..b232eb8f9a7 100644 --- a/src/Tests/Nest.Tests.Unit/Search/Sorting/SortTests.cs +++ b/src/Tests/Nest.Tests.Unit/Search/Sorting/SortTests.cs @@ -1,4 +1,6 @@ -using FluentAssertions; +using System; +using System.Collections.Generic; +using FluentAssertions; using System.Reflection; using NUnit.Framework; using Nest.Tests.MockData.Domain; @@ -198,6 +200,54 @@ public void TestSortDescendingOnSortField() Assert.True(json.JsonEquals(expected), json); } + [Test] + public void TestSortMultiWithParams() + { + var s = new SearchDescriptor() + .From(0) + .Size(10) + .SortMulti(sort => sort.OnField(f => f.Name.Suffix("sort")).Order(SortOrder.Descending), + sort => sort.OnField(f => f.Content.Suffix("test")).Order(SortOrder.Ascending)); + + var json = TestElasticClient.Serialize(s); + var expected = @" + { + from: 0, + size: 10, + sort: [ + { ""name.sort"" : { order: ""desc"" } }, + { ""content.test"" : { order: ""asc"" } } + ] + }"; + Assert.True(json.JsonEquals(expected), json); + } + + [Test] + public void TestSortMultiWithEnumerable() + { + var sorts = new [] + { + new SortFieldDescriptor().OnField(f => f.Name.Suffix("sort")).Order(SortOrder.Descending), + new SortFieldDescriptor().OnField(f => f.Content.Suffix("test")).Order(SortOrder.Ascending) + }; + + var s = new SearchDescriptor() + .From(0) + .Size(10) + .SortMulti(sorts); + var json = TestElasticClient.Serialize(s); + var expected = @" + { + from: 0, + size: 10, + sort: [ + { ""name.sort"" : { order: ""desc"" } }, + { ""content.test"" : { order: ""asc"" } } + ] + }"; + Assert.True(json.JsonEquals(expected), json); + } + [Test] public void TestSortGeo() {