// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #pragma once #include "multinumericattribute.h" #include "multi_numeric_search_context.h" #include #include namespace search { using FlagBaseImpl = MultiValueNumericAttribute< IntegerAttributeTemplate, int8_t >; template class FlagAttributeT : public B { public: FlagAttributeT(const vespalib::string & baseFileName, const AttributeVector::Config & cfg); private: using DocId = AttributeVector::DocId; bool onLoad(vespalib::Executor *executor) override; bool onLoadEnumerated(ReaderBase &attrReader) override; std::unique_ptr getSearch(std::unique_ptr term, const attribute::SearchContextParams & params) const override; void clearOldValues(DocId doc) override; void setNewValues(DocId doc, const std::vector & values) override; public: void setNewBVValue(DocId doc, multivalue::ValueType_t value); private: bool onAddDoc(DocId doc) override; void onAddDocs(DocId docIdLimit) override; void ensureGuardBit(BitVector & bv); void ensureGuardBit(); void clearGuardBit(DocId doc); void resizeBitVectors(uint32_t neededSize); void reclaim_memory(vespalib::GenerationHandler::generation_t oldest_used_gen) override; uint32_t getOffset(int8_t value) const { return value + 128; } using AtomicBitVectorPtr = vespalib::datastore::AtomicValueWrapper; vespalib::GenerationHolder _bitVectorHolder; std::vector > _bitVectorStore; std::vector _bitVectors; uint32_t _bitVectorSize; }; using FlagAttribute = FlagAttributeT; } // namespace search