Skip to content

Commit c7a2455

Browse files
committed
Split ydb part from yql/public/issue YQL-19206
init commit_hash:8b939f1c7e04aa3a20226fc112bedb27bc29f54d
1 parent 0958dbb commit c7a2455

File tree

5 files changed

+97
-227
lines changed

5 files changed

+97
-227
lines changed

yql/essentials/public/issue/ya.make

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ PEERDIR(
1212
contrib/libs/protobuf
1313
library/cpp/colorizer
1414
library/cpp/resource
15-
contrib/ydb/public/api/protos
1615
yql/essentials/public/issue/protos
1716
yql/essentials/utils
1817
)
Lines changed: 1 addition & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -1,119 +1,25 @@
11
#include "yql_issue_message.h"
2+
#include "yql_issue_message_impl.h"
23

34
#include <yql/essentials/public/issue/protos/issue_message.pb.h>
4-
#include <contrib/ydb/public/api/protos/ydb_issue_message.pb.h>
55

6-
#include <util/generic/deque.h>
76
#include <util/generic/yexception.h>
8-
#include <util/stream/output.h>
9-
#include <util/string/join.h>
107

118
#include <tuple>
129

1310
namespace NYql {
1411

1512
using namespace NIssue::NProto;
1613

17-
template<typename TIssueMessage>
18-
TIssue IssueFromMessage(const TIssueMessage& issueMessage) {
19-
TIssue topIssue;
20-
TDeque<std::pair<TIssue*, const TIssueMessage*>> queue;
21-
queue.push_front(std::make_pair(&topIssue, &issueMessage));
22-
while (!queue.empty()) {
23-
TIssue& issue = *queue.back().first;
24-
const auto& message = *queue.back().second;
25-
queue.pop_back();
26-
TPosition position(message.position().column(), message.position().row(), message.position().file());
27-
TPosition endPosition(message.end_position().column(), message.end_position().row());
28-
if (position.HasValue()) {
29-
if (endPosition.HasValue()) {
30-
issue = TIssue(position, endPosition, message.message());
31-
} else {
32-
issue = TIssue(position, message.message());
33-
}
34-
} else {
35-
issue = TIssue(message.message());
36-
}
37-
38-
for (const auto& subMessage : message.issues()) {
39-
auto subIssue = new TIssue();
40-
issue.AddSubIssue(subIssue);
41-
queue.push_front(std::make_pair(subIssue, &subMessage));
42-
}
43-
44-
issue.SetCode(message.issue_code(), static_cast<ESeverity>(message.severity()));
45-
}
46-
return topIssue;
47-
}
48-
49-
template<typename TIssueMessage>
50-
void IssuesFromMessage(const ::google::protobuf::RepeatedPtrField<TIssueMessage> &message, TIssues &issues) {
51-
issues.Clear();
52-
if (message.size()) {
53-
issues.Reserve(message.size());
54-
for (auto &x : message)
55-
issues.AddIssue(IssueFromMessage(x));
56-
}
57-
}
58-
59-
template<typename TIssueMessage>
60-
void IssueToMessage(const TIssue& topIssue, TIssueMessage* issueMessage) {
61-
TDeque<std::pair<const TIssue*, TIssueMessage*>> queue;
62-
queue.push_front(std::make_pair(&topIssue, issueMessage));
63-
while (!queue.empty()) {
64-
const TIssue& issue = *queue.back().first;
65-
auto& message = *queue.back().second;
66-
queue.pop_back();
67-
if (issue.Position) {
68-
auto& position = *message.mutable_position();
69-
position.set_row(issue.Position.Row);
70-
position.set_column(issue.Position.Column);
71-
position.set_file(issue.Position.File);
72-
}
73-
if (issue.EndPosition) {
74-
auto& endPosition = *message.mutable_end_position();
75-
endPosition.set_row(issue.EndPosition.Row);
76-
endPosition.set_column(issue.EndPosition.Column);
77-
}
78-
message.set_message(issue.GetMessage());
79-
message.set_issue_code(issue.GetCode());
80-
message.set_severity(issue.GetSeverity());
81-
82-
for (auto subIssue : issue.GetSubIssues()) {
83-
TIssueMessage* subMessage = message.add_issues();
84-
queue.push_front(std::make_pair(subIssue.Get(), subMessage));
85-
}
86-
}
87-
}
88-
89-
template<typename TIssueMessage>
90-
void IssuesToMessage(const TIssues& issues, ::google::protobuf::RepeatedPtrField<TIssueMessage> *message) {
91-
message->Clear();
92-
if (!issues)
93-
return;
94-
message->Reserve(issues.Size());
95-
for (const auto &issue : issues) {
96-
IssueToMessage(issue, message->Add());
97-
}
98-
}
99-
100-
template
101-
TIssue IssueFromMessage<Ydb::Issue::IssueMessage>(const Ydb::Issue::IssueMessage& issueMessage);
10214
template
10315
TIssue IssueFromMessage<NYql::NIssue::NProto::IssueMessage>(const NYql::NIssue::NProto::IssueMessage& issueMessage);
10416

105-
template
106-
void IssuesFromMessage<Ydb::Issue::IssueMessage>(const ::google::protobuf::RepeatedPtrField<Ydb::Issue::IssueMessage>& message, TIssues& issues);
10717
template
10818
void IssuesFromMessage<NYql::NIssue::NProto::IssueMessage>(const ::google::protobuf::RepeatedPtrField<NYql::NIssue::NProto::IssueMessage>& message, TIssues& issues);
10919

110-
template
111-
void IssueToMessage<Ydb::Issue::IssueMessage>(const TIssue& topIssue, Ydb::Issue::IssueMessage* issueMessage);
11220
template
11321
void IssueToMessage<NYql::NIssue::NProto::IssueMessage>(const TIssue& topIssue, NYql::NIssue::NProto::IssueMessage* issueMessage);
11422

115-
template
116-
void IssuesToMessage<Ydb::Issue::IssueMessage>(const TIssues& issues, ::google::protobuf::RepeatedPtrField<Ydb::Issue::IssueMessage>* message);
11723
template
11824
void IssuesToMessage<NYql::NIssue::NProto::IssueMessage>(const TIssues& issues, ::google::protobuf::RepeatedPtrField<NYql::NIssue::NProto::IssueMessage>* message);
11925

@@ -123,27 +29,8 @@ NIssue::NProto::IssueMessage IssueToMessage(const TIssue& topIssue) {
12329
return issueMessage;
12430
}
12531

126-
TString IssueToBinaryMessage(const TIssue& issue) {
127-
TString result;
128-
Ydb::Issue::IssueMessage protobuf;
129-
IssueToMessage(issue, &protobuf);
130-
Y_PROTOBUF_SUPPRESS_NODISCARD protobuf.SerializeToString(&result);
131-
return result;
132-
}
133-
134-
TIssue IssueFromBinaryMessage(const TString& binaryMessage) {
135-
Ydb::Issue::IssueMessage protobuf;
136-
if (!protobuf.ParseFromString(binaryMessage)) {
137-
ythrow yexception() << "unable to parse binary string as issue protobuf";
138-
}
139-
return IssueFromMessage(protobuf);
140-
}
141-
14232
}
14333

