diff options
author | Tor Egge <Tor.Egge@online.no> | 2022-08-29 17:33:04 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2022-08-29 17:33:04 +0200 |
commit | 7032f820c64c6a020483657b76c0ef594114d30f (patch) | |
tree | 5ac756a6623e3dcfa0bde4cdd79d897539d967e0 /searchsummary | |
parent | 1e059c5104ba96bf37f9f0ab7c1d08f17cc1fec4 (diff) |
Factor out DocsumFieldWriterFactory.
Diffstat (limited to 'searchsummary')
13 files changed, 278 insertions, 145 deletions
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt b/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt index aec86d49d7d..963c94f7796 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt +++ b/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt @@ -9,6 +9,7 @@ vespa_add_library(searchsummary_docsummary OBJECT copy_dfw.cpp docsumconfig.cpp docsum_field_writer.cpp + docsum_field_writer_factory.cpp docsum_store_document.cpp docsumstate.cpp docsumwriter.cpp @@ -24,6 +25,7 @@ vespa_add_library(searchsummary_docsummary OBJECT matched_elements_filter_dfw.cpp positionsdfw.cpp rankfeaturesdfw.cpp + res_config_entry.cpp res_type_utils.cpp resultclass.cpp resultconfig.cpp diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp new file mode 100644 index 00000000000..fdbf9cf169d --- /dev/null +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp @@ -0,0 +1,115 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "docsum_field_writer_factory.h" +#include "attribute_combiner_dfw.h" +#include "copy_dfw.h" +#include "document_id_dfw.h" +#include "empty_dfw.h" +#include "geoposdfw.h" +#include "idocsumenvironment.h" +#include "juniperdfw.h" +#include "matched_elements_filter_dfw.h" +#include "positionsdfw.h" +#include "rankfeaturesdfw.h" +#include "summaryfeaturesdfw.h" +#include <vespa/searchlib/common/matching_elements_fields.h> +#include <vespa/vespalib/util/exceptions.h> + +using vespalib::IllegalArgumentException; + +namespace search::docsummary { + +DocsumFieldWriterFactory::DocsumFieldWriterFactory(bool use_v8_geo_positions, IDocsumEnvironment* env) + : _use_v8_geo_positions(use_v8_geo_positions), + _env(env), + _matching_elems_fields(std::make_shared<MatchingElementsFields>()) +{ +} + +DocsumFieldWriterFactory::~DocsumFieldWriterFactory() = default; + +std::unique_ptr<DocsumFieldWriter> +DocsumFieldWriterFactory::create_docsum_field_writer(const vespalib::string& fieldName, const vespalib::string& overrideName, const vespalib::string& argument, bool& rc) +{ + rc = false; + std::unique_ptr<DocsumFieldWriter> fieldWriter; + if (overrideName == "dynamicteaser") { + if ( ! argument.empty() ) { + auto fw = std::make_unique<DynamicTeaserDFW>(getEnvironment()->getJuniper()); + auto fw_ptr = fw.get(); + fieldWriter = std::move(fw); + rc = fw_ptr->Init(fieldName.c_str(), argument); + } else { + throw IllegalArgumentException("Missing argument"); + } + } else if (overrideName == "summaryfeatures") { + fieldWriter = std::make_unique<SummaryFeaturesDFW>(getEnvironment()); + rc = true; + } else if (overrideName == "rankfeatures") { + fieldWriter = std::make_unique<RankFeaturesDFW>(getEnvironment()); + rc = true; + } else if (overrideName == "empty") { + fieldWriter = std::make_unique<EmptyDFW>(); + rc = true; + } else if (overrideName == "copy") { + if ( ! argument.empty() ) { + fieldWriter = std::make_unique<CopyDFW>(argument); + rc = true; + } else { + throw IllegalArgumentException("Missing argument"); + } + } else if (overrideName == "absdist") { + if (getEnvironment()) { + fieldWriter = AbsDistanceDFW::create(argument.c_str(), getEnvironment()->getAttributeManager()); + rc = static_cast<bool>(fieldWriter); + } + } else if (overrideName == "positions") { + if (getEnvironment()) { + fieldWriter = PositionsDFW::create(argument.c_str(), getEnvironment()->getAttributeManager(), _use_v8_geo_positions); + rc = static_cast<bool>(fieldWriter); + } + } else if (overrideName == "geopos") { + if (getEnvironment()) { + fieldWriter = GeoPositionDFW::create(argument.c_str(), getEnvironment()->getAttributeManager(), _use_v8_geo_positions); + rc = static_cast<bool>(fieldWriter); + } + } else if (overrideName == "attribute") { + if (getEnvironment() && getEnvironment()->getAttributeManager()) { + fieldWriter = AttributeDFWFactory::create(*getEnvironment()->getAttributeManager(), argument); + rc = true; // Allow missing attribute vector + } + } else if (overrideName == "attributecombiner") { + if (getEnvironment() && getEnvironment()->getAttributeManager()) { + auto attr_ctx = getEnvironment()->getAttributeManager()->createContext(); + const vespalib::string& source_field = argument.empty() ? fieldName : argument; + fieldWriter = AttributeCombinerDFW::create(source_field, *attr_ctx, false, std::shared_ptr<MatchingElementsFields>()); + rc = static_cast<bool>(fieldWriter); + } + } else if (overrideName == "matchedattributeelementsfilter") { + const vespalib::string& source_field = argument.empty() ? fieldName : argument; + if (getEnvironment() && getEnvironment()->getAttributeManager()) { + auto attr_ctx = getEnvironment()->getAttributeManager()->createContext(); + if (attr_ctx->getAttribute(source_field) != nullptr) { + fieldWriter = AttributeDFWFactory::create(*getEnvironment()->getAttributeManager(), source_field, true, _matching_elems_fields); + } else { + fieldWriter = AttributeCombinerDFW::create(source_field, *attr_ctx, true, _matching_elems_fields); + } + rc = static_cast<bool>(fieldWriter); + } + } else if (overrideName == "matchedelementsfilter") { + const vespalib::string& source_field = argument.empty() ? fieldName : argument; + if (getEnvironment() && getEnvironment()->getAttributeManager()) { + auto attr_ctx = getEnvironment()->getAttributeManager()->createContext(); + fieldWriter = MatchedElementsFilterDFW::create(source_field,*attr_ctx, _matching_elems_fields); + rc = static_cast<bool>(fieldWriter); + } + } else if (overrideName == "documentid") { + fieldWriter = std::make_unique<DocumentIdDFW>(); + rc = true; + } else { + throw IllegalArgumentException("unknown override operation '" + overrideName + "' for field '" + fieldName + "'."); + } + return fieldWriter; +} + +} diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h new file mode 100644 index 00000000000..2725ca748bd --- /dev/null +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h @@ -0,0 +1,29 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include "i_docsum_field_writer_factory.h" + +namespace search { class MatchingElementsFields; } + +namespace search::docsummary { + +class IDocsumEnvironment; + +/* + * Factory class for creating docsum field writers. + */ +class DocsumFieldWriterFactory : public IDocsumFieldWriterFactory +{ + bool _use_v8_geo_positions; + IDocsumEnvironment * _env; +protected: + std::shared_ptr<MatchingElementsFields> _matching_elems_fields; + IDocsumEnvironment * getEnvironment() { return _env; } +public: + DocsumFieldWriterFactory(bool use_v8_geo_positions, IDocsumEnvironment* env); + ~DocsumFieldWriterFactory() override; + std::unique_ptr<DocsumFieldWriter> create_docsum_field_writer(const vespalib::string& fieldName, const vespalib::string& overrideName, const vespalib::string& argument, bool& rc) override; +}; + +} diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp index 457d11e8f4b..0c2adcbfaa5 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp @@ -1,20 +1,8 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "docsumconfig.h" -#include "attribute_combiner_dfw.h" -#include "copy_dfw.h" +#include "docsum_field_writer_factory.h" #include "docsumwriter.h" -#include "document_id_dfw.h" -#include "empty_dfw.h" -#include "geoposdfw.h" -#include "idocsumenvironment.h" -#include "juniperdfw.h" -#include "matched_elements_filter_dfw.h" -#include "positionsdfw.h" -#include "rankfeaturesdfw.h" -#include "summaryfeaturesdfw.h" -#include <vespa/searchlib/common/matching_elements_fields.h> -#include <vespa/vespalib/util/stringfmt.h> #include <vespa/vespalib/util/exceptions.h> namespace search::docsummary { @@ -27,99 +15,20 @@ DynamicDocsumConfig::getResultConfig() const { return *_writer->GetResultConfig(); } -std::unique_ptr<DocsumFieldWriter> -DynamicDocsumConfig::createFieldWriter(const string & fieldName, const string & overrideName, const string & argument, bool & rc, std::shared_ptr<MatchingElementsFields> matching_elems_fields) +std::unique_ptr<IDocsumFieldWriterFactory> +DynamicDocsumConfig::make_docsum_field_writer_factory() { - const ResultConfig & resultConfig = getResultConfig(); - rc = false; - std::unique_ptr<DocsumFieldWriter> fieldWriter; - if (overrideName == "dynamicteaser") { - if ( ! argument.empty() ) { - auto fw = std::make_unique<DynamicTeaserDFW>(getEnvironment()->getJuniper()); - auto fw_ptr = fw.get(); - fieldWriter = std::move(fw); - rc = fw_ptr->Init(fieldName.c_str(), argument); - } else { - throw IllegalArgumentException("Missing argument"); - } - } else if (overrideName == "summaryfeatures") { - fieldWriter = std::make_unique<SummaryFeaturesDFW>(getEnvironment()); - rc = true; - } else if (overrideName == "rankfeatures") { - fieldWriter = std::make_unique<RankFeaturesDFW>(getEnvironment()); - rc = true; - } else if (overrideName == "empty") { - fieldWriter = std::make_unique<EmptyDFW>(); - rc = true; - } else if (overrideName == "copy") { - if ( ! argument.empty() ) { - fieldWriter = std::make_unique<CopyDFW>(argument); - rc = true; - } else { - throw IllegalArgumentException("Missing argument"); - } - } else if (overrideName == "absdist") { - if (getEnvironment()) { - fieldWriter = AbsDistanceDFW::create(argument.c_str(), getEnvironment()->getAttributeManager()); - rc = static_cast<bool>(fieldWriter); - } - } else if (overrideName == "positions") { - if (getEnvironment()) { - fieldWriter = PositionsDFW::create(argument.c_str(), getEnvironment()->getAttributeManager(), resultConfig.useV8geoPositions()); - rc = static_cast<bool>(fieldWriter); - } - } else if (overrideName == "geopos") { - if (getEnvironment()) { - fieldWriter = GeoPositionDFW::create(argument.c_str(), getEnvironment()->getAttributeManager(), resultConfig.useV8geoPositions()); - rc = static_cast<bool>(fieldWriter); - } - } else if (overrideName == "attribute") { - if (getEnvironment() && getEnvironment()->getAttributeManager()) { - fieldWriter = AttributeDFWFactory::create(*getEnvironment()->getAttributeManager(), argument); - rc = true; // Allow missing attribute vector - } - } else if (overrideName == "attributecombiner") { - if (getEnvironment() && getEnvironment()->getAttributeManager()) { - auto attr_ctx = getEnvironment()->getAttributeManager()->createContext(); - const string& source_field = argument.empty() ? fieldName : argument; - fieldWriter = AttributeCombinerDFW::create(source_field, *attr_ctx, false, std::shared_ptr<MatchingElementsFields>()); - rc = static_cast<bool>(fieldWriter); - } - } else if (overrideName == "matchedattributeelementsfilter") { - const string& source_field = argument.empty() ? fieldName : argument; - if (getEnvironment() && getEnvironment()->getAttributeManager()) { - auto attr_ctx = getEnvironment()->getAttributeManager()->createContext(); - if (attr_ctx->getAttribute(source_field) != nullptr) { - fieldWriter = AttributeDFWFactory::create(*getEnvironment()->getAttributeManager(), source_field, true, matching_elems_fields); - } else { - fieldWriter = AttributeCombinerDFW::create(source_field, *attr_ctx, true, matching_elems_fields); - } - rc = static_cast<bool>(fieldWriter); - } - } else if (overrideName == "matchedelementsfilter") { - const string& source_field = argument.empty() ? fieldName : argument; - if (getEnvironment() && getEnvironment()->getAttributeManager()) { - auto attr_ctx = getEnvironment()->getAttributeManager()->createContext(); - fieldWriter = MatchedElementsFilterDFW::create(source_field,*attr_ctx, matching_elems_fields); - rc = static_cast<bool>(fieldWriter); - } - } else if (overrideName == "documentid") { - fieldWriter = std::make_unique<DocumentIdDFW>(); - rc = true; - } else { - throw IllegalArgumentException("unknown override operation '" + overrideName + "' for field '" + fieldName + "'."); - } - return fieldWriter; + return std::make_unique<DocsumFieldWriterFactory>(getResultConfig().useV8geoPositions(), getEnvironment()); } void DynamicDocsumConfig::configure(const vespa::config::search::SummarymapConfig &cfg) { std::vector<string> strCfg; - auto matching_elems_fields = std::make_shared<MatchingElementsFields>(); + auto docsum_field_writer_factory = make_docsum_field_writer_factory(); for (const auto & o : cfg.override) { bool rc(false); - std::unique_ptr<DocsumFieldWriter> fieldWriter = createFieldWriter(o.field, o.command, o.arguments, rc, matching_elems_fields); + auto fieldWriter = docsum_field_writer_factory->create_docsum_field_writer(o.field, o.command, o.arguments, rc); if (rc && fieldWriter) { rc = _writer->Override(o.field.c_str(), std::move(fieldWriter)); // OBJECT HAND-OVER } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h index cb337f7f3d3..f5a82b4f79b 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h @@ -8,6 +8,7 @@ namespace search { class MatchingElementsFields; } namespace search::docsummary { class IDocsumEnvironment; +class IDocsumFieldWriterFactory; class DocsumFieldWriter; class DynamicDocsumWriter; class ResultConfig; @@ -26,9 +27,7 @@ protected: IDocsumEnvironment * getEnvironment() { return _env; } const ResultConfig & getResultConfig() const; - virtual std::unique_ptr<DocsumFieldWriter> - createFieldWriter(const string & fieldName, const string & overrideName, - const string & argument, bool & rc, std::shared_ptr<MatchingElementsFields> matching_elems_fields); + virtual std::unique_ptr<IDocsumFieldWriterFactory> make_docsum_field_writer_factory(); private: IDocsumEnvironment * _env; DynamicDocsumWriter * _writer; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/i_docsum_field_writer_factory.h b/searchsummary/src/vespa/searchsummary/docsummary/i_docsum_field_writer_factory.h new file mode 100644 index 00000000000..927fef26d1a --- /dev/null +++ b/searchsummary/src/vespa/searchsummary/docsummary/i_docsum_field_writer_factory.h @@ -0,0 +1,22 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include <memory> +#include <vespa/vespalib/stllike/string.h> + +namespace search::docsummary { + +class DocsumFieldWriter; + +/* + * Factory interface class for creating docsum field writers. + */ +class IDocsumFieldWriterFactory +{ +public: + virtual ~IDocsumFieldWriterFactory() = default; + virtual std::unique_ptr<DocsumFieldWriter> create_docsum_field_writer(const vespalib::string& fieldName, const vespalib::string& overrideName, const vespalib::string& argument, bool& rc) = 0; +}; + +} diff --git a/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.cpp b/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.cpp new file mode 100644 index 00000000000..668fb9b519b --- /dev/null +++ b/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.cpp @@ -0,0 +1,16 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "res_config_entry.h" + +namespace search::docsummary { + +ResConfigEntry::ResConfigEntry() noexcept + : _type(RES_BAD), + _bindname(), + _enumValue(0) +{ +} + +ResConfigEntry::~ResConfigEntry() = default; + +} diff --git a/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.h b/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.h new file mode 100644 index 00000000000..771125b1f45 --- /dev/null +++ b/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.h @@ -0,0 +1,21 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include "res_type.h" +#include <vespa/vespalib/stllike/string.h> + +namespace search::docsummary { + +/** + * This struct describes a single docsum field (name and type). + **/ +struct ResConfigEntry { + ResType _type; + vespalib::string _bindname; + int _enumValue; + ResConfigEntry() noexcept; + ~ResConfigEntry(); +}; + +} diff --git a/searchsummary/src/vespa/searchsummary/docsummary/res_type.h b/searchsummary/src/vespa/searchsummary/docsummary/res_type.h index 02c9f1522a4..e86e0eeedc8 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/res_type.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/res_type.h @@ -24,7 +24,8 @@ enum ResType { RES_LONG_DATA, RES_JSONSTRING, RES_TENSOR, - RES_FEATUREDATA + RES_FEATUREDATA, + RES_BAD }; } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.cpp b/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.cpp index 98cc8372ac1..f7a1aae7455 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.cpp @@ -22,8 +22,63 @@ ResTypeUtils::GetResTypeName(ResType type) case RES_JSONSTRING: return "jsonstring"; case RES_TENSOR: return "tensor"; case RES_FEATUREDATA: return "featuredata"; + default: return "unknown-type"; } - return "unknown-type"; +} + +ResType +ResTypeUtils::get_res_type(vespalib::stringref name) +{ + if (name == "integer") { + return RES_INT; + } + if (name == "short") { + return RES_SHORT; + } + if (name == "byte") { + return RES_BYTE; + } + if (name == "bool") { + return RES_BOOL; + } + if (name == "float") { + return RES_FLOAT; + } + if (name == "double") { + return RES_DOUBLE; + } + if (name == "int64") { + return RES_INT64; + } + if (name == "string") { + return RES_STRING; + } + if (name == "data") { + return RES_DATA; + } + if (name == "longstring") { + return RES_LONG_STRING; + } + if (name == "longdata") { + return RES_LONG_DATA; + } + if (name == "jsonstring") { + return RES_JSONSTRING; + } + if (name == "tensor") { + return RES_TENSOR; + } + if (name == "featuredata") { + return RES_FEATUREDATA; + } + // Known aliases + if (name == "raw") { + return RES_DATA; + } + if (name == "xmlstring") { + return RES_JSONSTRING; + } + return RES_BAD; } } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.h b/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.h index 9d73b7dc3fd..a2e881b5b4d 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.h @@ -3,6 +3,7 @@ #pragma once #include "res_type.h" +#include <vespa/vespalib/stllike/string.h> namespace search::docsummary { @@ -16,6 +17,8 @@ struct ResTypeUtils * @param resType enum value of a result field type. **/ static const char *GetResTypeName(ResType type); + + static ResType get_res_type(vespalib::stringref name); }; } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/resultclass.h b/searchsummary/src/vespa/searchsummary/docsummary/resultclass.h index 5df9ebebdf0..13bd122362a 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/resultclass.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/resultclass.h @@ -2,7 +2,7 @@ #pragma once -#include "res_type.h" +#include "res_config_entry.h" #include <vespa/searchlib/util/rawbuf.h> #include <vespa/vespalib/stllike/string.h> #include <vespa/vespalib/stllike/hash_map.h> @@ -11,16 +11,6 @@ namespace search::docsummary { /** - * This struct describes a single docsum field (name and type). - **/ -struct ResConfigEntry { - ResType _type; - vespalib::string _bindname; - int _enumValue; -}; - - -/** * This class represents a specific docsum format (docsum class). It * contains an array of ResConfigEntry instances (config * entries). It also contains methods for mapping both diff --git a/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp b/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp index 85d197f799a..f5e4c5d34cf 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp @@ -129,39 +129,10 @@ ResultConfig::ReadConfig(const vespa::config::search::SummaryConfig &cfg, const for (unsigned int j = 0; rc && (j < cfg_class.fields.size()); j++) { const char *fieldtype = cfg_class.fields[j].type.c_str(); const char *fieldname = cfg_class.fields[j].name.c_str(); + auto res_type = ResTypeUtils::get_res_type(fieldtype); LOG(debug, "Reconfiguring class '%s' field '%s' of type '%s'", cfg_class.name.c_str(), fieldname, fieldtype); - if (strcmp(fieldtype, "integer") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_INT); - } else if (strcmp(fieldtype, "short") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_SHORT); - } else if (strcmp(fieldtype, "bool") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_BOOL); - } else if (strcmp(fieldtype, "byte") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_BYTE); - } else if (strcmp(fieldtype, "float") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_FLOAT); - } else if (strcmp(fieldtype, "double") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_DOUBLE); - } else if (strcmp(fieldtype, "int64") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_INT64); - } else if (strcmp(fieldtype, "string") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_STRING); - } else if (strcmp(fieldtype, "data") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_DATA); - } else if (strcmp(fieldtype, "raw") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_DATA); - } else if (strcmp(fieldtype, "longstring") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_LONG_STRING); - } else if (strcmp(fieldtype, "longdata") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_LONG_DATA); - } else if (strcmp(fieldtype, "xmlstring") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_JSONSTRING); - } else if (strcmp(fieldtype, "jsonstring") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_JSONSTRING); - } else if (strcmp(fieldtype, "tensor") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_TENSOR); - } else if (strcmp(fieldtype, "featuredata") == 0) { - rc = resClass->AddConfigEntry(fieldname, RES_FEATUREDATA); + if (res_type != RES_BAD) { + rc = resClass->AddConfigEntry(fieldname, res_type); } else { LOG(error, "%s %s.fields[%d]: unknown type '%s'", configId, cfg_class.name.c_str(), j, fieldtype); rc = false; |