aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2019-06-21 14:15:26 +0000
committerGeir Storli <geirst@verizonmedia.com>2019-06-21 14:28:04 +0000
commitd1eea019622e242b78ec3e7d3cd741914a2b7130 (patch)
treed42628402e0604b14d0576921f927f3c9a5dbffc /searchlib
parent4373b26bdbd1f919bc574096e56ce6332bb5c5a3 (diff)
Fix bugs in doUnpack() in memory posting iterator.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/memoryindex/field_index/field_index_test.cpp12
-rw-r--r--searchlib/src/vespa/searchlib/memoryindex/posting_iterator.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/iterators.h3
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; }
};
}