Skip to content

Commit b8ff892

Browse files
committed
Fix default sort values for non-default sorts
1 parent cb4f9f2 commit b8ff892

File tree

4 files changed

+92
-48
lines changed

4 files changed

+92
-48
lines changed

server/src/main/java/org/elasticsearch/index/IndexSortConfig.java

Lines changed: 38 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -154,19 +154,38 @@ public static FieldSortSpec[] getDefaultSortSpecs(Settings settings) {
154154
return new FieldSortSpec[0];
155155
}
156156

157+
public static FieldSortSpec[] getSortSpecs(Settings settings) {
158+
if (INDEX_SORT_FIELD_SETTING.exists(settings) == false) {
159+
return IndexSortConfigDefaults.getDefaultSortSpecs(settings);
160+
}
161+
162+
List<String> fields = INDEX_SORT_FIELD_SETTING.get(settings);
163+
FieldSortSpec[] sortSpecs = fields.stream().map(FieldSortSpec::new).toArray(FieldSortSpec[]::new);
164+
165+
// Need to populate `order` because the default value of `mode` depends on it
166+
if (INDEX_SORT_ORDER_SETTING.exists(settings)) {
167+
List<SortOrder> orders = INDEX_SORT_ORDER_SETTING.get(settings);
168+
for (int i = 0; i < sortSpecs.length; i++) {
169+
sortSpecs[i].order = orders.get(i);
170+
}
171+
}
172+
173+
return sortSpecs;
174+
}
175+
157176
public static List<String> getDefaultSortFields(Settings settings) {
158-
return Arrays.stream(getDefaultSortSpecs(settings)).map(sortSpec -> sortSpec.field).toList();
177+
return Arrays.stream(IndexSortConfigDefaults.getDefaultSortSpecs(settings)).map(sortSpec -> sortSpec.field).toList();
159178
}
160179

161180
public static List<String> getDefaultSortOrder(Settings settings) {
162-
return Arrays.stream(getDefaultSortSpecs(settings))
181+
return Arrays.stream(getSortSpecs(settings))
163182
.map(sortSpec -> sortSpec.order != null ? sortSpec.order : SortOrder.ASC)
164183
.map(Enum::toString)
165184
.toList();
166185
}
167186

