amorynan commented on code in PR #15966: URL: https://github.com/apache/doris/pull/15966#discussion_r1093940463
########## be/src/olap/rowset/segment_v2/column_writer.cpp: ########## @@ -695,5 +808,120 @@ Status ArrayColumnWriter::finish_current_page() { 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()); + RETURN_IF_ERROR(_key_writer->write_data()); + RETURN_IF_ERROR(_value_writer->write_data()); + return Status::OK(); +} + +Status MapColumnWriter::write_ordinal_index() { + if (is_nullable()) { + RETURN_IF_ERROR(_null_writer->write_ordinal_index()); + } + RETURN_IF_ERROR(_key_writer->write_ordinal_index()); + RETURN_IF_ERROR(_value_writer->write_ordinal_index()); + + return Status::OK(); +} + +Status MapColumnWriter::append_nulls(size_t num_rows) { + return write_null_column(num_rows, true); +} + +Status MapColumnWriter::write_null_column(size_t num_rows, bool is_null) { + uint8_t null_sign = is_null ? 1 : 0; + while (num_rows > 0) { + // TODO llj bulk write + const uint8_t* null_sign_ptr = &null_sign; + RETURN_IF_ERROR(_null_writer->append_data(&null_sign_ptr, 1)); 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