@@ -10,8 +10,9 @@ namespace {
10
10
11
11
class TCsvToYdbConverter {
12
12
public:
13
- explicit TCsvToYdbConverter (TTypeParser& parser)
13
+ explicit TCsvToYdbConverter (TTypeParser& parser, const TString& nullValue )
14
14
: Parser(parser)
15
+ , NullValue(nullValue)
15
16
{
16
17
}
17
18
@@ -133,15 +134,15 @@ class TCsvToYdbConverter {
133
134
134
135
void BuildValue (TStringBuf token) {
135
136
switch (Parser.GetKind ()) {
136
- case TTypeParser::ETypeKind::Primitive:
137
+ case TTypeParser::ETypeKind::Primitive: {
137
138
BuildPrimitive (TString (token));
138
139
break ;
139
-
140
- case TTypeParser::ETypeKind::Decimal:
140
+ }
141
+ case TTypeParser::ETypeKind::Decimal: {
141
142
Builder.Decimal (TString (token));
142
143
break ;
143
-
144
- case TTypeParser::ETypeKind::Optional:
144
+ }
145
+ case TTypeParser::ETypeKind::Optional: {
145
146
Parser.OpenOptional ();
146
147
if (token == NullValue) {
147
148
Builder.EmptyOptional (GetType ());
@@ -152,23 +153,31 @@ class TCsvToYdbConverter {
152
153
}
153
154
Parser.CloseOptional ();
154
155
break ;
155
-
156
- case TTypeParser::ETypeKind::Null:
156
+ }
157
+ case TTypeParser::ETypeKind::Null: {
157
158
EnsureNull (token);
158
159
break ;
159
-
160
- case TTypeParser::ETypeKind::Void:
160
+ }
161
+ case TTypeParser::ETypeKind::Void: {
161
162
EnsureNull (token);
162
163
break ;
163
-
164
- case TTypeParser::ETypeKind::Tagged:
164
+ }
165
+ case TTypeParser::ETypeKind::Tagged: {
165
166
Parser.OpenTagged ();
166
167
Builder.BeginTagged (Parser.GetTag ());
167
168
BuildValue (token);
168
169
Builder.EndTagged ();
169
170
Parser.CloseTagged ();
170
171
break ;
171
-
172
+ }
173
+ case TTypeParser::ETypeKind::Pg: {
174
+ if (token == NullValue) {
175
+ Builder.Pg (TPgValue (TPgValue::VK_NULL, {}, Parser.GetPg ()));
176
+ } else {
177
+ Builder.Pg (TPgValue (TPgValue::VK_TEXT, TString (token), Parser.GetPg ()));
178
+ }
179
+ break ;
180
+ }
172
181
default :
173
182
throw TMisuseException () << " Unsupported type kind: " << Parser.GetKind ();
174
183
}
@@ -200,6 +209,10 @@ class TCsvToYdbConverter {
200
209
Parser.CloseTagged ();
201
210
break ;
202
211
212
+ case TTypeParser::ETypeKind::Pg:
213
+ typeBuilder.Pg (Parser.GetPg ());
214
+ break ;
215
+
203
216
default :
204
217
throw TMisuseException () << " Unsupported type kind: " << Parser.GetKind ();
205
218
}
@@ -240,23 +253,36 @@ class TCsvToYdbConverter {
240
253
241
254
}
242
255
243
- TCsvParser::TCsvParser (TString&& headerRow, const char delimeter,
244
- const std::map<TString, TType>& paramTypes, const std::map<TString, TString>* paramSources)
256
+ TCsvParser::TCsvParser (TString&& headerRow, const char delimeter, const TString& nullValue,
257
+ const std::map<TString, TType>* paramTypes,
258
+ const std::map<TString, TString>* paramSources)
245
259
: HeaderRow(std::move(headerRow))
246
260
, Delimeter(delimeter)
261
+ , NullValue(nullValue)
247
262
, ParamTypes(paramTypes)
248
263
, ParamSources(paramSources)
249
264
{
250
265
NCsvFormat::CsvSplitter splitter (HeaderRow, Delimeter);
251
266
Header = static_cast <TVector<TString>>(splitter);
252
267
}
253
268
254
- TValue TCsvParser::FieldToValue (TTypeParser& parser, TStringBuf token) {
255
- TCsvToYdbConverter converter (parser);
269
+ TCsvParser::TCsvParser (TVector<TString>&& header, const char delimeter, const TString& nullValue,
270
+ const std::map<TString, TType>* paramTypes,
271
+ const std::map<TString, TString>* paramSources)
272
+ : Header(std::move(header))
273
+ , Delimeter(delimeter)
274
+ , NullValue(nullValue)
275
+ , ParamTypes(paramTypes)
276
+ , ParamSources(paramSources)
277
+ {
278
+ }
279
+
280
+ TValue TCsvParser::FieldToValue (TTypeParser& parser, TStringBuf token) const {
281
+ TCsvToYdbConverter converter (parser, NullValue);
256
282
return converter.Convert (token);
257
283
}
258
284
259
- void TCsvParser::GetParams (TString&& data, TParamsBuilder& builder) {
285
+ void TCsvParser::GetParams (TString&& data, TParamsBuilder& builder) const {
260
286
NCsvFormat::CsvSplitter splitter (data, Delimeter);
261
287
auto headerIt = Header.begin ();
262
288
do {
@@ -265,8 +291,8 @@ void TCsvParser::GetParams(TString&& data, TParamsBuilder& builder) {
265
291
throw TMisuseException () << " Header contains less fields than data. Header: \" " << HeaderRow << " \" , data: \" " << data << " \" " ;
266
292
}
267
293
TString fullname = " $" + *headerIt;
268
- auto paramIt = ParamTypes. find (fullname);
269
- if (paramIt == ParamTypes. end ()) {
294
+ auto paramIt = ParamTypes-> find (fullname);
295
+ if (paramIt == ParamTypes-> end ()) {
270
296
++headerIt;
271
297
continue ;
272
298
}
@@ -286,7 +312,7 @@ void TCsvParser::GetParams(TString&& data, TParamsBuilder& builder) {
286
312
}
287
313
}
288
314
289
- void TCsvParser::GetValue (TString&& data, TValueBuilder& builder, const TType& type) {
315
+ void TCsvParser::GetValue (TString&& data, TValueBuilder& builder, const TType& type) const {
290
316
NCsvFormat::CsvSplitter splitter (data, Delimeter);
291
317
auto headerIt = Header.cbegin ();
292
318
std::map<TString, TStringBuf> fields;
@@ -307,6 +333,9 @@ void TCsvParser::GetValue(TString&& data, TValueBuilder& builder, const TType& t
307
333
parser.OpenStruct ();
308
334
while (parser.TryNextMember ()) {
309
335
TString name = parser.GetMemberName ();
336
+ if (name == NullValue) {
337
+ continue ;
338
+ }
310
339
auto fieldIt = fields.find (name);
311
340
if (fieldIt == fields.end ()) {
312
341
throw TMisuseException () << " No member \" " << name << " \" in csv string for YDB struct type" ;
@@ -317,11 +346,15 @@ void TCsvParser::GetValue(TString&& data, TValueBuilder& builder, const TType& t
317
346
builder.EndStruct ();
318
347
}
319
348
320
- TType TCsvParser::GetColumnsType () {
349
+ TType TCsvParser::GetColumnsType () const {
321
350
TTypeBuilder builder;
322
351
builder.BeginStruct ();
323
352
for (const auto & colName : Header) {
324
- builder.AddMember (colName, ParamTypes.at (colName));
353
+ if (ParamTypes->find (colName) != ParamTypes->end ()) {
354
+ builder.AddMember (colName, ParamTypes->at (colName));
355
+ } else {
356
+ builder.AddMember (NullValue, TTypeBuilder ().Build ());
357
+ }
325
358
}
326
359
builder.EndStruct ();
327
360
return builder.Build ();
0 commit comments