// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "multinumericattributesaver.h" #include "multivalueattributesaverutils.h" #include #include using vespalib::GenerationHandler; using search::multivalueattributesaver::CountWriter; using search::multivalueattributesaver::WeightWriter; namespace search { namespace { class DatWriter { std::unique_ptr _datWriter; public: explicit DatWriter(IAttributeSaveTarget &saveTarget) : _datWriter(saveTarget.datWriter().allocBufferWriter()) { } ~DatWriter() { _datWriter->flush(); } template void writeValues(vespalib::ConstArrayRef values) { for (const MultiValueT &valueRef : values) { using ValueType = multivalue::ValueType_t; ValueType value(valueRef); _datWriter->write(&value, sizeof(ValueType)); } } }; } template MultiValueNumericAttributeSaver:: MultiValueNumericAttributeSaver(GenerationHandler::Guard &&guard, const attribute::AttributeHeader &header, const MultiValueMapping &mvMapping) : Parent(std::move(guard), header, mvMapping), _mvMapping(mvMapping) { } template MultiValueNumericAttributeSaver::~MultiValueNumericAttributeSaver() = default; template bool MultiValueNumericAttributeSaver::onSave(IAttributeSaveTarget &saveTarget) { CountWriter countWriter(saveTarget); WeightWriter> weightWriter(saveTarget); DatWriter datWriter(saveTarget); for (uint32_t docId = 0; docId < _frozenIndices.size(); ++docId) { vespalib::datastore::EntryRef idx = _frozenIndices[docId]; vespalib::ConstArrayRef values(_mvMapping.getDataForIdx(idx)); countWriter.writeCount(values.size()); weightWriter.writeWeights(values); datWriter.writeValues(values); } return true; } template class MultiValueNumericAttributeSaver; template class MultiValueNumericAttributeSaver; template class MultiValueNumericAttributeSaver; template class MultiValueNumericAttributeSaver; template class MultiValueNumericAttributeSaver; template class MultiValueNumericAttributeSaver; template class MultiValueNumericAttributeSaver>; template class MultiValueNumericAttributeSaver>; template class MultiValueNumericAttributeSaver>; template class MultiValueNumericAttributeSaver>; template class MultiValueNumericAttributeSaver>; template class MultiValueNumericAttributeSaver>; } // namespace search