[Refactor](map) remove using column array in map to reduce offset column (#17330)

1. remove column array in map 
2. add offsets column in map 
Aim to reduce duplicate offset  from key-array and value-array in disk
This commit is contained in:
amory
2023-03-09 11:22:26 +08:00
committed by GitHub
parent 368e6a4f9c
commit 06dee69174
19 changed files with 659 additions and 326 deletions

View File

@ -97,12 +97,7 @@ public:
private:
//=========================== map element===========================//
ColumnPtr _get_mapped_idx(const ColumnArray& key_column,
const ColumnWithTypeAndName& argument) {
return _mapped_key(key_column, argument);
}
ColumnPtr _mapped_key(const ColumnArray& column, const ColumnWithTypeAndName& argument) {
ColumnPtr _get_mapped_idx(const ColumnArray& column, const ColumnWithTypeAndName& argument) {
auto right_column = argument.column->convert_to_full_column_if_const();
const ColumnArray::Offsets64& offsets = column.get_offsets();
ColumnPtr nested_ptr = nullptr;
@ -236,25 +231,28 @@ private:
const UInt8* src_null_map, UInt8* dst_null_map) {
auto left_column = arguments[0].column->convert_to_full_column_if_const();
DataTypePtr val_type =
reinterpret_cast<const DataTypeMap&>(*arguments[0].type).get_values();
reinterpret_cast<const DataTypeMap&>(*arguments[0].type).get_value_type();
const auto& map_column = reinterpret_cast<const ColumnMap&>(*left_column);
const ColumnArray& column_keys = assert_cast<const ColumnArray&>(map_column.get_keys());
// create column array to find keys
auto key_arr = ColumnArray::create(map_column.get_keys_ptr(), map_column.get_offsets_ptr());
auto val_arr =
ColumnArray::create(map_column.get_values_ptr(), map_column.get_offsets_ptr());
const auto& offsets = column_keys.get_offsets();
const auto& offsets = map_column.get_offsets();
const size_t rows = offsets.size();
if (rows <= 0) {
return nullptr;
}
ColumnPtr matched_indices = _get_mapped_idx(column_keys, arguments[1]);
ColumnPtr matched_indices = _get_mapped_idx(*key_arr, arguments[1]);
if (!matched_indices) {
return nullptr;
}
DataTypePtr indices_type(std::make_shared<vectorized::DataTypeInt8>());
ColumnWithTypeAndName indices(matched_indices, indices_type, "indices");
ColumnWithTypeAndName data(map_column.get_values_ptr(), val_type, "value");
ColumnWithTypeAndName data(val_arr, val_type, "value");
ColumnsWithTypeAndName args = {data, indices};
return _execute_non_nullable(args, input_rows_count, src_null_map, dst_null_map);
}