| 35 | template <typename Parser> |
| 36 | template <typename Reader> |
| 37 | void 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(); |
nothing calls this directly
no test coverage detected