// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #pragma once #include "multistringattribute.h" #include "enumattribute.hpp" #include "enumerated_multi_value_read_view.h" #include "multi_string_enum_hint_search_context.h" #include "string_sort_blob_writer.h" #include #include #include #include #include #include #include namespace search { //----------------------------------------------------------------------------- // MultiValueStringAttributeT public //----------------------------------------------------------------------------- template MultiValueStringAttributeT:: MultiValueStringAttributeT(const vespalib::string &name, const AttributeVector::Config &c) : MultiValueEnumAttribute(name, c) { } template MultiValueStringAttributeT::MultiValueStringAttributeT(const vespalib::string &name) : MultiValueStringAttributeT(name, AttributeVector::Config(AttributeVector::BasicType::STRING, attribute::CollectionType::ARRAY)) { } template MultiValueStringAttributeT::~MultiValueStringAttributeT() = default; template void MultiValueStringAttributeT::freezeEnumDictionary() { this->getEnumStore().freeze_dictionary(); } template std::unique_ptr MultiValueStringAttributeT::getSearch(QueryTermSimpleUP qTerm, const attribute::SearchContextParams ¶ms) const { bool cased = this->get_match_is_cased(); auto doc_id_limit = this->getCommittedDocIdLimit(); return std::make_unique>(std::move(qTerm), cased, params.fuzzy_matching_algorithm(), *this, this->_mvMapping.make_read_view(doc_id_limit), this->_enumStore, doc_id_limit, this->getStatus().getNumValues()); } template const attribute::IArrayReadView* MultiValueStringAttributeT::make_read_view(attribute::IMultiValueAttribute::ArrayTag, vespalib::Stash& stash) const { return &stash.create>(this->_mvMapping.make_read_view(this->getCommittedDocIdLimit()), this->_enumStore); } template const attribute::IWeightedSetReadView* MultiValueStringAttributeT::make_read_view(attribute::IMultiValueAttribute::WeightedSetTag, vespalib::Stash& stash) const { return &stash.create, M>>(this->_mvMapping.make_read_view(this->getCommittedDocIdLimit()), this->_enumStore); } template long MultiValueStringAttributeT::on_serialize_for_sort(DocId doc, void * serTo, long available, const common::BlobConverter * bc, bool asc) const { attribute::StringSortBlobWriter writer(serTo, available, bc, asc); auto indices = this->_mvMapping.get(doc); for (auto& v : indices) { if (!writer.candidate(this->_enumStore.get_value(multivalue::get_value_ref(v).load_acquire()))) { return -1; } } return writer.write(); } template long MultiValueStringAttributeT::onSerializeForAscendingSort(DocId doc, void * serTo, long available, const common::BlobConverter * bc) const { return on_serialize_for_sort(doc, serTo, available, bc, true); } template long MultiValueStringAttributeT::onSerializeForDescendingSort(DocId doc, void * serTo, long available, const common::BlobConverter * bc) const { return on_serialize_for_sort(doc, serTo, available, bc, false); } } // namespace search