From 64988cb3d4ea177bc3174b8fc71c28db21d075ea Mon Sep 17 00:00:00 2001 From: Pxl Date: Tue, 27 Sep 2022 15:49:15 +0800 Subject: [PATCH] [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(src); auto origin_size = size(); auto new_size = indices_end - indices_begin; data.resize(origin_size + new_size); + const T* src_data = reinterpret_cast(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::insert_range_from(const IColumn& src, size_t start, size_t template void ColumnVector::insert_indices_from(const IColumn& src, const int* indices_begin, const int* indices_end) { - const Self& src_vec = assert_cast(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) { - // 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(src.get_raw_data().data); + + if constexpr (std::is_same_v) { + // 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]]; } } }