From b4b35f73a3294f1b336654301cf0602f42391528 Mon Sep 17 00:00:00 2001 From: Bulat Gayazov Date: Wed, 20 Nov 2024 16:01:29 +0000 Subject: [PATCH 1/2] Remove json_value & yson_value fron ydb-cpp-sdk --- .../library/json_value/ydb_json_value.h | 42 - .../library/yson_value/ydb_yson_value.h | 19 - library/cpp/testing/gtest/gtest.h | 2 + src/library/CMakeLists.txt | 2 - src/library/json_value/CMakeLists.txt | 16 - src/library/json_value/ydb_json_value.cpp | 897 ------------------ src/library/yson_value/CMakeLists.txt | 15 - src/library/yson_value/ydb_yson_value.cpp | 277 ------ .../basic_example_it/basic_example.h | 2 +- .../bulk_upsert_simple_it/main.cpp | 2 +- tests/unit/client/CMakeLists.txt | 48 +- tests/unit/client/params/params_ut.cpp | 2 +- tests/unit/client/value/value_ut.cpp | 4 +- .../library/json_value/ydb_json_value_ut.cpp | 2 +- 14 files changed, 32 insertions(+), 1298 deletions(-) delete mode 100644 include/ydb-cpp-sdk/library/json_value/ydb_json_value.h delete mode 100644 include/ydb-cpp-sdk/library/yson_value/ydb_yson_value.h create mode 100644 library/cpp/testing/gtest/gtest.h delete mode 100644 src/library/json_value/CMakeLists.txt delete mode 100644 src/library/json_value/ydb_json_value.cpp delete mode 100644 src/library/yson_value/CMakeLists.txt delete mode 100644 src/library/yson_value/ydb_yson_value.cpp diff --git a/include/ydb-cpp-sdk/library/json_value/ydb_json_value.h b/include/ydb-cpp-sdk/library/json_value/ydb_json_value.h deleted file mode 100644 index ef80a59132..0000000000 --- a/include/ydb-cpp-sdk/library/json_value/ydb_json_value.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include -#include -#include - -#include - -namespace NYdb { - -enum class EBinaryStringEncoding { - /* For binary strings, encode every byte that is not a printable ascii symbol (codes 32-126) as utf-8. - * Exceptions: \\ \" \b \t \f \r \n - * Example: "Hello\x01" -> "Hello\\u0001" - */ - Unicode = 1, - - /* Encode binary strings to base64 - */ - Base64 -}; - -// ====== YDB to json ====== -void FormatValueJson(const TValue& value, NJsonWriter::TBuf& writer, EBinaryStringEncoding encoding); - -std::string FormatValueJson(const TValue& value, EBinaryStringEncoding encoding); - -void FormatResultRowJson(TResultSetParser& parser, const std::vector& columns, NJsonWriter::TBuf& writer, - EBinaryStringEncoding encoding); - -std::string FormatResultRowJson(TResultSetParser& parser, const std::vector& columns, - EBinaryStringEncoding encoding); - -void FormatResultSetJson(const TResultSet& result, IOutputStream* out, EBinaryStringEncoding encoding); - -std::string FormatResultSetJson(const TResultSet& result, EBinaryStringEncoding encoding); - -// ====== json to YDB ====== -TValue JsonToYdbValue(const std::string& jsonString, const TType& type, EBinaryStringEncoding encoding); -TValue JsonToYdbValue(const NJson::TJsonValue& jsonValue, const TType& type, EBinaryStringEncoding encoding); - -} // namespace NYdb diff --git a/include/ydb-cpp-sdk/library/yson_value/ydb_yson_value.h b/include/ydb-cpp-sdk/library/yson_value/ydb_yson_value.h deleted file mode 100644 index da92724f4b..0000000000 --- a/include/ydb-cpp-sdk/library/yson_value/ydb_yson_value.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include -#include -#include - -#include - -namespace NYdb { - -void FormatValueYson(const TValue& value, NYson::TYsonWriter& writer); - -std::string FormatValueYson(const TValue& value, NYson::EYsonFormat ysonFormat = NYson::EYsonFormat::Text); - -void FormatResultSetYson(const TResultSet& result, NYson::TYsonWriter& writer); - -std::string FormatResultSetYson(const TResultSet& result, NYson::EYsonFormat ysonFormat = NYson::EYsonFormat::Text); - -} // namespace NYdb diff --git a/library/cpp/testing/gtest/gtest.h b/library/cpp/testing/gtest/gtest.h new file mode 100644 index 0000000000..35da75ab47 --- /dev/null +++ b/library/cpp/testing/gtest/gtest.h @@ -0,0 +1,2 @@ +#include +#include diff --git a/src/library/CMakeLists.txt b/src/library/CMakeLists.txt index dbebd28275..33f373a28d 100644 --- a/src/library/CMakeLists.txt +++ b/src/library/CMakeLists.txt @@ -5,7 +5,6 @@ endif() add_subdirectory(decimal) add_subdirectory(grpc/client) add_subdirectory(issue) -add_subdirectory(json_value) add_subdirectory(jwt) add_subdirectory(malloc/api) add_subdirectory(operation_id) @@ -17,4 +16,3 @@ add_subdirectory(string_utils/base64) add_subdirectory(string_utils/helpers) add_subdirectory(string_utils/misc) add_subdirectory(uuid) -add_subdirectory(yson_value) diff --git a/src/library/json_value/CMakeLists.txt b/src/library/json_value/CMakeLists.txt deleted file mode 100644 index 6b9332c55b..0000000000 --- a/src/library/json_value/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -_ydb_sdk_add_library(public-lib-json_value) - -target_link_libraries(public-lib-json_value PUBLIC - yutil - json-writer - string_utils-base64 - client-ydb_result - client-ydb_value - library-uuid -) - -target_sources(public-lib-json_value PRIVATE - ydb_json_value.cpp -) - -_ydb_sdk_make_client_component(JsonValue public-lib-json_value) diff --git a/src/library/json_value/ydb_json_value.cpp b/src/library/json_value/ydb_json_value.cpp deleted file mode 100644 index b5315cba3d..0000000000 --- a/src/library/json_value/ydb_json_value.cpp +++ /dev/null @@ -1,897 +0,0 @@ -#include - -#include - -#include -#include - -#include - -namespace NYdb { - - namespace { - - class TUtf8Transcoder - { - public: - explicit TUtf8Transcoder() - { - }; - - std::string_view Encode(std::string_view str) { - Buffer.clear(); - IsAscii = true; - for (CurPos = 0; CurPos < str.size(); ++CurPos) { - ui8 c = str[CurPos]; - if (c == '"' || c == '\\') { - SwitchToNonAscii(str); - Buffer.push_back('\\'); - Buffer.push_back(c); - } else if (c == '\b') { - SwitchToNonAscii(str); - Buffer.push_back('\\'); - Buffer.push_back('b'); - } else if (c == '\t') { - SwitchToNonAscii(str); - Buffer.push_back('\\'); - Buffer.push_back('t'); - } else if (c == '\f') { - SwitchToNonAscii(str); - Buffer.push_back('\\'); - Buffer.push_back('f'); - } else if (c == '\r') { - SwitchToNonAscii(str); - Buffer.push_back('\\'); - Buffer.push_back('r'); - } else if (c == '\n') { - SwitchToNonAscii(str); - Buffer.push_back('\\'); - Buffer.push_back('n'); - } else if (c < '\x20' || c > '\x7E') { - SwitchToNonAscii(str); - std::string tmp = std::format("\\u{:04X}", c); - for (unsigned char c : tmp) { - Buffer.push_back(c); - } - } else { - if (!IsAscii) { - Buffer.push_back(c); - } - } - } - if (IsAscii) { - return str; - } else { - return std::string_view(Buffer.data(), Buffer.size()); - } - } - - std::string_view Decode(std::string_view str) { - Buffer.clear(); - IsAscii = true; - for (size_t i = 0; i < str.size(); ++i) { - char c = str[i]; - if (ui8(c) < 128) { - if (!IsAscii) { - Buffer.push_back(c); - } - } else if ((c & '\xFC') == '\xC0') { - if (IsAscii) { - Buffer.resize(i); - std::copy(str.data(), str.data() + i, Buffer.data()); - IsAscii = false; - } - Buffer.push_back(((c & '\x03') << 6) | (str[i + 1] & '\x3F')); - i += 1; - } else { - ThrowFatalError("Unicode symbols with codes greater than 255 are not supported."); - } - } - if (IsAscii) { - return str; - } else { - return std::string_view(Buffer.data(), Buffer.size()); - } - } - - private: - void SwitchToNonAscii(std::string_view& str) { - if (IsAscii) { - Buffer.resize(CurPos); - std::copy(str.data(), str.data() + CurPos, Buffer.data()); - IsAscii = false; - } - } - - private: - bool IsAscii; - std::vector Buffer; - size_t CurPos; - }; - - class TYdbToJsonConverter { - public: - TYdbToJsonConverter(TValueParser& parser, NJsonWriter::TBuf& writer, EBinaryStringEncoding encoding) - : Parser(parser) - , Writer(writer) - , Encoding(encoding) - { - } - - void Convert() { - ParseValue(); - } - - private: - void ParsePrimitiveValue(EPrimitiveType type) { - switch (type) { - case EPrimitiveType::Bool: - Writer.WriteBool(Parser.GetBool()); - break; - case EPrimitiveType::Int8: - Writer.WriteInt(Parser.GetInt8()); - break; - case EPrimitiveType::Uint8: - Writer.WriteInt(Parser.GetUint8()); - break; - case EPrimitiveType::Int16: - Writer.WriteInt(Parser.GetInt16()); - break; - case EPrimitiveType::Uint16: - Writer.WriteInt(Parser.GetUint16()); - break; - case EPrimitiveType::Int32: - Writer.WriteInt(Parser.GetInt32()); - break; - case EPrimitiveType::Uint32: - Writer.WriteULongLong(Parser.GetUint32()); - break; - case EPrimitiveType::Int64: - Writer.WriteLongLong(Parser.GetInt64()); - break; - case EPrimitiveType::Uint64: - Writer.WriteULongLong(Parser.GetUint64()); - break; - case EPrimitiveType::Float: - Writer.WriteFloat(Parser.GetFloat(), PREC_AUTO); - break; - case EPrimitiveType::Double: - Writer.WriteDouble(Parser.GetDouble(), PREC_AUTO); - break; - case EPrimitiveType::Date: - Writer.WriteString(Parser.GetDate().FormatGmTime("%Y-%m-%d")); - break; - case EPrimitiveType::Datetime: - Writer.WriteString(Parser.GetDatetime().ToStringUpToSeconds()); - break; - case EPrimitiveType::Timestamp: - Writer.WriteString(Parser.GetTimestamp().ToString()); - break; - case EPrimitiveType::Interval: - Writer.WriteLongLong(Parser.GetInterval()); - break; - case EPrimitiveType::TzDate: - Writer.WriteString(Parser.GetTzDate()); - break; - case EPrimitiveType::TzDatetime: - Writer.WriteString(Parser.GetTzDatetime()); - break; - case EPrimitiveType::TzTimestamp: - Writer.WriteString(Parser.GetTzTimestamp()); - break; - case EPrimitiveType::String: - Writer.UnsafeWriteValue(BinaryStringToJsonString(Parser.GetString())); - break; - case EPrimitiveType::Utf8: - Writer.WriteString(Parser.GetUtf8()); - break; - case EPrimitiveType::Yson: - Writer.UnsafeWriteValue(BinaryStringToJsonString(Parser.GetYson())); - break; - case EPrimitiveType::Json: - Writer.WriteString(Parser.GetJson()); - break; - case EPrimitiveType::Uuid: - Writer.WriteString(Parser.GetUuid().ToString()); - break; - case EPrimitiveType::JsonDocument: - Writer.WriteString(Parser.GetJsonDocument()); - break; - case EPrimitiveType::DyNumber: - Writer.WriteString(Parser.GetDyNumber()); - break; - default: - ThrowFatalError(TStringBuilder() << "Unsupported primitive type: " << type); - } - } - - void ParseValue() { - switch (Parser.GetKind()) { - case TTypeParser::ETypeKind::Primitive: - ParsePrimitiveValue(Parser.GetPrimitiveType()); - break; - - case TTypeParser::ETypeKind::Decimal: - Writer.WriteString(Parser.GetDecimal().ToString()); - break; - - case TTypeParser::ETypeKind::Pg: - if (Parser.GetPg().IsNull()) { - Writer.WriteNull(); - } else if (Parser.GetPg().IsText()) { - Writer.WriteString(Parser.GetPg().Content_); - } else { - Writer.BeginList(); - Writer.UnsafeWriteValue(BinaryStringToJsonString(Parser.GetPg().Content_)); - Writer.EndList(); - } - break; - - case TTypeParser::ETypeKind::Optional: - Parser.OpenOptional(); - if (Parser.IsNull()) { - Writer.WriteNull(); - } else { - ParseValue(); - } - Parser.CloseOptional(); - break; - - case TTypeParser::ETypeKind::Tagged: - Parser.OpenTagged(); - ParseValue(); - Parser.CloseTagged(); - break; - - case TTypeParser::ETypeKind::EmptyList: - { - Writer.BeginList(); - Writer.EndList(); - break; - } - - case TTypeParser::ETypeKind::List: - Parser.OpenList(); - Writer.BeginList(); - - while (Parser.TryNextListItem()) { - ParseValue(); - } - - Parser.CloseList(); - Writer.EndList(); - break; - - case TTypeParser::ETypeKind::Struct: - Parser.OpenStruct(); - Writer.BeginObject(); - - while (Parser.TryNextMember()) { - Writer.WriteKey(Parser.GetMemberName()); - ParseValue(); - } - - Parser.CloseStruct(); - Writer.EndObject(); - break; - - case TTypeParser::ETypeKind::Tuple: - Parser.OpenTuple(); - Writer.BeginList(); - - while (Parser.TryNextElement()) { - ParseValue(); - } - - Parser.CloseTuple(); - Writer.EndList(); - break; - - case TTypeParser::ETypeKind::EmptyDict: - { - Writer.BeginList(); - Writer.EndList(); - break; - } - - case TTypeParser::ETypeKind::Dict: - Parser.OpenDict(); - Writer.BeginList(); - - while (Parser.TryNextDictItem()) { - Writer.BeginList(); - Parser.DictKey(); - ParseValue(); - Parser.DictPayload(); - ParseValue(); - Writer.EndList(); - } - Parser.CloseDict(); - Writer.EndList(); - break; - case TTypeParser::ETypeKind::Null: - Writer.WriteNull(); - break; - default: - ThrowFatalError(TStringBuilder() << "Unsupported type kind: " << Parser.GetKind()); - } - } - - std::string BinaryStringToJsonString(const std::string& s) { - TStringStream str; - str << "\""; - switch (Encoding) { - case EBinaryStringEncoding::Unicode: - str << Utf8Transcoder.Encode(s); - break; - case EBinaryStringEncoding::Base64: - str << Base64Encode(s); - break; - default: - ThrowFatalError(TStringBuilder() << "Unknown binary string encode mode: " - << static_cast(Encoding)); - } - str << "\""; - return str.Str(); - } - - private: - TValueParser& Parser; - NJsonWriter::TBuf& Writer; - EBinaryStringEncoding Encoding; - TUtf8Transcoder Utf8Transcoder; - }; -} - -void FormatValueJson(const TValue& value, NJsonWriter::TBuf& writer, - EBinaryStringEncoding encoding) -{ - TValueParser typeParser(value); - TYdbToJsonConverter converter(typeParser, writer, encoding); - converter.Convert(); -} - -std::string FormatValueJson(const TValue& value, EBinaryStringEncoding encoding) -{ - TStringStream out; - NJsonWriter::TBuf writer(NJsonWriter::HEM_UNSAFE, &out); - - FormatValueJson(value, writer, encoding); - - return out.Str(); -} - -void FormatResultRowJson(TResultSetParser& parser, const std::vector& columns, NJsonWriter::TBuf& writer, - EBinaryStringEncoding encoding) -{ - writer.BeginObject(); - for (ui32 i = 0; i < columns.size(); ++i) { - writer.WriteKey(columns[i].Name); - TYdbToJsonConverter converter(parser.ColumnParser(i), writer, encoding); - converter.Convert(); - } - writer.EndObject(); -} - -std::string FormatResultRowJson(TResultSetParser& parser, const std::vector& columns, - EBinaryStringEncoding encoding) -{ - TStringStream out; - NJsonWriter::TBuf writer(NJsonWriter::HEM_UNSAFE, &out); - - FormatResultRowJson(parser, columns, writer, encoding); - - return out.Str(); -} - -void FormatResultSetJson(const TResultSet& result, IOutputStream* out, EBinaryStringEncoding encoding) -{ - auto columns = result.GetColumnsMeta(); - - TResultSetParser parser(result); - - while (parser.TryNextRow()) { - NJsonWriter::TBuf writer(NJsonWriter::HEM_UNSAFE, out); - FormatResultRowJson(parser, columns, writer, encoding); - *out << Endl; - } -} - -std::string FormatResultSetJson(const TResultSet& result, EBinaryStringEncoding encoding) -{ - TStringStream out; - - FormatResultSetJson(result, &out, encoding); - - return out.Str(); -} - -namespace { - class TJsonToYdbConverter { - public: - TJsonToYdbConverter(TValueBuilder& valueBuilder, const NJson::TJsonValue& jsonValue, TTypeParser& typeParser, - EBinaryStringEncoding encoding) - : ValueBuilder(valueBuilder) - , JsonValue(jsonValue) - , TypeParser(typeParser) - , Encoding(encoding) - { - } - - void Convert() { - ParseValue(JsonValue); - } - - private: - void ParsePrimitiveValue(const NJson::TJsonValue& jsonValue, EPrimitiveType type) { - switch (type) { - case EPrimitiveType::Bool: - EnsureType(jsonValue, NJson::JSON_BOOLEAN); - ValueBuilder.Bool(jsonValue.GetBoolean()); - break; - case EPrimitiveType::Int8: - { - EnsureType(jsonValue, NJson::JSON_INTEGER); - long long intValue = jsonValue.GetInteger(); - if (intValue > std::numeric_limits::max() || intValue < std::numeric_limits::min()) { - ThrowFatalError(TStringBuilder() << "Value \"" << intValue << "\" doesn't fit in Int8 type"); - } - ValueBuilder.Int8(intValue); - break; - } - case EPrimitiveType::Uint8: - { - EnsureType(jsonValue, NJson::JSON_UINTEGER); - unsigned long long intValue = jsonValue.GetUInteger(); - if (intValue > std::numeric_limits::max()) { - ThrowFatalError(TStringBuilder() << "Value \"" << intValue << "\" doesn't fit in UInt8 type"); - } - ValueBuilder.Uint8(intValue); - break; - } - case EPrimitiveType::Int16: - { - EnsureType(jsonValue, NJson::JSON_INTEGER); - long long intValue = jsonValue.GetInteger(); - if (intValue > std::numeric_limits::max() || intValue < std::numeric_limits::min()) { - ThrowFatalError(TStringBuilder() << "Value \"" << intValue << "\" doesn't fit in Int16 type"); - } - ValueBuilder.Int16(intValue); - break; - } - case EPrimitiveType::Uint16: - { - EnsureType(jsonValue, NJson::JSON_UINTEGER); - unsigned long long intValue = jsonValue.GetUInteger(); - if (intValue > std::numeric_limits::max()) { - ThrowFatalError(TStringBuilder() << "Value \"" << intValue << "\" doesn't fit in UInt16 type"); - } - ValueBuilder.Uint16(intValue); - break; - } - case EPrimitiveType::Int32: - { - EnsureType(jsonValue, NJson::JSON_INTEGER); - long long intValue = jsonValue.GetInteger(); - if (intValue > std::numeric_limits::max() || intValue < std::numeric_limits::min()) { - ThrowFatalError(TStringBuilder() << "Value \"" << intValue << "\" doesn't fit in Int32 type"); - } - ValueBuilder.Int32(intValue); - break; - } - case EPrimitiveType::Uint32: - { - EnsureType(jsonValue, NJson::JSON_UINTEGER); - unsigned long long intValue = jsonValue.GetUInteger(); - if (intValue > std::numeric_limits::max()) { - ThrowFatalError(TStringBuilder() << "Value \"" << intValue << "\" doesn't fit in UInt32 type"); - } - ValueBuilder.Uint32(intValue); - break; - } - case EPrimitiveType::Int64: - { - EnsureType(jsonValue, NJson::JSON_INTEGER); - long long intValue = jsonValue.GetInteger(); - if (intValue > std::numeric_limits::max() || intValue < std::numeric_limits::min()) { - ThrowFatalError(TStringBuilder() << "Value \"" << intValue << "\" doesn't fit in Int64 type"); - } - ValueBuilder.Int64(intValue); - break; - } - case EPrimitiveType::Uint64: - { - EnsureType(jsonValue, NJson::JSON_UINTEGER); - unsigned long long intValue = jsonValue.GetUInteger(); - if (intValue > std::numeric_limits::max()) { - ThrowFatalError(TStringBuilder() << "Value \"" << intValue << "\" doesn't fit in UInt64 type"); - } - ValueBuilder.Uint64(intValue); - break; - } - case EPrimitiveType::Float: - EnsureType(jsonValue, NJson::JSON_DOUBLE); - ValueBuilder.Float(jsonValue.GetDouble()); - break; - case EPrimitiveType::Double: - EnsureType(jsonValue, NJson::JSON_DOUBLE); - ValueBuilder.Double(jsonValue.GetDouble()); - break; - case EPrimitiveType::Date: - { - EnsureType(jsonValue, NJson::JSON_STRING); - TInstant date; - if (!TInstant::TryParseIso8601(jsonValue.GetString(), date)) { - ThrowFatalError(TStringBuilder() << "Can't parse date from string \"" << jsonValue.GetString() << "\""); - } - ValueBuilder.Date(date); - break; - } - case EPrimitiveType::Datetime: - { - EnsureType(jsonValue, NJson::JSON_STRING); - TInstant dateTime; - if (!TInstant::TryParseIso8601(jsonValue.GetString(), dateTime)) { - ThrowFatalError(TStringBuilder() << "Can't parse dateTime from string \"" << jsonValue.GetString() << "\""); - } - ValueBuilder.Datetime(dateTime); - break; - } - case EPrimitiveType::Timestamp: - { - EnsureType(jsonValue, NJson::JSON_STRING); - TInstant timestamp; - if (!TInstant::TryParseIso8601(jsonValue.GetString(), timestamp)) { - ThrowFatalError(TStringBuilder() << "Can't parse timestamp from string \"" << jsonValue.GetString() << "\""); - } - ValueBuilder.Timestamp(timestamp); - break; - } - case EPrimitiveType::Interval: - EnsureType(jsonValue, NJson::JSON_INTEGER); - ValueBuilder.Interval(jsonValue.GetInteger()); - break; - case EPrimitiveType::TzDate: - EnsureType(jsonValue, NJson::JSON_STRING); - ValueBuilder.TzDate(jsonValue.GetString()); - break; - case EPrimitiveType::TzDatetime: - EnsureType(jsonValue, NJson::JSON_STRING); - ValueBuilder.TzDatetime(jsonValue.GetString()); - break; - case EPrimitiveType::TzTimestamp: - EnsureType(jsonValue, NJson::JSON_STRING); - ValueBuilder.TzTimestamp(jsonValue.GetString()); - break; - case EPrimitiveType::String: - EnsureType(jsonValue, NJson::JSON_STRING); - ValueBuilder.String(JsonStringToBinaryString(jsonValue.GetString())); - break; - case EPrimitiveType::Utf8: - EnsureType(jsonValue, NJson::JSON_STRING); - ValueBuilder.Utf8(jsonValue.GetString()); - break; - case EPrimitiveType::Yson: - EnsureType(jsonValue, NJson::JSON_STRING); - ValueBuilder.Yson(JsonStringToBinaryString(jsonValue.GetString())); - break; - case EPrimitiveType::Json: - EnsureType(jsonValue, NJson::JSON_STRING); - ValueBuilder.Json(jsonValue.GetString()); - break; - case EPrimitiveType::Uuid: - EnsureType(jsonValue, NJson::JSON_STRING); - ValueBuilder.Uuid(std::string(jsonValue.GetString())); - break; - case EPrimitiveType::JsonDocument: - EnsureType(jsonValue, NJson::JSON_STRING); - ValueBuilder.JsonDocument(jsonValue.GetString()); - break; - case EPrimitiveType::DyNumber: - EnsureType(jsonValue, NJson::JSON_STRING); - ValueBuilder.DyNumber(jsonValue.GetString()); - break; - default: - ThrowFatalError(TStringBuilder() << "Unsupported primitive type: " << type); - } - } - - void BuildTypeInner(TTypeBuilder& typeBuilder) { - switch (TypeParser.GetKind()) { - case TTypeParser::ETypeKind::Primitive: - typeBuilder.Primitive(TypeParser.GetPrimitive()); - break; - case TTypeParser::ETypeKind::Decimal: - typeBuilder.Decimal(TypeParser.GetDecimal()); - break; - case TTypeParser::ETypeKind::Pg: - typeBuilder.Pg(TypeParser.GetPg()); - break; - case TTypeParser::ETypeKind::Optional: - TypeParser.OpenOptional(); - typeBuilder.BeginOptional(); - BuildTypeInner(typeBuilder); - typeBuilder.EndOptional(); - TypeParser.CloseOptional(); - break; - case TTypeParser::ETypeKind::List: - TypeParser.OpenList(); - typeBuilder.BeginList(); - BuildTypeInner(typeBuilder); - TypeParser.CloseList(); - typeBuilder.EndList(); - break; - case TTypeParser::ETypeKind::Struct: - TypeParser.OpenStruct(); - typeBuilder.BeginStruct(); - while (TypeParser.TryNextMember()) { - typeBuilder.AddMember(TypeParser.GetMemberName()); - BuildTypeInner(typeBuilder); - } - TypeParser.CloseStruct(); - typeBuilder.EndStruct(); - break; - case TTypeParser::ETypeKind::Tuple: - TypeParser.OpenTuple(); - typeBuilder.BeginTuple(); - while (TypeParser.TryNextMember()) { - typeBuilder.AddElement(); - BuildTypeInner(typeBuilder); - } - TypeParser.CloseTuple(); - typeBuilder.EndTuple(); - break; - case TTypeParser::ETypeKind::Dict: - TypeParser.OpenDict(); - typeBuilder.BeginDict(); - TypeParser.DictKey(); - typeBuilder.DictKey(); - BuildTypeInner(typeBuilder); - TypeParser.DictPayload(); - typeBuilder.DictPayload(); - BuildTypeInner(typeBuilder); - TypeParser.CloseDict(); - typeBuilder.EndDict(); - break; - default: - ThrowFatalError(TStringBuilder() << "Unsupported type kind: " << TypeParser.GetKind()); - } - } - - TType GetType() { - TTypeBuilder typeBuilder; - BuildTypeInner(typeBuilder); - return typeBuilder.Build(); - } - - void ParseValue(const NJson::TJsonValue& jsonValue) { - switch (TypeParser.GetKind()) { - case TTypeParser::ETypeKind::Null: - EnsureType(jsonValue, NJson::JSON_NULL); - break; - - case TTypeParser::ETypeKind::Primitive: - ParsePrimitiveValue(jsonValue, TypeParser.GetPrimitive()); - break; - - case TTypeParser::ETypeKind::Decimal: - EnsureType(jsonValue, NJson::JSON_STRING); - ValueBuilder.Decimal(TDecimalValue(std::string{jsonValue.GetString()}, 22, 9)); - break; - - case TTypeParser::ETypeKind::Pg: - if (jsonValue.GetType() == NJson::JSON_STRING) { - ValueBuilder.Pg(TPgValue(TPgValue::VK_TEXT, jsonValue.GetString(), TypeParser.GetPg())); - } else if (jsonValue.GetType() == NJson::JSON_NULL) { - ValueBuilder.Pg(TPgValue(TPgValue::VK_NULL, {}, TypeParser.GetPg())); - } else { - EnsureType(jsonValue, NJson::JSON_ARRAY); - if (jsonValue.GetArray().size() != 1) { - ThrowFatalError(TStringBuilder() << "Pg type should be encoded as array with size 1, but not " << jsonValue.GetArray().size()); - } - auto& innerJsonValue = jsonValue.GetArray().at(0); - EnsureType(innerJsonValue, NJson::JSON_STRING); - auto binary = JsonStringToBinaryString(innerJsonValue.GetString()); - ValueBuilder.Pg(TPgValue(TPgValue::VK_BINARY, binary, TypeParser.GetPg())); - } - break; - - case TTypeParser::ETypeKind::Optional: - TypeParser.OpenOptional(); - if (jsonValue.IsNull() && TypeParser.GetKind() != TTypeParser::ETypeKind::Optional) { - ValueBuilder.EmptyOptional(GetType()); - } else { - ValueBuilder.BeginOptional(); - ParseValue(jsonValue); - ValueBuilder.EndOptional(); - } - TypeParser.CloseOptional(); - break; - - case TTypeParser::ETypeKind::Tagged: - TypeParser.OpenTagged(); - ValueBuilder.BeginTagged(TypeParser.GetTag()); - ParseValue(jsonValue); - ValueBuilder.EndTagged(); - TypeParser.CloseTagged(); - break; - - case TTypeParser::ETypeKind::EmptyList: - EnsureType(jsonValue, NJson::JSON_ARRAY); - break; - - case TTypeParser::ETypeKind::List: - EnsureType(jsonValue, NJson::JSON_ARRAY); - TypeParser.OpenList(); - if (jsonValue.GetArray().empty()) { - ValueBuilder.EmptyList(GetType()); - } else { - ValueBuilder.BeginList(); - for (const auto& element : jsonValue.GetArray()) { - ValueBuilder.AddListItem(); - ParseValue(element); - } - ValueBuilder.EndList(); - } - TypeParser.CloseList(); - break; - - case TTypeParser::ETypeKind::Struct: - { - EnsureType(jsonValue, NJson::JSON_MAP); - TypeParser.OpenStruct(); - ValueBuilder.BeginStruct(); - - const auto& jsonMap = jsonValue.GetMap(); - while (TypeParser.TryNextMember()) { - const std::string& memberName = TypeParser.GetMemberName(); - const auto it = jsonMap.find(memberName); - if (it == jsonMap.end()) { - ThrowFatalError(TStringBuilder() << "No member \"" << memberName - << "\" in the map in json string for YDB struct type"); - } - ValueBuilder.AddMember(memberName); - ParseValue(it->second); - } - - ValueBuilder.EndStruct(); - TypeParser.CloseStruct(); - break; - } - - case TTypeParser::ETypeKind::Tuple: - EnsureType(jsonValue, NJson::JSON_ARRAY); - TypeParser.OpenTuple(); - ValueBuilder.BeginTuple(); - - for (const auto& element : jsonValue.GetArray()) { - if (!TypeParser.TryNextElement()) { - ThrowFatalError("Tuple in json string should contain less elements than provided"); - } - ValueBuilder.AddElement(); - ParseValue(element); - } - if (TypeParser.TryNextElement()) { - ThrowFatalError("Tuple in json string should contain more elements than provided"); - } - - ValueBuilder.EndTuple(); - TypeParser.CloseTuple(); - break; - - case TTypeParser::ETypeKind::EmptyDict: - EnsureType(jsonValue, NJson::JSON_ARRAY); - break; - - case TTypeParser::ETypeKind::Dict: - EnsureType(jsonValue, NJson::JSON_ARRAY); - TypeParser.OpenDict(); - - if (jsonValue.GetArray().size()) { - ValueBuilder.BeginDict(); - for (const auto& keyValueElement : jsonValue.GetArray()) { - EnsureType(keyValueElement, NJson::JSON_ARRAY); - const auto& keyValueArray = keyValueElement.GetArray(); - if (keyValueArray.size() != 2) { - ThrowFatalError("Each element of a dict type in YDB must be represented with " - "exactly 2 elements in array in json string"); - } - auto it = keyValueArray.begin(); - - ValueBuilder.AddDictItem(); - - TypeParser.DictKey(); - ValueBuilder.DictKey(); - ParseValue(*it); - - TypeParser.DictPayload(); - ValueBuilder.DictPayload(); - ParseValue(*(++it)); - } - ValueBuilder.EndDict(); - } else { - TypeParser.DictKey(); - TType keyType = GetType(); - TypeParser.DictPayload(); - TType payloadType = GetType(); - ValueBuilder.EmptyDict(keyType, payloadType); - } - - TypeParser.CloseDict(); - break; - - default: - ThrowFatalError(TStringBuilder() << "Unsupported type kind: " << TypeParser.GetKind()); - } - - } - - std::string JsonStringToBinaryString(const std::string& s) { - TStringStream str; - switch (Encoding) { - case EBinaryStringEncoding::Unicode: - str << Utf8Transcoder.Decode(s); - break; - case EBinaryStringEncoding::Base64: - str << Base64Decode(s); - break; - default: - ThrowFatalError("Unknown binary string encode mode"); - break; - } - return str.Str(); - } - - void EnsureType(const NJson::TJsonValue& value, NJson::EJsonValueType type) { - if (value.GetType() != type) { - if (value.GetType() == NJson::EJsonValueType::JSON_INTEGER && type == NJson::EJsonValueType::JSON_UINTEGER - || value.GetType() == NJson::EJsonValueType::JSON_UINTEGER && type == NJson::EJsonValueType::JSON_INTEGER) { - return; - } - if ((value.GetType() == NJson::EJsonValueType::JSON_INTEGER || value.GetType() == NJson::EJsonValueType::JSON_UINTEGER) - && type == NJson::EJsonValueType::JSON_DOUBLE) { - return; - } - TStringStream str; - NJsonWriter::TBuf writer(NJsonWriter::HEM_UNSAFE, &str); - writer.WriteJsonValue(&value); - ThrowFatalError(TStringBuilder() << "Wrong type for json value \"" << str.Str() - << "\". Expected type: " << type << ", received type: " << value.GetType() << ". "); - } - } - - private: - TValueBuilder& ValueBuilder; - const NJson::TJsonValue& JsonValue; - TTypeParser& TypeParser; - EBinaryStringEncoding Encoding; - TUtf8Transcoder Utf8Transcoder; - }; -} - -TValue JsonToYdbValue(const std::string& jsonString, const TType& type, EBinaryStringEncoding encoding) { - NJson::TJsonValue jsonValue; - - try { - if (!NJson::ReadJsonTree(jsonString, &jsonValue, true)) { - ThrowFatalError(TStringBuilder() << "Can't parse string \"" << jsonString << "\" as json."); - } - } - catch (std::exception& e) { - ThrowFatalError( - TStringBuilder() << "Exception while parsing string \"" << jsonString << "\" as json: " << e.what()); - } - return JsonToYdbValue(jsonValue, type, encoding); -} - -TValue JsonToYdbValue(const NJson::TJsonValue& jsonValue, const TType& type, EBinaryStringEncoding encoding) { - TValueBuilder builder; - TTypeParser typeParser(type); - - TJsonToYdbConverter converter(builder, jsonValue, typeParser, encoding); - converter.Convert(); - - return builder.Build(); -} - -} // namespace NYdb diff --git a/src/library/yson_value/CMakeLists.txt b/src/library/yson_value/CMakeLists.txt deleted file mode 100644 index 2a98ab94b3..0000000000 --- a/src/library/yson_value/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -_ydb_sdk_add_library(public-lib-yson_value) - -target_link_libraries(public-lib-yson_value PUBLIC - yutil - yson - client-ydb_result - client-ydb_value - library-uuid -) - -target_sources(public-lib-yson_value PRIVATE - ydb_yson_value.cpp -) - -_ydb_sdk_make_client_component(YsonValue public-lib-yson_value) diff --git a/src/library/yson_value/ydb_yson_value.cpp b/src/library/yson_value/ydb_yson_value.cpp deleted file mode 100644 index 7a0b61d056..0000000000 --- a/src/library/yson_value/ydb_yson_value.cpp +++ /dev/null @@ -1,277 +0,0 @@ -#include - -#include -#include - -#include - -namespace NYdb { - -static void PrimitiveValueToYson(EPrimitiveType type, TValueParser& parser, NYson::TYsonWriter& writer) -{ - switch (type) { - case EPrimitiveType::Bool: - writer.OnBooleanScalar(parser.GetBool()); - break; - case EPrimitiveType::Int8: - writer.OnInt64Scalar(parser.GetInt8()); - break; - case EPrimitiveType::Uint8: - writer.OnUint64Scalar(parser.GetUint8()); - break; - case EPrimitiveType::Int16: - writer.OnInt64Scalar(parser.GetInt16()); - break; - case EPrimitiveType::Uint16: - writer.OnUint64Scalar(parser.GetUint16()); - break; - case EPrimitiveType::Int32: - writer.OnInt64Scalar(parser.GetInt32()); - break; - case EPrimitiveType::Uint32: - writer.OnUint64Scalar(parser.GetUint32()); - break; - case EPrimitiveType::Int64: - writer.OnInt64Scalar(parser.GetInt64()); - break; - case EPrimitiveType::Uint64: - writer.OnUint64Scalar(parser.GetUint64()); - break; - case EPrimitiveType::Float: - writer.OnDoubleScalar(parser.GetFloat()); - break; - case EPrimitiveType::Double: - writer.OnDoubleScalar(parser.GetDouble()); - break; - case EPrimitiveType::Date: - writer.OnUint64Scalar(parser.GetDate().Days()); - break; - case EPrimitiveType::Datetime: - writer.OnUint64Scalar(parser.GetDatetime().Seconds()); - break; - case EPrimitiveType::Timestamp: - writer.OnUint64Scalar(parser.GetTimestamp().MicroSeconds()); - break; - case EPrimitiveType::Interval: - writer.OnInt64Scalar(parser.GetInterval()); - break; - case EPrimitiveType::Date32: - writer.OnInt64Scalar(parser.GetDate32()); - break; - case EPrimitiveType::Datetime64: - writer.OnInt64Scalar(parser.GetDatetime64()); - break; - case EPrimitiveType::Timestamp64: - writer.OnInt64Scalar(parser.GetTimestamp64()); - break; - case EPrimitiveType::Interval64: - writer.OnInt64Scalar(parser.GetInterval64()); - break; - case EPrimitiveType::TzDate: - writer.OnStringScalar(parser.GetTzDate()); - break; - case EPrimitiveType::TzDatetime: - writer.OnStringScalar(parser.GetTzDatetime()); - break; - case EPrimitiveType::TzTimestamp: - writer.OnStringScalar(parser.GetTzTimestamp()); - break; - case EPrimitiveType::String: - writer.OnStringScalar(parser.GetString()); - break; - case EPrimitiveType::Utf8: - writer.OnStringScalar(parser.GetUtf8()); - break; - case EPrimitiveType::Yson: - writer.OnStringScalar(parser.GetYson()); - break; - case EPrimitiveType::Json: - writer.OnStringScalar(parser.GetJson()); - break; - case EPrimitiveType::JsonDocument: - writer.OnStringScalar(parser.GetJsonDocument()); - break; - case EPrimitiveType::Uuid: - writer.OnStringScalar(parser.GetUuid().ToString()); - break; - case EPrimitiveType::DyNumber: - writer.OnStringScalar(parser.GetDyNumber()); - break; - default: - ThrowFatalError(TStringBuilder() << "Unsupported primitive type: " << type); - } -} - -static void FormatValueYsonInternal(TValueParser& parser, NYson::TYsonWriter& writer) -{ - switch (parser.GetKind()) { - case TTypeParser::ETypeKind::Primitive: - PrimitiveValueToYson(parser.GetPrimitiveType(), parser, writer); - break; - - case TTypeParser::ETypeKind::Decimal: - writer.OnStringScalar(parser.GetDecimal().ToString()); - break; - - case TTypeParser::ETypeKind::Pg: - if (parser.GetPg().IsNull()) { - writer.OnEntity(); - } else if (parser.GetPg().IsText()) { - writer.OnStringScalar(parser.GetPg().Content_); - } else { - writer.OnBeginList(); - writer.OnListItem(); - writer.OnStringScalar(parser.GetPg().Content_); - writer.OnEndList(); - } - break; - - case TTypeParser::ETypeKind::Optional: - parser.OpenOptional(); - if (parser.IsNull()) { - writer.OnEntity(); - } else { - writer.OnBeginList(); - writer.OnListItem(); - FormatValueYsonInternal(parser, writer); - writer.OnEndList(); - } - parser.CloseOptional(); - break; - - case TTypeParser::ETypeKind::Tagged: - parser.OpenTagged(); - FormatValueYsonInternal(parser, writer); - parser.CloseTagged(); - break; - - case TTypeParser::ETypeKind::EmptyList: - writer.OnBeginList(); - writer.OnEndList(); - break; - - case TTypeParser::ETypeKind::List: - parser.OpenList(); - writer.OnBeginList(); - - while (parser.TryNextListItem()) { - writer.OnListItem(); - FormatValueYsonInternal(parser, writer); - } - - writer.OnEndList(); - parser.CloseList(); - break; - - case TTypeParser::ETypeKind::Struct: - parser.OpenStruct(); - writer.OnBeginList(); - - while (parser.TryNextMember()) { - writer.OnListItem(); - FormatValueYsonInternal(parser, writer); - } - - writer.OnEndList(); - parser.CloseStruct(); - break; - - case TTypeParser::ETypeKind::Tuple: - parser.OpenTuple(); - writer.OnBeginList(); - - while (parser.TryNextElement()) { - writer.OnListItem(); - FormatValueYsonInternal(parser, writer); - } - - writer.OnEndList(); - parser.CloseTuple(); - break; - - case TTypeParser::ETypeKind::EmptyDict: - writer.OnBeginList(); - writer.OnEndList(); - break; - - case TTypeParser::ETypeKind::Dict: - parser.OpenDict(); - writer.OnBeginList(); - while (parser.TryNextDictItem()) { - writer.OnListItem(); - writer.OnBeginList(); - - writer.OnListItem(); - parser.DictKey(); - FormatValueYsonInternal(parser, writer); - - writer.OnListItem(); - parser.DictPayload(); - FormatValueYsonInternal(parser, writer); - - writer.OnEndList(); - } - writer.OnEndList(); - parser.CloseDict(); - break; - - case TTypeParser::ETypeKind::Void: - writer.OnStringScalar("Void"); - break; - - case TTypeParser::ETypeKind::Null: - writer.OnEntity(); - break; - - default: - ThrowFatalError(TStringBuilder() << "Unsupported type kind: " << parser.GetKind()); - } -} - -void FormatValueYson(const TValue& value, NYson::TYsonWriter& writer) -{ - TValueParser parser(value); - FormatValueYsonInternal(parser, writer); -} - -std::string FormatValueYson(const TValue& value, NYson::EYsonFormat ysonFormat) -{ - TStringStream out; - NYson::TYsonWriter writer(&out, ysonFormat, ::NYson::EYsonType::Node, true); - - FormatValueYson(value, writer); - - return out.Str(); -} - -void FormatResultSetYson(const TResultSet& result, NYson::TYsonWriter& writer) -{ - auto columns = result.GetColumnsMeta(); - - TResultSetParser parser(result); - writer.OnBeginList(); - - while (parser.TryNextRow()) { - writer.OnListItem(); - writer.OnBeginList(); - for (ui32 i = 0; i < columns.size(); ++i) { - writer.OnListItem(); - FormatValueYsonInternal(parser.ColumnParser(i), writer); - } - writer.OnEndList(); - } - - writer.OnEndList(); -} - -std::string FormatResultSetYson(const TResultSet& result, NYson::EYsonFormat ysonFormat) -{ - TStringStream out; - NYson::TYsonWriter writer(&out, ysonFormat, ::NYson::EYsonType::Node, true); - - FormatResultSetYson(result, writer); - - return out.Str(); -} - -} // namespace NYdb diff --git a/tests/integration/basic_example_it/basic_example.h b/tests/integration/basic_example_it/basic_example.h index ca0e2b71c1..6a59cdd2fe 100644 --- a/tests/integration/basic_example_it/basic_example.h +++ b/tests/integration/basic_example_it/basic_example.h @@ -3,7 +3,7 @@ #include #include -#include +#include #include diff --git a/tests/integration/bulk_upsert_simple_it/main.cpp b/tests/integration/bulk_upsert_simple_it/main.cpp index 7193cb5b8e..5342987c71 100644 --- a/tests/integration/bulk_upsert_simple_it/main.cpp +++ b/tests/integration/bulk_upsert_simple_it/main.cpp @@ -1,6 +1,6 @@ #include "bulk_upsert.h" -#include +#include #include diff --git a/tests/unit/client/CMakeLists.txt b/tests/unit/client/CMakeLists.txt index 7633d3f609..b9fea2c443 100644 --- a/tests/unit/client/CMakeLists.txt +++ b/tests/unit/client/CMakeLists.txt @@ -80,17 +80,17 @@ add_ydb_test(NAME client-oauth2_ut unit ) -add_ydb_test(NAME client-ydb_params_ut - SOURCES - params/params_ut.cpp - LINK_LIBRARIES - yutil - cpp-testing-unittest_main - YDB-CPP-SDK::Params - YDB-CPP-SDK::YsonValue - LABELS - unit -) +# add_ydb_test(NAME client-ydb_params_ut +# SOURCES +# params/params_ut.cpp +# LINK_LIBRARIES +# yutil +# cpp-testing-unittest_main +# YDB-CPP-SDK::Params +# YDB-CPP-SDK::YsonValue +# LABELS +# unit +# ) add_ydb_test(NAME client-ydb_result_ut SOURCES @@ -104,16 +104,16 @@ add_ydb_test(NAME client-ydb_result_ut unit ) -add_ydb_test(NAME client-ydb_value_ut - SOURCES - value/value_ut.cpp - LINK_LIBRARIES - yutil - cpp-testing-unittest_main - YDB-CPP-SDK::Value - YDB-CPP-SDK::JsonValue - YDB-CPP-SDK::YsonValue - YDB-CPP-SDK::Params - LABELS - unit -) +# add_ydb_test(NAME client-ydb_value_ut +# SOURCES +# value/value_ut.cpp +# LINK_LIBRARIES +# yutil +# cpp-testing-unittest_main +# YDB-CPP-SDK::Value +# YDB-CPP-SDK::JsonValue +# YDB-CPP-SDK::YsonValue +# YDB-CPP-SDK::Params +# LABELS +# unit +# ) diff --git a/tests/unit/client/params/params_ut.cpp b/tests/unit/client/params/params_ut.cpp index 1c4a5d41bd..1919774ff0 100644 --- a/tests/unit/client/params/params_ut.cpp +++ b/tests/unit/client/params/params_ut.cpp @@ -1,6 +1,6 @@ #include -#include +#include #include #include diff --git a/tests/unit/client/value/value_ut.cpp b/tests/unit/client/value/value_ut.cpp index 195448178a..f0551cf1ff 100644 --- a/tests/unit/client/value/value_ut.cpp +++ b/tests/unit/client/value/value_ut.cpp @@ -3,8 +3,8 @@ #include #include -#include -#include +#include +#include #include #include diff --git a/tests/unit/library/json_value/ydb_json_value_ut.cpp b/tests/unit/library/json_value/ydb_json_value_ut.cpp index 29861ea7df..62ad004838 100644 --- a/tests/unit/library/json_value/ydb_json_value_ut.cpp +++ b/tests/unit/library/json_value/ydb_json_value_ut.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include From bea2ca5d9fd764338d2524c8012610cefeb06753 Mon Sep 17 00:00:00 2001 From: Bulat Gayazov Date: Thu, 21 Nov 2024 14:10:09 +0000 Subject: [PATCH 2/2] Removed json_value tests --- tests/unit/library/CMakeLists.txt | 3 +- tests/unit/library/json_value/CMakeLists.txt | 14 - .../library/json_value/ydb_json_value_ut.cpp | 636 ------------------ 3 files changed, 1 insertion(+), 652 deletions(-) delete mode 100644 tests/unit/library/json_value/CMakeLists.txt delete mode 100644 tests/unit/library/json_value/ydb_json_value_ut.cpp diff --git a/tests/unit/library/CMakeLists.txt b/tests/unit/library/CMakeLists.txt index 1e4ccd6cd5..bb3ffee930 100644 --- a/tests/unit/library/CMakeLists.txt +++ b/tests/unit/library/CMakeLists.txt @@ -1,5 +1,4 @@ add_subdirectory(decimal) -add_subdirectory(issue) add_subdirectory(grpc_client) -add_subdirectory(json_value) +add_subdirectory(issue) add_subdirectory(operation_id) diff --git a/tests/unit/library/json_value/CMakeLists.txt b/tests/unit/library/json_value/CMakeLists.txt deleted file mode 100644 index 2589db68a7..0000000000 --- a/tests/unit/library/json_value/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -add_ydb_test(NAME json_value_ut - SOURCES - ydb_json_value_ut.cpp - LINK_LIBRARIES - yutil - cpp-testing-unittest_main - YDB-CPP-SDK::JsonValue - json - cpp-testing-unittest - YDB-CPP-SDK::Proto - YDB-CPP-SDK::Params - LABELS - unit -) diff --git a/tests/unit/library/json_value/ydb_json_value_ut.cpp b/tests/unit/library/json_value/ydb_json_value_ut.cpp deleted file mode 100644 index 62ad004838..0000000000 --- a/tests/unit/library/json_value/ydb_json_value_ut.cpp +++ /dev/null @@ -1,636 +0,0 @@ -#include - -#include -#include -#include -#include -#include - -namespace NYdb { - -Y_UNIT_TEST_SUITE(JsonValueTest) { - Y_UNIT_TEST(PrimitiveValueBool) { - TValue value = TValueBuilder() - .Bool(true) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "true"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueInt8) { - TValue value = TValueBuilder() - .Int8(-128) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "-128"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueUint8) { - TValue value = TValueBuilder() - .Uint8(255) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "255"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueInt16) { - TValue value = TValueBuilder() - .Int16(-32768) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "-32768"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueUint16) { - TValue value = TValueBuilder() - .Uint16(65535) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "65535"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueInt32) { - TValue value = TValueBuilder() - .Int32(-2147483648) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "-2147483648"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueUint32) { - TValue value = TValueBuilder() - .Uint32(4294967295) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "4294967295"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueInt64) { - TValue value = TValueBuilder() - .Int64(-9223372036854775807 - 1) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "-9223372036854775808"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueUint64) { - TValue value = TValueBuilder() - .Uint64(18446744073709551615ull) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "18446744073709551615"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueFloat) { - TValue value = TValueBuilder() - .Float(0.1234567890123456789) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "0.12345679"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueDouble) { - TValue value = TValueBuilder() - .Double(0.1234567890123456789) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "0.12345678901234568"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueDate) { - TInstant timestamp = TInstant::ParseIso8601("2000-01-02"); - TValue value = TValueBuilder() - .Date(TInstant::Days(timestamp.Days())) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, R"("2000-01-02")"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueDatetime) { - TInstant timestamp = TInstant::ParseIso8601("2000-01-02T03:04:05Z"); - TValue value = TValueBuilder() - .Datetime(TInstant::Seconds(timestamp.Seconds())) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, R"("2000-01-02T03:04:05Z")"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueTimestamp) { - TInstant timestamp = TInstant::ParseIso8601("2000-01-02T03:04:05.678901Z"); - TValue value = TValueBuilder() - .Timestamp(TInstant::MicroSeconds(timestamp.MicroSeconds())) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, R"("2000-01-02T03:04:05.678901Z")"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueSimpleString) { - TValue value = TValueBuilder() - .String("Escape characters: \" \\ \f \b \t \r\nNon-escaped characters: / ' < > & []() ") - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - jsonString, - "\"Escape characters: \\\" " R"(\\ \f \b \t \r\nNon-escaped characters: / ' < > & []() ")" - ); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - namespace { - std::string GenerateBinaryString() { - TStringBuilder str; - for (ui8 i = 0; i < 255; ++i) { - str << static_cast(i); - } - str << static_cast(0xff); - return str; - } - } - - Y_UNIT_TEST(BinaryStringAsciiFollowedByNonAscii) { - std::string binaryString = TStringBuilder() << "abc" << static_cast(0xff) - << static_cast(0xfe); - TValue value = TValueBuilder() - .String(binaryString) - .Build(); - std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - jsonString, - R"("abc\u00FF\u00FE")" - ); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(BinaryStringUnicode) { - std::string binaryString = GenerateBinaryString(); - TValue value = TValueBuilder() - .String(binaryString) - .Build(); - std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - TStringBuilder from0To255Utf8; - from0To255Utf8 << "\""; - from0To255Utf8 << - R"(\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000B\f\r\u000E\u000F)" - R"(\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F)" - " !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\u007F" - R"(\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F)" - R"(\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F)" - R"(\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF)" - R"(\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF)" - R"(\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF)" - R"(\u00D0\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u00D7\u00D8\u00D9\u00DA\u00DB\u00DC\u00DD\u00DE\u00DF)" - R"(\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF)" - R"(\u00F0\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u00FE\u00FF)"; - from0To255Utf8 << "\""; - UNIT_ASSERT_NO_DIFF( - jsonString, - from0To255Utf8 - ); - - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(BinaryStringBase64) { - std::string binaryString = GenerateBinaryString(); - TValue value = TValueBuilder() - .String(binaryString) - .Build(); - std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Base64); - UNIT_ASSERT_NO_DIFF( - jsonString, - R"("AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHS)" - R"(ElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJG)" - R"(Sk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna2)" - R"(9zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==")" - ); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Base64); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(EmptyBinaryStringUnicode) { - std::string binaryString; - TValue value = TValueBuilder() - .String(binaryString) - .Build(); - std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "\"\""); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(EmptyBinaryStringBase64) { - std::string binaryString; - TValue value = TValueBuilder() - .String(binaryString) - .Build(); - std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Base64); - UNIT_ASSERT_NO_DIFF(jsonString, "\"\""); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Base64); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(EmptyList) { - TValue value = TValueBuilder() - .EmptyList(TTypeBuilder().Primitive(EPrimitiveType::Int64).Build()) - .Build(); - std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "[]"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - namespace { - std::string InvalidJsonToBinaryStringBase(const std::string& jsonString) { - std::string errorMessage; - try { - TType stringType = TTypeBuilder().Primitive(EPrimitiveType::String).Build(); - TValue resultValue = JsonToYdbValue(jsonString, stringType, EBinaryStringEncoding::Unicode); - UNIT_FAIL("Exception should have been thrown, but it hasn't"); - } - catch (TContractViolation& e) { - errorMessage = e.what(); - } - catch (std::exception& e) { - UNIT_FAIL(TStringBuilder() << "Uncaught exception: " << e.what()); - } - return errorMessage; - } - } - - Y_UNIT_TEST(InvalidJsonToBinaryString1) { - std::string jsonString = R"(some string")"; - std::string errorMessage = InvalidJsonToBinaryStringBase(jsonString); - UNIT_ASSERT_STRING_CONTAINS( - errorMessage, - "Invalid value" - ); - } - - Y_UNIT_TEST(InvalidJsonToBinaryString2) { - std::string jsonString = R"("some string)"; - std::string errorMessage = InvalidJsonToBinaryStringBase(jsonString); - UNIT_ASSERT_STRING_CONTAINS( - errorMessage, - "Missing a closing quotation mark in string" - ); - } - - Y_UNIT_TEST(InvalidJsonToBinaryString3) { - std::string jsonString = "\"some string \\\""; - std::string errorMessage = InvalidJsonToBinaryStringBase(jsonString); - UNIT_ASSERT_STRING_CONTAINS( - errorMessage, - "Missing a closing quotation mark in string" - ); - } - - Y_UNIT_TEST(InvalidJsonToBinaryString4) { - std::string jsonString = R"("some \ string")"; - std::string errorMessage = InvalidJsonToBinaryStringBase(jsonString); - UNIT_ASSERT_STRING_CONTAINS( - errorMessage, - "Invalid escape character in string" - ); - } - - Y_UNIT_TEST(InvalidJsonToBinaryString5) { - std::string jsonString = R"("some string \u001")"; - std::string errorMessage = InvalidJsonToBinaryStringBase(jsonString); - UNIT_ASSERT_STRING_CONTAINS( - errorMessage, - "Incorrect hex digit after \\u escape in string" - ); - } - - Y_UNIT_TEST(InvalidJsonToBinaryString6) { - std::string jsonString = R"("some string \u0140")"; - std::string errorMessage = InvalidJsonToBinaryStringBase(jsonString); - UNIT_ASSERT_STRING_CONTAINS( - errorMessage, - "Unicode symbols with codes greater than 255 are not supported" - ); - } - - Y_UNIT_TEST(InvalidJsonToBinaryString7) { - std::string jsonString = R"("some string \u00AG")"; - std::string errorMessage = InvalidJsonToBinaryStringBase(jsonString); - UNIT_ASSERT_STRING_CONTAINS( - errorMessage, - "Incorrect hex digit after \\u escape in string" - ); - } - - Y_UNIT_TEST(PrimitiveValueUtf8String1) { - std::string utf8Str = "Escape characters: \" \\ \f \b \t \r\nNon-escaped characters: / ' < > & []() "; - TValue value = TValueBuilder() - .Utf8(utf8Str) - .Build(); - std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - - UNIT_ASSERT_NO_DIFF( - jsonString, - "\"Escape characters: \\\" " R"(\\ \f \b \t \r\nNon-escaped characters: / ' < > & []() ")" - ); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PrimitiveValueUtf8String2) { - std::string utf8Str = "\xD0\xB0\xD0\xB1\xD0\xB2\xD0\xB3\xD0\xB4\xD0\xB5\xD1\x91\xD0\xB6\xD0\xB7\xD0\xB8\xD0\xBA\xD0\xBB" - "\xD0\xBC\xD0\xBD\xD0\xBE\xD0\xBF\xD1\x80\xD1\x81\xD1\x82\xD1\x83\xD1\x84\xD1\x85\xD1\x86\xD1\x87\xD1\x88" - "\xD1\x89\xD1\x8A\xD1\x8B\xD1\x8C\xD1\x8D\xD1\x8E\xD1\x8F\xD0\x90\xD0\x91\xD0\x92\xD0\x93\xD0\x94\xD0\x95" - "\xD0\x81\xD0\x96\xD0\x97\xD0\x98\xD0\x9A\xD0\x9B\xD0\x9C\xD0\x9D\xD0\x9E\xD0\x9F\xD0\xA0\xD0\xA1\xD0\xA2" - "\xD0\xA3\xD0\xA4\xD0\xA5\xD0\xA6\xD0\xA7\xD0\xA8\xD0\xA9\xD0\xAA\xD0\xAB\xD0\xAC\xD0\xAD\xD0\xAE\xD0\xAF"; - TValue value = TValueBuilder() - .Utf8(utf8Str) - .Build(); - std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - - UNIT_ASSERT_NO_DIFF( - jsonString, - TStringBuilder() << '"' << utf8Str << '"' - ); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(TaggedValue) { - TValue value = TValueBuilder() - .BeginTagged("my_tag") - .BeginTagged("my_inner_tag") - .Uint32(1) - .EndTagged() - .EndTagged() - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, R"(1)"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(CompositeValueEmptyList) { - TValue value = TValueBuilder() - .EmptyList(TTypeBuilder().Primitive(EPrimitiveType::Uint32).Build()) - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "[]"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(CompositeValueIntList) { - TValue value = TValueBuilder() - .BeginList() - .AddListItem() - .Int32(1) - .AddListItem() - .Int32(10) - .AddListItem() - .Int32(100) - .EndList() - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "[1,10,100]"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(CompositeValueStruct) { - TValue value = TValueBuilder() - .BeginStruct() - .AddMember("Id") - .Uint32(1) - .AddMember("Name") - .String("Anna") - .AddMember("Value") - .Int32(-100) - .AddMember("Description") - .EmptyOptional(EPrimitiveType::Utf8) - .EndStruct() - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, R"({"Id":1,"Name":"Anna","Value":-100,"Description":null})"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(CompositeValueTuple) { - TValue value = TValueBuilder() - .BeginTuple() - .AddElement() - .BeginOptional() - .BeginOptional() - .Int32(10) - .EndOptional() - .EndOptional() - .AddElement() - .BeginOptional() - .BeginOptional() - .BeginOptional() - .Int64(-1) - .EndOptional() - .EndOptional() - .EndOptional() - .AddElement() - .BeginOptional() - .EmptyOptional(TTypeBuilder().Primitive(EPrimitiveType::String).Build()) - .EndOptional() - .AddElement() - .BeginOptional() - .BeginOptional() - .EmptyOptional(EPrimitiveType::Utf8) - .EndOptional() - .EndOptional() - .EndTuple() - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, "[10,-1,null,null]"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(CompositeValueDict) { - TValue value = TValueBuilder() - .BeginDict() - .AddDictItem() - .DictKey() - .Int64(1) - .DictPayload() - .String("Value1") - .AddDictItem() - .DictKey() - .Int64(2) - .DictPayload() - .String("Value2") - .EndDict() - .Build(); - const std::string jsonString = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString, R"([[1,"Value1"],[2,"Value2"]])"); - TValue resultValue = JsonToYdbValue(jsonString, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue).DebugString() - ); - } - - Y_UNIT_TEST(PgValue) { - TPgType pgType(""); - TPgValue v1(TPgValue::VK_TEXT, "text_value", pgType); - TPgValue v2(TPgValue::VK_BINARY, "binary_value", pgType); - TPgValue v3(TPgValue::VK_TEXT, "", pgType); - TPgValue v4(TPgValue::VK_BINARY, "", pgType); - TPgValue v5(TPgValue::VK_NULL, "", pgType); - - TValue value = TValueBuilder() - .BeginList() - .AddListItem() - .Pg(v1) - .AddListItem() - .Pg(v2) - .AddListItem() - .Pg(v3) - .AddListItem() - .Pg(v4) - .AddListItem() - .Pg(v5) - .EndList() - .Build(); - - // unicode - const std::string jsonString1 = FormatValueJson(value, EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF(jsonString1, R"(["text_value",["binary_value"],"",[""],null])"); - - TValue resultValue1 = JsonToYdbValue(jsonString1, value.GetType(), EBinaryStringEncoding::Unicode); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue1).DebugString() - ); - - // base64 - const std::string jsonString2 = FormatValueJson(value, EBinaryStringEncoding::Base64); - UNIT_ASSERT_NO_DIFF(jsonString2, R"(["text_value",["YmluYXJ5X3ZhbHVl"],"",[""],null])"); - - TValue resultValue2 = JsonToYdbValue(jsonString2, value.GetType(), EBinaryStringEncoding::Base64); - UNIT_ASSERT_NO_DIFF( - TProtoAccessor::GetProto(value).DebugString(), - TProtoAccessor::GetProto(resultValue2).DebugString() - ); - } -} - -} // namespace NYdb