[feature-wip](partial update) PART1: support basic partial write (#17542)
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user