MCPcopy Create free account
hub / github.com/ClickHouse/ClickHouse / flattenImpl

Function flattenImpl

src/DataTypes/NestedUtils.cpp:198–269  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

196}
197
198static Block flattenImpl(const Block & block, bool flatten_named_tuple)
199{
200 Block res;
201
202 for (const auto & elem : block)
203 {
204 if (isNested(elem.type))
205 {
206 const DataTypeArray * type_arr = assert_cast<const DataTypeArray *>(elem.type.get());
207 const DataTypeTuple * type_tuple = assert_cast<const DataTypeTuple *>(type_arr->getNestedType().get());
208 if (type_tuple->hasExplicitNames())
209 {
210 const DataTypes & element_types = type_tuple->getElements();
211 const Strings & names = type_tuple->getElementNames();
212 size_t tuple_size = element_types.size();
213
214 bool is_const = isColumnConst(*elem.column);
215 const ColumnArray * column_array = nullptr;
216 if (is_const)
217 column_array = typeid_cast<const ColumnArray *>(&assert_cast<const ColumnConst &>(*elem.column).getDataColumn());
218 else
219 column_array = typeid_cast<const ColumnArray *>(elem.column.get());
220
221 const ColumnPtr & column_offsets = column_array->getOffsetsPtr();
222
223 const ColumnTuple & column_tuple = typeid_cast<const ColumnTuple &>(column_array->getData());
224 const auto & element_columns = column_tuple.getColumns();
225
226 for (size_t i = 0; i < tuple_size; ++i)
227 {
228 String nested_name = concatenateName(elem.name, names[i]);
229 ColumnPtr column_array_of_element = ColumnArray::create(element_columns[i], column_offsets);
230
231 res.insert(ColumnWithTypeAndName(
232 is_const
233 ? ColumnConst::create(column_array_of_element, block.rows())
234 : column_array_of_element,
235 std::make_shared<DataTypeArray>(element_types[i]),
236 nested_name));
237 }
238 }
239 else
240 res.insert(elem);
241 }
242 else if (const DataTypeTuple * type_tuple = typeid_cast<const DataTypeTuple *>(elem.type.get()); type_tuple && flatten_named_tuple)
243 {
244 if (type_tuple->hasExplicitNames())
245 {
246 const DataTypes & element_types = type_tuple->getElements();
247 const Strings & names = type_tuple->getElementNames();
248 const ColumnTuple * column_tuple = nullptr;
249 if (isColumnConst(*elem.column))
250 column_tuple = typeid_cast<const ColumnTuple *>(&assert_cast<const ColumnConst &>(*elem.column).getDataColumn());
251 else
252 column_tuple = typeid_cast<const ColumnTuple *>(elem.column.get());
253 size_t tuple_size = column_tuple->tupleSize();
254 for (size_t i = 0; i < tuple_size; ++i)
255 {

Callers 2

flattenFunction · 0.85
flattenNestedFunction · 0.85

Calls 15

isNestedFunction · 0.85
isColumnConstFunction · 0.85
concatenateNameFunction · 0.85
getNestedTypeMethod · 0.80
hasExplicitNamesMethod · 0.80
createFunction · 0.70
getMethod · 0.45
getElementsMethod · 0.45
sizeMethod · 0.45
getDataMethod · 0.45
getColumnsMethod · 0.45

Tested by

no test coverage detected