amorynan commented on code in PR #15966: URL: https://github.com/apache/doris/pull/15966#discussion_r1093049679
########## be/src/olap/rowset/segment_v2/column_writer.cpp: ########## @@ -695,5 +808,120 @@ return Status::NotSupported("array writer has no data, can not finish_current_page"); } +/// ============================= MapColumnWriter =====================//// +MapColumnWriter::MapColumnWriter(const ColumnWriterOptions& opts, std::unique_ptr<Field> field, + ScalarColumnWriter* null_writer, + std::unique_ptr<ColumnWriter> key_writer, + std::unique_ptr<ColumnWriter> value_writer) + : ColumnWriter(std::move(field), opts.meta->is_nullable()), + _key_writer(std::move(key_writer)), + _value_writer(std::move(value_writer)), + _opts(opts) { + if (is_nullable()) { + _null_writer.reset(null_writer); + } +} + +Status MapColumnWriter::init() { + if (is_nullable()) { + RETURN_IF_ERROR(_null_writer->init()); + } + RETURN_IF_ERROR(_key_writer->init()); + RETURN_IF_ERROR(_value_writer->init()); + return Status::OK(); +} + +uint64_t MapColumnWriter::estimate_buffer_size() { + size_t estimate = _key_writer->estimate_buffer_size() + + _value_writer->estimate_buffer_size(); + if (is_nullable()) { + estimate += _null_writer->estimate_buffer_size(); + } + return estimate; +} + +Status MapColumnWriter::finish() { + if (is_nullable()) { + RETURN_IF_ERROR(_null_writer->finish()); + } + RETURN_IF_ERROR(_key_writer->finish()); + RETURN_IF_ERROR(_value_writer->finish()); + return Status::OK(); +} + +// todo. make keys and values write +Status MapColumnWriter::append_data(const uint8_t** ptr, size_t num_rows) { + size_t remaining = num_rows; + const auto* col_cursor = reinterpret_cast<const MapValue*>(*ptr); + while (remaining > 0) { + size_t num_written = 1; + auto* key_data_ptr = const_cast<MapValue*>(col_cursor)->mutable_key_data(); + const uint8_t* key_ptr = (const uint8_t*)key_data_ptr; + RETURN_IF_ERROR(_key_writer->append_data(&key_ptr, 1)); + auto* val_data_ptr = const_cast<MapValue*>(col_cursor)->mutable_value_data(); + const uint8_t* val_ptr = (const uint8_t*)val_data_ptr; + RETURN_IF_ERROR(_value_writer->append_data(&val_ptr, 1)); + remaining -= num_written; + col_cursor += num_written; + *ptr += num_written * sizeof(MapValue); + } + + if (is_nullable()) { + return write_null_column(num_rows, false); + } + return Status::OK(); +} + +Status MapColumnWriter::write_data() { + if (is_nullable()) { + RETURN_IF_ERROR(_null_writer->write_data()); + } + RETURN_IF_ERROR(_offset_writer->write_data()); Review Comment: done -- 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