diff options
Diffstat (limited to 'container-search/src')
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++; + } + } } |