diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-09-16 22:57:02 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-16 22:57:02 +0200 |
commit | 049d1eb173f90f002e9f7251476fa0c8a71e6f7e (patch) | |
tree | 432ee8550037db4765d5fe8bad542b7038643fe3 /container-search/src/test | |
parent | 74a39bfa696568cf2d94b9c3a773f4fc0c2d0d54 (diff) |
Revert "Revert "Revert "Revert "Use a LeanHit until merging is done." MERGEOK"""
Diffstat (limited to 'container-search/src/test')
3 files changed, 122 insertions, 4 deletions
diff --git a/container-search/src/test/java/com/yahoo/search/dispatch/LeanHitTest.java b/container-search/src/test/java/com/yahoo/search/dispatch/LeanHitTest.java new file mode 100644 index 00000000000..3478038e427 --- /dev/null +++ b/container-search/src/test/java/com/yahoo/search/dispatch/LeanHitTest.java @@ -0,0 +1,42 @@ +package com.yahoo.search.dispatch; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class LeanHitTest { + byte [] gidA = {'a'}; + byte [] gidB = {'b'}; + byte [] gidC = {'c'}; + private void verifyTransitiveOrdering(LeanHit a, LeanHit b, LeanHit c) { + assertTrue(a.compareTo(b) < 0); + assertTrue(b.compareTo(c) < 0); + assertTrue(a.compareTo(c) < 0); + assertTrue(b.compareTo(a) > 0); + assertTrue(c.compareTo(b) > 0); + assertTrue(c.compareTo(a) > 0); + } + @Test + public void testOrderingByRelevance() { + assertEquals(0, new LeanHit(gidA, 0, 0, 1).compareTo(new LeanHit(gidA, 0, 0, 1))); + verifyTransitiveOrdering(new LeanHit(gidA, 0, 0, 1), + new LeanHit(gidA, 0, 0, 0), + new LeanHit(gidA, 0, 0, -1)); + } + @Test + public void testOrderingByGid() { + assertEquals(0, new LeanHit(gidA, 0, 0, 1).compareTo(new LeanHit(gidA, 0, 0, 1))); + + verifyTransitiveOrdering(new LeanHit(gidA, 0, 0, 1), + new LeanHit(gidB, 0, 0, 1), + new LeanHit(gidC, 0, 0, 1)); + } + @Test + public void testOrderingBySortData() { + assertEquals(0, new LeanHit(gidA, 0, 0, gidA).compareTo(new LeanHit(gidA, 0, 0, gidA))); + verifyTransitiveOrdering(new LeanHit(gidA, 0, 0, gidA), + new LeanHit(gidA, 0, 0, gidB), + new LeanHit(gidA, 0, 0, gidC)); + } +} diff --git a/container-search/src/test/java/com/yahoo/search/dispatch/MockInvoker.java b/container-search/src/test/java/com/yahoo/search/dispatch/MockInvoker.java index 4b2f63d6b89..2fe434d6f3f 100644 --- a/container-search/src/test/java/com/yahoo/search/dispatch/MockInvoker.java +++ b/container-search/src/test/java/com/yahoo/search/dispatch/MockInvoker.java @@ -1,6 +1,7 @@ // Copyright 2019 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.search.dispatch; +import com.yahoo.prelude.fastsearch.FastHit; import com.yahoo.search.Query; import com.yahoo.search.Result; import com.yahoo.search.dispatch.searchcluster.Node; @@ -37,13 +38,20 @@ class MockInvoker extends SearchInvoker { } @Override - protected Result getSearchResult(Execution execution) throws IOException { - Result ret = new Result(query); + protected InvokerResult getSearchResult(Execution execution) throws IOException { + InvokerResult ret = new InvokerResult(query, 10); if (coverage != null) { - ret.setCoverage(coverage); + ret.getResult().setCoverage(coverage); } if (hits != null) { - ret.hits().addAll(hits); + for (Hit h : hits) { + if (h instanceof FastHit) { + FastHit fh = (FastHit) h; + ret.getLeanHits().add(new LeanHit(fh.getRawGlobalId(), fh.getPartId(), fh.getDistributionKey(), fh.getRelevance().getScore())); + } else { + ret.getResult().hits().add(h); + } + } } return ret; } 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++; + } + } } |