amorynan commented on code in PR #15966: URL: https://github.com/apache/doris/pull/15966#discussion_r1086258307
########## be/src/vec/olap/olap_data_convertor.cpp: ########## @@ -712,4 +723,79 @@ Status OlapBlockDataConvertor::OlapColumnDataConvertorArray::convert_to_olap( return Status::OK(); } +Status OlapBlockDataConvertor::OlapColumnDataConvertorMap::convert_to_olap() { + const ColumnMap* column_map = nullptr; + const DataTypeMap* data_type_map = nullptr; + if (_nullmap) { + const auto* nullable_column = + assert_cast<const ColumnNullable*>(_typed_column.column.get()); + column_map = + assert_cast<const ColumnMap*>(nullable_column->get_nested_column_ptr().get()); + data_type_map = assert_cast<const DataTypeMap*>( + (assert_cast<const DataTypeNullable*>(_typed_column.type.get())->get_nested_type()) + .get()); + } else { + column_map = assert_cast<const ColumnMap*>(_typed_column.column.get()); + data_type_map = assert_cast<const DataTypeMap*>(_typed_column.type.get()); + } + assert(column_map); + assert(data_type_map); + + return convert_to_olap(column_map, data_type_map); +} + +Status OlapBlockDataConvertor::OlapColumnDataConvertorMap::convert_to_olap( + const ColumnMap* column_map, + const DataTypeMap* data_type_map) { + + ColumnPtr key_data = column_map->get_keys_ptr(); + ColumnPtr value_data = column_map->get_values_ptr(); + if (column_map->get_keys().is_nullable()) { + const auto& key_nullable_column = + assert_cast<const ColumnNullable&>(column_map->get_keys()); + key_data = key_nullable_column.get_nested_column_ptr(); + } + + if (column_map->get_values().is_nullable()) { + const auto& val_nullable_column = + assert_cast<const ColumnNullable&>(column_map->get_values()); + value_data = val_nullable_column.get_nested_column_ptr(); + } + + const auto& offsets = column_map->get_offsets(); // use keys offsets + + ColumnWithTypeAndName key_typed_column = { + key_data, remove_nullable(data_type_map->get_keys()),"map.key"}; + _key_convertor->set_source_column(key_typed_column, _row_pos, _num_rows); + _key_convertor->convert_to_olap(); + + ColumnWithTypeAndName value_typed_column = { + value_data, remove_nullable(data_type_map->get_values()), "map.value"}; + _value_convertor->set_source_column(value_typed_column, _row_pos, _num_rows); + _value_convertor->convert_to_olap(); + + MapValue* map_value = _values.data(); + for (size_t i = 0; i < _num_rows; ++i, ++map_value) { + int64_t cur_pos = _row_pos + i; + int64_t prev_pos = cur_pos - 1; + if (_nullmap && _nullmap[cur_pos]) { + continue; + } + auto single_map_size = offsets[cur_pos] - offsets[prev_pos]; + new (map_value) MapValue(single_map_size); Review Comment: ? You mean one MapValue contains more than one rows ? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org