Skip to content

Commit 91f396d

Browse files
committed
add ydb2 schema, add some crazy types to render to json (ydb-platform#10443)
1 parent 3c1c428 commit 91f396d

File tree

2 files changed

+94
-3
lines changed

2 files changed

+94
-3
lines changed

ydb/core/viewer/json_handlers_viewer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ void InitViewerWhoAmIJsonHandler(TJsonHandlers& handlers) {
227227
}
228228

229229
void InitViewerQueryJsonHandler(TJsonHandlers& handlers) {
230-
handlers.AddHandler("/viewer/query", new TJsonHandler<TJsonQuery>(TJsonQuery::GetSwagger()), 3);
230+
handlers.AddHandler("/viewer/query", new TJsonHandler<TJsonQuery>(TJsonQuery::GetSwagger()), 4);
231231
}
232232

233233
void InitViewerNetInfoJsonHandler(TJsonHandlers& handlers) {

ydb/core/viewer/viewer_query.h

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class TJsonQuery : public TViewerPipeClient {
3737
Modern,
3838
Multi,
3939
Ydb,
40+
Ydb2,
4041
};
4142
ESchemaType Schema = ESchemaType::Classic;
4243
TRequestResponse<NKqp::TEvKqp::TEvCreateSessionResponse> CreateSessionResponse;
@@ -53,6 +54,8 @@ class TJsonQuery : public TViewerPipeClient {
5354
return ESchemaType::Multi;
5455
} else if (schemaStr == "ydb") {
5556
return ESchemaType::Ydb;
57+
} else if (schemaStr == "ydb2") {
58+
return ESchemaType::Ydb2;
5659
} else {
5760
return ESchemaType::Classic;
5861
}
@@ -393,8 +396,8 @@ class TJsonQuery : public TViewerPipeClient {
393396
return valueParser.GetDyNumber();
394397
case NYdb::EPrimitiveType::Uuid:
395398
return valueParser.GetUuid().ToString();
396-
default:
397-
Y_ENSURE(false, TStringBuilder() << "Unsupported type: " << primitive); }
399+
}
400+
return NJson::JSON_UNDEFINED;
398401
}
399402

400403
NJson::TJsonValue ColumnValueToJsonValue(NYdb::TValueParser& valueParser) {
@@ -426,6 +429,63 @@ class TJsonQuery : public TViewerPipeClient {
426429
case NYdb::TTypeParser::ETypeKind::Decimal:
427430
return valueParser.GetDecimal().ToString();
428431

432+
case NYdb::TTypeParser::ETypeKind::List:
433+
{
434+
NJson::TJsonValue jsonList;
435+
jsonList.SetType(NJson::JSON_ARRAY);
436+
valueParser.OpenList();
437+
while (valueParser.TryNextListItem()) {
438+
jsonList.AppendValue(ColumnValueToJsonValue(valueParser));
439+
}
440+
return jsonList;
441+
}
442+
443+
case NYdb::TTypeParser::ETypeKind::Tuple:
444+
{
445+
NJson::TJsonValue jsonTuple;
446+
jsonTuple.SetType(NJson::JSON_ARRAY);
447+
valueParser.OpenTuple();
448+
while (valueParser.TryNextElement()) {
449+
jsonTuple.AppendValue(ColumnValueToJsonValue(valueParser));
450+
}
451+
return jsonTuple;
452+
}
453+
454+
case NYdb::TTypeParser::ETypeKind::Struct:
455+
{
456+
NJson::TJsonValue jsonStruct;
457+
jsonStruct.SetType(NJson::JSON_MAP);
458+
valueParser.OpenStruct();
459+
while (valueParser.TryNextMember()) {
460+
jsonStruct[valueParser.GetMemberName()] = ColumnValueToJsonValue(valueParser);
461+
}
462+
return jsonStruct;
463+
}
464+
465+
case NYdb::TTypeParser::ETypeKind::Dict:
466+
{
467+
NJson::TJsonValue jsonDict;
468+
jsonDict.SetType(NJson::JSON_MAP);
469+
valueParser.OpenDict();
470+
while (valueParser.TryNextDictItem()) {
471+
valueParser.DictKey();
472+
TString key = valueParser.GetString();
473+
valueParser.DictPayload();
474+
jsonDict[key] = ColumnValueToJsonValue(valueParser);
475+
}
476+
return jsonDict;
477+
}
478+
479+
case NYdb::TTypeParser::ETypeKind::Variant:
480+
valueParser.OpenVariant();
481+
return ColumnValueToJsonValue(valueParser);
482+
483+
case NYdb::TTypeParser::ETypeKind::EmptyList:
484+
return NJson::JSON_ARRAY;
485+
486+
case NYdb::TTypeParser::ETypeKind::EmptyDict:
487+
return NJson::JSON_MAP;
488+
429489
default:
430490
return NJson::JSON_UNDEFINED;
431491
}
@@ -664,6 +724,37 @@ class TJsonQuery : public TViewerPipeClient {
664724
}
665725
}
666726
}
727+
728+
if (Schema == ESchemaType::Ydb2) {
729+
NJson::TJsonValue& jsonResults = jsonResponse["result"];
730+
jsonResults.SetType(NJson::JSON_ARRAY);
731+
for (const auto& resultSets : ResultSets) {
732+
NJson::TJsonValue& jsonResult = jsonResults.AppendValue({});
733+
bool hasColumns = false;
734+
for (NYdb::TResultSet resultSet : resultSets) {
735+
if (!hasColumns) {
736+
NJson::TJsonValue& jsonColumns = jsonResult["columns"];
737+
jsonColumns.SetType(NJson::JSON_ARRAY);
738+
const auto& columnsMeta = resultSet.GetColumnsMeta();
739+
for (size_t columnNum = 0; columnNum < columnsMeta.size(); ++columnNum) {
740+
NJson::TJsonValue& jsonColumn = jsonColumns.AppendValue({});
741+
const NYdb::TColumn& columnMeta = columnsMeta[columnNum];
742+
jsonColumn["name"] = columnMeta.Name;
743+
jsonColumn["type"] = columnMeta.Type.ToString();
744+
}
745+
hasColumns = true;
746+
}
747+
NJson::TJsonValue& jsonRows = jsonResult["rows"];
748+
const auto& columnsMeta = resultSet.GetColumnsMeta();
749+
NYdb::TResultSetParser rsParser(resultSet);
750+
while (rsParser.TryNextRow()) {
751+
NJson::TJsonValue& jsonRow = jsonRows.AppendValue({});
752+
TString row = NYdb::FormatResultRowJson(rsParser, columnsMeta, IsBase64Encode ? NYdb::EBinaryStringEncoding::Base64 : NYdb::EBinaryStringEncoding::Unicode);
753+
NJson::ReadJsonTree(row, &jsonRow);
754+
}
755+
}
756+
}
757+
}
667758
}
668759
if (response.HasQueryAst()) {
669760
jsonResponse["ast"] = response.GetQueryAst();

0 commit comments

Comments
 (0)