// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #pragma once #include "multi_numeric_search_context.h" #include namespace search { class BitVector; template class FlagAttributeIteratorT; template class FlagAttributeIteratorStrict; } namespace search::attribute { /* * MultiNumericFlagSearchContext handles the creation of search iterators for * a query term on a multi value numeric flag attribute vector. */ template class MultiNumericFlagSearchContext : public MultiNumericSearchContext { public: using AtomicBitVectorsRef = vespalib::ConstArrayRef>; MultiNumericFlagSearchContext(std::unique_ptr qTerm, const AttributeVector& toBeSearched, MultiValueMappingReadView mv_mapping_read_view, AtomicBitVectorsRef bit_vectors); std::unique_ptr createIterator(fef::TermFieldMatchData * matchData, bool strict) override; private: AtomicBitVectorsRef _bit_vectors; bool _zeroHits; const BitVector* get_bit_vector(T value) const { static_assert(std::is_same_v, "Flag attribute search context is only supported for int8_t data type"); return _bit_vectors[value + 128].load_acquire(); } template friend class ::search::FlagAttributeIteratorT; template friend class ::search::FlagAttributeIteratorStrict; }; }