diff options
author | Håvard Pettersen <havardpe@oath.com> | 2017-09-08 12:44:13 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2017-09-19 12:31:42 +0000 |
commit | befe2d842c0e499fae0b3c9f2f220c23526e340b (patch) | |
tree | bb747584dedc284fbb35613652d6972112046943 /searchlib/src | |
parent | dd155329562cb4477a1e449f990b4fc394d85e11 (diff) |
MatchData no longer owned by RankProgram
Diffstat (limited to 'searchlib/src')
12 files changed, 70 insertions, 58 deletions
diff --git a/searchlib/src/tests/features/item_raw_score/item_raw_score_test.cpp b/searchlib/src/tests/features/item_raw_score/item_raw_score_test.cpp index f407aea811b..a954710f153 100644 --- a/searchlib/src/tests/features/item_raw_score/item_raw_score_test.cpp +++ b/searchlib/src/tests/features/item_raw_score/item_raw_score_test.cpp @@ -67,13 +67,14 @@ struct SingleLabel : public Labels { struct RankFixture : BlueprintFactoryFixture, IndexFixture { QueryEnvironment queryEnv; RankSetup rankSetup; - RankProgram::UP rankProgram; MatchDataLayout mdl; + MatchData::UP match_data; + RankProgram::UP rankProgram; std::vector<TermFieldHandle> fooHandles; std::vector<TermFieldHandle> barHandles; RankFixture(size_t fooCnt, size_t barCnt, const Labels &labels) : queryEnv(&indexEnv), rankSetup(factory, indexEnv), - rankProgram(), mdl(), fooHandles(), barHandles() + mdl(), match_data(), rankProgram(), fooHandles(), barHandles() { for (size_t i = 0; i < fooCnt; ++i) { uint32_t fieldId = indexEnv.getFieldByName("foo")->id(); @@ -95,14 +96,15 @@ struct RankFixture : BlueprintFactoryFixture, IndexFixture { rankSetup.setFirstPhaseRank(featureName); rankSetup.setIgnoreDefaultRankFeatures(true); ASSERT_TRUE(rankSetup.compile()); + match_data = mdl.createMatchData(); rankProgram = rankSetup.create_first_phase_program(); - rankProgram->setup(mdl, queryEnv); + rankProgram->setup(*match_data, queryEnv); } feature_t getScore(uint32_t docId) { return Utils::getScoreFeature(*rankProgram, docId); } void setScore(TermFieldHandle handle, uint32_t docId, feature_t score) { - rankProgram->match_data().resolveTermField(handle)->setRawScore(docId, score); + match_data->resolveTermField(handle)->setRawScore(docId, score); } void setFooScore(uint32_t i, uint32_t docId, feature_t score) { ASSERT_LESS(i, fooHandles.size()); diff --git a/searchlib/src/tests/features/native_dot_product/native_dot_product_test.cpp b/searchlib/src/tests/features/native_dot_product/native_dot_product_test.cpp index 5ba7504f7d2..1da912ccb3a 100644 --- a/searchlib/src/tests/features/native_dot_product/native_dot_product_test.cpp +++ b/searchlib/src/tests/features/native_dot_product/native_dot_product_test.cpp @@ -72,14 +72,15 @@ std::vector<uint32_t> vec(uint32_t w1, uint32_t w2, uint32_t w3) { struct RankFixture : BlueprintFactoryFixture, IndexFixture { QueryEnvironment queryEnv; RankSetup rankSetup; - RankProgram::UP rankProgram; MatchDataLayout mdl; + MatchData::UP match_data; + RankProgram::UP rankProgram; std::vector<TermFieldHandle> fooHandles; std::vector<TermFieldHandle> barHandles; RankFixture(const std::vector<uint32_t> &fooWeights, const std::vector<uint32_t> &barWeights) : queryEnv(&indexEnv), rankSetup(factory, indexEnv), - rankProgram(), mdl(), fooHandles(), barHandles() + mdl(), match_data(), rankProgram(), fooHandles(), barHandles() { for (size_t i = 0; i < fooWeights.size(); ++i) { uint32_t fieldId = indexEnv.getFieldByName("foo")->id(); @@ -100,8 +101,9 @@ struct RankFixture : BlueprintFactoryFixture, IndexFixture { rankSetup.setFirstPhaseRank(featureName); rankSetup.setIgnoreDefaultRankFeatures(true); ASSERT_TRUE(rankSetup.compile()); + match_data = mdl.createMatchData(); rankProgram = rankSetup.create_first_phase_program(); - rankProgram->setup(mdl, queryEnv); + rankProgram->setup(*match_data, queryEnv); } feature_t getScore(uint32_t docId) { return Utils::getScoreFeature(*rankProgram, docId); @@ -110,15 +112,15 @@ struct RankFixture : BlueprintFactoryFixture, IndexFixture { ASSERT_LESS(i, fooHandles.size()); TermFieldMatchDataPosition pos; pos.setElementWeight(index_weight); - rankProgram->match_data().resolveTermField(fooHandles[i])->reset(docId); - rankProgram->match_data().resolveTermField(fooHandles[i])->appendPosition(pos); + match_data->resolveTermField(fooHandles[i])->reset(docId); + match_data->resolveTermField(fooHandles[i])->appendPosition(pos); } void setBarWeight(uint32_t i, uint32_t docId, int32_t index_weight) { ASSERT_LESS(i, barHandles.size()); TermFieldMatchDataPosition pos; pos.setElementWeight(index_weight); - rankProgram->match_data().resolveTermField(barHandles[i])->reset(docId); - rankProgram->match_data().resolveTermField(barHandles[i])->appendPosition(pos); + match_data->resolveTermField(barHandles[i])->reset(docId); + match_data->resolveTermField(barHandles[i])->appendPosition(pos); } }; diff --git a/searchlib/src/tests/features/raw_score/raw_score_test.cpp b/searchlib/src/tests/features/raw_score/raw_score_test.cpp index 52587c0d8f9..4aad6c6896e 100644 --- a/searchlib/src/tests/features/raw_score/raw_score_test.cpp +++ b/searchlib/src/tests/features/raw_score/raw_score_test.cpp @@ -45,13 +45,14 @@ struct FeatureDumpFixture : public IDumpFeatureVisitor { struct RankFixture : BlueprintFactoryFixture, IndexFixture { QueryEnvironment queryEnv; RankSetup rankSetup; - RankProgram::UP rankProgram; MatchDataLayout mdl; + MatchData::UP match_data; + RankProgram::UP rankProgram; std::vector<TermFieldHandle> fooHandles; std::vector<TermFieldHandle> barHandles; RankFixture(size_t fooCnt, size_t barCnt) : queryEnv(&indexEnv), rankSetup(factory, indexEnv), - rankProgram(), mdl(), fooHandles(), barHandles() + mdl(), match_data(), rankProgram(), fooHandles(), barHandles() { for (size_t i = 0; i < fooCnt; ++i) { uint32_t fieldId = indexEnv.getFieldByName("foo")->id(); @@ -70,14 +71,15 @@ struct RankFixture : BlueprintFactoryFixture, IndexFixture { rankSetup.setFirstPhaseRank(featureName); rankSetup.setIgnoreDefaultRankFeatures(true); ASSERT_TRUE(rankSetup.compile()); + match_data = mdl.createMatchData(); rankProgram = rankSetup.create_first_phase_program(); - rankProgram->setup(mdl, queryEnv); + rankProgram->setup(*match_data, queryEnv); } feature_t getScore(uint32_t docId) { return Utils::getScoreFeature(*rankProgram, docId); } void setScore(TermFieldHandle handle, uint32_t docId, feature_t score) { - rankProgram->match_data().resolveTermField(handle)->setRawScore(docId, score); + match_data->resolveTermField(handle)->setRawScore(docId, score); } void setFooScore(uint32_t i, uint32_t docId, feature_t score) { ASSERT_LESS(i, fooHandles.size()); diff --git a/searchlib/src/tests/features/subqueries/subqueries_test.cpp b/searchlib/src/tests/features/subqueries/subqueries_test.cpp index 37e43b4d2b0..d275cf134c6 100644 --- a/searchlib/src/tests/features/subqueries/subqueries_test.cpp +++ b/searchlib/src/tests/features/subqueries/subqueries_test.cpp @@ -43,22 +43,24 @@ struct FeatureDumpFixture : public IDumpFeatureVisitor { struct RankFixture : BlueprintFactoryFixture, IndexFixture { QueryEnvironment queryEnv; RankSetup rankSetup; - RankProgram::UP rankProgram; MatchDataLayout mdl; + MatchData::UP match_data; + RankProgram::UP rankProgram; std::vector<TermFieldHandle> fooHandles; std::vector<TermFieldHandle> barHandles; RankFixture(size_t fooCnt, size_t barCnt, std::string featureName = "subqueries(foo)") : queryEnv(&indexEnv), rankSetup(factory, indexEnv), - rankProgram(), mdl(), fooHandles(), barHandles() + mdl(), match_data(), rankProgram(), fooHandles(), barHandles() { fooHandles = addFields(fooCnt, indexEnv.getFieldByName("foo")->id()); barHandles = addFields(barCnt, indexEnv.getFieldByName("bar")->id()); rankSetup.setFirstPhaseRank(featureName); rankSetup.setIgnoreDefaultRankFeatures(true); ASSERT_TRUE(rankSetup.compile()); + match_data = mdl.createMatchData(); rankProgram = rankSetup.create_first_phase_program(); - rankProgram->setup(mdl, queryEnv); + rankProgram->setup(*match_data, queryEnv); } std::vector<TermFieldHandle> addFields(size_t count, uint32_t fieldId) { std::vector<TermFieldHandle> handles; @@ -75,7 +77,7 @@ struct RankFixture : BlueprintFactoryFixture, IndexFixture { } void setSubqueries(TermFieldHandle handle, uint32_t docId, uint64_t subqueries) { - rankProgram->match_data().resolveTermField(handle)->setSubqueries(docId, subqueries); + match_data->resolveTermField(handle)->setSubqueries(docId, subqueries); } void setFooSubqueries(uint32_t i, uint32_t docId, uint64_t subqueries) { ASSERT_LESS(i, fooHandles.size()); diff --git a/searchlib/src/tests/fef/featureoverride/featureoverride.cpp b/searchlib/src/tests/fef/featureoverride/featureoverride.cpp index 0ff7e0899e9..e55bd7081a1 100644 --- a/searchlib/src/tests/fef/featureoverride/featureoverride.cpp +++ b/searchlib/src/tests/fef/featureoverride/featureoverride.cpp @@ -141,7 +141,8 @@ TEST("test overrides") overrides.add("value(1,2,3).2", "6.0"); overrides.add("bogus(feature)", "10.0"); - rankProgram->setup(mdl, queryEnv, overrides); + MatchData::UP match_data = mdl.createMatchData(); + rankProgram->setup(*match_data, queryEnv, overrides); std::map<vespalib::string, feature_t> res = Utils::getAllFeatures(*rankProgram, 2); diff --git a/searchlib/src/tests/fef/object_passing/object_passing_test.cpp b/searchlib/src/tests/fef/object_passing/object_passing_test.cpp index 5c0f09a1203..3ae5932889a 100644 --- a/searchlib/src/tests/fef/object_passing/object_passing_test.cpp +++ b/searchlib/src/tests/fef/object_passing/object_passing_test.cpp @@ -7,6 +7,7 @@ #include <vespa/searchlib/fef/test/indexenvironment.h> #include <vespa/searchlib/fef/test/queryenvironment.h> #include <vespa/searchlib/fef/test/plugin/unbox.h> +#include <vespa/searchlib/fef/matchdatalayout.h> #include <vespa/searchlib/fef/rank_program.h> #include <vespa/searchlib/fef/verify_feature.h> #include <vespa/eval/eval/value_type.h> @@ -87,10 +88,11 @@ struct Fixture { return vespalib::eval::error_value; } MatchDataLayout mdl; + MatchData::UP md = mdl.createMatchData(); QueryEnvironment queryEnv(&indexEnv); Properties overrides; RankProgram program(resolver); - program.setup(mdl, queryEnv, overrides); + program.setup(*md, queryEnv, overrides); auto result = program.get_seeds(); EXPECT_EQUAL(1u, result.num_features()); EXPECT_TRUE(!result.is_object(0)); // verifies auto-unboxing diff --git a/searchlib/src/tests/fef/rank_program/rank_program_test.cpp b/searchlib/src/tests/fef/rank_program/rank_program_test.cpp index 8e23731e961..7e28178e5f7 100644 --- a/searchlib/src/tests/fef/rank_program/rank_program_test.cpp +++ b/searchlib/src/tests/fef/rank_program/rank_program_test.cpp @@ -6,6 +6,7 @@ #include <vespa/searchlib/features/rankingexpressionfeature.h> #include <vespa/searchlib/fef/blueprintfactory.h> #include <vespa/searchlib/fef/indexproperties.h> +#include <vespa/searchlib/fef/matchdatalayout.h> #include <vespa/searchlib/fef/test/indexenvironment.h> #include <vespa/searchlib/fef/test/queryenvironment.h> #include <vespa/searchlib/fef/test/plugin/sum.h> @@ -69,10 +70,11 @@ struct Fixture { IndexEnvironment indexEnv; BlueprintResolver::SP resolver; Properties overrides; + MatchData::UP match_data; RankProgram program; size_t track_cnt; Fixture() : factory(), indexEnv(), resolver(new BlueprintResolver(factory, indexEnv)), - overrides(), program(resolver), track_cnt(0) + overrides(), match_data(), program(resolver), track_cnt(0) { factory.addPrototype(Blueprint::SP(new BoxingBlueprint())); factory.addPrototype(Blueprint::SP(new DocidBlueprint())); @@ -107,7 +109,8 @@ struct Fixture { ASSERT_TRUE(resolver->compile()); MatchDataLayout mdl; QueryEnvironment queryEnv(&indexEnv); - program.setup(mdl, queryEnv, overrides); + match_data = mdl.createMatchData(); + program.setup(*match_data, queryEnv, overrides); return *this; } double get(uint32_t docid = default_docid) { diff --git a/searchlib/src/tests/ranksetup/ranksetup_test.cpp b/searchlib/src/tests/ranksetup/ranksetup_test.cpp index c2ef8f3a46b..7a26180eed2 100644 --- a/searchlib/src/tests/ranksetup/ranksetup_test.cpp +++ b/searchlib/src/tests/ranksetup/ranksetup_test.cpp @@ -87,6 +87,7 @@ private: const RankEnvironment & _rankEnv; MatchDataLayout _layout; std::unique_ptr<RankSetup> _rs; + MatchData::UP _match_data; RankProgram::UP _firstPhaseProgram; RankProgram::UP _secondPhaseProgram; @@ -100,7 +101,7 @@ public: RankExecutor::RankExecutor(const vespalib::string &initRank, const vespalib::string &finalRank, const RankEnvironment &rankEnv) : _initRank(initRank), _finalRank(finalRank), _rankEnv(rankEnv), _layout(), - _rs(), _firstPhaseProgram(), _secondPhaseProgram() + _rs(), _match_data(), _firstPhaseProgram(), _secondPhaseProgram() {} RankExecutor::~RankExecutor() {} @@ -121,12 +122,13 @@ RankExecutor::setup() if (!_rs->compile()) { return false; } + _match_data = _layout.createMatchData(); _firstPhaseProgram = _rs->create_first_phase_program(); - _firstPhaseProgram->setup(_layout, _rankEnv.queryEnvironment()); + _firstPhaseProgram->setup(*_match_data, _rankEnv.queryEnvironment()); if (!_finalRank.empty()) { _secondPhaseProgram = _rs->create_second_phase_program(); - _secondPhaseProgram->setup(_layout, _rankEnv.queryEnvironment()); + _secondPhaseProgram->setup(*_match_data, _rankEnv.queryEnvironment()); } return true; } @@ -154,6 +156,7 @@ private: const RankEnvironment & _rankEnv; RankSetup _setup; MatchDataLayout _layout; + MatchData::UP _match_data; RankProgram::UP _rankProgram; public: @@ -169,6 +172,7 @@ FeatureDumper::FeatureDumper(const RankEnvironment & rankEnv) : _rankEnv(rankEnv), _setup(_rankEnv.factory(), _rankEnv.indexEnvironment()), _layout(), + _match_data(), _rankProgram() {} FeatureDumper::~FeatureDumper() {} @@ -191,8 +195,9 @@ FeatureDumper::setup() return false; } + _match_data = _layout.createMatchData(); _rankProgram = _setup.create_dump_program(); - _rankProgram->setup(_layout, _rankEnv.queryEnvironment()); + _rankProgram->setup(*_match_data, _rankEnv.queryEnvironment()); return true; } @@ -780,12 +785,13 @@ RankSetupTest::testFeatureNormalization() { // RANK context MatchDataLayout layout; QueryEnvironment queryEnv; + MatchData::UP match_data = layout.createMatchData(); RankProgram::UP firstPhaseProgram = rankSetup.create_first_phase_program(); RankProgram::UP secondPhaseProgram = rankSetup.create_second_phase_program(); RankProgram::UP summaryProgram = rankSetup.create_summary_program(); - firstPhaseProgram->setup(layout, queryEnv); - secondPhaseProgram->setup(layout, queryEnv); - summaryProgram->setup(layout, queryEnv); + firstPhaseProgram->setup(*match_data, queryEnv); + secondPhaseProgram->setup(*match_data, queryEnv); + summaryProgram->setup(*match_data, queryEnv); EXPECT_APPROX(2.0, Utils::getScoreFeature(*firstPhaseProgram, 1), 0.001); EXPECT_APPROX(4.0, Utils::getScoreFeature(*secondPhaseProgram, 1), 0.001); @@ -831,8 +837,9 @@ RankSetupTest::testFeatureNormalization() { // DUMP context MatchDataLayout layout; QueryEnvironment queryEnv; + MatchData::UP match_data = layout.createMatchData(); RankProgram::UP rankProgram = rankSetup.create_dump_program(); - rankProgram->setup(layout, queryEnv); + rankProgram->setup(*match_data, queryEnv); { // dump seed features std::map<vespalib::string, feature_t> actual = Utils::getSeedFeatures(*rankProgram, 1); diff --git a/searchlib/src/vespa/searchlib/fef/rank_program.cpp b/searchlib/src/vespa/searchlib/fef/rank_program.cpp index fa4582d46b7..33a65b48a1c 100644 --- a/searchlib/src/vespa/searchlib/fef/rank_program.cpp +++ b/searchlib/src/vespa/searchlib/fef/rank_program.cpp @@ -109,7 +109,7 @@ RankProgram::run_const(FeatureExecutor *executor) } void -RankProgram::unbox(BlueprintResolver::FeatureRef seed) +RankProgram::unbox(BlueprintResolver::FeatureRef seed, const MatchData &md) { FeatureExecutor *input_executor = _executors[seed.executor]; const NumberOrObject *input_value = input_executor->outputs().get_raw(seed.output); @@ -122,7 +122,7 @@ RankProgram::unbox(BlueprintResolver::FeatureRef seed) FeatureExecutor &unboxer = _hot_stash.create<UnboxingExecutor>(); unboxer.bind_inputs(inputs); unboxer.bind_outputs(outputs); - unboxer.bind_match_data(*_match_data); + unboxer.bind_match_data(md); _unboxed_seeds.emplace(input_value, LazyValue(&outputs[0], &unboxer)); } } @@ -153,7 +153,6 @@ RankProgram::resolve(const BlueprintResolver::FeatureMap &features, bool unbox_s RankProgram::RankProgram(BlueprintResolver::SP resolver) : _resolver(resolver), - _match_data(), _hot_stash(32768), _cold_stash(), _executors(), @@ -165,12 +164,11 @@ RankProgram::RankProgram(BlueprintResolver::SP resolver) RankProgram::~RankProgram() {} void -RankProgram::setup(const MatchDataLayout &mdl_in, +RankProgram::setup(const MatchData &md, const IQueryEnvironment &queryEnv, const Properties &featureOverrides) { assert(_executors.empty()); - _match_data = mdl_in.createMatchData(); std::vector<Override> overrides = prepare_overrides(_resolver->getFeatureMap(), featureOverrides); auto override = overrides.begin(); auto override_end = overrides.end(); @@ -204,7 +202,7 @@ RankProgram::setup(const MatchDataLayout &mdl_in, } executor->bind_inputs(inputs); executor->bind_outputs(outputs); - executor->bind_match_data(*_match_data); + executor->bind_match_data(md); _executors.push_back(executor); if (is_const) { run_const(executor); @@ -213,7 +211,7 @@ RankProgram::setup(const MatchDataLayout &mdl_in, for (const auto &seed_entry: _resolver->getSeedMap()) { auto seed = seed_entry.second; if (specs[seed.executor].output_types[seed.output]) { - unbox(seed); + unbox(seed, md); } } assert(_executors.size() == specs.size()); diff --git a/searchlib/src/vespa/searchlib/fef/rank_program.h b/searchlib/src/vespa/searchlib/fef/rank_program.h index 7cf593e4a4e..3a92fc874a4 100644 --- a/searchlib/src/vespa/searchlib/fef/rank_program.h +++ b/searchlib/src/vespa/searchlib/fef/rank_program.h @@ -6,7 +6,6 @@ #include "featureexecutor.h" #include "properties.h" #include "matchdata.h" -#include "matchdatalayout.h" #include "feature_resolver.h" #include <vespa/vespalib/stllike/string.h> #include <vespa/vespalib/util/array.h> @@ -21,11 +20,10 @@ namespace fef { * values. In order to access (and thereby calculate) output features * you typically use the get_seeds function to resolve the predefined * set of output features. Each feature value will be wrapped in a - * LazyValue object that can be realized for a specific docid. The - * rank program also owns the MatchData used to store unpacked - * term-field match information. Note that you need unpack any - * relevant posting information into the MatchData object before - * trying to resolve lazy values. + * LazyValue object that can be realized for a specific docid. Note + * that you need unpack any relevant posting information into the + * MatchData object passed to the setup function before trying to + * resolve lazy values. **/ class RankProgram { @@ -37,7 +35,6 @@ private: using ValueSet = std::set<const NumberOrObject *>; BlueprintResolver::SP _resolver; - MatchData::UP _match_data; vespalib::Stash _hot_stash; vespalib::Stash _cold_stash; std::vector<FeatureExecutor *> _executors; @@ -47,7 +44,7 @@ private: bool check_const(const NumberOrObject *value) const { return (_is_const.count(value) == 1); } bool check_const(FeatureExecutor *executor, const std::vector<BlueprintResolver::FeatureRef> &inputs) const; void run_const(FeatureExecutor *executor); - void unbox(BlueprintResolver::FeatureRef seed); + void unbox(BlueprintResolver::FeatureRef seed, const MatchData &md); FeatureResolver resolve(const BlueprintResolver::FeatureMap &features, bool unbox_seeds) const; public: @@ -66,21 +63,13 @@ public: /** * Set up this rank program by creating the needed feature * executors and wiring them together. This function will also - * create the MatchData to be used for iterator unpacking as well - * as pre-calculating all constant features. + * pre-calculate all constant features. **/ - void setup(const MatchDataLayout &mdl, + void setup(const MatchData &md, const IQueryEnvironment &queryEnv, const Properties &featureOverrides = Properties()); /** - * Expose the MatchData used when creating search iterators as it - * is where all iterators should unpack their match information. - **/ - MatchData &match_data() { return *_match_data; } - const MatchData &match_data() const { return *_match_data; } - - /** * Obtain the names and storage locations of all seed features for * this rank program. Programs for ranking phases will only have a * single seed while programs used for summary features or diff --git a/searchlib/src/vespa/searchlib/fef/test/featuretest.cpp b/searchlib/src/vespa/searchlib/fef/test/featuretest.cpp index 2652abf97a4..e5a6232ed54 100644 --- a/searchlib/src/vespa/searchlib/fef/test/featuretest.cpp +++ b/searchlib/src/vespa/searchlib/fef/test/featuretest.cpp @@ -22,6 +22,7 @@ FeatureTest::FeatureTest(BlueprintFactory &factory, _layout(layout), _overrides(overrides), _resolver(new BlueprintResolver(factory, indexEnv)), + _match_data(_layout.createMatchData()), _rankProgram(new RankProgram(_resolver)), _doneSetup(false) { @@ -42,6 +43,7 @@ FeatureTest::FeatureTest(BlueprintFactory &factory, _layout(layout), _overrides(overrides), _resolver(new BlueprintResolver(factory, indexEnv)), + _match_data(_layout.createMatchData()), _rankProgram(new RankProgram(_resolver)), _doneSetup(false) { @@ -68,7 +70,7 @@ FeatureTest::setup() return false; } - _rankProgram->setup(_layout, _queryEnv, _overrides); + _rankProgram->setup(*_match_data, _queryEnv, _overrides); _doneSetup = true; return true; } @@ -77,7 +79,7 @@ MatchDataBuilder::UP FeatureTest::createMatchDataBuilder() { if (_doneSetup) { - return MatchDataBuilder::UP(new MatchDataBuilder(_queryEnv, _rankProgram->match_data())); + return MatchDataBuilder::UP(new MatchDataBuilder(_queryEnv, *_match_data)); } LOG(warning, "Match data not initialized."); return MatchDataBuilder::UP(); @@ -135,6 +137,7 @@ void FeatureTest::clear() { _resolver = BlueprintResolver::SP(new BlueprintResolver(_factory, _indexEnv)); + _match_data = _layout.createMatchData(); _rankProgram.reset(new RankProgram(_resolver)); _doneSetup = false; } diff --git a/searchlib/src/vespa/searchlib/fef/test/featuretest.h b/searchlib/src/vespa/searchlib/fef/test/featuretest.h index 2bce63d357d..e354884c110 100644 --- a/searchlib/src/vespa/searchlib/fef/test/featuretest.h +++ b/searchlib/src/vespa/searchlib/fef/test/featuretest.h @@ -116,6 +116,7 @@ private: MatchDataLayout &_layout; const Properties &_overrides; BlueprintResolver::SP _resolver; + MatchData::UP _match_data; RankProgram::UP _rankProgram; bool _doneSetup; |