summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-09-16 17:54:07 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2019-09-16 17:54:07 +0200
commit4c0c2e8019ceb81a1ccd4f896309381f7d7cdaa7 (patch)
treec899ae3940a276edb46aa70f8ecbee34a578f3f2 /container-search
parent10a7fd163b55c9d501fec44eceaa3b36cebd7861 (diff)
Add simple protobuf decoding test and fix logic inversion.
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/LeanHit.java12
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java4
-rw-r--r--container-search/src/test/java/com/yahoo/search/dispatch/rpc/ProtobufSerializationTest.java68
3 files changed, 76 insertions, 8 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/LeanHit.java b/container-search/src/main/java/com/yahoo/search/dispatch/LeanHit.java
index 3ce8459ac8f..6ec0e3f27d1 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/LeanHit.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/LeanHit.java
@@ -26,12 +26,12 @@ public class LeanHit implements Comparable<LeanHit> {
this.partId = partId;
this.distributionKey = distributionKey;
}
- double getRelevance() { return relevance; }
- byte [] getGid() { return gid; }
- byte [] getSortData() { return sortData; }
- boolean hasSortData() { return sortData != null; }
- int getPartId() { return partId; }
- int getDistributionKey() { return distributionKey; }
+ public double getRelevance() { return relevance; }
+ public byte [] getGid() { return gid; }
+ public byte [] getSortData() { return sortData; }
+ public boolean hasSortData() { return sortData != null; }
+ public int getPartId() { return partId; }
+ public int getDistributionKey() { return distributionKey; }
QueryPacketData getQueryPacketData() { return queryPacketData; }
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java
index cf59c3b7bec..7fd41862212 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java
@@ -187,7 +187,7 @@ public class ProtobufSerialization {
return convertToResult(query, protobuf, searcher.getDocumentDatabase(query), partId, distKey);
}
- private static InvokerResult convertToResult(Query query, SearchProtocol.SearchReply protobuf,
+ static InvokerResult convertToResult(Query query, SearchProtocol.SearchReply protobuf,
DocumentDatabase documentDatabase, int partId, int distKey)
{
InvokerResult result = new InvokerResult(query, protobuf.getHitsCount());
@@ -211,7 +211,7 @@ public class ProtobufSerialization {
}
for (var replyHit : protobuf.getHitsList()) {
- LeanHit hit = (!replyHit.getSortData().isEmpty())
+ LeanHit hit = (replyHit.getSortData().isEmpty())
? new LeanHit(replyHit.getGlobalId().toByteArray(), partId, distKey, replyHit.getRelevance())
: new LeanHit(replyHit.getGlobalId().toByteArray(), partId, distKey, replyHit.getSortData().toByteArray());
result.getLeanHits().add(hit);
diff --git a/container-search/src/test/java/com/yahoo/search/dispatch/rpc/ProtobufSerializationTest.java b/container-search/src/test/java/com/yahoo/search/dispatch/rpc/ProtobufSerializationTest.java
index 0b1d0d07e7a..b736ca1e6df 100644
--- a/container-search/src/test/java/com/yahoo/search/dispatch/rpc/ProtobufSerializationTest.java
+++ b/container-search/src/test/java/com/yahoo/search/dispatch/rpc/ProtobufSerializationTest.java
@@ -2,22 +2,32 @@
package com.yahoo.search.dispatch.rpc;
+import ai.vespa.searchlib.searchprotocol.protobuf.SearchProtocol;
+import com.google.protobuf.ByteString;
import com.yahoo.document.GlobalId;
import com.yahoo.document.idstring.IdString;
import com.yahoo.prelude.fastsearch.FastHit;
import com.yahoo.search.Query;
+import com.yahoo.search.dispatch.InvokerResult;
+import com.yahoo.search.dispatch.LeanHit;
import org.junit.Test;
import java.io.IOException;
import java.util.Collections;
+import java.util.List;
import static org.hamcrest.Matchers.equalTo;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
/**
* @author ollivir
*/
public class ProtobufSerializationTest {
+ static final double DELTA = 0.000000000001;
+
@Test
public void testDocsumSerialization() throws IOException {
Query q = new Query("search/?query=test&hits=10&offset=3");
@@ -29,4 +39,62 @@ public class ProtobufSerializationTest {
assertThat(bytes.length, equalTo(41));
}
+
+ SearchProtocol.SearchReply createSearchReply(int numHits, boolean useSorting) {
+ SearchProtocol.SearchReply.Builder reply = SearchProtocol.SearchReply.newBuilder();
+ reply.setTotalHitCount(7);
+
+ for (int i = 0; i < numHits; i++) {
+ SearchProtocol.Hit.Builder hit = SearchProtocol.Hit.newBuilder();
+ byte [] gid = {'a','a','a','a','a','a','a','a','a','a','a', (byte)i};
+ hit.setGlobalId(ByteString.copyFrom(gid));
+ if (useSorting) {
+ gid[0] = 'b';
+ hit.setSortData(ByteString.copyFrom(gid));
+ } else {
+ hit.setRelevance(numHits - i);
+ }
+ reply.addHits(hit);
+ }
+ return reply.build();
+ }
+ @Test
+ public void testSearhReplyDecodingWithRelevance() {
+ Query q = new Query("search/?query=test");
+ InvokerResult result = ProtobufSerialization.convertToResult(q, createSearchReply(5, false), null, 1, 2);
+ assertEquals(result.getResult().getTotalHitCount(), 7);
+ List<LeanHit> hits = result.getLeanHits();
+ assertEquals(5, hits.size());
+ double expectedRelevance = 5;
+ int hitNum = 0;
+ for (LeanHit hit : hits) {
+ assertEquals('a', hit.getGid()[0]);
+ assertEquals(hitNum, hit.getGid()[11]);
+ assertEquals(expectedRelevance--, hit.getRelevance(), DELTA);
+ assertEquals(1, hit.getPartId());
+ assertEquals(2, hit.getDistributionKey());
+ assertFalse(hit.hasSortData());
+ hitNum++;
+ }
+ }
+ @Test
+ public void testSearhReplyDecodingWithSortData() {
+ Query q = new Query("search/?query=test");
+ InvokerResult result = ProtobufSerialization.convertToResult(q, createSearchReply(5, true), null, 1, 2);
+ assertEquals(result.getResult().getTotalHitCount(), 7);
+ List<LeanHit> hits = result.getLeanHits();
+ assertEquals(5, hits.size());
+ int hitNum = 0;
+ for (LeanHit hit : hits) {
+ assertEquals('a', hit.getGid()[0]);
+ assertEquals(hitNum, hit.getGid()[11]);
+ assertEquals(Double.NEGATIVE_INFINITY, hit.getRelevance(), DELTA);
+ assertEquals(1, hit.getPartId());
+ assertEquals(2, hit.getDistributionKey());
+ assertTrue(hit.hasSortData());
+ assertEquals('b', hit.getSortData()[0]);
+ assertEquals(hitNum, hit.getSortData()[11]);
+ hitNum++;
+ }
+ }
}