diff options
author | Geir Storli <geirst@verizonmedia.com> | 2019-06-21 14:15:26 +0000 |
---|---|---|
committer | Geir Storli <geirst@verizonmedia.com> | 2019-06-21 14:28:04 +0000 |
commit | d1eea019622e242b78ec3e7d3cd741914a2b7130 (patch) | |
tree | d42628402e0604b14d0576921f927f3c9a5dbffc /searchlib | |
parent | 4373b26bdbd1f919bc574096e56ce6332bb5c5a3 (diff) |
Fix bugs in doUnpack() in memory posting iterator.
Diffstat (limited to 'searchlib')
3 files changed, 16 insertions, 3 deletions
diff --git a/searchlib/src/tests/memoryindex/field_index/field_index_test.cpp b/searchlib/src/tests/memoryindex/field_index/field_index_test.cpp index de3b87194f8..ac5ef45e330 100644 --- a/searchlib/src/tests/memoryindex/field_index/field_index_test.cpp +++ b/searchlib/src/tests/memoryindex/field_index/field_index_test.cpp @@ -14,6 +14,7 @@ #include <vespa/searchlib/memoryindex/field_inverter.h> #include <vespa/searchlib/memoryindex/ordered_field_index_inserter.h> #include <vespa/searchlib/memoryindex/posting_iterator.h> +#include <vespa/searchlib/queryeval/iterators.h> #include <vespa/searchlib/test/index/mock_field_length_inspector.h> #include <vespa/searchlib/test/memoryindex/wrap_inserter.h> #include <vespa/vespalib/btree/btreenodeallocator.hpp> @@ -31,6 +32,7 @@ using namespace fef; using namespace index; using document::Document; +using queryeval::RankedSearchIteratorBase; using queryeval::SearchIterator; using search::index::schema::CollectionType; using search::index::schema::DataType; @@ -641,6 +643,9 @@ struct FieldIndexInterleavedFeaturesTest : public FieldIndexTest<FieldIndex<true EXPECT_EQ(exp_field_positions, toString(match_data)); EXPECT_EQ(exp_num_occs, match_data.term.getNumOccs()); EXPECT_EQ(exp_field_length, match_data.term.getFieldLength()); + EXPECT_EQ(10, match_data.term.getDocId()); + auto& ranked_itr = dynamic_cast<RankedSearchIteratorBase&>(*itr); + EXPECT_TRUE(ranked_itr.getUnpacked()); EXPECT_TRUE(!itr->seek(11)); EXPECT_TRUE(itr->isAtEnd()); } @@ -667,6 +672,13 @@ TEST_F(FieldIndexInterleavedFeaturesTest, both_normal_and_interleaved_features_a expect_features_unpacked("{5:0,1}", 2, 5); } +TEST_F(FieldIndexInterleavedFeaturesTest, no_features_are_unpacked) +{ + match_data.term.setNeedNormalFeatures(false); + match_data.term.setNeedInterleavedFeatures(false); + expect_features_unpacked("{1000000:}", 0, 0); +} + Schema make_multi_field_schema() { diff --git a/searchlib/src/vespa/searchlib/memoryindex/posting_iterator.cpp b/searchlib/src/vespa/searchlib/memoryindex/posting_iterator.cpp index ecaa1514c6b..735fec2bb5f 100644 --- a/searchlib/src/vespa/searchlib/memoryindex/posting_iterator.cpp +++ b/searchlib/src/vespa/searchlib/memoryindex/posting_iterator.cpp @@ -124,13 +124,15 @@ PostingIterator<interleaved_features, unpack_normal_features, unpack_interleaved datastore::EntryRef featureRef(_itr.getData().get_features()); _feature_store.setupForUnpackFeatures(featureRef, _feature_decoder); _feature_decoder.unpackFeatures(_matchData, docId); - setUnpacked(); + } else { + _matchData[0]->reset(docId); } if (interleaved_features && unpack_interleaved_features) { auto* tfmd = _matchData[0]; tfmd->setNumOccs(_itr.getData().get_num_occs()); tfmd->setFieldLength(_itr.getData().get_field_length()); } + setUnpacked(); } template <bool interleaved_features> diff --git a/searchlib/src/vespa/searchlib/queryeval/iterators.h b/searchlib/src/vespa/searchlib/queryeval/iterators.h index 43d046a78b7..0e44a6f6ff6 100644 --- a/searchlib/src/vespa/searchlib/queryeval/iterators.h +++ b/searchlib/src/vespa/searchlib/queryeval/iterators.h @@ -16,14 +16,13 @@ public: private: uint32_t _needUnpack; protected: - bool getUnpacked() const { return _needUnpack == 0; } void setUnpacked() { _needUnpack = 0; } void clearUnpacked() { _needUnpack = 1; } uint32_t getNeedUnpack() const { return _needUnpack; } void incNeedUnpack() { ++_needUnpack; } - public: RankedSearchIteratorBase(const fef::TermFieldMatchDataArray &matchData); + bool getUnpacked() const { return _needUnpack == 0; } }; } |