Skip to content

Commit 55453ae

Browse files
Dry up o.e.c.lucene.Lucene transport logic (#126646)
We've accumulated quited a bit of duplication here, drying this logic up a little.
1 parent ef633d5 commit 55453ae

File tree

4 files changed

+51
-83
lines changed

4 files changed

+51
-83
lines changed

server/src/main/java/org/elasticsearch/common/lucene/Lucene.java

Lines changed: 44 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -313,18 +313,15 @@ public static TopDocsAndMaxScore readTopDocs(StreamInput in) throws IOException
313313
} else if (type == 1) {
314314
TotalHits totalHits = readTotalHits(in);
315315
float maxScore = in.readFloat();
316-
SortField[] fields = in.readArray(Lucene::readSortField, SortField[]::new);
317-
FieldDoc[] fieldDocs = new FieldDoc[in.readVInt()];
318-
for (int i = 0; i < fieldDocs.length; i++) {
319-
fieldDocs[i] = readFieldDoc(in);
320-
}
316+
SortField[] fields = readSortFieldArray(in);
317+
FieldDoc[] fieldDocs = in.readArray(Lucene::readFieldDoc, FieldDoc[]::new);
321318
return new TopDocsAndMaxScore(new TopFieldDocs(totalHits, fieldDocs, fields), maxScore);
322319
} else if (type == 2) {
323320
TotalHits totalHits = readTotalHits(in);
324321
float maxScore = in.readFloat();
325322

326323
String field = in.readString();
327-
SortField[] fields = in.readArray(Lucene::readSortField, SortField[]::new);
324+
SortField[] fields = readSortFieldArray(in);
328325
int size = in.readVInt();
329326
Object[] collapseValues = new Object[size];
330327
FieldDoc[] fieldDocs = new FieldDoc[size];
@@ -339,65 +336,30 @@ public static TopDocsAndMaxScore readTopDocs(StreamInput in) throws IOException
339336
}
340337

341338
public static FieldDoc readFieldDoc(StreamInput in) throws IOException {
342-
Comparable<?>[] cFields = new Comparable<?>[in.readVInt()];
343-
for (int j = 0; j < cFields.length; j++) {
344-
byte type = in.readByte();
345-
if (type == 0) {
346-
cFields[j] = null;
347-
} else if (type == 1) {
348-
cFields[j] = in.readString();
349-
} else if (type == 2) {
350-
cFields[j] = in.readInt();
351-
} else if (type == 3) {
352-
cFields[j] = in.readLong();
353-
} else if (type == 4) {
354-
cFields[j] = in.readFloat();
355-
} else if (type == 5) {
356-
cFields[j] = in.readDouble();
357-
} else if (type == 6) {
358-
cFields[j] = in.readByte();
359-
} else if (type == 7) {
360-
cFields[j] = in.readShort();
361-
} else if (type == 8) {
362-
cFields[j] = in.readBoolean();
363-
} else if (type == 9) {
364-
cFields[j] = in.readBytesRef();
365-
} else if (type == 10) {
366-
cFields[j] = new BigInteger(in.readString());
367-
} else {
368-
throw new IOException("Can't match type [" + type + "]");
369-
}
370-
}
371-
return new FieldDoc(in.readVInt(), in.readFloat(), cFields);
339+
var sortValues = readSortValues(in);
340+
return new FieldDoc(in.readVInt(), in.readFloat(), sortValues);
341+
}
342+
343+
public static Object[] readSortValues(StreamInput in) throws IOException {
344+
return in.readArray(Lucene::readSortValue, Object[]::new);
372345
}
373346

374347
public static Comparable<?> readSortValue(StreamInput in) throws IOException {
375348
byte type = in.readByte();
376-
if (type == 0) {
377-
return null;
378-
} else if (type == 1) {
379-
return in.readString();
380-
} else if (type == 2) {
381-
return in.readInt();
382-
} else if (type == 3) {
383-
return in.readLong();
384-
} else if (type == 4) {
385-
return in.readFloat();
386-
} else if (type == 5) {
387-
return in.readDouble();
388-
} else if (type == 6) {
389-
return in.readByte();
390-
} else if (type == 7) {
391-
return in.readShort();
392-
} else if (type == 8) {
393-
return in.readBoolean();
394-
} else if (type == 9) {
395-
return in.readBytesRef();
396-
} else if (type == 10) {
397-
return new BigInteger(in.readString());
398-
} else {
399-
throw new IOException("Can't match type [" + type + "]");
400-
}
349+
return switch (type) {
350+
case 0 -> null;
351+
case 1 -> in.readString();
352+
case 2 -> in.readInt();
353+
case 3 -> in.readLong();
354+
case 4 -> in.readFloat();
355+
case 5 -> in.readDouble();
356+
case 6 -> in.readByte();
357+
case 7 -> in.readShort();
358+
case 8 -> in.readBoolean();
359+
case 9 -> in.readBytesRef();
360+
case 10 -> new BigInteger(in.readString());
361+
default -> throw new IOException("Can't match type [" + type + "]");
362+
};
401363
}
402364

