// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "array_attribute_combiner_dfw.h" #include "attribute_combiner_dfw.h" #include "docsum_field_writer_state.h" #include "docsumstate.h" #include "struct_fields_resolver.h" #include "struct_map_attribute_combiner_dfw.h" #include #include #include LOG_SETUP(".searchsummary.docsummary.attribute_combiner_dfw"); using search::attribute::IAttributeContext; namespace search::docsummary { AttributeCombinerDFW::AttributeCombinerDFW(const vespalib::string &fieldName, bool filter_elements, std::shared_ptr matching_elems_fields) : SimpleDFW(), _stateIndex(0), _filter_elements(filter_elements), _fieldName(fieldName), _matching_elems_fields(std::move(matching_elems_fields)) { } AttributeCombinerDFW::~AttributeCombinerDFW() = default; bool AttributeCombinerDFW::setFieldWriterStateIndex(uint32_t fieldWriterStateIndex) { _stateIndex = fieldWriterStateIndex; return true; } std::unique_ptr AttributeCombinerDFW::create(const vespalib::string &fieldName, IAttributeContext &attrCtx, bool filter_elements, std::shared_ptr matching_elems_fields) { StructFieldsResolver structFields(fieldName, attrCtx, true); if (structFields.has_error()) { return {}; } else if (structFields.is_map_of_struct()) { return std::make_unique(fieldName, structFields, filter_elements, std::move(matching_elems_fields)); } return std::make_unique(fieldName, structFields, filter_elements, std::move(matching_elems_fields)); } void AttributeCombinerDFW::insertField(uint32_t docid, GetDocsumsState& state, vespalib::slime::Inserter &target) const { auto& fieldWriterState = state._fieldWriterStates[_stateIndex]; if (!fieldWriterState) { const MatchingElements *matching_elements = nullptr; if (_filter_elements) { matching_elements = &state.get_matching_elements(*_matching_elems_fields); } fieldWriterState = allocFieldWriterState(*state._attrCtx, state.get_stash(), matching_elements); } fieldWriterState->insertField(docid, target); } }