@@ -102,25 +102,6 @@ public final class IndexSortConfig {
102
102
Setting .Property .ServerlessPublic
103
103
);
104
104
105
- public static final FieldSortSpec [] TIME_SERIES_SORT , TIMESTAMP_SORT , HOSTNAME_TIMESTAMP_SORT , HOSTNAME_TIMESTAMP_BWC_SORT ;
106
- static {
107
- FieldSortSpec timeStampSpec = new FieldSortSpec (DataStreamTimestampFieldMapper .DEFAULT_PATH );
108
- timeStampSpec .order = SortOrder .DESC ;
109
- TIME_SERIES_SORT = new FieldSortSpec [] { new FieldSortSpec (TimeSeriesIdFieldMapper .NAME ), timeStampSpec };
110
- TIMESTAMP_SORT = new FieldSortSpec [] { timeStampSpec };
111
-
112
- FieldSortSpec hostnameSpec = new FieldSortSpec (IndexMode .HOST_NAME );
113
- hostnameSpec .order = SortOrder .ASC ;
114
- hostnameSpec .missingValue = "_last" ;
115
- hostnameSpec .mode = MultiValueMode .MIN ;
116
- HOSTNAME_TIMESTAMP_SORT = new FieldSortSpec [] { hostnameSpec , timeStampSpec };
117
-
118
- // Older indexes use ascending ordering for host name and timestamp.
119
- HOSTNAME_TIMESTAMP_BWC_SORT = new FieldSortSpec [] {
120
- new FieldSortSpec (IndexMode .HOST_NAME ),
121
- new FieldSortSpec (DataStreamTimestampFieldMapper .DEFAULT_PATH ) };
122
- }
123
-
124
105
private static String validateMissingValue (String missing ) {
125
106
if ("_last" .equals (missing ) == false && "_first" .equals (missing ) == false ) {
126
107
throw new IllegalArgumentException ("Illegal missing value:[" + missing + "], " + "must be one of [_last, _first]" );
@@ -146,6 +127,98 @@ private static MultiValueMode parseMultiValueMode(String value) {
146
127
return mode ;
147
128
}
148
129
130
+ private static void checkSizeMismatch (String firstKey , List <?> first , String secondKey , List <?> second ) {
131
+ if (first .size () != second .size ()) {
132
+ throw new IllegalArgumentException (firstKey + ":" + first + " " + secondKey + ":" + second + ", size mismatch" );
133
+ }
134
+ }
135
+
136
+ public static void validateSortSettings (Settings settings ) {
137
+ List <String > fields = INDEX_SORT_FIELD_SETTING .get (settings );
138
+
139
+ if (INDEX_SORT_ORDER_SETTING .exists (settings )) {
140
+ var order = INDEX_SORT_ORDER_SETTING .get (settings );
141
+ checkSizeMismatch (INDEX_SORT_FIELD_SETTING .getKey (), fields , INDEX_SORT_ORDER_SETTING .getKey (), order );
142
+ }
143
+
144
+ if (INDEX_SORT_MODE_SETTING .exists (settings )) {
145
+ var mode = INDEX_SORT_MODE_SETTING .get (settings );
146
+ checkSizeMismatch (INDEX_SORT_FIELD_SETTING .getKey (), fields , INDEX_SORT_MODE_SETTING .getKey (), mode );
147
+ }
148
+
149
+ if (INDEX_SORT_MISSING_SETTING .exists (settings )) {
150
+ var missing = INDEX_SORT_MISSING_SETTING .get (settings );
151
+ checkSizeMismatch (INDEX_SORT_FIELD_SETTING .getKey (), fields , INDEX_SORT_MISSING_SETTING .getKey (), missing );
152
+ }
153
+ }
154
+
155
+ public static class IndexSortConfigDefaults {
156
+ public static final FieldSortSpec [] TIME_SERIES_SORT , TIMESTAMP_SORT , HOSTNAME_TIMESTAMP_SORT , HOSTNAME_TIMESTAMP_BWC_SORT ;
157
+
158
+ static {
159
+ FieldSortSpec timeStampSpec = new FieldSortSpec (DataStreamTimestampFieldMapper .DEFAULT_PATH );
160
+ timeStampSpec .order = SortOrder .DESC ;
161
+ TIME_SERIES_SORT = new FieldSortSpec [] { new FieldSortSpec (TimeSeriesIdFieldMapper .NAME ), timeStampSpec };
162
+ TIMESTAMP_SORT = new FieldSortSpec [] { timeStampSpec };
163
+
164
+ FieldSortSpec hostnameSpec = new FieldSortSpec (IndexMode .HOST_NAME );
165
+ hostnameSpec .order = SortOrder .ASC ;
166
+ hostnameSpec .missingValue = "_last" ;
167
+ hostnameSpec .mode = MultiValueMode .MIN ;
168
+ HOSTNAME_TIMESTAMP_SORT = new FieldSortSpec [] { hostnameSpec , timeStampSpec };
169
+
170
+ // Older indexes use ascending ordering for host name and timestamp.
171
+ HOSTNAME_TIMESTAMP_BWC_SORT = new FieldSortSpec [] {
172
+ new FieldSortSpec (IndexMode .HOST_NAME ),
173
+ new FieldSortSpec (DataStreamTimestampFieldMapper .DEFAULT_PATH ) };
174
+ }
175
+
176
+ public static FieldSortSpec [] getDefaultSortSpecs (IndexSettings indexSettings ) {
177
+ final Settings settings = indexSettings .getSettings ();
178
+
179
+ IndexMode indexMode = indexSettings .getMode ();
180
+ if (indexMode == IndexMode .TIME_SERIES ) {
181
+ return TIME_SERIES_SORT ;
182
+ } else if (indexMode == IndexMode .LOGSDB ) {
183
+ if (INDEX_SORT_FIELD_SETTING .exists (settings )) {
184
+ return null ;
185
+ }
186
+
187
+ var version = indexSettings .getIndexVersionCreated ();
188
+ if (version .onOrAfter (IndexVersions .LOGSDB_EXPLICIT_INDEX_SORTING_DEFAULTS )) {
189
+ return null ;
190
+ }
191
+
192
+ List <String > fields = INDEX_SORT_FIELD_SETTING .get (settings );
193
+ if (INDEX_SORT_ORDER_SETTING .exists (settings )) {
194
+ var order = INDEX_SORT_ORDER_SETTING .get (settings );
195
+ throw new IllegalArgumentException ("index.sort.fields:" + fields + " index.sort.order:" + order + ", size mismatch" );
196
+ }
197
+ if (INDEX_SORT_MODE_SETTING .exists (settings )) {
198
+ var mode = INDEX_SORT_MODE_SETTING .get (settings );
199
+ throw new IllegalArgumentException ("index.sort.fields:" + fields + " index.sort.mode:" + mode + ", size mismatch" );
200
+ }
201
+ if (INDEX_SORT_MISSING_SETTING .exists (settings )) {
202
+ var missing = INDEX_SORT_MISSING_SETTING .get (settings );
203
+ throw new IllegalArgumentException (
204
+ "index.sort.fields:" + fields + " index.sort.missing:" + missing + ", size mismatch"
205
+ );
206
+ }
207
+ if (version .onOrAfter (IndexVersions .LOGSB_OPTIONAL_SORTING_ON_HOST_NAME )
208
+ || version .between (
209
+ IndexVersions .LOGSB_OPTIONAL_SORTING_ON_HOST_NAME_BACKPORT ,
210
+ IndexVersions .UPGRADE_TO_LUCENE_10_0_0
211
+ )) {
212
+ return (IndexSettings .LOGSDB_SORT_ON_HOST_NAME .get (settings )) ? HOSTNAME_TIMESTAMP_SORT : TIMESTAMP_SORT ;
213
+ } else {
214
+ return HOSTNAME_TIMESTAMP_BWC_SORT ;
215
+ }
216
+ }
217
+
218
+ return null ;
219
+ }
220
+ }
221
+
149
222
// visible for tests
150
223
final FieldSortSpec [] sortSpecs ;
151
224
private final IndexVersion indexCreatedVersion ;
@@ -158,34 +231,13 @@ public IndexSortConfig(IndexSettings indexSettings) {
158
231
this .indexName = indexSettings .getIndex ().getName ();
159
232
this .indexMode = indexSettings .getMode ();
160
233
161
- if (indexMode == IndexMode .TIME_SERIES ) {
162
- sortSpecs = TIME_SERIES_SORT ;
234
+ var defaultSortSpecs = IndexSortConfigDefaults .getDefaultSortSpecs (indexSettings );
235
+ if (defaultSortSpecs != null ) {
236
+ this .sortSpecs = defaultSortSpecs ;
163
237
return ;
164
238
}
165
239
166
240
List <String > fields = INDEX_SORT_FIELD_SETTING .get (settings );
167
- if (indexMode == IndexMode .LOGSDB && INDEX_SORT_FIELD_SETTING .exists (settings ) == false ) {
168
- if (INDEX_SORT_ORDER_SETTING .exists (settings )) {
169
- var order = INDEX_SORT_ORDER_SETTING .get (settings );
170
- throw new IllegalArgumentException ("index.sort.fields:" + fields + " index.sort.order:" + order + ", size mismatch" );
171
- }
172
- if (INDEX_SORT_MODE_SETTING .exists (settings )) {
173
- var mode = INDEX_SORT_MODE_SETTING .get (settings );
174
- throw new IllegalArgumentException ("index.sort.fields:" + fields + " index.sort.mode:" + mode + ", size mismatch" );
175
- }
176
- if (INDEX_SORT_MISSING_SETTING .exists (settings )) {
177
- var missing = INDEX_SORT_MISSING_SETTING .get (settings );
178
- throw new IllegalArgumentException ("index.sort.fields:" + fields + " index.sort.missing:" + missing + ", size mismatch" );
179
- }
180
- var version = indexSettings .getIndexVersionCreated ();
181
- if (version .onOrAfter (IndexVersions .LOGSB_OPTIONAL_SORTING_ON_HOST_NAME )
182
- || version .between (IndexVersions .LOGSB_OPTIONAL_SORTING_ON_HOST_NAME_BACKPORT , IndexVersions .UPGRADE_TO_LUCENE_10_0_0 )) {
183
- sortSpecs = (IndexSettings .LOGSDB_SORT_ON_HOST_NAME .get (settings )) ? HOSTNAME_TIMESTAMP_SORT : TIMESTAMP_SORT ;
184
- } else {
185
- sortSpecs = HOSTNAME_TIMESTAMP_BWC_SORT ;
186
- }
187
- return ;
188
- }
189
241
sortSpecs = fields .stream ().map (FieldSortSpec ::new ).toArray (FieldSortSpec []::new );
190
242
191
243
if (INDEX_SORT_ORDER_SETTING .exists (settings )) {
0 commit comments