summaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo
diff options
context:
space:
mode:
Diffstat (limited to 'config-model/src/main/java/com/yahoo')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/Search.java31
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java160
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableSDField.java72
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java31
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;
}