// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "attribute_builder.h" #include #include #include #include #include #include #include #include #include #include using vespalib::eval::SimpleValue; using vespalib::eval::TensorSpec; namespace search::attribute::test { AttributeBuilder::AttributeBuilder(const vespalib::string& name, const Config& cfg) : _attr_ptr(AttributeFactory::createAttribute(name, cfg)), _attr(*_attr_ptr) { _attr.addReservedDoc(); } namespace { void add_docs(AttributeVector& attr, size_t num_docs) { attr.addDocs(num_docs); } template void fill_helper(AttributeVector& attr, std::initializer_list values) { add_docs(attr, values.size()); auto& real = dynamic_cast(attr); uint32_t docid = 1; for (auto value : values) { real.update(docid++, value); } attr.commit(true); } template void fill_array_helper(AttributeVector& attr, std::initializer_list> values) { assert(attr.hasMultiValue()); add_docs(attr, values.size()); auto& real = dynamic_cast(attr); uint32_t docid = 1; for (auto value : values) { for (auto elem : value) { real.append(docid, elem, 1); } ++docid; } attr.commit(true); } template void fill_wset_helper(AttributeVector& attr, std::initializer_list>> values) { assert(attr.hasMultiValue()); add_docs(attr, values.size()); auto& real = dynamic_cast(attr); uint32_t docid = 1; for (auto value : values) { for (auto elem : value) { real.append(docid, elem.first, elem.second); } ++docid; } attr.commit(true); } } AttributeBuilder& AttributeBuilder::docs(size_t num_docs) { add_docs(_attr, num_docs); return *this; } AttributeBuilder& AttributeBuilder::fill(std::initializer_list values) { fill_helper(_attr, values); return *this; } AttributeBuilder& AttributeBuilder::fill(std::initializer_list values) { fill_helper(_attr, values); return *this; } AttributeBuilder& AttributeBuilder::fill_array(std::initializer_list values) { fill_array_helper(_attr, values); return *this; } AttributeBuilder& AttributeBuilder::fill_wset(std::initializer_list values) { fill_wset_helper(_attr, values); return *this; } AttributeBuilder& AttributeBuilder::fill(std::initializer_list values) { fill_helper(_attr, values); return *this; } AttributeBuilder& AttributeBuilder::fill_array(std::initializer_list values) { fill_array_helper(_attr, values); return *this; } AttributeBuilder& AttributeBuilder::fill_wset(std::initializer_list values) { fill_wset_helper(_attr, values); return *this; } AttributeBuilder& AttributeBuilder::fill(std::initializer_list values) { fill_helper(_attr, values); return *this; } AttributeBuilder& AttributeBuilder::fill_array(std::initializer_list values) { fill_array_helper(_attr, values); return *this; } AttributeBuilder& AttributeBuilder::fill_wset(std::initializer_list values) { fill_wset_helper(_attr, values); return *this; } AttributeBuilder& AttributeBuilder::fill(std::initializer_list> values) { fill_helper>(_attr, values); return *this; } AttributeBuilder& AttributeBuilder::fill_tensor(const std::vector& values) { add_docs(_attr, values.size()); auto& real = dynamic_cast(_attr); vespalib::string tensor_type = real.getConfig().tensorType().to_spec(); uint32_t docid = 1; for (const auto& value : values) { if (!value.empty()) { auto spec = TensorSpec::from_expr(tensor_type + ":" + value); auto tensor = SimpleValue::from_spec(spec); real.setTensor(docid, *tensor); } ++docid; } _attr.commit(true); return *this; } }