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/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() {