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 <15605149...@163.com>
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: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to