Skip to content

Commit 0493033

Browse files
authored
Fix check for sort fields being in nested objects (#121084) (#121230)
1 parent 3cb2144 commit 0493033

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
@@ -202,6 +202,47 @@ non-default sort settings:
202202
- match: { test-sort.settings.index.sort.mode.0: "max" }
203203
- match: { test-sort.settings.index.sort.mode.1: "max" }
204204

205+
---
206+
non-default sort settings with presence of nested:
207+
- requires:
208+
cluster_features: [ "mapper.nested.sorting_fields_check_fix" ]
209+
reason: "Fixed behavior"
210+
211+
- do:
212+
indices.create:
213+
index: test-sort
214+
body:
215+
settings:
216+
index:
217+
mode: logsdb
218+
number_of_shards: 2
219+
number_of_replicas: 0
220+
sort:
221+
field: [ "agent_id", "@timestamp" ]
222+
order: [ "asc", "desc" ]
223+
mappings:
224+
properties:
225+
"@timestamp":
226+
type: date
227+
agent_id:
228+
type: keyword
229+
agent:
230+
type: nested
231+
properties:
232+
id:
233+
type: keyword
234+
235+
- do:
236+
indices.get_settings:
237+
index: test-sort
238+
239+
- is_true: test-sort
240+
- match: { test-sort.settings.index.mode: "logsdb" }
241+
- match: { test-sort.settings.index.sort.field.0: "agent_id" }
242+
- match: { test-sort.settings.index.sort.field.1: "@timestamp" }
243+
- match: { test-sort.settings.index.sort.order.0: "asc" }
244+
- match: { test-sort.settings.index.sort.order.1: "desc" }
245+
205246
---
206247
override sort order settings:
207248
- 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
@@ -167,12 +167,12 @@ public void validate(IndexSettings settings, boolean checkLimits) {
167167
throw new IllegalArgumentException("cannot have nested fields when index sort is activated");
168168
}
169169
for (String field : settings.getValue(IndexSortConfig.INDEX_SORT_FIELD_SETTING)) {
170-
for (NestedObjectMapper nestedObjectMapper : mappers().nestedLookup().getNestedMappers().values()) {
171-
if (field.startsWith(nestedObjectMapper.fullPath())) {
172-
throw new IllegalArgumentException(
173-
"cannot apply index sort to field [" + field + "] under nested object [" + nestedObjectMapper.fullPath() + "]"
174-
);
175-
}
170+
NestedObjectMapper nestedMapper = mappers().nestedLookup().getNestedMappers().get(field);
171+
String nestedParent = nestedMapper != null ? nestedMapper.fullPath() : mappers().nestedLookup().getNestedParent(field);
172+
if (nestedParent != null) {
173+
throw new IllegalArgumentException(
174+
"cannot apply index sort to field [" + field + "] under nested object [" + nestedParent + "]"
175+
);
176176
}
177177
}
178178
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public Set<NodeFeature> getFeatures() {
6161

6262
public static final NodeFeature META_FETCH_FIELDS_ERROR_CODE_CHANGED = new NodeFeature("meta_fetch_fields_error_code_changed");
6363
public static final NodeFeature SPARSE_VECTOR_STORE_SUPPORT = new NodeFeature("mapper.sparse_vector.store_support");
64+
public static final NodeFeature SORT_FIELDS_CHECK_FOR_NESTED_OBJECT_FIX = new NodeFeature("mapper.nested.sorting_fields_check_fix");
6465

6566
@Override
6667
public Set<NodeFeature> getTestFeatures() {
@@ -75,6 +76,7 @@ public Set<NodeFeature> getTestFeatures() {
7576
CONSTANT_KEYWORD_SYNTHETIC_SOURCE_WRITE_FIX,
7677
META_FETCH_FIELDS_ERROR_CODE_CHANGED,
7778
SPARSE_VECTOR_STORE_SUPPORT,
79+
SORT_FIELDS_CHECK_FOR_NESTED_OBJECT_FIX,
7880
COUNTED_KEYWORD_SYNTHETIC_SOURCE_NATIVE_SUPPORT,
7981
SourceFieldMapper.SYNTHETIC_RECOVERY_SOURCE,
8082
ObjectMapper.SUBOBJECTS_FALSE_MAPPING_UPDATE_FIX

0 commit comments

Comments
 (0)