diff options
author | Tor Egge <Tor.Egge@yahoo-inc.com> | 2017-08-03 12:21:10 +0000 |
---|---|---|
committer | Tor Egge <Tor.Egge@yahoo-inc.com> | 2017-08-03 12:21:10 +0000 |
commit | c66a01ed3869eac76630d94d3015971860045034 (patch) | |
tree | 826dcb6ee1100a00cbae75880d65777e58428e44 | |
parent | 73bde87baf280b9491d3f2c9fb3a3cd18b96f8c2 (diff) |
Set numDocs and committedDocIdLimit when loading reference attribute.
Handle shrinking of reference attribute.
3 files changed, 29 insertions, 0 deletions
diff --git a/searchlib/src/tests/attribute/reference_attribute/reference_attribute_test.cpp b/searchlib/src/tests/attribute/reference_attribute/reference_attribute_test.cpp index 745f6fd3c88..d1ded170c86 100644 --- a/searchlib/src/tests/attribute/reference_attribute/reference_attribute_test.cpp +++ b/searchlib/src/tests/attribute/reference_attribute/reference_attribute_test.cpp @@ -243,6 +243,7 @@ TEST_F("require that we can save and load attribute", Fixture) f.commit(); f.save(); f.load(); + EXPECT_EQUAL(5u, f.attr().getNumDocs()); TEST_DO(f.assertNoRef(3)); TEST_DO(f.assertRef(doc1, 1)); TEST_DO(f.assertRef(doc2, 2)); diff --git a/searchlib/src/vespa/searchlib/attribute/reference_attribute.cpp b/searchlib/src/vespa/searchlib/attribute/reference_attribute.cpp index 92f7bd2ba1c..9f5d9cacd55 100644 --- a/searchlib/src/vespa/searchlib/attribute/reference_attribute.cpp +++ b/searchlib/src/vespa/searchlib/attribute/reference_attribute.cpp @@ -164,6 +164,8 @@ ReferenceAttribute::onLoad() _indices.push_back(builder.mapEnumValueToEntryRef(enumValue)); } builder.makeDictionary(); + setNumDocs(numDocs); + setCommittedDocIdLimit(numDocs); incGeneration(); return true; } @@ -276,6 +278,30 @@ ReferenceAttribute::populateReferencedLids() } } +void +ReferenceAttribute::clearDocs(DocId lidLow, DocId lidLimit) +{ + assert(lidLow <= lidLimit); + assert(lidLimit <= getNumDocs()); + for (DocId lid = lidLow; lid < lidLimit; ++lid) { + EntryRef oldRef = _indices[lid]; + if (oldRef.valid()) { + _indices[lid] = EntryRef(); + _store.remove(oldRef); + } + } +} + +void +ReferenceAttribute::onShrinkLidSpace() +{ + // References for lids > committedDocIdLimit have been cleared. + uint32_t committedDocIdLimit = getCommittedDocIdLimit(); + assert(_indices.size() >= committedDocIdLimit); + _indices.shrink(committedDocIdLimit); + setNumDocs(committedDocIdLimit); +} + IMPLEMENT_IDENTIFIABLE_ABSTRACT(ReferenceAttribute, AttributeVector); } diff --git a/searchlib/src/vespa/searchlib/attribute/reference_attribute.h b/searchlib/src/vespa/searchlib/attribute/reference_attribute.h index f0e7c22f8f4..0df40cf8b2a 100644 --- a/searchlib/src/vespa/searchlib/attribute/reference_attribute.h +++ b/searchlib/src/vespa/searchlib/attribute/reference_attribute.h @@ -84,6 +84,8 @@ public: DocId getReferencedLid(DocId doc) const; void notifyGidToLidChange(const GlobalId &gid, DocId referencedLid); void populateReferencedLids(); + virtual void clearDocs(DocId lidLow, DocId lidLimit) override; + virtual void onShrinkLidSpace() override; }; } |