diff options
Diffstat (limited to 'container-search/src/main/java/com/yahoo/prelude/fastsearch/DocsumDefinition.java')
-rw-r--r-- | container-search/src/main/java/com/yahoo/prelude/fastsearch/DocsumDefinition.java | 92 |
1 files changed, 73 insertions, 19 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 33b912da42f..8a7d14d5f49 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 @@ -1,11 +1,15 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. 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.search.schema.DocumentSummary; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.stream.Collectors; +import java.util.Set; /** * A docsum definition which knows how to decode a certain class of document @@ -17,26 +21,55 @@ import java.util.stream.Collectors; public class DocsumDefinition { private final String name; - private final Map<String, DocsumField> fields; + private final ImmutableList<DocsumField> fields; /** True if this contains dynamic fields */ private final boolean dynamic; - public DocsumDefinition(DocumentSummary documentSummary) { - this.name = documentSummary.name(); - this.dynamic = documentSummary.isDynamic(); - this.fields = documentSummary.fields() - .stream() - .map(field -> DocsumField.create(field.name(), field.type().asString())) - .collect(Collectors.toUnmodifiableMap(field -> field.getName(), - field -> field)); + // Mapping between field names and their index in this.fields + private final ImmutableMap<String, Integer> fieldNameToIndex; + + public DocsumDefinition(String name, List<DocsumField> fields) { + this.name = name; + this.dynamic = false; + this.fields = ImmutableList.copyOf(fields); + ImmutableMap.Builder<String, Integer> fieldNameToIndexBuilder = new ImmutableMap.Builder<>(); + int i = 0; + for (DocsumField field : fields) + fieldNameToIndexBuilder.put(field.name, i++); + this.fieldNameToIndex = fieldNameToIndexBuilder.build(); } - public String name() { return name; } - public Map<String, DocsumField> fields() { return fields; } + DocsumDefinition(DocumentdbInfoConfig.Documentdb.Summaryclass config) { + this.name = config.name(); - /** Returns whether this summary contains one or more dynamic fields */ - public boolean isDynamic() { return dynamic; } + List<DocsumField> fieldsBuilder = new ArrayList<>(); + Map<String, Integer> fieldNameToIndexBuilder = new HashMap<>(); + boolean dynamic = false; + for (DocumentdbInfoConfig.Documentdb.Summaryclass.Fields field : config.fields()) { + // no, don't switch the order of the two next lines :) + fieldNameToIndexBuilder.put(field.name(), fieldsBuilder.size()); + fieldsBuilder.add(DocsumField.create(field.name(), field.type())); + if (field.dynamic()) + dynamic = true; + } + this.dynamic = dynamic; + fields = ImmutableList.copyOf(fieldsBuilder); + fieldNameToIndex = ImmutableMap.copyOf(fieldNameToIndexBuilder); + } + + /** Returns the field at this index, or null if none */ + public DocsumField getField(int fieldIndex) { + if (fieldIndex >= fields.size()) return null; + return fields.get(fieldIndex); + } + + /** Returns the field with this name, or null if none */ + public DocsumField getField(String fieldName) { + Integer index = fieldNameToIndex.get(fieldName); + if (index == null) return null; + return getField(index); + } /** * Returns the given slime value as the type specified in this, or null if the type is not known. @@ -45,14 +78,35 @@ public class DocsumDefinition { * another has not. */ public Object convert(String fieldName, Inspector value) { - DocsumField field = fields.get(fieldName); - if (field == null || ! value.valid()) return null; - return field.convert(value); + DocsumField fieldType = getField(fieldName); + if (fieldType == null || ! value.valid()) return null; + return fieldType.convert(value); + } + + public Set<String> fieldNames() { + return fieldNameToIndex.keySet(); } @Override public String toString() { - return "docsum definition '" + name() + "'"; + return "docsum definition '" + getName() + "'"; + } + + public String getName() { + return name; + } + + public int getFieldCount() { + return fields.size(); + } + + public List<DocsumField> getFields() { + return fields; + } + + /** Returns whether this summary contains one or more dynamic fields */ + public boolean isDynamic() { + return dynamic; } } |