144-
Y_DECLARE_OUT_SPEC(, google::protobuf::RepeatedPtrField<Ydb::Issue::IssueMessage>, stream, issues) {
145-
stream << JoinSeq("", issues);
146-
}
14734
Y_DECLARE_OUT_SPEC(, google::protobuf::RepeatedPtrField<NYql::NIssue::NProto::IssueMessage>, stream, issues) {
14835
stream << JoinSeq("", issues);
14936
}

yql/essentials/public/issue/yql_issue_message.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,4 @@ void IssueToMessage(const TIssue& topIssue, TIssueMessage* message);
3131
template<typename TIssueMessage>
3232
void IssuesToMessage(const TIssues& issues, ::google::protobuf::RepeatedPtrField<TIssueMessage>* message);
3333

34-
TString IssueToBinaryMessage(const TIssue& issue);
35-
TIssue IssueFromBinaryMessage(const TString& binaryMessage);
36-
3734
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#pragma once
2+
3+
#include "yql_issue_message.h"
4+
5+
#include <util/generic/deque.h>
6+
#include <util/string/join.h>
7+
#include <util/stream/output.h>
8+
9+
namespace NYql {
10+
11+
using namespace NIssue::NProto;
12+
13+
template<typename TIssueMessage>
14+
TIssue IssueFromMessage(const TIssueMessage& issueMessage) {
15+
TIssue topIssue;
16+
TDeque<std::pair<TIssue*, const TIssueMessage*>> queue;
17+
queue.push_front(std::make_pair(&topIssue, &issueMessage));
18+
while (!queue.empty()) {
19+
TIssue& issue = *queue.back().first;
20+
const auto& message = *queue.back().second;
21+
queue.pop_back();
22+
TPosition position(message.position().column(), message.position().row(), message.position().file());
23+
TPosition endPosition(message.end_position().column(), message.end_position().row());
24+
if (position.HasValue()) {
25+
if (endPosition.HasValue()) {
26+
issue = TIssue(position, endPosition, message.message());
27+
} else {
28+
issue = TIssue(position, message.message());
29+
}
30+
} else {
31+
issue = TIssue(message.message());
32+
}
33+
34+
for (const auto& subMessage : message.issues()) {
35+
auto subIssue = new TIssue();
36+
issue.AddSubIssue(subIssue);
37+
queue.push_front(std::make_pair(subIssue, &subMessage));
38+
}
39+
40+
issue.SetCode(message.issue_code(), static_cast<ESeverity>(message.severity()));
41+
}
42+
return topIssue;
43+
}
44+
45+
template<typename TIssueMessage>
46+
void IssuesFromMessage(const ::google::protobuf::RepeatedPtrField<TIssueMessage> &message, TIssues &issues) {
47+
issues.Clear();
48+
if (message.size()) {
49+
issues.Reserve(message.size());
50+
for (auto &x : message)
51+
issues.AddIssue(IssueFromMessage(x));
52+
}
53+
}
54+
55+
template<typename TIssueMessage>
56+
void IssueToMessage(const TIssue& topIssue, TIssueMessage* issueMessage) {
57+
TDeque<std::pair<const TIssue*, TIssueMessage*>> queue;
58+
queue.push_front(std::make_pair(&topIssue, issueMessage));
59+
while (!queue.empty()) {
60+
const TIssue& issue = *queue.back().first;
61+
auto& message = *queue.back().second;
62+
queue.pop_back();
63+
if (issue.Position) {
64+
auto& position = *message.mutable_position();
65+
position.set_row(issue.Position.Row);
66+
position.set_column(issue.Position.Column);
67+
position.set_file(issue.Position.File);
68+
}
69+
if (issue.EndPosition) {
70+
auto& endPosition = *message.mutable_end_position();
71+
endPosition.set_row(issue.EndPosition.Row);
72+
endPosition.set_column(issue.EndPosition.Column);
73+
}
74+
message.set_message(issue.GetMessage());
75+
message.set_issue_code(issue.GetCode());
76+
message.set_severity(issue.GetSeverity());
77+
78+
for (auto subIssue : issue.GetSubIssues()) {
79+
TIssueMessage* subMessage = message.add_issues();
80+
queue.push_front(std::make_pair(subIssue.Get(), subMessage));
81+
}
82+
}
83+
}
84+
85+
template<typename TIssueMessage>
86+
void IssuesToMessage(const TIssues& issues, ::google::protobuf::RepeatedPtrField<TIssueMessage> *message) {
87+
message->Clear();
88+
if (!issues)
89+
return;
90+
message->Reserve(issues.Size());
91+
for (const auto &issue : issues) {
92+
IssueToMessage(issue, message->Add());
93+
}
94+
}
95+
96+
}

