Skip to content

Commit 74f9178

Browse files
authored
Fix check for sort fields being in nested objects (#121084)
1 parent cfe2507 commit 74f9178

File tree

3 files changed

+49
-6
lines changed

3 files changed

+49
-6
lines changed

rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/logsdb/10_settings.yml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,47 @@ non-default sort settings:
201201
- match: { test-sort.settings.index.sort.mode.0: "max" }
202202
- match: { test-sort.settings.index.sort.mode.1: "max" }
203203

204+
---
205+
non-default sort settings with presence of nested:
206+
- requires:
207+
cluster_features: [ "mapper.nested.sorting_fields_check_fix" ]
208+
reason: "Fixed behavior"
209+
210+
- do:
211+
indices.create:
212+
index: test-sort
213+
body:
214+
settings:
215+
index:
216+
mode: logsdb
217+
number_of_shards: 2
218+
number_of_replicas: 0
219+
sort:
220+
field: [ "agent_id", "@timestamp" ]
221+
order: [ "asc", "desc" ]
222+
mappings:
223+
properties:
224+
"@timestamp":
225+
type: date
226+
agent_id:
227+
type: keyword
228+
agent:
229+
type: nested
230+
properties:
231+
id:
232+
type: keyword
233+
234+
- do:
235+
indices.get_settings:
236+
index: test-sort
237+
238+
- is_true: test-sort
239+
- match: { test-sort.settings.index.mode: "logsdb" }
240+
- match: { test-sort.settings.index.sort.field.0: "agent_id" }
241+
- match: { test-sort.settings.index.sort.field.1: "@timestamp" }
242+
- match: { test-sort.settings.index.sort.order.0: "asc" }
243+
- match: { test-sort.settings.index.sort.order.1: "desc" }
244+
204245
---
205246
override sort order settings:
206247
- requires:

server/src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,12 +164,12 @@ public void validate(IndexSettings settings, boolean checkLimits) {
164164
throw new IllegalArgumentException("cannot have nested fields when index sort is activated");
165165
}
166166
for (String field : settings.getValue(IndexSortConfig.INDEX_SORT_FIELD_SETTING)) {
167-
for (NestedObjectMapper nestedObjectMapper : mappers().nestedLookup().getNestedMappers().values()) {
168-
if (field.startsWith(nestedObjectMapper.fullPath())) {
169-
throw new IllegalArgumentException(
170-
"cannot apply index sort to field [" + field + "] under nested object [" + nestedObjectMapper.fullPath() + "]"
171-
);
172-
}
167+
NestedObjectMapper nestedMapper = mappers().nestedLookup().getNestedMappers().get(field);
168+
String nestedParent = nestedMapper != null ? nestedMapper.fullPath() : mappers().nestedLookup().getNestedParent(field);
169+
if (nestedParent != null) {
170+
throw new IllegalArgumentException(
171+
"cannot apply index sort to field [" + field + "] under nested object [" + nestedParent + "]"
172+
);
173173
}
174174
}
175175
}

server/src/main/java/org/elasticsearch/index/mapper/MapperFeatures.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public class MapperFeatures implements FeatureSpecification {
2929

3030
public static final NodeFeature META_FETCH_FIELDS_ERROR_CODE_CHANGED = new NodeFeature("meta_fetch_fields_error_code_changed");
3131
public static final NodeFeature SPARSE_VECTOR_STORE_SUPPORT = new NodeFeature("mapper.sparse_vector.store_support");
32+
public static final NodeFeature SORT_FIELDS_CHECK_FOR_NESTED_OBJECT_FIX = new NodeFeature("mapper.nested.sorting_fields_check_fix");
3233

3334
@Override
3435
public Set<NodeFeature> getTestFeatures() {
@@ -44,6 +45,7 @@ public Set<NodeFeature> getTestFeatures() {
4445
CONSTANT_KEYWORD_SYNTHETIC_SOURCE_WRITE_FIX,
4546
META_FETCH_FIELDS_ERROR_CODE_CHANGED,
4647
SPARSE_VECTOR_STORE_SUPPORT,
48+
SORT_FIELDS_CHECK_FOR_NESTED_OBJECT_FIX,
4749
COUNTED_KEYWORD_SYNTHETIC_SOURCE_NATIVE_SUPPORT,
4850
SourceFieldMapper.SYNTHETIC_RECOVERY_SOURCE,
4951
ObjectMapper.SUBOBJECTS_FALSE_MAPPING_UPDATE_FIX

0 commit comments

Comments
 (0)