diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2018-01-09 16:07:43 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2018-01-09 16:07:43 +0100 |
commit | dc0f70fac9167acf487453daf565636c675934df (patch) | |
tree | aaccfae7aaf4a48e35655a66c75ea57412ede6a6 /config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/MacroShadower.java | |
parent | fa9fe82c82d6a562e3ae02b9577f536a16c72c92 (diff) |
Basic TensorFlow integration
This wil replace any occurrence of tensorflow(...)
in ranking expressions with the corresponding translated expression.
It is functional but these tings are outstanding
- Propagate warnings
- Import a model just once even if referred multiple times
- Add constants as tensor files rather than config
Diffstat (limited to 'config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/MacroShadower.java')
-rw-r--r-- | config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/MacroShadower.java | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/MacroShadower.java b/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/MacroShadower.java new file mode 100644 index 00000000000..1d9769d0d78 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/searchdefinition/expressiontransforms/MacroShadower.java @@ -0,0 +1,66 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.searchdefinition.expressiontransforms; + +import com.yahoo.searchdefinition.RankProfile; +import com.yahoo.searchlib.rankingexpression.RankingExpression; +import com.yahoo.searchlib.rankingexpression.rule.*; +import com.yahoo.searchlib.rankingexpression.transform.ExpressionTransformer; + +import java.util.Map; + +/** + * Transforms function nodes to reference nodes if a macro shadows a built-in function. + * This has the effect of allowing macros to redefine built-in functions. + * Another effect is that we can more or less add built-in functions over time + * without fear of breaking existing users' macros with the same name. + * + * However, there is a (largish) caveat. If a user has a macro with a certain number + * of arguments, and we add in a built-in function with a different arity, + * this will cause parse errors as the Java parser gives precedence to + * built-in functions. + * + * @author lesters + */ +public class MacroShadower extends ExpressionTransformer { + + private final Map<String, RankProfile.Macro> macros; + + public MacroShadower(Map<String, RankProfile.Macro> macros) { + this.macros = macros; + } + + @Override + public RankingExpression transform(RankingExpression expression) { + String name = expression.getName(); + ExpressionNode node = expression.getRoot(); + ExpressionNode result = transform(node); + return new RankingExpression(name, result); + } + + @Override + public ExpressionNode transform(ExpressionNode node) { + if (node instanceof FunctionNode) + return transformFunctionNode((FunctionNode) node); + if (node instanceof CompositeNode) + return transformChildren((CompositeNode)node); + return node; + } + + protected ExpressionNode transformFunctionNode(FunctionNode function) { + String name = function.getFunction().toString(); + RankProfile.Macro macro = macros.get(name); + if (macro == null) { + return transformChildren(function); + } + + int functionArity = function.getFunction().arity(); + int macroArity = macro.getFormalParams() != null ? macro.getFormalParams().size() : 0; + if (functionArity != macroArity) { + return transformChildren(function); + } + + ReferenceNode node = new ReferenceNode(name, function.children(), null); + return transformChildren(node); + } + +} |