diff options
author | Tor Egge <Tor.Egge@yahoo-inc.com> | 2016-12-08 16:24:52 +0000 |
---|---|---|
committer | Tor Egge <Tor.Egge@yahoo-inc.com> | 2016-12-08 16:24:52 +0000 |
commit | 482d7c852053566798bc4909bf89398091cc3313 (patch) | |
tree | 3c6e1de6401d74969500209d6531d1fc91e28588 /streamingvisitors | |
parent | eaed14310982d37fba4da1bbde6c386226626768 (diff) |
Use feature resolver instead of resolving directly on match data.
Diffstat (limited to 'streamingvisitors')
4 files changed, 26 insertions, 21 deletions
diff --git a/streamingvisitors/src/tests/hitcollector/hitcollector.cpp b/streamingvisitors/src/tests/hitcollector/hitcollector.cpp index 4e008211223..2cb65040486 100644 --- a/streamingvisitors/src/tests/hitcollector/hitcollector.cpp +++ b/streamingvisitors/src/tests/hitcollector/hitcollector.cpp @@ -5,6 +5,7 @@ #include <vespa/document/fieldvalue/fieldvalues.h> #include <vespa/searchlib/fef/matchdata.h> +#include <vespa/searchlib/fef/feature_resolver.h> #include <vespa/searchvisitor/hitcollector.h> #include <vespa/vdslib/container/searchresult.h> #include <vespa/vsm/common/storagedocument.h> @@ -237,6 +238,13 @@ public: *_matchData.resolveFeature(2) = docid + 30; return _matchData; } + + FeatureResolver get_resolver() { + FeatureResolver resolver(2); + resolver.add("foo", _matchData.resolve_raw(0), false); + resolver.add("bar", _matchData.resolve_raw(2), false); + return resolver; + } }; void @@ -250,15 +258,9 @@ HitCollectorTest::testFeatureSet() addHit(hc, 3, 40); // on heap addHit(hc, 4, 30); // on heap - std::vector<vespalib::string> names; - std::vector<FeatureHandle> handles; - names.push_back("foo"); - names.push_back("bar"); - handles.push_back(0); - handles.push_back(2); - MyRankProgram rankProgram; - search::FeatureSet::SP sf = hc.getFeatureSet(rankProgram, names, handles); + FeatureResolver resolver(rankProgram.get_resolver()); + search::FeatureSet::SP sf = hc.getFeatureSet(rankProgram, resolver); EXPECT_EQUAL(sf->getNames().size(), 2u); EXPECT_EQUAL(sf->getNames()[0], "foo"); diff --git a/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp b/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp index 10b752adf9e..09fa3fd5639 100644 --- a/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp +++ b/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp @@ -4,6 +4,7 @@ #include <vespa/log/log.h> LOG_SETUP(".searchvisitor.hitcollector"); #include "hitcollector.h" +#include <vespa/searchlib/fef/feature_resolver.h> #include <stdexcept> using search::FeatureSet; @@ -125,20 +126,24 @@ HitCollector::fillSearchResult(vdslib::SearchResult & searchResult) FeatureSet::SP HitCollector::getFeatureSet(IRankProgram &rankProgram, - const std::vector<vespalib::string> & names, - const std::vector<search::fef::FeatureHandle> & handles) + const search::fef::FeatureResolver &resolver) { - if (names.empty() || _hits.empty()) { + if (resolver.num_features() == 0 || _hits.empty()) { return FeatureSet::SP(new FeatureSet()); } sortByDocId(); + std::vector<vespalib::string> names; + names.reserve(resolver.num_features()); + for (size_t i = 0; i < resolver.num_features(); ++i) { + names.emplace_back(resolver.name_of(i)); + } FeatureSet::SP retval = FeatureSet::SP(new FeatureSet(names, _hits.size())); for (HitVector::iterator it(_hits.begin()), mt(_hits.end()); it != mt; ++it) { const MatchData &matchData = rankProgram.run(it->getDocId(), it->getMatchData()); uint32_t docId = matchData.getDocId(); search::feature_t * f = retval->getFeaturesByIndex(retval->addDocId(docId)); for (uint32_t j = 0; j < names.size(); ++j) { - f[j] = *matchData.resolveFeature(handles[j]); + f[j] = *resolver.resolve_number(j); LOG(debug, "getFeatureSet: lDocId(%u), '%s': %f", docId, names[j].c_str(), f[j]); } } diff --git a/streamingvisitors/src/vespa/searchvisitor/hitcollector.h b/streamingvisitors/src/vespa/searchvisitor/hitcollector.h index 11c799f1c06..fc43e748a6d 100644 --- a/streamingvisitors/src/vespa/searchvisitor/hitcollector.h +++ b/streamingvisitors/src/vespa/searchvisitor/hitcollector.h @@ -9,6 +9,8 @@ #include <vespa/vsm/common/storagedocument.h> #include <vespa/vespalib/stllike/string.h> +namespace search { namespace fef { class FeatureResolver; } } + namespace storage { /** @@ -132,12 +134,10 @@ public: * * @return features for all hits on the heap. * @param rankProgram the rank program used to calculate all features. - * @param names names of all features. - * @param handles handles of all features. + * @param resolver feature resolver, gives feature names and values **/ search::FeatureSet::SP getFeatureSet(IRankProgram &rankProgram, - const std::vector<vespalib::string> & names, - const std::vector<search::fef::FeatureHandle> & handles); + const search::fef::FeatureResolver &resolver); }; diff --git a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp index aa42ec40bb9..d6870d485d5 100644 --- a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp +++ b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp @@ -202,13 +202,11 @@ FeatureSet::SP RankProcessor::calculateFeatureSet() { LOG(debug, "Calculate feature set"); - std::vector<vespalib::string> names; - std::vector<FeatureHandle> handles; RankProgram &rankProgram = *(_summaryProgram.get() != nullptr ? _summaryProgram : _rankProgram); - rankProgram.get_seed_handles(names, handles); - LOG(debug, "Feature handles: numNames(%ld), numHandles(%ld)", names.size(), handles.size()); + search::fef::FeatureResolver resolver(rankProgram.get_seeds()); + LOG(debug, "Feature handles: numNames(%ld)", resolver.num_features()); RankProgramWrapper wrapper(rankProgram); - FeatureSet::SP sf = _hitCollector->getFeatureSet(wrapper, names, handles); + FeatureSet::SP sf = _hitCollector->getFeatureSet(wrapper, resolver); LOG(debug, "Feature set: numFeatures(%u), numDocs(%u)", sf->numFeatures(), sf->numDocs()); return sf; } |