summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-08-14 18:05:01 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2019-08-14 18:05:01 +0200
commitd0cbb75e26ce816c15da3f0ced77284e8a5ecf46 (patch)
tree9df4769132f7f8136cfe43cf5be09054e1648fc1 /container-search
parent6ea9324d3dd790ae3ef389ed2d34d33837ba6a80 (diff)
Differentiate between empty and missing docsum.
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcFillInvoker.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java2
-rw-r--r--container-search/src/test/java/com/yahoo/search/dispatch/rpc/FillTestCase.java40
-rw-r--r--container-search/src/test/java/com/yahoo/search/dispatch/rpc/MockClient.java2
4 files changed, 44 insertions, 2 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcFillInvoker.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcFillInvoker.java
index 0d3f2e7d0a1..33215f0a9f2 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcFillInvoker.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcFillInvoker.java
@@ -240,7 +240,7 @@ public class RpcFillInvoker extends FillInvoker {
int skippedHits = 0;
for (int i = 0; i < hits.size(); i++) {
Inspector summary = summaries.entry(i).field("docsum");
- if (summary.fieldCount() != 0) {
+ if (summary.valid()) {
hits.get(i).setField(Hit.SDDOCNAME_FIELD, documentDb.getName());
hits.get(i).addSummary(documentDb.getDocsumDefinitionSet().getDocsum(summaryClass), summary);
hits.get(i).setFilled(summaryClass);
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java
index cd4ba191a7d..341b9b2bce3 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java
@@ -201,7 +201,7 @@ public class RpcProtobufFillInvoker extends FillInvoker {
int skippedHits = 0;
for (int i = 0; i < hits.size(); i++) {
Inspector summary = summaries.entry(i).field("docsum");
- if (summary.fieldCount() != 0) {
+ if (summary.valid()) {
hits.get(i).setField(Hit.SDDOCNAME_FIELD, documentDb.getName());
hits.get(i).addSummary(documentDb.getDocsumDefinitionSet().getDocsum(summaryClass), summary);
hits.get(i).setFilled(summaryClass);
diff --git a/container-search/src/test/java/com/yahoo/search/dispatch/rpc/FillTestCase.java b/container-search/src/test/java/com/yahoo/search/dispatch/rpc/FillTestCase.java
index 6d1f19eeaf2..cc32bfe1572 100644
--- a/container-search/src/test/java/com/yahoo/search/dispatch/rpc/FillTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/dispatch/rpc/FillTestCase.java
@@ -105,6 +105,46 @@ public class FillTestCase {
assertEquals(3L, result.hits().get("hit:3").getField("field2"));
assertNull(result.hits().get("hit:4").getField("field2"));
+ assertNull(result.hits().getError());
+ }
+
+ @Test
+ public void testMissingHits() {
+ Map<Integer, Client.NodeConnection> nodes = new HashMap<>();
+ nodes.put(0, client.createConnection("host0", 123));
+ nodes.put(1, client.createConnection("host1", 123));
+ nodes.put(2, client.createConnection("host2", 123));
+ RpcResourcePool rpcResourcePool = new RpcResourcePool(nodes);
+ RpcInvokerFactory factory = new RpcInvokerFactory(rpcResourcePool, null, true);
+
+ Query query = new Query();
+ Result result = new Result(query);
+ result.hits().add(createHit(0, 0));
+ result.hits().add(createHit(2, 1));
+ result.hits().add(createHit(1, 2));
+ result.hits().add(createHit(2, 3));
+ result.hits().add(createHit(0, 4));
+
+ client.setDocsumReponse("host0", 0, "summaryClass1", map("field1", "s.0.0", "field2", 0));
+ client.setDocsumReponse("host2", 1, "summaryClass1", map("field1", "s.2.1", "field2", 1));
+ client.setDocsumReponse("host1", 2, "summaryClass1", null);
+ client.setDocsumReponse("host2", 3, "summaryClass1", map("field1", "s.2.3", "field2", 3));
+ client.setDocsumReponse("host0", 4, "summaryClass1", null);
+
+ factory.createFillInvoker(db()).fill(result, "summaryClass1");
+
+ assertEquals("s.0.0", result.hits().get("hit:0").getField("field1").toString());
+ assertEquals("s.2.1", result.hits().get("hit:1").getField("field1").toString());
+ assertNull(result.hits().get("hit:2").getField("field1"));
+ assertEquals("s.2.3", result.hits().get("hit:3").getField("field1").toString());
+ assertNull(result.hits().get("hit:4").getField("field1"));
+
+ assertEquals(0L, result.hits().get("hit:0").getField("field2"));
+ assertEquals(1L, result.hits().get("hit:1").getField("field2"));
+ assertNull(result.hits().get("hit:2").getField("field2"));
+ assertEquals(3L, result.hits().get("hit:3").getField("field2"));
+ assertNull(result.hits().get("hit:4").getField("field2"));
+
assertEquals("Missing hit summary data for summary summaryClass1 for 2 hits", result.hits().getError().getDetailedMessage());
}
diff --git a/container-search/src/test/java/com/yahoo/search/dispatch/rpc/MockClient.java b/container-search/src/test/java/com/yahoo/search/dispatch/rpc/MockClient.java
index b6b7a1f5819..2fc8c0fd620 100644
--- a/container-search/src/test/java/com/yahoo/search/dispatch/rpc/MockClient.java
+++ b/container-search/src/test/java/com/yahoo/search/dispatch/rpc/MockClient.java
@@ -71,6 +71,8 @@ public class MockClient implements Client {
Cursor root = responseSlime.setObject();
Cursor docsums = root.setArray("docsums");
for (Map<String, Object> docsumFields : docsumsToReturn) {
+ if (docsumFields == null) continue;
+
Cursor docsumItem = docsums.addObject();
Cursor docsum = docsumItem.setObject("docsum");
for (Map.Entry<String, Object> field : docsumFields.entrySet()) {