// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #pragma once #include "numericbase.h" #include "loadednumericvalue.h" #include "changevector.h" #include namespace search { class FloatingPointAttribute : public NumericAttribute { public: ~FloatingPointAttribute() override; template bool append(DocId doc, Accessor & ac) { return AttributeVector::append(_changes, doc, ac); } bool append(DocId doc, double v, int32_t weight) { return AttributeVector::append(_changes, doc, NumericChangeData(v), weight); } bool remove(DocId doc, double v, int32_t weight) { return AttributeVector::remove(_changes, doc, NumericChangeData(v), weight); } bool update(DocId doc, double v) { return AttributeVector::update(_changes, doc, NumericChangeData(v)); } bool apply(DocId doc, const ArithmeticValueUpdate & op); bool applyWeight(DocId doc, const FieldValue & fv, const ArithmeticValueUpdate & wAdjust) override; bool applyWeight(DocId doc, const FieldValue& fv, const document::AssignValueUpdate& wAdjust) override; uint32_t clearDoc(DocId doc) override; protected: FloatingPointAttribute(const vespalib::string & name, const Config & c); using Change = ChangeTemplate>; using ChangeVector = ChangeVectorT; ChangeVector _changes; vespalib::MemoryUsage getChangeVectorMemoryUsage() const override; private: vespalib::ConstArrayRef get_raw(DocId) const override; uint32_t get(DocId doc, vespalib::string * v, uint32_t sz) const override; uint32_t get(DocId doc, const char ** v, uint32_t sz) const override; uint32_t get(DocId doc, WeightedString * v, uint32_t sz) const override; uint32_t get(DocId doc, WeightedConstChar * v, uint32_t sz) const override; }; template class FloatingPointAttributeTemplate : public FloatingPointAttribute { public: using Weighted = WeightedType; protected: using EnumEntryType = T; using LoadedNumericValueT = attribute::LoadedNumericValue; public: using BaseType = T; using LoadedValueType = T; using LoadedVector = SequentialReadModifyWriteInterface; virtual T get(DocId doc) const = 0; virtual T getFromEnum(EnumHandle e) const = 0; T defaultValue() const { return isMutable() ? 0.0 : attribute::getUndefined(); } bool isUndefined(DocId doc) const override { return attribute::isUndefined(get(doc)); } protected: explicit FloatingPointAttributeTemplate(const vespalib::string & name); FloatingPointAttributeTemplate(const vespalib::string & name, const Config & c); ~FloatingPointAttributeTemplate() override; virtual bool findEnum(T v, EnumHandle & e) const = 0; virtual void load_enum_store(LoadedVector&) {} virtual void fillValues(LoadedVector &) {} virtual void load_posting_lists(LoadedVector&) {} long onSerializeForAscendingSort(DocId doc, void * serTo, long available, const common::BlobConverter * bc) const override; long onSerializeForDescendingSort(DocId doc, void * serTo, long available, const common::BlobConverter * bc) const override; const Change _defaultValue; private: bool findEnum(const char *value, EnumHandle &e) const override; std::vector findFoldedEnums(const char *value) const override; }; }