Skip to content

Commit e12d275

Browse files
ES|QL: Implement serialization of InvalidMappedField (#98972)
Fixes #98851 As from the subject, implement the serialization/deserialization of InvalidMappedField objects. These objects are instantiated in the execution plan when a field mapping cannot be defined, eg. if two fields with the same name and different types appear in two indexes for the same index pattern.
1 parent fb95510 commit e12d275

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

docs/changelog/98972.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 98972
2+
summary: "ES|QL: Implement serialization of `InvalidMappedField`"
3+
area: ES|QL
4+
type: bug
5+
issues:
6+
- 98851

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/io/stream/PlanNamedTypes.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@
168168
import org.elasticsearch.xpack.ql.tree.Source;
169169
import org.elasticsearch.xpack.ql.type.DateEsField;
170170
import org.elasticsearch.xpack.ql.type.EsField;
171+
import org.elasticsearch.xpack.ql.type.InvalidMappedField;
171172
import org.elasticsearch.xpack.ql.type.KeywordEsField;
172173
import org.elasticsearch.xpack.ql.type.TextEsField;
173174
import org.elasticsearch.xpack.ql.type.UnsupportedEsField;
@@ -266,6 +267,7 @@ public static List<PlanNameRegistry.Entry> namedTypeEntries() {
266267
// EsFields
267268
of(EsField.class, EsField.class, PlanNamedTypes::writeEsField, PlanNamedTypes::readEsField),
268269
of(EsField.class, DateEsField.class, PlanNamedTypes::writeDateEsField, PlanNamedTypes::readDateEsField),
270+
of(EsField.class, InvalidMappedField.class, PlanNamedTypes::writeInvalidMappedField, PlanNamedTypes::readInvalidMappedField),
269271
of(EsField.class, KeywordEsField.class, PlanNamedTypes::writeKeywordEsField, PlanNamedTypes::readKeywordEsField),
270272
of(EsField.class, TextEsField.class, PlanNamedTypes::writeTextEsField, PlanNamedTypes::readTextEsField),
271273
of(EsField.class, UnsupportedEsField.class, PlanNamedTypes::writeUnsupportedEsField, PlanNamedTypes::readUnsupportedEsField),
@@ -904,6 +906,15 @@ static void writeDateEsField(PlanStreamOutput out, DateEsField dateEsField) thro
904906
out.writeBoolean(dateEsField.isAggregatable());
905907
}
906908

909+
static InvalidMappedField readInvalidMappedField(PlanStreamInput in) throws IOException {
910+
return new InvalidMappedField(in.readString(), in.readString());
911+
}
912+
913+
static void writeInvalidMappedField(PlanStreamOutput out, InvalidMappedField field) throws IOException {
914+
out.writeString(field.getName());
915+
out.writeString(field.errorMessage());
916+
}
917+
907918
static KeywordEsField readKeywordEsField(PlanStreamInput in) throws IOException {
908919
return new KeywordEsField(
909920
in.readString(),

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/io/stream/PlanNamedTypesTests.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
import org.elasticsearch.xpack.ql.type.DataTypes;
8383
import org.elasticsearch.xpack.ql.type.DateEsField;
8484
import org.elasticsearch.xpack.ql.type.EsField;
85+
import org.elasticsearch.xpack.ql.type.InvalidMappedField;
8586
import org.elasticsearch.xpack.ql.type.KeywordEsField;
8687
import org.elasticsearch.xpack.ql.type.TextEsField;
8788
import org.elasticsearch.xpack.ql.type.UnsupportedEsField;
@@ -246,6 +247,19 @@ public void testTextEsField() {
246247
Stream.generate(PlanNamedTypesTests::randomTextEsField).limit(100).forEach(PlanNamedTypesTests::assertNamedEsField);
247248
}
248249

250+
public void testInvalidMappedFieldSimple() throws IOException {
251+
var orig = new InvalidMappedField("foo", "bar");
252+
BytesStreamOutput bso = new BytesStreamOutput();
253+
PlanStreamOutput out = new PlanStreamOutput(bso, planNameRegistry);
254+
PlanNamedTypes.writeInvalidMappedField(out, orig);
255+
var deser = PlanNamedTypes.readInvalidMappedField(planStreamInput(bso));
256+
EqualsHashCodeTestUtils.checkEqualsAndHashCode(orig, unused -> deser);
257+
}
258+
259+
public void testInvalidMappedField() {
260+
Stream.generate(PlanNamedTypesTests::randomInvalidMappedField).limit(100).forEach(PlanNamedTypesTests::assertNamedEsField);
261+
}
262+
249263
public void testEsDateFieldSimple() throws IOException {
250264
var orig = DateEsField.dateEsField("birth_date", Map.of(), false);
251265
BytesStreamOutput bso = new BytesStreamOutput();
@@ -454,6 +468,13 @@ static TextEsField randomTextEsField() {
454468
);
455469
}
456470

471+
static InvalidMappedField randomInvalidMappedField() {
472+
return new InvalidMappedField(
473+
randomAlphaOfLength(randomIntBetween(1, 25)), // name
474+
randomAlphaOfLength(randomIntBetween(1, 25)) // error message
475+
);
476+
}
477+
457478
static BinaryComparison randomBinaryComparison() {
458479
int v = randomIntBetween(0, 6);
459480
var left = field(randomName(), randomDataType());

0 commit comments

Comments
 (0)