diff options
author | Jon Bratseth <bratseth@oath.com> | 2018-05-11 19:47:49 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@oath.com> | 2018-05-11 19:47:49 +0200 |
commit | 5aee8939ac121c16e3eeee3a9dab482149e1ffd0 (patch) | |
tree | a90724057d5f15ae4239daea30759881c779791c /container-search | |
parent | 40e9964ea6f7e9940aebd45591822cb7982a914d (diff) |
Convert fields and test traversal first
Diffstat (limited to 'container-search')
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() { |