diff options
author | Haavard <havardpe@yahoo-inc.com> | 2017-08-14 09:16:43 +0000 |
---|---|---|
committer | Haavard <havardpe@yahoo-inc.com> | 2017-08-14 10:21:43 +0000 |
commit | 3a64ad68e72ff576e3da6fa216c37706cdcb17a9 (patch) | |
tree | a85b0aa4fb999ca46feaa1f96bdd36b29a293ff1 /searchlib | |
parent | 892b13d604ea569695fd41ed89d6f0c2d91dee43 (diff) |
enable expression replacement in ranking expression feature
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp | 20 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/features/rankingexpressionfeature.h | 14 |
2 files changed, 25 insertions, 9 deletions
diff --git a/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp b/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp index c173ee97536..d07841c2fe2 100644 --- a/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp @@ -168,9 +168,15 @@ InterpretedRankingExpressionExecutor::execute(uint32_t) //----------------------------------------------------------------------------- RankingExpressionBlueprint::RankingExpressionBlueprint() + : RankingExpressionBlueprint(std::make_shared<rankingexpression::NullExpressionReplacer>()) {} + +RankingExpressionBlueprint::RankingExpressionBlueprint(rankingexpression::ExpressionReplacer::SP replacer) : fef::Blueprint("rankingExpression"), + _expression_replacer(std::move(replacer)), + _intrinsic_expression(), _interpreted_function(), - _compile_token() + _compile_token(), + _input_is_object() { } @@ -208,6 +214,11 @@ RankingExpressionBlueprint::setup(const fef::IIndexEnvironment &env, LOG(error, "Failed to parse expression '%s': %s", script.c_str(), rank_function.get_error().c_str()); return false; } + _intrinsic_expression = _expression_replacer->maybe_replace(rank_function, env); + if (_intrinsic_expression) { + describeOutput("out", "result of intrinsic expression", _intrinsic_expression->result_type()); + return true; + } bool do_compile = true; std::vector<ValueType> input_types; for (size_t i = 0; i < rank_function.num_params(); ++i) { @@ -268,12 +279,15 @@ RankingExpressionBlueprint::setup(const fef::IIndexEnvironment &env, fef::Blueprint::UP RankingExpressionBlueprint::createInstance() const { - return fef::Blueprint::UP(new RankingExpressionBlueprint()); + return std::make_unique<RankingExpressionBlueprint>(_expression_replacer); } fef::FeatureExecutor & -RankingExpressionBlueprint::createExecutor(const fef::IQueryEnvironment &, vespalib::Stash &stash) const +RankingExpressionBlueprint::createExecutor(const fef::IQueryEnvironment &env, vespalib::Stash &stash) const { + if (_intrinsic_expression) { + return _intrinsic_expression->create_executor(env, stash); + } if (_interpreted_function) { ConstArrayRef<char> input_is_object = stash.copy_array<char>(_input_is_object); return stash.create<InterpretedRankingExpressionExecutor>(*_interpreted_function, input_is_object); diff --git a/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.h b/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.h index 529d2bcb669..5da6c9eae87 100644 --- a/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.h +++ b/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.h @@ -5,6 +5,8 @@ #include <vespa/searchlib/fef/featureexecutor.h> #include <vespa/eval/eval/interpreted_function.h> #include <vespa/eval/eval/llvm/compile_cache.h> +#include <vespa/searchlib/features/rankingexpression/expression_replacer.h> +#include <vespa/searchlib/features/rankingexpression/intrinsic_expression.h> namespace search { namespace features { @@ -17,15 +19,15 @@ namespace features { class RankingExpressionBlueprint : public fef::Blueprint { private: - vespalib::eval::InterpretedFunction::UP _interpreted_function; - vespalib::eval::CompileCache::Token::UP _compile_token; - std::vector<char> _input_is_object; + rankingexpression::ExpressionReplacer::SP _expression_replacer; + rankingexpression::IntrinsicExpression::UP _intrinsic_expression; + vespalib::eval::InterpretedFunction::UP _interpreted_function; + vespalib::eval::CompileCache::Token::UP _compile_token; + std::vector<char> _input_is_object; public: - /** - * Constructs a ranking expression blueprint. - */ RankingExpressionBlueprint(); + RankingExpressionBlueprint(rankingexpression::ExpressionReplacer::SP replacer); ~RankingExpressionBlueprint(); void visitDumpFeatures(const fef::IIndexEnvironment &env, fef::IDumpFeatureVisitor &visitor) const override; |