summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/prelude/fastsearch/DocsumDefinition.java
diff options
context:
space:
mode:
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.java92
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;
}
}