diff options
author | HÃ¥vard Pettersen <3535158+havardpe@users.noreply.github.com> | 2020-02-21 13:40:44 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-21 13:40:44 +0100 |
commit | 25b8c70ba24e4c3f03139d44cd87f71589f3caa1 (patch) | |
tree | 65b31bdafd176ba5ec46f746935227b41d4d886f /searchlib | |
parent | e30bdb30c2b034dee7460ddb58d2caa303c981f9 (diff) | |
parent | 802c4ed261085c6d79176aff42ab2976260ab8e2 (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.cpp | 21 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/fef/blueprintresolver.cpp | 12 |
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]; |