diff options
Diffstat (limited to 'config-model/src/main/java/com/yahoo')
4 files changed, 290 insertions, 4 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/Search.java b/config-model/src/main/java/com/yahoo/searchdefinition/Search.java index f2386d77324..917fae9f3df 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/Search.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/Search.java @@ -2,16 +2,34 @@ package com.yahoo.searchdefinition; import com.yahoo.config.application.api.ApplicationPackage; -import com.yahoo.document.*; -import com.yahoo.searchdefinition.document.*; +import com.yahoo.document.Field; +import com.yahoo.searchdefinition.document.Attribute; +import com.yahoo.searchdefinition.document.ImmutableImportedSDField; +import com.yahoo.searchdefinition.document.ImmutableSDField; +import com.yahoo.searchdefinition.document.ImportedFields; +import com.yahoo.searchdefinition.document.SDDocumentType; +import com.yahoo.searchdefinition.document.SDField; +import com.yahoo.searchdefinition.document.Stemming; +import com.yahoo.searchdefinition.document.TemporaryImportedFields; import com.yahoo.searchdefinition.document.annotation.SDAnnotationType; import com.yahoo.vespa.documentmodel.DocumentSummary; import com.yahoo.vespa.documentmodel.SummaryField; import java.io.Reader; import java.io.Serializable; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.TreeMap; import java.util.logging.Logger; +import java.util.stream.Stream; /** * <p>A search definition describes (or uses) some document types, defines how these are turned into a relevancy tuned @@ -170,6 +188,13 @@ public class Search implements Serializable { this.importedFields = Optional.of(importedFields); } + public Stream<ImmutableSDField> allImportedFields() { + return importedFields + .map(fields -> fields.fields().values().stream()) + .orElse(Stream.empty()) + .map(ImmutableImportedSDField::new); + } + /** * Gets a document from this search definition * diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java new file mode 100644 index 00000000000..dc5d7794522 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java @@ -0,0 +1,160 @@ +// Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.searchdefinition.document; + +import com.yahoo.document.DataType; +import com.yahoo.document.Field; +import com.yahoo.searchdefinition.Index; +import com.yahoo.searchdefinition.Search; +import com.yahoo.vespa.indexinglanguage.expressions.Expression; +import com.yahoo.vespa.indexinglanguage.expressions.ScriptExpression; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * Wraps {@link ImportedField} as {@link ImmutableSDField}. + * Methods that are not meaningful or relevant for imported fields will throw {@link UnsupportedOperationException}. + * + * @author bjorncs + */ +public class ImmutableImportedSDField implements ImmutableSDField { + + private final ImportedField importedField; + + public ImmutableImportedSDField(ImportedField importedField) { + this.importedField = importedField; + } + + @Override + public <T extends Expression> boolean containsExpression(Class<T> searchFor) { + throw createUnsupportedException(); + } + + @Override + public boolean doesAttributing() { + return importedField.targetField().doesAttributing(); + } + + @Override + public boolean doesIndexing() { + return importedField.targetField().doesIndexing(); + } + + @Override + public boolean doesLowerCasing() { + return importedField.targetField().doesLowerCasing(); + } + + @Override + public boolean isExtraField() { + return false; + } + + @Override + public boolean isHeader() { + return importedField.targetField().isHeader(); + } + + @Override + public boolean isImportedField() { + return true; + } + + @Override + public boolean isIndexStructureField() { + return importedField.targetField().isIndexStructureField(); + } + + @Override + public boolean usesStructOrMap() { + return importedField.targetField().usesStructOrMap(); + } + + @Override + public DataType getDataType() { + return importedField.targetField().getDataType(); + } + + @Override + public Index getIndex(String name) { + throw createUnsupportedException(); + } + + @Override + public List<String> getQueryCommands() { + return importedField.targetField().getQueryCommands(); + } + + @Override + public Map<String, Attribute> getAttributes() { + return importedField.targetField().getAttributes(); + } + + @Override + public Map<String, String> getAliasToName() { + return Collections.emptyMap(); + } + + @Override + public ScriptExpression getIndexingScript() { + throw createUnsupportedException(); + } + + @Override + public Matching getMatching() { + throw createUnsupportedException(); + } + + @Override + public NormalizeLevel getNormalizing() { + throw createUnsupportedException(); + } + + @Override + public ImmutableSDField getStructField(String name) { + throw createUnsupportedException(); + } + + @Override + public Collection<? extends ImmutableSDField> getStructFields() { + throw createUnsupportedException(); + } + + @Override + public Stemming getStemming() { + throw createUnsupportedException(); + } + + @Override + public Stemming getStemming(Search search) { + throw createUnsupportedException(); + } + + @Override + public Ranking getRanking() { + throw createUnsupportedException(); + } + + @Override + public String getName() { + return importedField.fieldName(); // Name of the imported field, not the target field + } + + /** + * Returns a field representation of the imported field. + * Changes to the returned instance are not propagated back to the underlying imported field! + */ + @Override + public Field asField() { + return new Field( + importedField.fieldName(), + importedField.targetField().getDataType()); + } + + private static UnsupportedOperationException createUnsupportedException() { + return new UnsupportedOperationException("This aspect is not meaningful or relevant for an imported field."); + } + +} diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableSDField.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableSDField.java new file mode 100644 index 00000000000..926eafe37f6 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableSDField.java @@ -0,0 +1,72 @@ +// Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.searchdefinition.document; + +import com.yahoo.document.DataType; +import com.yahoo.document.Field; +import com.yahoo.searchdefinition.Index; +import com.yahoo.searchdefinition.Search; +import com.yahoo.vespa.indexinglanguage.expressions.Expression; +import com.yahoo.vespa.indexinglanguage.expressions.ScriptExpression; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * An interface containing the non-mutating methods of {@link SDField}. + * For description of the methods see {@link SDField}. + * + * @author bjorncs + */ +public interface ImmutableSDField { + <T extends Expression> boolean containsExpression(Class<T> searchFor); + + boolean doesAttributing(); + + boolean doesIndexing(); + + boolean doesLowerCasing(); + + boolean isExtraField(); + + boolean isHeader(); + + boolean isImportedField(); + + boolean isIndexStructureField(); + + boolean usesStructOrMap(); + + DataType getDataType(); + + Index getIndex(String name); + + List<String> getQueryCommands(); + + Map<String, Attribute> getAttributes(); + + Map<String, String> getAliasToName(); + + ScriptExpression getIndexingScript(); + + Matching getMatching(); + + NormalizeLevel getNormalizing(); + + ImmutableSDField getStructField(String name); + + Collection<? extends ImmutableSDField> getStructFields(); + + Stemming getStemming(); + + Stemming getStemming(Search search); + + Ranking getRanking(); + + String getName(); + + /** + * @return a {@link Field} representation (which is sadly not immutable). + */ + Field asField(); +} diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java index f5d208d1b41..3611bc03989 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java @@ -28,7 +28,7 @@ import java.util.*; * * @author bratseth */ -public class SDField extends Field implements TypedKey, FieldOperationContainer, Serializable { +public class SDField extends Field implements TypedKey, FieldOperationContainer, ImmutableSDField, Serializable { /** Use this field for modifying index-structure, even if it doesn't have any indexing code */ @@ -198,14 +198,22 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, isExtraField = isExtra; } + @Override public boolean isExtraField() { return isExtraField; } + @Override + public boolean isImportedField() { + return false; + } + + @Override public boolean doesAttributing() { return containsExpression(AttributeExpression.class); } + @Override public boolean doesIndexing() { return containsExpression(IndexExpression.class); } @@ -221,10 +229,12 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, return containsExpression(SummaryExpression.class); } + @Override public boolean doesLowerCasing() { return containsExpression(LowerCaseExpression.class); } + @Override public <T extends Expression> boolean containsExpression(Class<T> searchFor) { return findExpression(searchFor) != null; } @@ -404,6 +414,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, return (dt != null); } + @Override public boolean usesStructOrMap() { DataType dt = getFirstStructOrMapRecursive(); return (dt != null); @@ -457,6 +468,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, } } + @Override public ScriptExpression getIndexingScript() { return indexingScript; } @@ -474,6 +486,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, } } + @Override public boolean isIndexStructureField() { return indexStructureField; } @@ -517,6 +530,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, /** * Returns what kind of matching type should be applied. */ + @Override public Matching getMatching() { return matching; } /** @@ -559,6 +573,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, * some <b>explicit settings</b> applied in this field (even if this returns null, * the index may be implicitly defined by an indexing statement) */ + @Override public Index getIndex(String name) { return indices.get(name); } @@ -601,6 +616,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, } /** Returns the rank settings set in a "rank" block for this field. This is never null. */ + @Override public Ranking getRanking() { return ranking; } /** Returns the default rank type of indices of this field, or null if nothing is set */ @@ -612,6 +628,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, * * <p>TODO: Make unmodifiable.</p> */ + @Override public Map<String, Attribute> getAttributes() { return attributes; } public void addAttribute(Attribute attribute) { @@ -629,11 +646,13 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, * * @return the stemming setting of this, or null, to use the default */ + @Override public Stemming getStemming() { return stemming; } /** * Whether this field should be stemmed in this search definition */ + @Override public Stemming getStemming(Search search) { if (stemming!=null) return stemming; @@ -641,6 +660,11 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, return search.getStemming(); } + @Override + public Field asField() { + return this; + } + /** * Sets how this field should be stemmed, or set to null to use the default. */ @@ -685,6 +709,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, } /** Returns list of static struct fields */ + @Override public Collection<SDField> getStructFields() { return structFields.values(); } /** @@ -692,6 +717,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, * potentially traversing into nested structs. * Returns null if there is no such struct field defined. */ + @Override public SDField getStructField(String name) { if (name.contains(".")) { String superFieldName = name.substring(0,name.indexOf(".")); @@ -708,6 +734,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, /** * Returns how the content of this field should be accent normalized etc */ + @Override public NormalizeLevel getNormalizing() { return normalizing; } /** @@ -727,6 +754,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, * A list of query commands * @return a list of strings with query commands. */ + @Override public List<String> getQueryCommands() { return queryCommands; } @@ -766,6 +794,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, } /** The aliases declared for this field */ + @Override public Map<String, String> getAliasToName() { return aliasToName; } |