#include "common/JsonCastFunction.h" #include #include "common/EasyAssert.h" namespace milvus { const std::unordered_map JsonCastFunction::predefined_cast_functions_ = { {"STRING_TO_DOUBLE", JsonCastFunction(Type::kString2Double)}, }; JsonCastFunction JsonCastFunction::FromString(const std::string& str) { auto it = predefined_cast_functions_.find(str); if (it != predefined_cast_functions_.end()) { return it->second; } return JsonCastFunction(Type::kUnknown); } template <> std::optional JsonCastFunction::cast(const std::string& t) const { try { return std::stod(t); } catch (const std::exception&) { return std::nullopt; } } template <> std::optional JsonCastFunction::cast(const int64_t& t) const { return static_cast(t); } template <> std::optional JsonCastFunction::cast(const double& t) const { return t; } template <> std::optional JsonCastFunction::cast(const bool& t) const { return std::nullopt; } template std::optional JsonCastFunction::CastJsonValue(const JsonCastFunction& cast_function, const Json& json, const std::string& pointer) { AssertInfo(cast_function.match(), "Type mismatch"); auto json_type = json.type(pointer); std::optional res; switch (json_type.value()) { case simdjson::ondemand::json_type::string: { auto json_value = json.at(pointer); res = cast_function.cast( std::string(json_value.value())); break; } case simdjson::ondemand::json_type::number: { if (json.get_number_type(pointer) == simdjson::ondemand::number_type::floating_point_number) { auto json_value = json.at(pointer); res = cast_function.cast(json_value.value()); } else { auto json_value = json.at(pointer); res = cast_function.cast(json_value.value()); } break; } case simdjson::ondemand::json_type::boolean: { auto json_value = json.at(pointer); res = cast_function.cast(json_value.value()); break; } default: break; } return res; } template std::optional JsonCastFunction::CastJsonValue(const JsonCastFunction& cast_function, const Json& json, const std::string& pointer); template std::optional JsonCastFunction::CastJsonValue(const JsonCastFunction& cast_function, const Json& json, const std::string& pointer); template std::optional JsonCastFunction::CastJsonValue(const JsonCastFunction& cast_function, const Json& json, const std::string& pointer); template std::optional JsonCastFunction::CastJsonValue( const JsonCastFunction& cast_function, const Json& json, const std::string& pointer); } // namespace milvus