Skip to content

Commit 6d05801

Browse files
authored
result_format: response parser (#8541)
1 parent d5b523d commit 6d05801

File tree

4 files changed

+454
-2
lines changed

4 files changed

+454
-2
lines changed

ydb/library/yql/public/result_format/ut/yql_result_format_ut.cpp

Lines changed: 327 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ void Test(const TString& input) {
1313
UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(builder.GetResult()), NYT::NodeToCanonicalYsonString(node));
1414
}
1515

16-
Y_UNIT_TEST_SUITE(TParseType) {
16+
Y_UNIT_TEST_SUITE(ParseType) {
1717
Y_UNIT_TEST(Throwing) {
1818
TThrowingTypeVisitor v;
1919
UNIT_ASSERT_EXCEPTION(v.OnNull(), TUnsupportedException);
@@ -287,4 +287,330 @@ Y_UNIT_TEST_SUITE(TParseType) {
287287
}
288288
}
289289

290+
Y_UNIT_TEST_SUITE(ParseResponse) {
291+
Y_UNIT_TEST(Empty) {
292+
auto response = NYT::NodeFromYsonString("[]");
293+
auto resList = ParseResponse(response);
294+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 0);
295+
}
296+
297+
Y_UNIT_TEST(One) {
298+
auto response = NYT::NodeFromYsonString(R"([
299+
{
300+
Write = [
301+
]
302+
};
303+
])");
304+
305+
auto resList = ParseResponse(response);
306+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
307+
}
308+
309+
Y_UNIT_TEST(Two) {
310+
auto response = NYT::NodeFromYsonString(R"([
311+
{
312+
Write = [
313+
]
314+
};
315+
{
316+
Write = [
317+
]
318+
};
319+
])");
320+
321+
auto resList = ParseResponse(response);
322+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 2);
323+
}
324+
325+
Y_UNIT_TEST(Label) {
326+
auto response = NYT::NodeFromYsonString(R"([
327+
{
328+
Label = foo;
329+
Write = [
330+
]
331+
};
332+
])");
333+
334+
auto resList = ParseResponse(response);
335+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
336+
const auto& res = resList[0];
337+
UNIT_ASSERT(res.Label.Defined());
338+
UNIT_ASSERT_VALUES_EQUAL(*res.Label, "foo");
339+
}
340+
341+
Y_UNIT_TEST(Position) {
342+
auto response = NYT::NodeFromYsonString(R"([
343+
{
344+
Position = {
345+
File = "<main>";
346+
Row = 1;
347+
Column = 7;
348+
};
349+
Write = [
350+
]
351+
};
352+
])");
353+
354+
auto resList = ParseResponse(response);
355+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
356+
const auto& res = resList[0];
357+
UNIT_ASSERT(res.Position.Defined());
358+
UNIT_ASSERT_VALUES_EQUAL(res.Position->File, "<main>");
359+
UNIT_ASSERT_VALUES_EQUAL(res.Position->Row, 1);
360+
UNIT_ASSERT_VALUES_EQUAL(res.Position->Column, 7);
361+
}
362+
363+
Y_UNIT_TEST(Truncated) {
364+
auto response = NYT::NodeFromYsonString(R"([
365+
{
366+
Truncated = %true;
367+
Write = [
368+
]
369+
};
370+
])");
371+
372+
auto resList = ParseResponse(response);
373+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
374+
const auto& res = resList[0];
375+
UNIT_ASSERT(res.IsTruncated);
376+
}
377+
378+
Y_UNIT_TEST(Unordered) {
379+
auto response = NYT::NodeFromYsonString(R"([
380+
{
381+
Unordered = %true;
382+
Write = [
383+
]
384+
};
385+
])");
386+
387+
auto resList = ParseResponse(response);
388+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
389+
const auto& res = resList[0];
390+
UNIT_ASSERT(res.IsUnordered);
391+
}
392+
393+
Y_UNIT_TEST(WriteOne) {
394+
auto response = NYT::NodeFromYsonString(R"([
395+
{
396+
Write = [
397+
{
398+
Data = data;
399+
Type = type;
400+
}
401+
]
402+
};
403+
])");
404+
405+
auto resList = ParseResponse(response);
406+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
407+
const auto& res = resList[0];
408+
UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
409+
const auto& write = res.Writes[0];
410+
UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write.Data), "\"data\"");
411+
UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write.Type), "\"type\"");
412+
}
413+
414+
Y_UNIT_TEST(WriteTwo) {
415+
auto response = NYT::NodeFromYsonString(R"([
416+
{
417+
Write = [
418+
{
419+
Data = data1;
420+
Type = type1;
421+
};
422+
{
423+
Data = data2;
424+
Type = type2;
425+
}
426+
]
427+
};
428+
])");
429+
430+
auto resList = ParseResponse(response);
431+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
432+
const auto& res = resList[0];
433+
UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 2);
434+
const auto& write1 = res.Writes[0];
435+
UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write1.Data), "\"data1\"");
436+
UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write1.Type), "\"type1\"");
437+
const auto& write2 = res.Writes[1];
438+
UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write2.Data), "\"data2\"");
439+
UNIT_ASSERT_VALUES_EQUAL(NYT::NodeToCanonicalYsonString(*write2.Type), "\"type2\"");
440+
}
441+
442+
Y_UNIT_TEST(WriteTruncated) {
443+
auto response = NYT::NodeFromYsonString(R"([
444+
{
445+
Write = [
446+
{
447+
Data = data;
448+
Type = type;
449+
Truncated = %true;
450+
}
451+
]
452+
};
453+
])");
454+
455+
auto resList = ParseResponse(response);
456+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
457+
const auto& res = resList[0];
458+
UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
459+
const auto& write = res.Writes[0];
460+
UNIT_ASSERT(write.IsTruncated);
461+
UNIT_ASSERT(!res.IsTruncated);
462+
}
463+
464+
Y_UNIT_TEST(RefsEmpty) {
465+
auto response = NYT::NodeFromYsonString(R"([
466+
{
467+
Write = [
468+
{
469+
Data = data;
470+
Type = type;
471+
Refs = [];
472+
}
473+
]
474+
};
475+
])");
476+
477+
auto resList = ParseResponse(response);
478+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
479+
const auto& res = resList[0];
480+
UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
481+
const auto& write = res.Writes[0];
482+
UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 0);
483+
}
484+
485+
Y_UNIT_TEST(RefsOne) {
486+
auto response = NYT::NodeFromYsonString(R"([
487+
{
488+
Write = [
489+
{
490+
Data = data;
491+
Type = type;
492+
Refs = [
493+
{
494+
"Reference" = [];
495+
"Remove" = %true;
496+
}
497+
];
498+
}
499+
]
500+
};
501+
])");
502+
503+
auto resList = ParseResponse(response);
504+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
505+
const auto& res = resList[0];
506+
UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
507+
const auto& write = res.Writes[0];
508+
UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 1);
509+
const auto& ref = write.Refs[0];
510+
UNIT_ASSERT_VALUES_EQUAL(ref.Reference.size(), 0);
511+
UNIT_ASSERT(ref.Remove);
512+
}
513+
514+
Y_UNIT_TEST(RefsTwo) {
515+
auto response = NYT::NodeFromYsonString(R"([
516+
{
517+
Write = [
518+
{
519+
Data = data;
520+
Type = type;
521+
Refs = [
522+
{
523+
"Reference" = [];
524+
"Remove" = %true;
525+
};
526+
{
527+
"Reference" = [];
528+
"Remove" = %true;
529+
}
530+
];
531+
}
532+
]
533+
};
534+
])");
535+
536+
auto resList = ParseResponse(response);
537+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
538+
const auto& res = resList[0];
539+
UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
540+
const auto& write = res.Writes[0];
541+
UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 2);
542+
const auto& ref1 = write.Refs[0];
543+
UNIT_ASSERT_VALUES_EQUAL(ref1.Reference.size(), 0);
544+
UNIT_ASSERT(ref1.Remove);
545+
const auto& ref2 = write.Refs[1];
546+
UNIT_ASSERT_VALUES_EQUAL(ref2.Reference.size(), 0);
547+
UNIT_ASSERT(ref2.Remove);
548+
}
549+
550+
Y_UNIT_TEST(RefsComponents) {
551+
auto response = NYT::NodeFromYsonString(R"([
552+
{
553+
Write = [
554+
{
555+
Data = data;
556+
Type = type;
557+
Refs = [
558+
{
559+
"Reference" = ["foo";"bar"];
560+
"Remove" = %false;
561+
}
562+
];
563+
}
564+
]
565+
};
566+
])");
567+
568+
auto resList = ParseResponse(response);
569+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
570+
const auto& res = resList[0];
571+
UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
572+
const auto& write = res.Writes[0];
573+
UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 1);
574+
const auto& ref = write.Refs[0];
575+
UNIT_ASSERT_VALUES_EQUAL(ref.Reference.size(), 2);
576+
UNIT_ASSERT_VALUES_EQUAL(ref.Reference[0], "foo");
577+
UNIT_ASSERT_VALUES_EQUAL(ref.Reference[1], "bar");
578+
UNIT_ASSERT(!ref.Remove);
579+
}
580+
581+
Y_UNIT_TEST(RefsColumns) {
582+
auto response = NYT::NodeFromYsonString(R"([
583+
{
584+
Write = [
585+
{
586+
Data = data;
587+
Type = type;
588+
Refs = [
589+
{
590+
"Columns" = ["col1";"col2"];
591+
"Reference" = [];
592+
"Remove" = %false;
593+
}
594+
];
595+
}
596+
]
597+
};
598+
])");
599+
600+
auto resList = ParseResponse(response);
601+
UNIT_ASSERT_VALUES_EQUAL(resList.size(), 1);
602+
const auto& res = resList[0];
603+
UNIT_ASSERT_VALUES_EQUAL(res.Writes.size(), 1);
604+
const auto& write = res.Writes[0];
605+
UNIT_ASSERT_VALUES_EQUAL(write.Refs.size(), 1);
606+
const auto& ref = write.Refs[0];
607+
UNIT_ASSERT(ref.Columns.Defined());
608+
UNIT_ASSERT_VALUES_EQUAL(ref.Columns->size(), 2);
609+
UNIT_ASSERT_VALUES_EQUAL((*ref.Columns)[0], "col1");
610+
UNIT_ASSERT_VALUES_EQUAL((*ref.Columns)[1], "col2");
611+
}
612+
}
613+
290614
}
615+
616+

ydb/library/yql/public/result_format/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ SRCS(
66

77
PEERDIR(
88
library/cpp/yson/node
9+
ydb/library/yql/public/issue
910
)
1011

1112
END()

0 commit comments

Comments
 (0)