summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2017-09-08 13:54:56 +0000
committerHåvard Pettersen <havardpe@oath.com>2017-09-19 12:31:43 +0000
commitf29abebf697e89959368c57a57614b0166543bf3 (patch)
treeabc32b9e1b9953df05a6e1e51df388cd983f32ca /searchcore
parentd84f35db2ad848ea352b3892c234fbfcb6f092a7 (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')
-rw-r--r--searchcore/src/tests/proton/matching/matching_test.cpp2
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/match_master.cpp2
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/match_thread.cpp4
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/match_tools.cpp35
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/match_tools.h20
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