This is an automated email from the ASF dual-hosted git repository.
eldenmoon pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.0 by this push:
new df4b1ca60b9 [pick](variant) pick some serde impl (#40573) (#41390)
df4b1ca60b9 is described below
commit df4b1ca60b92108e53a3d508884d3114942146fa
Author: lihangyu <[email protected]>
AuthorDate: Fri Sep 27 14:23:06 2024 +0800
[pick](variant) pick some serde impl (#40573) (#41390)
related PR #40573
introduced by #41358
---
.../vec/data_types/serde/data_type_nothing_serde.h | 7 +++++
.../data_types/serde/data_type_object_serde.cpp | 31 ++++++++++++++++++++++
.../vec/data_types/serde/data_type_object_serde.h | 4 +++
3 files changed, 42 insertions(+)
diff --git a/be/src/vec/data_types/serde/data_type_nothing_serde.h
b/be/src/vec/data_types/serde/data_type_nothing_serde.h
index b39c3b5776e..83f7caf0579 100644
--- a/be/src/vec/data_types/serde/data_type_nothing_serde.h
+++ b/be/src/vec/data_types/serde/data_type_nothing_serde.h
@@ -107,6 +107,13 @@ public:
std::vector<StringRef>& buffer_list) const
override {
return Status::NotSupported("write_column_to_orc with type " +
column.get_name());
}
+
+ Status write_one_cell_to_json(const IColumn& column, rapidjson::Value&
result,
+ rapidjson::Document::AllocatorType&
allocator, Arena& mem_pool,
+ int row_num) const override {
+ result.SetNull();
+ return Status::OK();
+ }
};
} // namespace vectorized
} // namespace doris
diff --git a/be/src/vec/data_types/serde/data_type_object_serde.cpp
b/be/src/vec/data_types/serde/data_type_object_serde.cpp
index 49efa8c829c..530646e9b4d 100644
--- a/be/src/vec/data_types/serde/data_type_object_serde.cpp
+++ b/be/src/vec/data_types/serde/data_type_object_serde.cpp
@@ -160,6 +160,37 @@ void DataTypeObjectSerDe::write_column_to_arrow(const
IColumn& column, const Nul
}
}
+Status DataTypeObjectSerDe::write_one_cell_to_json(const IColumn& column,
rapidjson::Value& result,
+
rapidjson::Document::AllocatorType& allocator,
+ Arena& mem_pool, int
row_num) const {
+ const auto& var = assert_cast<const ColumnObject&>(column);
+ if (!var.is_finalized()) {
+ var.assume_mutable()->finalize();
+ }
+ result.SetObject();
+ // sort to make output stable, todo add a config
+ auto subcolumns = schema_util::get_sorted_subcolumns(var.get_subcolumns());
+ for (const auto& entry : subcolumns) {
+ const auto& subcolumn = entry->data.get_finalized_column();
+ const auto& subtype_serde = entry->data.get_least_common_type_serde();
+ if (subcolumn.is_null_at(row_num)) {
+ continue;
+ }
+ rapidjson::Value key;
+ key.SetString(entry->path.get_path().data(),
entry->path.get_path().size());
+ rapidjson::Value val;
+ RETURN_IF_ERROR(subtype_serde->write_one_cell_to_json(subcolumn, val,
allocator, mem_pool,
+ row_num));
+ if (val.IsNull() && entry->path.empty()) {
+ // skip null value with empty key, indicate the null json value of
root in variant map,
+ // usally padding in nested arrays
+ continue;
+ }
+ result.AddMember(key, val, allocator);
+ }
+ return Status::OK();
+}
+
} // namespace vectorized
} // namespace doris
diff --git a/be/src/vec/data_types/serde/data_type_object_serde.h
b/be/src/vec/data_types/serde/data_type_object_serde.h
index 9351b200f53..314922f8694 100644
--- a/be/src/vec/data_types/serde/data_type_object_serde.h
+++ b/be/src/vec/data_types/serde/data_type_object_serde.h
@@ -93,6 +93,10 @@ public:
return Status::NotSupported("write_column_to_orc with type " +
column.get_name());
}
+ Status write_one_cell_to_json(const IColumn& column, rapidjson::Value&
result,
+ rapidjson::Document::AllocatorType&
allocator, Arena& mem_pool,
+ int row_num) const override;
+
private:
template <bool is_binary_format>
Status _write_column_to_mysql(const IColumn& column,
MysqlRowBuffer<is_binary_format>& result,
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]