168187
public static List<String> getDefaultSortMode(Settings settings) {
169-
return Arrays.stream(getDefaultSortSpecs(settings)).map(sortSpec -> {
188+
return Arrays.stream(getSortSpecs(settings)).map(sortSpec -> {
170189
if (sortSpec.mode != null) {
171190
return sortSpec.mode;
172191
} else if (sortSpec.order == SortOrder.DESC) {
@@ -179,7 +198,7 @@ public static List<String> getDefaultSortMode(Settings settings) {
179198

180199
public static List<String> getDefaultSortMissing(Settings settings) {
181200
// _last is the default per IndexFieldData.XFieldComparatorSource.Nested#sortMissingLast
182-
return Arrays.stream(getDefaultSortSpecs(settings))
201+
return Arrays.stream(getSortSpecs(settings))
183202
.map(sortSpec -> sortSpec.missingValue != null ? sortSpec.missingValue : "_last")
184203
.toList();
185204
}
@@ -229,20 +248,14 @@ private static void validateSortSettings(Settings settings) {
229248

230249
List<String> fields = INDEX_SORT_FIELD_SETTING.get(settings);
231250

232-
if (INDEX_SORT_ORDER_SETTING.exists(settings)) {
233-
var order = INDEX_SORT_ORDER_SETTING.get(settings);
234-
checkSizeMismatch(INDEX_SORT_FIELD_SETTING.getKey(), fields, INDEX_SORT_ORDER_SETTING.getKey(), order);
235-
}
251+
var order = INDEX_SORT_ORDER_SETTING.get(settings);
252+
checkSizeMismatch(INDEX_SORT_FIELD_SETTING.getKey(), fields, INDEX_SORT_ORDER_SETTING.getKey(), order);
236253

237-
if (INDEX_SORT_MODE_SETTING.exists(settings)) {
238-
var mode = INDEX_SORT_MODE_SETTING.get(settings);
239-
checkSizeMismatch(INDEX_SORT_FIELD_SETTING.getKey(), fields, INDEX_SORT_MODE_SETTING.getKey(), mode);
240-
}
254+
var mode = INDEX_SORT_MODE_SETTING.get(settings);
255+
checkSizeMismatch(INDEX_SORT_FIELD_SETTING.getKey(), fields, INDEX_SORT_MODE_SETTING.getKey(), mode);
241256

242-
if (INDEX_SORT_MISSING_SETTING.exists(settings)) {
243-
var missing = INDEX_SORT_MISSING_SETTING.get(settings);
244-
checkSizeMismatch(INDEX_SORT_FIELD_SETTING.getKey(), fields, INDEX_SORT_MISSING_SETTING.getKey(), missing);
245-
}
257+
var missing = INDEX_SORT_MISSING_SETTING.get(settings);
258+
checkSizeMismatch(INDEX_SORT_FIELD_SETTING.getKey(), fields, INDEX_SORT_MISSING_SETTING.getKey(), missing);
246259
}
247260

248261
// visible for tests
@@ -260,39 +273,21 @@ public IndexSortConfig(IndexSettings indexSettings) {
260273
validateSortSettings(settings);
261274

262275
List<String> fields = INDEX_SORT_FIELD_SETTING.get(settings);
263-
boolean applyDefaults = INDEX_SORT_FIELD_SETTING.exists(settings) == false;
264276
sortSpecs = fields.stream().map(FieldSortSpec::new).toArray(FieldSortSpec[]::new);
265277

266-
if (INDEX_SORT_ORDER_SETTING.exists(settings) || applyDefaults) {
267-
List<SortOrder> orders = INDEX_SORT_ORDER_SETTING.get(settings);
268-
if (orders.size() != sortSpecs.length) {
269-
throw new IllegalArgumentException("index.sort.field:" + fields + " index.sort.order:" + orders + ", size mismatch");
270-
}
271-
for (int i = 0; i < sortSpecs.length; i++) {
272-
sortSpecs[i].order = orders.get(i);
273-
}
278+
List<SortOrder> orders = INDEX_SORT_ORDER_SETTING.get(settings);
279+
for (int i = 0; i < sortSpecs.length; i++) {
280+
sortSpecs[i].order = orders.get(i);
274281
}
275282

276-
if (INDEX_SORT_MODE_SETTING.exists(settings) || applyDefaults) {
277-
List<MultiValueMode> modes = INDEX_SORT_MODE_SETTING.get(settings);
278-
if (modes.size() != sortSpecs.length) {
279-
throw new IllegalArgumentException("index.sort.field:" + fields + " index.sort.mode:" + modes + ", size mismatch");
280-
}
281-
for (int i = 0; i < sortSpecs.length; i++) {
282-
sortSpecs[i].mode = modes.get(i);
283-
}
283+
List<MultiValueMode> modes = INDEX_SORT_MODE_SETTING.get(settings);
284+
for (int i = 0; i < sortSpecs.length; i++) {
285+
sortSpecs[i].mode = modes.get(i);
284286
}
285287

286-
if (INDEX_SORT_MISSING_SETTING.exists(settings) || applyDefaults) {
287-
List<String> missingValues = INDEX_SORT_MISSING_SETTING.get(settings);
288-
if (missingValues.size() != sortSpecs.length) {
289-
throw new IllegalArgumentException(
290-
"index.sort.field:" + fields + " index.sort.missing:" + missingValues + ", size mismatch"
291-
);
292-
}
293-
for (int i = 0; i < sortSpecs.length; i++) {
294-
sortSpecs[i].missingValue = missingValues.get(i);
295-
}
288+
List<String> missingValues = INDEX_SORT_MISSING_SETTING.get(settings);
289+
for (int i = 0; i < sortSpecs.length; i++) {
290+
sortSpecs[i].missingValue = missingValues.get(i);
296291
}
297292
}
298293

server/src/main/java/org/elasticsearch/index/fielddata/IndexNumericFieldData.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public SortField sortField(
148148
SortField sortField = sortField(missingValue, sortMode, nested, reverse);
149149
if (getNumericType() == NumericType.DATE_NANOSECONDS
150150
&& indexCreatedVersion.before(IndexVersions.V_7_14_0)
151-
&& missingValue == null
151+
&& missingValue.equals("_last")
152152
&& Long.valueOf(0L).equals(sortField.getMissingValue())) {
153153
// 7.14 changed the default missing value of sort on date_nanos, from Long.MIN_VALUE
154154
// to 0L - for compatibility we require to a missing value of MIN_VALUE to allow to

server/src/test/java/org/elasticsearch/index/IndexSortSettingsTests.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ public void testIndexSortWithArrays() {
9494
assertThat(config.sortSpecs[1].order, equalTo(SortOrder.DESC));
9595
assertThat(config.sortSpecs[0].missingValue, equalTo("_last"));
9696
assertThat(config.sortSpecs[1].missingValue, equalTo("_first"));
97-
assertNull(config.sortSpecs[0].mode);
98-
assertNull(config.sortSpecs[1].mode);
97+
assertThat(config.sortSpecs[0].mode, equalTo(MultiValueMode.MIN));
98+
assertThat(config.sortSpecs[1].mode, equalTo(MultiValueMode.MAX));
9999
}
100100

101101
public void testInvalidIndexSort() {
@@ -280,8 +280,8 @@ public void testLogsdbIndexSortWithArrays() {
280280
assertThat(config.sortSpecs[1].order, equalTo(SortOrder.DESC));
281281
assertThat(config.sortSpecs[0].missingValue, equalTo("_last"));
282282
assertThat(config.sortSpecs[1].missingValue, equalTo("_first"));
283-
assertNull(config.sortSpecs[0].mode);
284-
assertNull(config.sortSpecs[1].mode);
283+
assertThat(config.sortSpecs[0].mode, equalTo(MultiValueMode.MIN));
284+
assertThat(config.sortSpecs[1].mode, equalTo(MultiValueMode.MAX));
285285
}
286286

287287
public void testLogsdbInvalidIndexSortOrder() {

x-pack/plugin/logsdb/src/yamlRestTest/resources/rest-api-spec/test/80_index_sort_defaults.yml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,3 +508,52 @@ create logsdb data stream with host as text and name as double:
508508
- match: { .$backing_index.defaults.index.sort.order: [ "asc", "desc" ] }
509509
- match: { .$backing_index.defaults.index.sort.mode: [ "min", "max" ] }
510510
- match: { .$backing_index.defaults.index.sort.missing: [ "_last", "_last" ] }
511+
512+
---
513+
create logsdb data stream with non-default sort field:
514+
- do:
515+
cluster.put_component_template:
516+
name: "logsdb-mappings"
517+
body:
518+
template:
519+
settings:
520+
mode: "logsdb"
521+
index.sort.field: ["some_field"]
522+
mappings:
523+
properties:
524+
some_field:
525+
type: "keyword"
526+
"@timestamp":
527+
type: "date"
528+
529+
- do:
530+
indices.put_index_template:
531+
name: "logsdb-index-template"
532+
body:
533+
index_patterns: ["logsdb"]
534+
data_stream: {}
535+
composed_of: ["logsdb-mappings"]
536+
allowed_warnings:
537+
- "index template [logsdb-index-template] has index patterns [logsdb] matching patterns from existing older templates [global] with patterns (global => [*]); this template [logsdb-index-template] will take precedence during new index creation"
538+
539+
- do:
540+
indices.create_data_stream:
541+
name: "logsdb"
542+
543+
- is_true: acknowledged
544+
- do:
545+
indices.get_data_stream:
546+
name: "logsdb"
547+
expand_wildcards: hidden
548+
- length: { data_streams: 1 }
549+
- set: { data_streams.0.indices.0.index_name: backing_index }
550+
551+
- do:
552+
indices.get_settings:
553+
index: $backing_index
554+
include_defaults: true
555+
- match: { .$backing_index.settings.index.mode: logsdb }
556+
- match: { .$backing_index.settings.index.sort.field: [ "some_field" ] }
557+
- match: { .$backing_index.defaults.index.sort.order: [ "asc" ] }
558+
- match: { .$backing_index.defaults.index.sort.mode: [ "min" ] }
559+
- match: { .$backing_index.defaults.index.sort.missing: [ "_last" ] }

0 commit comments

Comments
 (0)