403365
public static ScoreDoc readScoreDoc(StreamInput in) throws IOException {
@@ -426,7 +388,7 @@ public static void writeTopDocsIncludingShardIndex(StreamOutput out, TopDocs top
426388
out.writeByte((byte) 2);
427389
writeTotalHits(out, topDocs.totalHits);
428390
out.writeString(topFieldGroups.field);
429-
out.writeArray(Lucene::writeSortField, topFieldGroups.fields);
391+
writeSortFieldArray(out, topFieldGroups.fields);
430392
out.writeVInt(topDocs.scoreDocs.length);
431393
for (int i = 0; i < topDocs.scoreDocs.length; i++) {
432394
ScoreDoc doc = topFieldGroups.scoreDocs[i];
@@ -437,7 +399,7 @@ public static void writeTopDocsIncludingShardIndex(StreamOutput out, TopDocs top
437399
} else if (topDocs instanceof TopFieldDocs topFieldDocs) {
438400
out.writeByte((byte) 1);
439401
writeTotalHits(out, topDocs.totalHits);
440-
out.writeArray(Lucene::writeSortField, topFieldDocs.fields);
402+
writeSortFieldArray(out, topFieldDocs.fields);
441403
out.writeArray((o, doc) -> {
442404
writeFieldDoc(o, (FieldDoc) doc);
443405
o.writeVInt(doc.shardIndex);
@@ -452,6 +414,10 @@ public static void writeTopDocsIncludingShardIndex(StreamOutput out, TopDocs top
452414
}
453415
}
454416

417+
public static void writeSortFieldArray(StreamOutput out, SortField[] sortFields) throws IOException {
418+
out.writeArray(Lucene::writeSortField, sortFields);
419+
}
420+
455421
/**
456422
* Read side counterpart to {@link #writeTopDocsIncludingShardIndex} and the same as {@link #readTopDocs(StreamInput)} but for the
457423
* added shard index values that are read.
@@ -474,7 +440,7 @@ public static TopDocs readTopDocsIncludingShardIndex(StreamInput in) throws IOEx
474440
return new TopDocs(totalHits, scoreDocs);
475441
} else if (type == 1) {
476442
TotalHits totalHits = readTotalHits(in);
477-
SortField[] fields = in.readArray(Lucene::readSortField, SortField[]::new);
443+
SortField[] fields = readSortFieldArray(in);
478444
FieldDoc[] fieldDocs = new FieldDoc[in.readVInt()];
479445
for (int i = 0; i < fieldDocs.length; i++) {
480446
var fieldDoc = readFieldDoc(in);
@@ -485,7 +451,7 @@ public static TopDocs readTopDocsIncludingShardIndex(StreamInput in) throws IOEx
485451
} else if (type == 2) {
486452
TotalHits totalHits = readTotalHits(in);
487453
String field = in.readString();
488-
SortField[] fields = in.readArray(Lucene::readSortField, SortField[]::new);
454+
SortField[] fields = readSortFieldArray(in);
489455
int size = in.readVInt();
490456
Object[] collapseValues = new Object[size];
491457
FieldDoc[] fieldDocs = new FieldDoc[size];
@@ -501,6 +467,10 @@ public static TopDocs readTopDocsIncludingShardIndex(StreamInput in) throws IOEx
501467
}
502468
}
503469

470+
public static SortField[] readSortFieldArray(StreamInput in) throws IOException {
471+
return in.readArray(Lucene::readSortField, SortField[]::new);
472+
}
473+
504474
public static void writeTopDocs(StreamOutput out, TopDocsAndMaxScore topDocs) throws IOException {
505475
if (topDocs.topDocs instanceof TopFieldGroups topFieldGroups) {
506476
out.writeByte((byte) 2);
@@ -509,7 +479,7 @@ public static void writeTopDocs(StreamOutput out, TopDocsAndMaxScore topDocs) th
509479
out.writeFloat(topDocs.maxScore);
510480

511481
out.writeString(topFieldGroups.field);
512-
out.writeArray(Lucene::writeSortField, topFieldGroups.fields);
482+
writeSortFieldArray(out, topFieldGroups.fields);
513483

514484
out.writeVInt(topFieldGroups.scoreDocs.length);
515485
for (int i = 0; i < topFieldGroups.scoreDocs.length; i++) {
@@ -523,7 +493,7 @@ public static void writeTopDocs(StreamOutput out, TopDocsAndMaxScore topDocs) th
523493
writeTotalHits(out, topFieldDocs.totalHits);
524494
out.writeFloat(topDocs.maxScore);
525495

526-
out.writeArray(Lucene::writeSortField, topFieldDocs.fields);
496+
writeSortFieldArray(out, topFieldDocs.fields);
527497
out.writeArray((o, doc) -> writeFieldDoc(o, (FieldDoc) doc), topFieldDocs.scoreDocs);
528498
} else {
529499
out.writeByte((byte) 0);
@@ -598,14 +568,17 @@ public static void writeSortValue(StreamOutput out, Object field) throws IOExcep
598568

599569
public static void writeFieldDoc(StreamOutput out, FieldDoc fieldDoc) throws IOException {
600570
out.writeArray(Lucene::writeSortValue, fieldDoc.fields);
601-
out.writeVInt(fieldDoc.doc);
602-
out.writeFloat(fieldDoc.score);
571+
doWriteScoreDoc(out, fieldDoc);
603572
}
604573

605574
public static void writeScoreDoc(StreamOutput out, ScoreDoc scoreDoc) throws IOException {
606575
if (scoreDoc.getClass().equals(ScoreDoc.class) == false) {
607576
throw new IllegalArgumentException("This method can only be used to serialize a ScoreDoc, not a " + scoreDoc.getClass());
608577
}
578+
doWriteScoreDoc(out, scoreDoc);
579+
}
580+
581+
private static void doWriteScoreDoc(StreamOutput out, ScoreDoc scoreDoc) throws IOException {
609582
out.writeVInt(scoreDoc.doc);
610583
out.writeFloat(scoreDoc.score);
611584
}
@@ -662,17 +635,12 @@ private static SortField rewriteMergeSortField(SortField sortField) {
662635
}
663636
}
664637

665-
public static void writeSortField(StreamOutput out, SortField sortField) throws IOException {
638+
static void writeSortField(StreamOutput out, SortField sortField) throws IOException {
666639
sortField = rewriteMergeSortField(sortField);
667640
if (sortField.getClass() != SortField.class) {
668641
throw new IllegalArgumentException("Cannot serialize SortField impl [" + sortField + "]");
669642
}
670-
if (sortField.getField() == null) {
671-
out.writeBoolean(false);
672-
} else {
673-
out.writeBoolean(true);
674-
out.writeString(sortField.getField());
675-
}
643+
out.writeOptionalString(sortField.getField());
676644
if (sortField.getComparatorSource() != null) {
677645
IndexFieldData.XFieldComparatorSource comparatorSource = (IndexFieldData.XFieldComparatorSource) sortField
678646
.getComparatorSource();

server/src/main/java/org/elasticsearch/search/SearchHits.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,9 @@ public static SearchHits readFrom(StreamInput in, boolean pooled) throws IOExcep
140140
isPooled = isPooled || hit.isPooled();
141141
}
142142
}
143-
var sortFields = in.readOptionalArray(Lucene::readSortField, SortField[]::new);
143+
var sortFields = in.readOptional(Lucene::readSortFieldArray);
144144
var collapseField = in.readOptionalString();
145-
var collapseValues = in.readOptionalArray(Lucene::readSortValue, Object[]::new);
145+
var collapseValues = in.readOptional(Lucene::readSortValues);
146146
if (isPooled) {
147147
return new SearchHits(hits, totalHits, maxScore, sortFields, collapseField, collapseValues);
148148
} else {
@@ -164,7 +164,7 @@ public void writeTo(StreamOutput out) throws IOException {
164164
}
165165
out.writeFloat(maxScore);
166166
out.writeArray(hits);
167-
out.writeOptionalArray(Lucene::writeSortField, sortFields);
167+
out.writeOptional(Lucene::writeSortFieldArray, sortFields);
168168
out.writeOptionalString(collapseField);
169169
out.writeOptionalArray(Lucene::writeSortValue, collapseValues);
170170
}

server/src/main/java/org/elasticsearch/search/SearchSortValues.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ public SearchSortValues(Object[] rawSortValues, DocValueFormat[] sortValueFormat
5151
}
5252

5353
public static SearchSortValues readFrom(StreamInput in) throws IOException {
54-
Object[] formattedSortValues = in.readArray(Lucene::readSortValue, Object[]::new);
55-
Object[] rawSortValues = in.readArray(Lucene::readSortValue, Object[]::new);
54+
Object[] formattedSortValues = Lucene.readSortValues(in);
55+
Object[] rawSortValues = Lucene.readSortValues(in);
5656
if (formattedSortValues.length == 0 && rawSortValues.length == 0) {
5757
return EMPTY;
5858
}

server/src/main/java/org/elasticsearch/search/SearchSortValuesAndFormats.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ public SearchSortValuesAndFormats(Object[] rawSortValues, DocValueFormat[] sortV
4848
}
4949

5050
public SearchSortValuesAndFormats(StreamInput in) throws IOException {
51-
this.rawSortValues = in.readArray(Lucene::readSortValue, Object[]::new);
52-
this.formattedSortValues = in.readArray(Lucene::readSortValue, Object[]::new);
51+
this.rawSortValues = Lucene.readSortValues(in);
52+
this.formattedSortValues = Lucene.readSortValues(in);
5353
this.sortValueFormats = new DocValueFormat[formattedSortValues.length];
5454
for (int i = 0; i < sortValueFormats.length; ++i) {
5555
sortValueFormats[i] = in.readNamedWriteable(DocValueFormat.class);

0 commit comments

Comments
 (0)