This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 64988cb3d4 [Enhancement](optimize) optimize for insert_indices_from 
(#12807)
64988cb3d4 is described below

commit 64988cb3d4ea177bc3174b8fc71c28db21d075ea
Author: Pxl <pxl...@qq.com>
AuthorDate: Tue Sep 27 15:49:15 2022 +0800

    [Enhancement](optimize) optimize for insert_indices_from (#12807)
---
 be/src/vec/columns/column_decimal.h  |  5 ++---
 be/src/vec/columns/column_vector.cpp | 22 ++++++++++++----------
 2 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/be/src/vec/columns/column_decimal.h 
b/be/src/vec/columns/column_decimal.h
index bd1d90e63c..124a7e7ba2 100644
--- a/be/src/vec/columns/column_decimal.h
+++ b/be/src/vec/columns/column_decimal.h
@@ -102,14 +102,13 @@ public:
 
     void insert_indices_from(const IColumn& src, const int* indices_begin,
                              const int* indices_end) override {
-        const Self& src_vec = assert_cast<const Self&>(src);
         auto origin_size = size();
         auto new_size = indices_end - indices_begin;
         data.resize(origin_size + new_size);
+        const T* src_data = reinterpret_cast<const 
T*>(src.get_raw_data().data);
 
         for (int i = 0; i < new_size; ++i) {
-            auto offset = *(indices_begin + i);
-            data[origin_size + i] = offset == -1 ? T {} : 
src_vec.get_element(offset);
+            data[origin_size + i] = src_data[indices_begin[i]];
         }
     }
 
diff --git a/be/src/vec/columns/column_vector.cpp 
b/be/src/vec/columns/column_vector.cpp
index 2ca35f6948..5c5ec8835c 100644
--- a/be/src/vec/columns/column_vector.cpp
+++ b/be/src/vec/columns/column_vector.cpp
@@ -349,20 +349,22 @@ void ColumnVector<T>::insert_range_from(const IColumn& 
src, size_t start, size_t
 template <typename T>
 void ColumnVector<T>::insert_indices_from(const IColumn& src, const int* 
indices_begin,
                                           const int* indices_end) {
-    const Self& src_vec = assert_cast<const Self&>(src);
     auto origin_size = size();
     auto new_size = indices_end - indices_begin;
     data.resize(origin_size + new_size);
 
-    for (int i = 0; i < new_size; ++i) {
-        int offset = indices_begin[i];
-        if constexpr (std::is_same_v<T, UInt8>) {
-            // Now Uint8 use to identify null and non null
-            // 1. nullable column : offset == -1 means is null at the here, 
set true here
-            // 2. real data column : offset == -1 what at is meaningless
-            data[origin_size + i] = (offset == -1) ? T {1} : 
src_vec.get_element(offset);
-        } else {
-            data[origin_size + i] = (offset == -1) ? T {0} : 
src_vec.get_element(offset);
+    const T* src_data = reinterpret_cast<const T*>(src.get_raw_data().data);
+
+    if constexpr (std::is_same_v<T, UInt8>) {
+        // nullmap : indices_begin[i] == -1 means is null at the here, set 
true here
+        for (int i = 0; i < new_size; ++i) {
+            data[origin_size + i] = (indices_begin[i] == -1) +
+                                    (indices_begin[i] != -1) * 
src_data[indices_begin[i]];
+        }
+    } else {
+        // real data : indices_begin[i] == -1 what at is meaningless
+        for (int i = 0; i < new_size; ++i) {
+            data[origin_size + i] = src_data[indices_begin[i]];
         }
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to