| 13 | { |
| 14 | |
| 15 | void flattenTupleTypeImpl(const DataTypePtr & type, const String & current_path, std::vector<String> & flattened_paths, DataTypes & flattened_types) |
| 16 | { |
| 17 | if (const auto * type_tuple = typeid_cast<const DataTypeTuple *>(removeNullable(type).get())) |
| 18 | { |
| 19 | const auto & tuple_names = type_tuple->getElementNames(); |
| 20 | const auto & tuple_types = type_tuple->getElements(); |
| 21 | |
| 22 | for (size_t i = 0; i < tuple_names.size(); ++i) |
| 23 | { |
| 24 | String path = current_path.empty() ? tuple_names[i] : current_path + "." + tuple_names[i]; |
| 25 | flattenTupleTypeImpl(tuple_types[i], path, flattened_paths, flattened_types); |
| 26 | } |
| 27 | } |
| 28 | else if (const auto * type_array = typeid_cast<const DataTypeArray *>(type.get())) |
| 29 | { |
| 30 | std::vector<String> flattened_element_paths; |
| 31 | DataTypes flattened_element_types; |
| 32 | |
| 33 | flattenTupleTypeImpl(type_array->getNestedType(), current_path, flattened_element_paths, flattened_element_types); |
| 34 | chassert(flattened_element_paths.size() == flattened_element_types.size()); |
| 35 | |
| 36 | for (size_t i = 0; i < flattened_element_paths.size(); ++i) |
| 37 | { |
| 38 | flattened_paths.push_back(flattened_element_paths[i]); |
| 39 | flattened_types.push_back(std::make_shared<DataTypeArray>(flattened_element_types[i])); |
| 40 | } |
| 41 | } |
| 42 | else |
| 43 | { |
| 44 | flattened_paths.push_back(current_path); |
| 45 | flattened_types.push_back(type); |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | void flattenTupleColumnImpl(const ColumnPtr & column, Columns & flattened_columns, Columns & offsets_columns) |
| 50 | { |
no test coverage detected