Skip to content

Commit 675702d

Browse files
committed
Merge branch 'master' of github.com:elastic/elasticsearch-net
2 parents b9aeb04 + 54372ed commit 675702d

File tree

4 files changed

+247
-4
lines changed

4 files changed

+247
-4
lines changed

src/Nest/IndexModules/IndexSettings/Settings/IndexSettings.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ public interface IIndexSettings : IDynamicIndexSettings
1313
/// </summary>
1414
int? NumberOfShards { get; set; }
1515

16-
1716
//TODO remove pre note with 6.0
1817
/// <summary>
1918
/// By defaulting, routing resolves to a single shard. Use this settings to have it resolve to a set of shards instead.
@@ -32,6 +31,12 @@ public interface IIndexSettings : IDynamicIndexSettings
3231
/// Settings associated with queries.
3332
/// </summary>
3433
IQueriesSettings Queries { get; set; }
34+
35+
/// <summary>
36+
/// Settings associated with index sorting.
37+
/// https://www.elastic.co/guide/en/elasticsearch/reference/6.0/index-modules-index-sorting.html
38+
/// </summary>
39+
ISortingSettings Sorting { get; set; }
3540
}
3641

3742
/// <inheritdoc />
@@ -51,6 +56,9 @@ public IndexSettings(IDictionary<string, object> container) : base(container) {
5156

5257
/// <inheritdoc />
5358
public IQueriesSettings Queries { get; set; }
59+
60+
/// <inheritdoc />
61+
public ISortingSettings Sorting { get; set; }
5462
}
5563

5664
/// <inheritdoc />
@@ -72,6 +80,8 @@ public IndexSettingsDescriptor FileSystemStorageImplementation(FileSystemStorage
7280

7381
public IndexSettingsDescriptor Queries(Func<QueriesSettingsDescriptor, IQueriesSettings> selector) =>
7482
Assign(a => a.Queries = selector?.Invoke(new QueriesSettingsDescriptor()));
75-
}
7683

84+
public IndexSettingsDescriptor Sorting<T>(Func<SortingSettingsDescriptor<T>, ISortingSettings> selector) where T : class =>
85+
Assign(a => a.Sorting = selector?.Invoke(new SortingSettingsDescriptor<T>()));
86+
}
7787
}

src/Nest/IndexModules/IndexSettings/Settings/IndexSettingsConverter.cs

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,33 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
7777
d[UpdatableIndexSettings.Analysis] = ds.Analysis;
7878

7979
var indexSettings = value as IIndexSettings;
80-
d[FixedIndexSettings.NumberOfShards] = indexSettings?.NumberOfShards;
80+
81+
d[FixedIndexSettings.NumberOfShards] = indexSettings?.NumberOfShards;
8182
d[FixedIndexSettings.RoutingPartitionSize] = indexSettings?.RoutingPartitionSize;
8283
d[UpdatableIndexSettings.StoreType] = indexSettings?.FileSystemStorageImplementation;
8384
d[UpdatableIndexSettings.QueriesCacheEnabled] = indexSettings?.Queries?.Cache?.Enabled;
8485

86+
if (indexSettings?.Sorting != null)
87+
{
88+
d[IndexSortSettings.Fields] = AsArrayOrSingleItem(indexSettings.Sorting.Fields);
89+
d[IndexSortSettings.Order] = AsArrayOrSingleItem(indexSettings.Sorting.Order);
90+
d[IndexSortSettings.Mode] = AsArrayOrSingleItem(indexSettings.Sorting.Mode);
91+
d[IndexSortSettings.Missing] = AsArrayOrSingleItem(indexSettings.Sorting.Missing);
92+
}
93+
8594
base.WriteJson(writer, d, serializer);
8695
}
8796

97+
private object AsArrayOrSingleItem<T>(IEnumerable<T> items)
98+
{
99+
if (items == null || !items.Any())
100+
return null;
101+
102+
if (items.Count() == 1)
103+
return items.First();
104+
105+
return items;
106+
}
88107

