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