aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHaavard <havardpe@yahoo-inc.com>2017-08-14 09:16:43 +0000
committerHaavard <havardpe@yahoo-inc.com>2017-08-14 10:21:43 +0000
commit3a64ad68e72ff576e3da6fa216c37706cdcb17a9 (patch)
treea85b0aa4fb999ca46feaa1f96bdd36b29a293ff1 /searchlib
parent892b13d604ea569695fd41ed89d6f0c2d91dee43 (diff)
enable expression replacement in ranking expression feature
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp20
-rw-r--r--searchlib/src/vespa/searchlib/features/rankingexpressionfeature.h14
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;