89108
public JObject Flatten(JObject original, string prefix = "", JObject newObject = null)
90109
{
@@ -184,6 +203,12 @@ private void SetKnownIndexSettings(JsonReader reader, JsonSerializer serializer,
184203
Set<int?>(s, settings, FixedIndexSettings.RoutingPartitionSize, v => s.RoutingPartitionSize = v);
185204
Set<FileSystemStorageImplementation?>(s, settings, UpdatableIndexSettings.StoreType, v => s.FileSystemStorageImplementation = v, serializer);
186205

206+
var sorting = s.Sorting = new SortingSettings();
207+
SetArray<string[], string>(s, settings, IndexSortSettings.Fields, v => sorting.Fields = v, v => sorting.Fields = new [] { v });
208+
SetArray<IndexSortOrder[], IndexSortOrder>(s, settings, IndexSortSettings.Order, v => sorting.Order = v, v => sorting.Order = new [] { v });
209+
SetArray<IndexSortMode[], IndexSortMode>(s, settings, IndexSortSettings.Mode, v => sorting.Mode = v, v => sorting.Mode = new [] { v });
210+
SetArray<IndexSortMissing[], IndexSortMissing>(s, settings, IndexSortSettings.Missing, v => sorting.Missing = v, v => sorting.Missing = new [] { v });
211+
187212
var queries = s.Queries = new QueriesSettings();
188213
var queriesCache = s.Queries.Cache = new QueriesCacheSettings();
189214
Set<bool?>(s, settings, UpdatableIndexSettings.QueriesCacheEnabled, v => queriesCache.Enabled = v);
@@ -205,10 +230,29 @@ private static void Set<T>(IIndexSettings s, IDictionary<string, JProperty> sett
205230
{
206231
if (!settings.ContainsKey(key)) return;
207232
var v = settings[key];
208-
T value = serializer == null ? v.Value.ToObject<T>() : v.Value.ToObject<T>(serializer);
233+
var value = serializer == null ? v.Value.ToObject<T>() : v.Value.ToObject<T>(serializer);
209234
assign(value);
210235
s.Add(key, value);
211236
settings.Remove(key);
212237
}
238+
239+
private static void SetArray<TArray, TItem>(IIndexSettings s, IDictionary<string, JProperty> settings, string key, Action<TArray> assign, Action<TItem> assign2, JsonSerializer serializer = null)
240+
{
241+
if (!settings.ContainsKey(key)) return;
242+
var v = settings[key];
243+
if (v.Value is JArray)
244+
{
245+
var value = serializer == null ? v.Value.ToObject<TArray>() : v.Value.ToObject<TArray>(serializer);
246+
assign(value);
247+
s.Add(key, value);
248+
}
249+
else
250+
{
251+
var value = serializer == null ? v.Value.ToObject<TItem>() : v.Value.ToObject<TItem>(serializer);
252+
assign2(value);
253+
s.Add(key, value);
254+
}
255+
settings.Remove(key);
256+
}
213257
}
214258
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
using System;
2+
using System.Runtime.Serialization;
3+
using Newtonsoft.Json;
4+
using Newtonsoft.Json.Converters;
5+
6+
namespace Nest
7+
{
8+
public static class IndexSortSettings
9+
{
10+
public const string Fields = "index.sort.field";
11+
public const string Order = "index.sort.order";
12+
public const string Mode = "index.sort.mode";
13+
public const string Missing = "index.sort.missing";
14+
}
15+
16+
[JsonConverter(typeof(StringEnumConverter))]
17+
public enum IndexSortMode
18+
{
19+
[EnumMember(Value = "min")]
20+
Minimum,
21+
[EnumMember(Value = "max")]
22+
Maximum
23+
}
24+
25+
[JsonConverter(typeof(StringEnumConverter))]
26+
public enum IndexSortMissing
27+
{
28+
[EnumMember(Value = "_first")]
29+
First,
30+
[EnumMember(Value = "_last")]
31+
Last
32+
}
33+
34+
[JsonConverter(typeof(StringEnumConverter))]
35+
public enum IndexSortOrder
36+
{
37+
[EnumMember(Value = "asc")]
38+
Ascending,
39+
[EnumMember(Value = "desc")]
40+
Descending
41+
}
42+
43+
public interface ISortingSettings
44+
{
45+
/// <summary>
46+
/// The list of fields used to sort the index. Only boolean, numeric, date and keyword fields with doc_values are allowed here.
47+
/// </summary>
48+
Fields Fields { get; set; }
49+
50+
/// <summary>
51+
/// The sort order to use for each field. The order option can have the following values: <see cref="IndexSortOrder.Ascending"/> and <see cref="IndexSortOrder.Descending"/>.
52+
/// </summary>
53+
IndexSortOrder[] Order { get; set; }
54+
55+
/// <summary>
56+
/// The mode option controls what value, from a multi-value field, is picked to sort the document.
57+
/// The mode option can have the following values:
58+
/// <see cref="IndexSortMode.Minimum" />: Pick the lowest value.
59+
/// <see cref="IndexSortMode.Maximum" />: Pick the highest value.
60+
/// </summary>
61+
IndexSortMode[] Mode { get; set; }
62+
63+
/// <summary>
64+
/// The missing parameter specifies how docs which are missing the field should be treated. The missing value can have the following values:
65+
/// <see cref="IndexSortMissing.Last"/>: Documents without value for the field are sorted last.
66+
/// <see cref="IndexSortMissing.First"/>: Documents without value for the field are sorted first.
67+
/// </summary>
68+
IndexSortMissing[] Missing { get; set; }
69+
}
70+
71+
public class SortingSettings : ISortingSettings
72+
{
73+
/// <inheritdoc/>
74+
public Fields Fields { get; set; }
75+
76+
/// <inheritdoc/>
77+
public IndexSortOrder[] Order { get; set; }
78+
79+
/// <inheritdoc/>
80+
public IndexSortMode[] Mode { get; set; }
81+
82+
/// <inheritdoc/>
83+
public IndexSortMissing[] Missing { get; set; }
84+
}
85+
86+
public class SortingSettingsDescriptor<T> : DescriptorBase<SortingSettingsDescriptor<T>, ISortingSettings>, ISortingSettings where T : class
87+
{
88+
Fields ISortingSettings.Fields { get; set; }
89+
IndexSortOrder[] ISortingSettings.Order { get; set; }
90+
IndexSortMode[] ISortingSettings.Mode { get; set; }
91+
IndexSortMissing[] ISortingSettings.Missing { get; set; }
92+
93+
public SortingSettingsDescriptor<T> Fields(Func<FieldsDescriptor<T>, IPromise<Fields>> fields) => Assign(a => a.Fields = fields?.Invoke(new FieldsDescriptor<T>())?.Value);
94+
95+
public SortingSettingsDescriptor<T> Fields(Fields fields) => Assign(a => a.Fields = fields);
96+
97+
public SortingSettingsDescriptor<T> Order(params IndexSortOrder[] order) => Assign(a => a.Order = order);
98+
99+
public SortingSettingsDescriptor<T> Mode(params IndexSortMode[] mode) => Assign(a => a.Mode = mode);
100+
101+
public SortingSettingsDescriptor<T> Missing(params IndexSortMissing[] missing) => Assign(a => a.Missing = missing);
102+
}
103+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Nest;
4+
using Tests.Framework;
5+
6+
namespace Tests.IndexModules.IndexSettings.Sorting
7+
{
8+
public class SortingSettingsSingleItem
9+
{
10+
private class TestClass
11+
{
12+
public string field1 { get; set; }
13+
}
14+
15+
public class Usage : PromiseUsageTestBase<IIndexSettings, IndexSettingsDescriptor, Nest.IndexSettings>
16+
{
17+
protected override object ExpectJson => new Dictionary<string, object>
18+
{
19+
{"index.sort.field", "field1" },
20+
{"index.sort.order", "asc" },
21+
{"index.sort.mode", "min" },
22+
{"index.sort.missing", "_first" },
23+
};
24+
25+
protected override Func<IndexSettingsDescriptor, IPromise<IIndexSettings>> Fluent => s => s
26+
.Sorting<TestClass>(sl => sl
27+
.Fields("field1")
28+
.Order(IndexSortOrder.Ascending)
29+
.Mode(IndexSortMode.Minimum)
30+
.Missing(IndexSortMissing.First)
31+
);
32+
33+
protected override Nest.IndexSettings Initializer =>
34+
new Nest.IndexSettings
35+
{
36+
Sorting = new Nest.SortingSettings
37+
{
38+
Fields = new[] { "field1" },
39+
Order = new [] { IndexSortOrder.Ascending },
40+
Mode = new [] { IndexSortMode.Minimum },
41+
Missing = new [] { IndexSortMissing.First }
42+
}
43+
};
44+
}
45+
}
46+
47+
public class SortingSettingsArray
48+
{
49+
private class TestClass
50+
{
51+
public string field1 { get; set; }
52+
public string field2 { get; set; }
53+
}
54+
55+
public class Usage : PromiseUsageTestBase<IIndexSettings, IndexSettingsDescriptor, Nest.IndexSettings>
56+
{
57+
protected override object ExpectJson => new Dictionary<string, object>
58+
{
59+
{"index.sort.field", new[] { "field1", "field2" } },
60+
{"index.sort.order", new[] { "asc", "desc" } },
61+
{"index.sort.mode", new[] { "min", "max" } },
62+
{"index.sort.missing", new[] { "_first", "_last" } },
63+
};
64+
65+
protected override Func<IndexSettingsDescriptor, IPromise<IIndexSettings>> Fluent => s => s
66+
.Sorting<TestClass>(sl => sl
67+
.Fields(f => f.Field(p => p.field1).Field("field2"))
68+
.Order(IndexSortOrder.Ascending, IndexSortOrder.Descending)
69+
.Mode(IndexSortMode.Minimum, IndexSortMode.Maximum)
70+
.Missing(IndexSortMissing.First,IndexSortMissing.Last)
71+
);
72+
73+
protected override Nest.IndexSettings Initializer =>
74+
new Nest.IndexSettings
75+
{
76+
Sorting = new Nest.SortingSettings
77+
{
78+
Fields = new[] { "field1", "field2" },
79+
Order = new [] { IndexSortOrder.Ascending, IndexSortOrder.Descending },
80+
Mode = new [] { IndexSortMode.Minimum, IndexSortMode.Maximum },
81+
Missing = new [] { IndexSortMissing.First, IndexSortMissing.Last }
82+
}
83+
};
84+
}
85+
}
86+
}

0 commit comments

Comments
 (0)