diff options
author | Håvard Pettersen <havardpe@oath.com> | 2017-09-08 13:54:56 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2017-09-19 12:31:43 +0000 |
commit | f29abebf697e89959368c57a57614b0166543bf3 (patch) | |
tree | abc32b9e1b9953df05a6e1e51df388cd983f32ca /searchcore | |
parent | d84f35db2ad848ea352b3892c234fbfcb6f092a7 (diff) |
MatchData is now separate from RankProgram
a single MatchData is now shared among all RankPrograms (but only a
single program at a time)
Diffstat (limited to 'searchcore')
5 files changed, 34 insertions, 29 deletions
diff --git a/searchcore/src/tests/proton/matching/matching_test.cpp b/searchcore/src/tests/proton/matching/matching_test.cpp index fefc6f361a9..4f57f235d97 100644 --- a/searchcore/src/tests/proton/matching/matching_test.cpp +++ b/searchcore/src/tests/proton/matching/matching_test.cpp @@ -293,7 +293,7 @@ struct MyWorld { *request, searchContext, attributeContext, metaStore, overrides); MatchTools::UP match_tools = match_tools_factory->createMatchTools(); RankProgram::UP rank_program = match_tools->first_phase_program(); - return rank_program->match_data().get_termwise_limit(); + return match_tools->match_data().get_termwise_limit(); } SearchReply::UP performSearch(SearchRequest::SP req, size_t threads) { diff --git a/searchcore/src/vespa/searchcore/proton/matching/match_master.cpp b/searchcore/src/vespa/searchcore/proton/matching/match_master.cpp index 0b5287fb094..c6c75cc7c65 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/match_master.cpp +++ b/searchcore/src/vespa/searchcore/proton/matching/match_master.cpp @@ -121,7 +121,7 @@ MatchMaster::getFeatureSet(const MatchToolsFactory &matchToolsFactory, } FeatureSet &fs = *retval.get(); - SearchIterator::UP search = matchTools->createSearch(rankProgram->match_data()); + SearchIterator::UP search = matchTools->createSearch(); search->initRange(docs.front(), docs.back()+1); for (uint32_t i = 0; i < docs.size(); ++i) { if (search->seek(docs[i])) { diff --git a/searchcore/src/vespa/searchcore/proton/matching/match_thread.cpp b/searchcore/src/vespa/searchcore/proton/matching/match_thread.cpp index 3a9f59680f9..ae01973439b 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/match_thread.cpp +++ b/searchcore/src/vespa/searchcore/proton/matching/match_thread.cpp @@ -241,7 +241,7 @@ search::ResultSet::UP MatchThread::findMatches(MatchTools &matchTools) { RankProgram::UP ranking = matchTools.first_phase_program(); - SearchIterator::UP search = matchTools.createSearch(ranking->match_data()); + SearchIterator::UP search = matchTools.createSearch(); if (isFirstThread()) { LOG(spam, "SearchIterator: %s", search->asString().c_str()); } @@ -264,7 +264,7 @@ MatchThread::findMatches(MatchTools &matchTools) if (matchTools.has_second_phase_rank()) { { // 2nd phase ranking ranking = matchTools.second_phase_program(); - search = matchTools.createSearch(ranking->match_data()); + search = matchTools.createSearch(); DocidRange docid_range = scheduler.total_span(thread_id); search->initRange(docid_range.begin, docid_range.end); auto sorted_scores = hits.getSortedHeapScores(); diff --git a/searchcore/src/vespa/searchcore/proton/matching/match_tools.cpp b/searchcore/src/vespa/searchcore/proton/matching/match_tools.cpp index 1e429616e7e..9c1b0b3ea0d 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/match_tools.cpp +++ b/searchcore/src/vespa/searchcore/proton/matching/match_tools.cpp @@ -33,16 +33,17 @@ tagMatchData(const HandleRecorder::HandleSet & handles, MatchData & md) } search::fef::RankProgram::UP setup_program(search::fef::RankProgram::UP program, - const MatchDataLayout &mdl, + MatchData &match_data, const QueryEnvironment &queryEnv, const Properties &featureOverrides) { + match_data.soft_reset(); HandleRecorder recorder; { HandleRecorder::Binder bind(recorder); - program->setup(mdl, queryEnv, featureOverrides); + program->setup(match_data, queryEnv, featureOverrides); } - tagMatchData(recorder.getHandles(), program->match_data()); + tagMatchData(recorder.getHandles(), match_data); return program; } @@ -65,39 +66,41 @@ MatchTools::MatchTools(QueryLimiter & queryLimiter, _queryEnv(queryEnv), _rankSetup(rankSetup), _featureOverrides(featureOverrides), - _mdl(mdl), - _handleRecorder() + _match_data(mdl.createMatchData()) { - HandleRecorder::Binder bind(_handleRecorder); } MatchTools::~MatchTools() {} search::fef::RankProgram::UP -MatchTools::first_phase_program() const { +MatchTools::first_phase_program() +{ auto program = setup_program(_rankSetup.create_first_phase_program(), - _mdl, _queryEnv, _featureOverrides); - program->match_data().set_termwise_limit(TermwiseLimit::lookup(_queryEnv.getProperties(), - _rankSetup.get_termwise_limit())); + *_match_data, _queryEnv, _featureOverrides); + _match_data->set_termwise_limit(TermwiseLimit::lookup(_queryEnv.getProperties(), + _rankSetup.get_termwise_limit())); return program; } search::fef::RankProgram::UP -MatchTools::second_phase_program() const { +MatchTools::second_phase_program() +{ return setup_program(_rankSetup.create_second_phase_program(), - _mdl, _queryEnv, _featureOverrides); + *_match_data, _queryEnv, _featureOverrides); } search::fef::RankProgram::UP -MatchTools::summary_program() const { +MatchTools::summary_program() +{ return setup_program(_rankSetup.create_summary_program(), - _mdl, _queryEnv, _featureOverrides); + *_match_data, _queryEnv, _featureOverrides); } search::fef::RankProgram::UP -MatchTools::dump_program() const { +MatchTools::dump_program() +{ return setup_program(_rankSetup.create_dump_program(), - _mdl, _queryEnv, _featureOverrides); + *_match_data, _queryEnv, _featureOverrides); } //----------------------------------------------------------------------------- diff --git a/searchcore/src/vespa/searchcore/proton/matching/match_tools.h b/searchcore/src/vespa/searchcore/proton/matching/match_tools.h index b4f1f997d32..460462da35b 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/match_tools.h +++ b/searchcore/src/vespa/searchcore/proton/matching/match_tools.h @@ -31,8 +31,7 @@ private: const QueryEnvironment & _queryEnv; const search::fef::RankSetup & _rankSetup; const search::fef::Properties & _featureOverrides; - search::fef::MatchDataLayout _mdl; - HandleRecorder _handleRecorder; + search::fef::MatchData::UP _match_data; public: typedef std::unique_ptr<MatchTools> UP; MatchTools(const MatchTools &) = delete; @@ -51,15 +50,18 @@ public: const vespalib::Doom &getHardDoom() const { return _hardDoom; } QueryLimiter & getQueryLimiter() { return _queryLimiter; } MaybeMatchPhaseLimiter &match_limiter() { return _match_limiter; } - search::queryeval::SearchIterator::UP - createSearch(search::fef::MatchData &matchData) const { - return _query.createSearch(matchData); + search::queryeval::SearchIterator::UP createSearch() { + return _query.createSearch(*_match_data); } bool has_second_phase_rank() const { return !_rankSetup.getSecondPhaseRank().empty(); } - search::fef::RankProgram::UP first_phase_program() const; - search::fef::RankProgram::UP second_phase_program() const; - search::fef::RankProgram::UP summary_program() const; - search::fef::RankProgram::UP dump_program() const; + const search::fef::MatchData &match_data() const { return *_match_data; } + // NOTE: since rank programs share a single match data, creating a + // new program will invalidate the underlying match data and thus + // also any previously created rank programs. + search::fef::RankProgram::UP first_phase_program(); + search::fef::RankProgram::UP second_phase_program(); + search::fef::RankProgram::UP summary_program(); + search::fef::RankProgram::UP dump_program(); }; class MatchToolsFactory : public vespalib::noncopyable |