@@ -21,7 +21,7 @@ class TJsonQuery : public TViewerPipeClient {
21
21
using TBase = TViewerPipeClient;
22
22
TJsonSettings JsonSettings;
23
23
ui32 Timeout = 0 ;
24
- TVector< Ydb::ResultSet> ResultSets;
24
+ std::vector<std::vector< Ydb::ResultSet> > ResultSets;
25
25
TString Query;
26
26
TString Database;
27
27
TString Action;
@@ -177,11 +177,9 @@ class TJsonQuery : public TViewerPipeClient {
177
177
if (SessionId) {
178
178
auto event = std::make_unique<NKqp::TEvKqp::TEvCloseSessionRequest>();
179
179
event->Record .MutableRequest ()->SetSessionId (SessionId);
180
- BLOG_TRACE (" Closing session " << SessionId);
181
180
Send (NKqp::MakeKqpProxyID (SelfId ().NodeId ()), event.release ());
182
181
}
183
182
TBase::PassAway ();
184
- BLOG_TRACE (" PassAway()" );
185
183
}
186
184
187
185
void ReplyAndPassAway () override {
@@ -227,7 +225,6 @@ class TJsonQuery : public TViewerPipeClient {
227
225
Span.Attribute (" database" , Database);
228
226
}
229
227
}
230
- BLOG_TRACE (" Creating session" );
231
228
CreateSessionResponse = MakeRequest<NKqp::TEvKqp::TEvCreateSessionResponse>(NKqp::MakeKqpProxyID (SelfId ().NodeId ()), event.release ());
232
229
}
233
230
@@ -257,7 +254,6 @@ class TJsonQuery : public TViewerPipeClient {
257
254
TStringBuilder () << " Failed to create session, error " << ev->Get ()->Record .GetYdbStatus ()), " InternalError" );
258
255
}
259
256
SessionId = CreateSessionResponse->Record .GetResponse ().GetSessionId ();
260
- BLOG_TRACE (" Session created " << SessionId);
261
257
262
258
{
263
259
auto event = std::make_unique<NKqp::TEvKqp::TEvPingSessionRequest>();
@@ -332,7 +328,6 @@ class TJsonQuery : public TViewerPipeClient {
332
328
}
333
329
ActorIdToProto (SelfId (), event->Record .MutableRequestActorId ());
334
330
QueryResponse = MakeRequest<NKqp::TEvKqp::TEvQueryResponse>(NKqp::MakeKqpProxyID (SelfId ().NodeId ()), event.Release ());
335
- BLOG_TRACE (" Query sent" );
336
331
}
337
332
338
333
private:
@@ -432,7 +427,6 @@ class TJsonQuery : public TViewerPipeClient {
432
427
}
433
428
434
429
void HandleReply (NKqp::TEvKqp::TEvQueryResponse::TPtr& ev) {
435
- BLOG_TRACE (" Query response received" );
436
430
NJson::TJsonValue jsonResponse;
437
431
jsonResponse[" version" ] = Viewer->GetCapabilityVersion (" /viewer/query" );
438
432
if (ev->Get ()->Record .GetRef ().GetYdbStatus () == Ydb::StatusIds::SUCCESS) {
@@ -491,6 +485,7 @@ class TJsonQuery : public TViewerPipeClient {
491
485
}
492
486
493
487
void HandleReply (NKqp::TEvKqpExecuter::TEvStreamData::TPtr& ev) {
488
+ QueryResponse.Event (" StreamData" );
494
489
NKikimrKqp::TEvExecuterStreamData& data (ev->Get ()->Record );
495
490
496
491
if (TotalRows < LimitRows) {
@@ -500,7 +495,10 @@ class TJsonQuery : public TViewerPipeClient {
500
495
data.MutableResultSet ()->set_truncated (true );
501
496
}
502
497
TotalRows += data.GetResultSet ().rows_size ();
503
- ResultSets.emplace_back () = std::move (*data.MutableResultSet ());
498
+ if (ResultSets.size () <= data.GetQueryResultIndex ()) {
499
+ ResultSets.resize (data.GetQueryResultIndex () + 1 );
500
+ }
501
+ ResultSets[data.GetQueryResultIndex ()].emplace_back () = std::move (*data.MutableResultSet ());
504
502
}
505
503
506
504
THolder<NKqp::TEvKqpExecuter::TEvStreamDataAck> ack = MakeHolder<NKqp::TEvKqpExecuter::TEvStreamDataAck>();
@@ -517,7 +515,6 @@ class TJsonQuery : public TViewerPipeClient {
517
515
if (SessionId) {
518
516
auto event = std::make_unique<NKqp::TEvKqp::TEvCancelQueryRequest>();
519
517
event->Record .MutableRequest ()->SetSessionId (SessionId);
520
- BLOG_TRACE (" Cancelling query in session " << SessionId);
521
518
Send (NKqp::MakeKqpProxyID (SelfId ().NodeId ()), event.release ());
522
519
error << " , query was cancelled" ;
523
520
}
@@ -549,11 +546,11 @@ class TJsonQuery : public TViewerPipeClient {
549
546
for (const auto & result : response.GetResults ()) {
550
547
Ydb::ResultSet resultSet;
551
548
NKqp::ConvertKqpQueryResultToDbResult (result, &resultSet);
552
- ResultSets.emplace_back (std::move (resultSet));
549
+ ResultSets.emplace_back (). emplace_back ( std::move (resultSet));
553
550
}
554
551
555
552
for (const auto & result : response.GetYdbResults ()) {
556
- ResultSets.emplace_back (result);
553
+ ResultSets.emplace_back (). emplace_back ( result);
557
554
}
558
555
}
559
556
catch (const std::exception& ex) {
@@ -568,15 +565,16 @@ class TJsonQuery : public TViewerPipeClient {
568
565
if (Schema == ESchemaType::Classic) {
569
566
NJson::TJsonValue& jsonResults = jsonResponse[" result" ];
570
567
jsonResults.SetType (NJson::JSON_ARRAY);
571
- for (auto it = ResultSets.begin (); it != ResultSets.end (); ++it) {
572
- NYdb::TResultSet resultSet (*it);
573
- const auto & columnsMeta = resultSet.GetColumnsMeta ();
574
- NYdb::TResultSetParser rsParser (resultSet);
575
- while (rsParser.TryNextRow ()) {
576
- NJson::TJsonValue& jsonRow = jsonResults.AppendValue ({});
577
- for (size_t columnNum = 0 ; columnNum < columnsMeta.size (); ++columnNum) {
578
- const NYdb::TColumn& columnMeta = columnsMeta[columnNum];
579
- jsonRow[columnMeta.Name ] = ColumnValueToJsonValue (rsParser.ColumnParser (columnNum));
568
+ for (const auto & resultSets : ResultSets) {
569
+ for (NYdb::TResultSet resultSet : resultSets) {
570
+ const auto & columnsMeta = resultSet.GetColumnsMeta ();
571
+ NYdb::TResultSetParser rsParser (resultSet);
572
+ while (rsParser.TryNextRow ()) {
573
+ NJson::TJsonValue& jsonRow = jsonResults.AppendValue ({});
574
+ for (size_t columnNum = 0 ; columnNum < columnsMeta.size (); ++columnNum) {
575
+ const NYdb::TColumn& columnMeta = columnsMeta[columnNum];
576
+ jsonRow[columnMeta.Name ] = ColumnValueToJsonValue (rsParser.ColumnParser (columnNum));
577
+ }
580
578
}
581
579
}
582
580
}
@@ -585,7 +583,7 @@ class TJsonQuery : public TViewerPipeClient {
585
583
if (Schema == ESchemaType::Modern) {
586
584
{
587
585
NJson::TJsonValue& jsonColumns = jsonResponse[" columns" ];
588
- NYdb::TResultSet resultSet (ResultSets.front ());
586
+ NYdb::TResultSet resultSet (ResultSets.front (). front () );
589
587
const auto & columnsMeta = resultSet.GetColumnsMeta ();
590
588
jsonColumns.SetType (NJson::JSON_ARRAY);
591
589
for (size_t columnNum = 0 ; columnNum < columnsMeta.size (); ++columnNum) {
@@ -598,16 +596,17 @@ class TJsonQuery : public TViewerPipeClient {
598
596
599
597
NJson::TJsonValue& jsonResults = jsonResponse[" result" ];
600
598
jsonResults.SetType (NJson::JSON_ARRAY);
601
- for (auto it = ResultSets.begin (); it != ResultSets.end (); ++it) {
602
- NYdb::TResultSet resultSet (*it);
603
- const auto & columnsMeta = resultSet.GetColumnsMeta ();
604
- NYdb::TResultSetParser rsParser (resultSet);
605
- while (rsParser.TryNextRow ()) {
606
- NJson::TJsonValue& jsonRow = jsonResults.AppendValue ({});
607
- jsonRow.SetType (NJson::JSON_ARRAY);
608
- for (size_t columnNum = 0 ; columnNum < columnsMeta.size (); ++columnNum) {
609
- NJson::TJsonValue& jsonColumn = jsonRow.AppendValue ({});
610
- jsonColumn = ColumnValueToJsonValue (rsParser.ColumnParser (columnNum));
599
+ for (const auto & resultSets : ResultSets) {
600
+ for (NYdb::TResultSet resultSet : resultSets) {
601
+ const auto & columnsMeta = resultSet.GetColumnsMeta ();
602
+ NYdb::TResultSetParser rsParser (resultSet);
603
+ while (rsParser.TryNextRow ()) {
604
+ NJson::TJsonValue& jsonRow = jsonResults.AppendValue ({});
605
+ jsonRow.SetType (NJson::JSON_ARRAY);
606
+ for (size_t columnNum = 0 ; columnNum < columnsMeta.size (); ++columnNum) {
607
+ NJson::TJsonValue& jsonColumn = jsonRow.AppendValue ({});
608
+ jsonColumn = ColumnValueToJsonValue (rsParser.ColumnParser (columnNum));
609
+ }
611
610
}
612
611
}
613
612
}
@@ -616,47 +615,53 @@ class TJsonQuery : public TViewerPipeClient {
616
615
if (Schema == ESchemaType::Multi) {
617
616
NJson::TJsonValue& jsonResults = jsonResponse[" result" ];
618
617
jsonResults.SetType (NJson::JSON_ARRAY);
619
- for (auto it = ResultSets.begin (); it != ResultSets.end (); ++it) {
620
- NYdb::TResultSet resultSet (*it);
621
- const auto & columnsMeta = resultSet.GetColumnsMeta ();
618
+ for (const auto & resultSets : ResultSets) {
622
619
NJson::TJsonValue& jsonResult = jsonResults.AppendValue ({});
620
+ bool hasColumns = false ;
621
+ for (NYdb::TResultSet resultSet : resultSets) {
622
+ if (!hasColumns) {
623
+ NJson::TJsonValue& jsonColumns = jsonResult[" columns" ];
624
+ jsonColumns.SetType (NJson::JSON_ARRAY);
625
+ const auto & columnsMeta = resultSet.GetColumnsMeta ();
626
+ for (size_t columnNum = 0 ; columnNum < columnsMeta.size (); ++columnNum) {
627
+ NJson::TJsonValue& jsonColumn = jsonColumns.AppendValue ({});
628
+ const NYdb::TColumn& columnMeta = columnsMeta[columnNum];
629
+ jsonColumn[" name" ] = columnMeta.Name ;
630
+ jsonColumn[" type" ] = columnMeta.Type .ToString ();
631
+ }
632
+ hasColumns = true ;
633
+ }
623
634
624
- NJson::TJsonValue& jsonColumns = jsonResult[" columns" ];
625
- jsonColumns.SetType (NJson::JSON_ARRAY);
626
- for (size_t columnNum = 0 ; columnNum < columnsMeta.size (); ++columnNum) {
627
- NJson::TJsonValue& jsonColumn = jsonColumns.AppendValue ({});
628
- const NYdb::TColumn& columnMeta = columnsMeta[columnNum];
629
- jsonColumn[" name" ] = columnMeta.Name ;
630
- jsonColumn[" type" ] = columnMeta.Type .ToString ();
631
- }
635
+ NJson::TJsonValue& jsonRows = jsonResult[" rows" ];
636
+ NYdb::TResultSetParser rsParser (resultSet);
637
+ while (rsParser.TryNextRow ()) {
638
+ NJson::TJsonValue& jsonRow = jsonRows.AppendValue ({});
639
+ jsonRow.SetType (NJson::JSON_ARRAY);
640
+ for (size_t columnNum = 0 ; columnNum < rsParser.ColumnsCount (); ++columnNum) {
641
+ NJson::TJsonValue& jsonColumn = jsonRow.AppendValue ({});
642
+ jsonColumn = ColumnValueToJsonValue (rsParser.ColumnParser (columnNum));
643
+ }
644
+ }
632
645
633
- NJson::TJsonValue& jsonRows = jsonResult[" rows" ];
634
- NYdb::TResultSetParser rsParser (resultSet);
635
- while (rsParser.TryNextRow ()) {
636
- NJson::TJsonValue& jsonRow = jsonRows.AppendValue ({});
637
- jsonRow.SetType (NJson::JSON_ARRAY);
638
- for (size_t columnNum = 0 ; columnNum < columnsMeta.size (); ++columnNum) {
639
- NJson::TJsonValue& jsonColumn = jsonRow.AppendValue ({});
640
- jsonColumn = ColumnValueToJsonValue (rsParser.ColumnParser (columnNum));
646
+ if (resultSet.Truncated ()) {
647
+ jsonResult[" truncated" ] = true ;
641
648
}
642
649
}
643
- if (resultSet.Truncated ()) {
644
- jsonResult[" truncated" ] = true ;
645
- }
646
650
}
647
651
}
648
652
649
653
if (Schema == ESchemaType::Ydb) {
650
654
NJson::TJsonValue& jsonResults = jsonResponse[" result" ];
651
655
jsonResults.SetType (NJson::JSON_ARRAY);
652
- for (auto it = ResultSets.begin (); it != ResultSets.end (); ++it) {
653
- NYdb::TResultSet resultSet (*it);
654
- const auto & columnsMeta = resultSet.GetColumnsMeta ();
655
- NYdb::TResultSetParser rsParser (resultSet);
656
- while (rsParser.TryNextRow ()) {
657
- NJson::TJsonValue& jsonRow = jsonResults.AppendValue ({});
658
- TString row = NYdb::FormatResultRowJson (rsParser, columnsMeta, IsBase64Encode ? NYdb::EBinaryStringEncoding::Base64 : NYdb::EBinaryStringEncoding::Unicode);
659
- NJson::ReadJsonTree (row, &jsonRow);
656
+ for (const auto & resultSets : ResultSets) {
657
+ for (NYdb::TResultSet resultSet : resultSets) {
658
+ const auto & columnsMeta = resultSet.GetColumnsMeta ();
659
+ NYdb::TResultSetParser rsParser (resultSet);
660
+ while (rsParser.TryNextRow ()) {
661
+ NJson::TJsonValue& jsonRow = jsonResults.AppendValue ({});
662
+ TString row = NYdb::FormatResultRowJson (rsParser, columnsMeta, IsBase64Encode ? NYdb::EBinaryStringEncoding::Base64 : NYdb::EBinaryStringEncoding::Unicode);
663
+ NJson::ReadJsonTree (row, &jsonRow);
664
+ }
660
665
}
661
666
}
662
667
}
0 commit comments