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

Function transformTypesRecursively

src/DataTypes/transformTypesRecursively.cpp:19–164  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

17}
18
19void transformTypesRecursively(DataTypes & types, std::function<void(DataTypes &, TypeIndexesSet &)> transform_simple_types, std::function<void(DataTypes &, TypeIndexesSet &)> transform_complex_types)
20{
21 TypeIndexesSet type_indexes = getTypesIndexes(types);
22
23 /// Nullable
24 if (type_indexes.contains(TypeIndex::Nullable))
25 {
26 std::vector<UInt8> is_nullable;
27 is_nullable.reserve(types.size());
28 DataTypes nested_types;
29 nested_types.reserve(types.size());
30 for (const auto & type : types)
31 {
32 if (const DataTypeNullable * type_nullable = typeid_cast<const DataTypeNullable *>(type.get()))
33 {
34 is_nullable.push_back(1);
35 nested_types.push_back(type_nullable->getNestedType());
36 }
37 else
38 {
39 is_nullable.push_back(0);
40 nested_types.push_back(type);
41 }
42 }
43
44 transformTypesRecursively(nested_types, transform_simple_types, transform_complex_types);
45 for (size_t i = 0; i != types.size(); ++i)
46 {
47 /// Type could be changed so it cannot be inside Nullable anymore.
48 if (is_nullable[i] && nested_types[i]->canBeInsideNullable())
49 types[i] = makeNullable(nested_types[i]);
50 else
51 types[i] = nested_types[i];
52 }
53
54 if (transform_complex_types)
55 {
56 /// Some types could be changed.
57 type_indexes = getTypesIndexes(types);
58 transform_complex_types(types, type_indexes);
59 }
60
61 return;
62 }
63
64 /// Arrays
65 if (type_indexes.contains(TypeIndex::Array))
66 {
67 /// All types are Array
68 if (type_indexes.size() == 1)
69 {
70 DataTypes nested_types;
71 for (const auto & type : types)
72 nested_types.push_back(typeid_cast<const DataTypeArray *>(type.get())->getNestedType());
73
74 transformTypesRecursively(nested_types, transform_simple_types, transform_complex_types);
75 for (size_t i = 0; i != types.size(); ++i)
76 types[i] = std::make_shared<DataTypeArray>(nested_types[i]);

Callers 1

callOnNestedSimpleTypesFunction · 0.85

Calls 13

getTypesIndexesFunction · 0.85
getNestedTypeMethod · 0.80
makeNullableFunction · 0.70
containsMethod · 0.45
reserveMethod · 0.45
sizeMethod · 0.45
getMethod · 0.45
push_backMethod · 0.45
canBeInsideNullableMethod · 0.45
getElementsMethod · 0.45
resizeMethod · 0.45
emplace_backMethod · 0.45

Tested by

no test coverage detected