aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/searchdefinition/MapEvaluationTypeContext.java
diff options
context:
space:
mode:
Diffstat (limited to 'config-model/src/main/java/com/yahoo/searchdefinition/MapEvaluationTypeContext.java')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/MapEvaluationTypeContext.java167
1 files changed, 0 insertions, 167 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/MapEvaluationTypeContext.java b/config-model/src/main/java/com/yahoo/searchdefinition/MapEvaluationTypeContext.java
deleted file mode 100644
index cf6d90db7fa..00000000000
--- a/config-model/src/main/java/com/yahoo/searchdefinition/MapEvaluationTypeContext.java
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.searchdefinition;
-
-import com.yahoo.searchlib.rankingexpression.ExpressionFunction;
-import com.yahoo.searchlib.rankingexpression.RankingExpression;
-import com.yahoo.searchlib.rankingexpression.Reference;
-import com.yahoo.searchlib.rankingexpression.parser.ParseException;
-import com.yahoo.searchlib.rankingexpression.rule.Arguments;
-import com.yahoo.searchlib.rankingexpression.rule.ExpressionNode;
-import com.yahoo.searchlib.rankingexpression.rule.FunctionReferenceContext;
-import com.yahoo.searchlib.rankingexpression.rule.NameNode;
-import com.yahoo.searchlib.rankingexpression.rule.ReferenceNode;
-import com.yahoo.tensor.TensorType;
-import com.yahoo.tensor.evaluation.TypeContext;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-/**
- * A context which only contains type information.
- * This returns empty tensor types (double) for unknown features which are not
- * query, attribute or constant features, as we do not have information about which such
- * features exist (but we know those that exist are doubles).
- *
- * @author bratseth
- */
-public class MapEvaluationTypeContext extends FunctionReferenceContext implements TypeContext<Reference> {
-
- private final Map<Reference, TensorType> featureTypes = new HashMap<>();
-
- public MapEvaluationTypeContext(Collection<ExpressionFunction> functions) {
- super(functions);
- }
-
- public MapEvaluationTypeContext(Map<String, ExpressionFunction> functions,
- Map<String, String> bindings,
- Map<Reference, TensorType> featureTypes) {
- super(functions, bindings);
- this.featureTypes.putAll(featureTypes);
- }
-
- public void setType(Reference reference, TensorType type) {
- featureTypes.put(reference, type);
- }
-
- @Override
- public TensorType getType(String reference) {
- throw new UnsupportedOperationException("Not able to parse gereral references from string form");
- }
-
- @Override
- public TensorType getType(Reference reference) {
- Optional<String> binding = boundIdentifier(reference);
- if (binding.isPresent()) {
- try {
- // This is not pretty, but changing to bind expressions rather
- // than their string values requires deeper changes
- return new RankingExpression(binding.get()).type(this);
- }
- catch (ParseException e) {
- throw new IllegalArgumentException(e);
- }
- }
-
- if (isSimpleFeature(reference)) {
- // The argument may be a local identifier bound to the actual value
- String argument = simpleArgument(reference.arguments()).get();
- reference = Reference.simple(reference.name(), bindings.getOrDefault(argument, argument));
- return featureTypes.getOrDefault(reference, defaultTypeOf(reference));
- }
-
- Optional<ExpressionFunction> function = functionInvocation(reference);
- if (function.isPresent()) {
- return function.get().getBody().type(this.withBindings(bind(function.get().arguments(), reference.arguments())));
- }
-
- // We do not know what this is - since we do not have complete knowledge abut the match features
- // in Java we must assume this is a match feature and return the double type - which is the type of all
- // all match features
- return TensorType.empty;
- }
-
- /**
- * Returns the default type for this simple feature, or nullif it does not have a default
- */
- public TensorType defaultTypeOf(Reference reference) {
- if ( ! isSimpleFeature(reference))
- throw new IllegalArgumentException("This can only be called for simple references, not " + reference);
- if (reference.name().equals("query")) // we do not require all query features to be declared, only non-doubles
- return TensorType.empty;
- return null;
- }
-
- /**
- * Returns the binding if this reference is a simple identifier which is bound in this context.
- * Returns empty otherwise.
- */
- private Optional<String> boundIdentifier(Reference reference) {
- if ( ! reference.arguments().isEmpty()) return Optional.empty();
- if ( reference.output() != null) return Optional.empty();
- return Optional.ofNullable(bindings.get(reference.name()));
- }
-
- /**
- * Return whether the reference (discarding the output) is a simple feature
- * ("attribute(name)", "constant(name)" or "query(name)").
- * We disregard the output because all outputs under a simple feature have the same type.
- */
- private boolean isSimpleFeature(Reference reference) {
- Optional<String> argument = simpleArgument(reference.arguments());
- if ( ! argument.isPresent()) return false;
- return reference.name().equals("attribute") ||
- reference.name().equals("constant") ||
- reference.name().equals("query");
- }
-
- /**
- * If these arguments contains one simple argument string, it is returned.
- * Otherwise null is returned.
- */
- private Optional<String> simpleArgument(Arguments arguments) {
- if (arguments.expressions().size() != 1) return Optional.empty();
- ExpressionNode argument = arguments.expressions().get(0);
-
- if ( ! (argument instanceof ReferenceNode)) return Optional.empty();
- ReferenceNode refArgument = (ReferenceNode)argument;
-
- if ( ! refArgument.reference().isIdentifier()) return Optional.empty();
-
- return Optional.of(refArgument.getName());
- }
-
- private Optional<ExpressionFunction> functionInvocation(Reference reference) {
- if (reference.output() != null) return Optional.empty();
- ExpressionFunction function = functions().get(reference.name());
- if (function == null) return Optional.empty();
- if (function.arguments().size() != reference.arguments().size()) return Optional.empty();
- return Optional.of(function);
- }
-
- /** Binds the given list of formal arguments to their actual values */
- private Map<String, String> bind(List<String> formalArguments,
- Arguments invocationArguments) {
- Map<String, String> bindings = new HashMap<>(formalArguments.size());
- for (int i = 0; i < formalArguments.size(); i++) {
- String identifier = invocationArguments.expressions().get(i).toString();
- identifier = super.bindings.getOrDefault(identifier, identifier);
- bindings.put(formalArguments.get(i), identifier);
- }
- return bindings;
- }
-
- public Map<Reference, TensorType> featureTypes() {
- return Collections.unmodifiableMap(featureTypes);
- }
-
- @Override
- public MapEvaluationTypeContext withBindings(Map<String, String> bindings) {
- if (bindings.isEmpty() && this.bindings.isEmpty()) return this;
- return new MapEvaluationTypeContext(functions(), bindings, featureTypes);
- }
-
-}