summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/fs4/QueryResultPacket.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo/fs4/QueryResultPacket.java')
-rw-r--r--container-search/src/main/java/com/yahoo/fs4/QueryResultPacket.java34
1 files changed, 26 insertions, 8 deletions
diff --git a/container-search/src/main/java/com/yahoo/fs4/QueryResultPacket.java b/container-search/src/main/java/com/yahoo/fs4/QueryResultPacket.java
index 239101184ea..6a27beefb5e 100644
--- a/container-search/src/main/java/com/yahoo/fs4/QueryResultPacket.java
+++ b/container-search/src/main/java/com/yahoo/fs4/QueryResultPacket.java
@@ -7,7 +7,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-
/**
* A query result packet (code 217). This packet can be decoded only.
*
@@ -108,10 +107,9 @@ public class QueryResultPacket extends Packet {
nodesReplied = buffer.getShort();
}
- if (sortData && documentCount > 0) { // sort data is not needed - skip
- buffer.position(buffer.position() + (documentCount -1) * 4); // one sortIndex int per document
- int sortDataLengthInBytes = buffer.getInt();
- buffer.position(buffer.position() + sortDataLengthInBytes);
+ byte[][] documentSortData = null;
+ if (sortData && documentCount > 0) {
+ documentSortData = decodeSortData(buffer, documentCount);
}
if (groupDataFeature) {
@@ -125,7 +123,7 @@ public class QueryResultPacket extends Packet {
soonActiveDocs = buffer.getLong();
degradedReason = buffer.getInt();
- decodeDocuments(buffer, documentCount);
+ decodeDocuments(buffer, documentCount, documentSortData);
if (propsFeature) {
int numMaps = buffer.getInt();
propsArray = new FS4Properties[numMaps];
@@ -136,6 +134,25 @@ public class QueryResultPacket extends Packet {
}
}
+ private byte[][] decodeSortData(ByteBuffer buffer, int documentCount) {
+ int[] indexes = new int[documentCount];
+ indexes[0] = 0;
+ for (int i = 1; i < documentCount; i++) {
+ indexes[i] = buffer.getInt();
+ }
+
+ int sortDataLengthInBytes = buffer.getInt();
+ byte[][] ret = new byte[indexes.length][];
+
+ for (int i = 0; i < indexes.length; i++) {
+ int end = i + 1 >= indexes.length ? sortDataLengthInBytes : indexes[i + 1];
+ int len = end - indexes[i];
+ ret[i] = new byte[len];
+ buffer.get(ret[i], 0, len);
+ }
+ return ret;
+ }
+
private Number decodeMaxRank(ByteBuffer buffer) {
return Double.valueOf(buffer.getDouble());
}
@@ -161,9 +178,10 @@ public class QueryResultPacket extends Packet {
propsFeature = (QRF_PROPERTIES & features) != 0;
}
- private void decodeDocuments(ByteBuffer buffer, int documentCount) {
+ private void decodeDocuments(ByteBuffer buffer, int documentCount, byte[][] documentSortData) {
for (int i = 0; i < documentCount; i++) {
- documents.add(new DocumentInfo(buffer, this));
+ byte[] sort = documentSortData == null ? null : documentSortData[i];
+ documents.add(new DocumentInfo(buffer, this, sort));
}
}