aboutsummaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2018-05-11 19:47:49 +0200
committerJon Bratseth <bratseth@oath.com>2018-05-11 19:47:49 +0200
commit5aee8939ac121c16e3eeee3a9dab482149e1ffd0 (patch)
treea90724057d5f15ae4239daea30759881c779791c /container-search
parent40e9964ea6f7e9940aebd45591822cb7982a914d (diff)
Convert fields and test traversal first
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/fastsearch/DocsumDefinition.java13
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java13
-rw-r--r--container-search/src/test/java/com/yahoo/prelude/fastsearch/SlimeSummaryTestCase.java23
3 files changed, 33 insertions, 16 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/DocsumDefinition.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/DocsumDefinition.java
index e20340a03c0..675c1af6545 100644
--- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/DocsumDefinition.java
+++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/DocsumDefinition.java
@@ -3,6 +3,7 @@ package com.yahoo.prelude.fastsearch;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.yahoo.data.access.Inspector;
import com.yahoo.vespa.config.search.SummaryConfig;
import com.yahoo.container.search.LegacyEmulationConfig;
@@ -74,6 +75,18 @@ public class DocsumDefinition {
return getField(index);
}
+ /**
+ * Returns the given slime value as the type specified in this, or null if the type is not known.
+ * Even in a correctly configured system we may encounter field names for which we do not know the type,
+ * in the time period when a configuration is changing and one node has received the new configuration and
+ * another has not.
+ */
+ public Object convert(String fieldName, Inspector value) {
+ DocsumField fieldType = getField(fieldName);
+ if (fieldType == null) return null;
+ return fieldType.convert(value);
+ }
+
public Set<String> fieldNames() {
return fieldNameToIndex.keySet();
}
diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java
index 4310124037e..0b3ddf689d9 100644
--- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java
+++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java
@@ -519,6 +519,7 @@ public class FastHit extends Hit {
}
Object getField(String name) {
+ // TODO: When emulConfig is removed, change the below to use type.convert(name, data.field(name))
DocsumField fieldType = type.getField(name);
if (fieldType == null) return null;
Inspector fieldValue = data.field(name);
@@ -528,8 +529,10 @@ public class FastHit extends Hit {
void forEachField(BiConsumer<String, Object> consumer) {
data.traverse((ObjectTraverser)(name, value) -> {
- if ( ! shadowed(name) && ! removed(name))
- consumer.accept(name, value);
+ Object convertedValue = type.convert(name, value);
+ if ( convertedValue != null && !shadowed(name) && !removed(name)) {
+ consumer.accept(name, convertedValue);
+ }
});
}
@@ -619,9 +622,9 @@ public class FastHit extends Hit {
@Override
protected Map.Entry<String, Object> toValue(Map.Entry<String, Inspector> field) {
- DocsumField fieldType = type.getField(field.getKey());
- if (fieldType == null) return null; // type and content mismatch: May happen during reconfig
- return new SummaryFieldEntry(field.getKey(), fieldType.convert(field.getValue()));
+ Object convertedValue = type.convert(field.getKey(), field.getValue());
+ if (convertedValue == null) return null;
+ return new SummaryFieldEntry(field.getKey(), convertedValue);
}
private static final class SummaryFieldEntry implements Map.Entry<String, Object> {
diff --git a/container-search/src/test/java/com/yahoo/prelude/fastsearch/SlimeSummaryTestCase.java b/container-search/src/test/java/com/yahoo/prelude/fastsearch/SlimeSummaryTestCase.java
index 1b74a6c5b29..a9eb9c5e6ce 100644
--- a/container-search/src/test/java/com/yahoo/prelude/fastsearch/SlimeSummaryTestCase.java
+++ b/container-search/src/test/java/com/yahoo/prelude/fastsearch/SlimeSummaryTestCase.java
@@ -266,6 +266,14 @@ public class SlimeSummaryTestCase {
/** Asserts that the expected fields are what is returned from every access method of Hit */
private void assertFields(Map<String, Object> expected, Hit hit) {
+ // field traverser
+ Map<String, Object> traversed = new HashMap<>();
+ hit.forEachField((name, value) -> {
+ if (traversed.containsKey(name))
+ fail("Multiple callbacks for " + name);
+ traversed.put(name, value);
+ });
+ assertEquals(expected, traversed);
// fieldKeys
int fieldNameIteratorFieldCount = 0;
for (Iterator<String> i = hit.fieldKeys().iterator(); i.hasNext(); ) {
@@ -273,10 +281,8 @@ public class SlimeSummaryTestCase {
assertTrue(expected.containsKey(i.next()));
}
assertEquals(expected.size(), fieldNameIteratorFieldCount);
+ // fieldKeys
assertEquals(expected.keySet(), hit.fieldKeys());
- // getField
- for (Map.Entry<String, Object> field : expected.entrySet())
- assertEquals(field.getValue(), hit.getField(field.getKey()));
// fields
assertEquals(expected, hit.fields());
// fieldIterator
@@ -287,14 +293,9 @@ public class SlimeSummaryTestCase {
assertEquals(field.getValue(), expected.get(field.getKey()));
}
assertEquals(expected.size(), fieldIteratorFieldCount);
- // field traverser
- Map<String, Object> traversed = new HashMap<>();
- hit.forEachField((name, value) -> {
- if (traversed.containsKey(name))
- fail("Multiple callbacks for " + name);
- traversed.put(name, value);
- });
- assertEquals(expected, traversed);
+ // getField
+ for (Map.Entry<String, Object> field : expected.entrySet())
+ assertEquals(field.getValue(), hit.getField(field.getKey()));
}
private byte[] emptySummary() {