summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHÃ¥vard Pettersen <3535158+havardpe@users.noreply.github.com>2020-02-21 13:40:44 +0100
committerGitHub <noreply@github.com>2020-02-21 13:40:44 +0100
commit25b8c70ba24e4c3f03139d44cd87f71589f3caa1 (patch)
tree65b31bdafd176ba5ec46f746935227b41d4d886f /searchlib
parente30bdb30c2b034dee7460ddb58d2caa303c981f9 (diff)
parent802c4ed261085c6d79176aff42ab2976260ab8e2 (diff)
Merge pull request #12289 from vespa-engine/toregge/fixup-feature-map-on-blueprint-setup-failures
Fixup feature map after blueprint setup failure.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/fef/resolver/resolver_test.cpp21
-rw-r--r--searchlib/src/vespa/searchlib/fef/blueprintresolver.cpp12
2 files changed, 33 insertions, 0 deletions
diff --git a/searchlib/src/tests/fef/resolver/resolver_test.cpp b/searchlib/src/tests/fef/resolver/resolver_test.cpp
index 955c072810f..7591d028620 100644
--- a/searchlib/src/tests/fef/resolver/resolver_test.cpp
+++ b/searchlib/src/tests/fef/resolver/resolver_test.cpp
@@ -4,10 +4,13 @@
#include <vespa/searchlib/fef/fef.h>
#include <vespa/searchlib/fef/test/indexenvironment.h>
#include <vespa/searchlib/features/valuefeature.h>
+#include <vespa/searchlib/features/rankingexpressionfeature.h>
#include <vespa/log/log.h>
LOG_SETUP("resolver_test");
+using search::features::RankingExpressionBlueprint;
+
namespace search {
namespace fef {
@@ -58,6 +61,7 @@ class Test : public vespalib::TestApp {
private:
BlueprintFactory _factory;
void requireThatWeGetUniqueBlueprints();
+ void require_that_bad_input_is_handled();
public:
Test();
~Test();
@@ -69,6 +73,7 @@ Test::Test() :
{
_factory.addPrototype(Blueprint::SP(new BaseBlueprint()));
_factory.addPrototype(Blueprint::SP(new CombineBlueprint()));
+ _factory.addPrototype(std::make_shared<RankingExpressionBlueprint>());
}
Test::~Test() {}
@@ -85,12 +90,28 @@ Test::requireThatWeGetUniqueBlueprints()
EXPECT_TRUE(dynamic_cast<CombineBlueprint *>(spec[1].blueprint.get()) != NULL);
}
+void
+Test::require_that_bad_input_is_handled()
+{
+ test::IndexEnvironment ienv;
+ ienv.getProperties().add(indexproperties::eval::LazyExpressions::NAME, "false");
+ ienv.getProperties().add("rankingExpression(badinput).rankingScript", "base.foobad + base.bar");
+ BlueprintResolver::SP res(new BlueprintResolver(_factory, ienv));
+ res->addSeed("rankingExpression(badinput)");
+ EXPECT_FALSE(res->compile());
+ const BlueprintResolver::ExecutorSpecList & spec = res->getExecutorSpecs();
+ EXPECT_EQUAL(2u, spec.size());
+ EXPECT_TRUE(dynamic_cast<BaseBlueprint *>(spec[0].blueprint.get()) != nullptr);
+ EXPECT_TRUE(dynamic_cast<RankingExpressionBlueprint *>(spec[1].blueprint.get()) != nullptr);
+}
+
int
Test::Main()
{
TEST_INIT("resolver_test");
requireThatWeGetUniqueBlueprints();
+ require_that_bad_input_is_handled();
TEST_DONE();
}
diff --git a/searchlib/src/vespa/searchlib/fef/blueprintresolver.cpp b/searchlib/src/vespa/searchlib/fef/blueprintresolver.cpp
index cd2cd949a91..82a69009e82 100644
--- a/searchlib/src/vespa/searchlib/fef/blueprintresolver.cpp
+++ b/searchlib/src/vespa/searchlib/fef/blueprintresolver.cpp
@@ -85,9 +85,21 @@ struct Compiler : public Blueprint::DependencyHandler {
}
compile_error = true;
}
+ fixup_feature_map();
return FeatureRef();
}
+ void fixup_feature_map() {
+ auto itr = feature_map.begin();
+ while (itr != feature_map.end()) {
+ if (itr->second.executor >= spec_list.size()) {
+ itr = feature_map.erase(itr);
+ } else {
+ ++itr;
+ }
+ }
+ }
+
FeatureRef verify_type(const FeatureNameParser &parser, FeatureRef ref, Accept accept_type) {
const auto &spec = spec_list[ref.executor];
bool is_object = spec.output_types[ref.output];