@@ -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
0 commit comments