[feature-wip](partial update) PART1: support basic partial write (#17542)

This commit is contained in:
yixiutt
2023-04-28 17:17:57 +08:00
committed by GitHub
parent 718297d3c1
commit aef9355cd3
65 changed files with 31529 additions and 176 deletions

View File

@ -80,6 +80,34 @@ void JsonbSerializeUtil::jsonb_to_block(const TupleDescriptor& desc, const char*
JsonbValue* slot_value = doc->find(slot->col_unique_id());
MutableColumnPtr dst_column = dst.get_by_position(j).column->assume_mutable();
if (!slot_value || slot_value->isNull()) {
// null or not exist
dst_column->insert_default();
continue;
}
dst.get_data_type(j)->get_serde()->read_one_cell_from_jsonb(*dst_column, slot_value);
}
}
void JsonbSerializeUtil::jsonb_to_block(TabletSchemaSPtr schema,
const std::vector<uint32_t>& col_ids,
const ColumnString& jsonb_column, Block& dst) {
for (int i = 0; i < jsonb_column.size(); ++i) {
StringRef jsonb_data = jsonb_column.get_data_at(i);
jsonb_to_block(schema, col_ids, jsonb_data.data, jsonb_data.size, dst);
}
}
void JsonbSerializeUtil::jsonb_to_block(TabletSchemaSPtr schema,
const std::vector<uint32_t>& col_ids, const char* data,
size_t size, Block& dst) {
auto pdoc = JsonbDocument::createDocument(data, size);
JsonbDocument& doc = *pdoc;
for (int j = 0; j < col_ids.size(); ++j) {
auto column = schema->column(col_ids[j]);
JsonbValue* slot_value = doc->find(column.unique_id());
MutableColumnPtr dst_column = dst.get_by_position(j).column->assume_mutable();
if (!slot_value || slot_value->isNull()) {
// null or not exist
dst_column->insert_default();
continue;
}

View File

@ -18,6 +18,9 @@
#pragma once
#include <stddef.h>
#include "olap/tablet_schema.h"
#include "runtime/descriptors.h"
#include "vec/columns/column_string.h"
#include "vec/core/block.h"
namespace doris {
@ -41,5 +44,13 @@ public:
// single row
static void jsonb_to_block(const TupleDescriptor& desc, const char* data, size_t size,
Block& dst);
static void jsonb_to_block(TabletSchemaSPtr schema, const std::vector<uint32_t>& col_ids,
const ColumnString& jsonb_column, Block& dst);
static void jsonb_to_block(TabletSchemaSPtr schema, const std::vector<uint32_t>& col_ids,
const char* data, size_t size, Block& dst);
static PrimitiveType get_primity_type(FieldType type);
};
} // namespace doris::vectorized

View File

@ -178,6 +178,16 @@ void OlapBlockDataConvertor::set_source_content(const vectorized::Block* block,
}
}
void OlapBlockDataConvertor::set_source_content_with_specifid_columns(
const vectorized::Block* block, size_t row_pos, size_t num_rows,
std::vector<uint32_t> cids) {
assert(block && num_rows > 0 && row_pos + num_rows <= block->rows() &&
block->columns() <= _convertors.size());
for (auto i : cids) {
_convertors[i]->set_source_column(block->get_by_position(i), row_pos, num_rows);
}
}
void OlapBlockDataConvertor::clear_source_content() {
for (auto& convertor : _convertors) {
convertor->clear_source_column();

View File

@ -73,6 +73,8 @@ public:
OlapBlockDataConvertor(const TabletSchema* tablet_schema);
OlapBlockDataConvertor(const TabletSchema* tablet_schema, const std::vector<uint32_t>& col_ids);
void set_source_content(const vectorized::Block* block, size_t row_pos, size_t num_rows);
void set_source_content_with_specifid_columns(const vectorized::Block* block, size_t row_pos,
size_t num_rows, std::vector<uint32_t> cids);
void clear_source_content();
std::pair<Status, IOlapColumnDataAccessor*> convert_column_data(size_t cid);
void add_column_data_convertor(const TabletColumn& column);