yql/essentials/public/issue/yql_issue_ut.cpp

Lines changed: 0 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include <library/cpp/testing/unittest/registar.h>
55
#include <yql/essentials/public/issue/protos/issue_message.pb.h>
66
#include <yql/essentials/public/issue/yql_issue_message.h>
7-
#include <contrib/ydb/public/api/protos/ydb_issue_message.pb.h>
87

98
#include <library/cpp/unicode/normalization/normalization.h>
109

@@ -18,38 +17,6 @@
1817
using namespace google::protobuf;
1918
using namespace NYql;
2019

21-
void ensureMessageTypesSame(const Descriptor* a, const Descriptor* b, THashSet<TString>* visitedTypes);
22-
void ensureFieldDescriptorsSame(const FieldDescriptor* a, const FieldDescriptor* b, THashSet<TString>* visitedTypes) {
23-
UNIT_ASSERT(a);
24-
UNIT_ASSERT(b);
25-
26-
UNIT_ASSERT_VALUES_EQUAL(FieldDescriptor::TypeName(a->type()), FieldDescriptor::TypeName(b->type()));
27-
UNIT_ASSERT_VALUES_EQUAL((int)a->label(), (int)b->label());
28-
UNIT_ASSERT_VALUES_EQUAL(a->name(), b->name());
29-
UNIT_ASSERT_VALUES_EQUAL(a->number(), b->number());
30-
UNIT_ASSERT_VALUES_EQUAL(a->is_repeated(), b->is_repeated());
31-
UNIT_ASSERT_VALUES_EQUAL(a->is_packed(), b->is_packed());
32-
UNIT_ASSERT_VALUES_EQUAL(a->index(), b->index());
33-
if (a->type() == FieldDescriptor::TYPE_MESSAGE || a->type() == FieldDescriptor::TYPE_GROUP) {
34-
ensureMessageTypesSame(a->message_type(), b->message_type(), visitedTypes);
35-
}
36-
}
37-
38-
void ensureMessageTypesSame(const Descriptor* a, const Descriptor* b, THashSet<TString>* visitedTypes) {
39-
UNIT_ASSERT(a);
40-
UNIT_ASSERT(b);
41-
if (!visitedTypes->insert(a->name()).second) {
42-
return;
43-
}
44-
45-
UNIT_ASSERT_VALUES_EQUAL(a->name(), b->name());
46-
UNIT_ASSERT_VALUES_EQUAL(a->field_count(), b->field_count());
47-
48-
for (int i = 0; i < a->field_count(); i++) {
49-
ensureFieldDescriptorsSame(a->field(i), b->field(i), visitedTypes);
50-
}
51-
}
52-
5320
Y_UNIT_TEST_SUITE(IssueTest) {
5421
Y_UNIT_TEST(Ascii) {
5522
TIssue issue1("тест abc");
@@ -63,27 +30,6 @@ Y_UNIT_TEST_SUITE(IssueTest) {
6330
}
6431
}
6532

66-
Y_UNIT_TEST_SUITE(IssueProtoTest) {
67-
Y_UNIT_TEST(KikimrYqlSameLayout) {
68-
Ydb::Issue::IssueMessage yqlIssue;
69-
NYql::NIssue::NProto::IssueMessage kikimrIssue;
70-
THashSet<TString> visitedTypes;
71-
ensureMessageTypesSame(yqlIssue.GetDescriptor(), kikimrIssue.GetDescriptor(), &visitedTypes);
72-
}
73-
74-
Y_UNIT_TEST(BinarySerialization) {
75-
TIssue issueTo("root_issue");
76-
TString bin = IssueToBinaryMessage(issueTo);
77-
TIssue issueFrom = IssueFromBinaryMessage(bin);
78-
UNIT_ASSERT_EQUAL(issueTo, issueFrom);
79-
}
80-
81-
Y_UNIT_TEST(WrongBinStringException) {
82-
UNIT_ASSERT_EXCEPTION(IssueFromBinaryMessage("qqq"), yexception);
83-
}
84-
}
85-
86-
8733
Y_UNIT_TEST_SUITE(TextWalkerTest) {
8834
Y_UNIT_TEST(BasicTest) {
8935
TPosition pos;
@@ -167,61 +113,6 @@ Y_UNIT_TEST_SUITE(ToOneLineStringTest) {
167113
}
168114
}
169115

170-
Y_UNIT_TEST_SUITE(ToStreamTest) {
171-
template <typename TIssueMessage>
172-
void CheckSerializationToStream(const TIssues& issues, const TString& expected) {
173-
google::protobuf::RepeatedPtrField<TIssueMessage> protoIssues;
174-
IssuesToMessage(issues, &protoIssues);
175-
TStringBuilder stream;
176-
stream << protoIssues;
177-
UNIT_ASSERT_STRINGS_EQUAL(stream, expected);
178-
};
179-
180-
Y_UNIT_TEST(OneMessageTest) {
181-
TIssues issues;
182-
issues.AddIssue("error");
183-
CheckSerializationToStream<Ydb::Issue::IssueMessage>(issues, "{ message: \"error\" severity: 1 }");
184-
CheckSerializationToStream<NYql::NIssue::NProto::IssueMessage>(issues, "{ message: \"error\" issue_code: 0 severity: 1 }");
185-
}
186-
187-
Y_UNIT_TEST(SubIssuesTest) {
188-
TIssue issue(TPosition(12, 34, "file.abc"), "error");
189-
TIssue subissue("suberror");
190-
subissue.AddSubIssue(MakeIntrusive<TIssue>("subsuberror"));
191-
issue.AddSubIssue(MakeIntrusive<TIssue>(subissue));
192-
TIssues issues;
193-
issues.AddIssue(issue);
194-
CheckSerializationToStream<Ydb::Issue::IssueMessage>(issues, "{ position { row: 34 column: 12 file: \"file.abc\" } message: \"error\" end_position { row: 34 column: 12 } severity: 1 issues { message: \"suberror\" severity: 1 issues { message: \"subsuberror\" severity: 1 } } }");
195-
CheckSerializationToStream<NYql::NIssue::NProto::IssueMessage>(issues, "{ position { row: 34 column: 12 file: \"file.abc\" } message: \"error\" end_position { row: 34 column: 12 } issue_code: 0 severity: 1 issues { message: \"suberror\" issue_code: 0 severity: 1 issues { message: \"subsuberror\" issue_code: 0 severity: 1 } } }");
196-
}
197-
198-
Y_UNIT_TEST(ManyIssuesTest) {
199-
TIssue issue(TPosition(12, 34, "file.abc"), "error");
200-
issue.AddSubIssue(MakeIntrusive<TIssue>("suberror"));
201-
TIssues issues;
202-
issues.AddIssue(issue);
203-
issues.AddIssue(TPosition(100, 2, "abc.file"), "my message");
204-
CheckSerializationToStream<Ydb::Issue::IssueMessage>(issues, "{ position { row: 34 column: 12 file: \"file.abc\" } message: \"error\" end_position { row: 34 column: 12 } severity: 1 issues { message: \"suberror\" severity: 1 } }{ position { row: 2 column: 100 file: \"abc.file\" } message: \"my message\" end_position { row: 2 column: 100 } severity: 1 }");
205-
CheckSerializationToStream<NYql::NIssue::NProto::IssueMessage>(issues, "{ position { row: 34 column: 12 file: \"file.abc\" } message: \"error\" end_position { row: 34 column: 12 } issue_code: 0 severity: 1 issues { message: \"suberror\" issue_code: 0 severity: 1 } }{ position { row: 2 column: 100 file: \"abc.file\" } message: \"my message\" end_position { row: 2 column: 100 } issue_code: 0 severity: 1 }");
206-
}
207-
}
208-
209-
Y_UNIT_TEST_SUITE(ToMessage) {
210-
Y_UNIT_TEST(NonUtf8) {
211-
const TString nonUtf8String = "\x7f\xf8\xf7\xff\xf8\x1f\xff\xf2\xaf\xbf\xfe\xfa\xf5\x7f\xfe\xfa\x27\x20\x7d\x20\x5d\x2e";
212-
UNIT_ASSERT(!IsUtf(nonUtf8String));
213-
TIssue issue;
214-
issue.SetMessage(nonUtf8String);
215-
216-
Ydb::Issue::IssueMessage msg;
217-
IssueToMessage(issue, &msg);
218-
TString serialized;
219-
UNIT_ASSERT(msg.SerializeToString(&serialized));
220-
Ydb::Issue::IssueMessage msg2;
221-
UNIT_ASSERT(msg2.ParseFromString(serialized));
222-
}
223-
}
224-
225116
Y_UNIT_TEST_SUITE(EscapeNonUtf8) {
226117
Y_UNIT_TEST(Escape) {
227118
const TString nonUtf8String = "\xfe\xfa\xf5\xc2";

0 commit comments

Comments
 (0)