MCPcopy Create free account
hub / github.com/ByConity/ByConity / deserializeTextImpl

Method deserializeTextImpl

src/DataTypes/Serializations/SerializationObject.cpp:37–99  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

35template <typename Parser>
36template <typename Reader>
37void SerializationObject<Parser>::deserializeTextImpl(IColumn & column, Reader && reader) const
38{
39 auto & column_object = assert_cast<ColumnObject &>(column);
40
41 String buf;
42 reader(buf);
43 std::optional<ParseResult> result;
44
45 /// Treat empty string as an empty object
46 /// for better CAST from String to Object.
47 if (!buf.empty())
48 {
49 auto parser = parsers_pool.get([] { return new Parser; });
50 result = parser->parse(buf.data(), buf.size());
51 }
52 else
53 {
54 result = ParseResult{};
55 }
56
57 if (!result)
58 throw Exception(ErrorCodes::INCORRECT_DATA, "Cannot parse object");
59
60 auto & [paths, values] = *result;
61 assert(paths.size() == values.size());
62
63 size_t old_column_size = column_object.size();
64 for (size_t i = 0; i < paths.size(); ++i)
65 {
66 auto field_info = getFieldInfo(values[i]);
67 if (field_info.need_fold_dimension)
68 values[i] = applyVisitor(FieldVisitorFoldDimension(field_info.num_dimensions), std::move(values[i]));
69 if (isNothing(field_info.scalar_type))
70 continue;
71
72 if (!column_object.hasSubcolumn(paths[i]))
73 {
74 if (paths[i].hasNested())
75 column_object.addNestedSubcolumn(paths[i], field_info, old_column_size);
76 else
77 column_object.addSubcolumn(paths[i], old_column_size);
78 }
79
80 auto & subcolumn = column_object.getSubcolumn(paths[i]);
81 assert(subcolumn.size() == old_column_size);
82
83 subcolumn.insert(std::move(values[i]), std::move(field_info));
84 }
85
86 /// Insert default values to missed subcolumns.
87 const auto & subcolumns = column_object.getSubcolumns();
88 for (const auto & entry : subcolumns)
89 {
90 if (entry->data.size() == old_column_size)
91 {
92 bool inserted = column_object.tryInsertDefaultFromNested(entry);
93 if (!inserted)
94 entry->data.insertDefault();

Callers

nothing calls this directly

Calls 15

getFieldInfoFunction · 0.85
applyVisitorFunction · 0.85
isNothingFunction · 0.85
addNestedSubcolumnMethod · 0.80
addSubcolumnMethod · 0.80
getSubcolumnsMethod · 0.80
incrementNumRowsMethod · 0.80
ExceptionClass · 0.50
emptyMethod · 0.45
getMethod · 0.45
parseMethod · 0.45

Tested by

no test coverage detected