This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 944d9bd4bdcc0cacd96b45d8008d90bb943b2c9a Author: HappenLee <happen...@hotmail.com> AuthorDate: Mon May 20 20:56:20 2024 +0800 [exec](performance) opt the topn nullable column order performance in Heap Sort (#35042) --- be/src/vec/columns/column_nullable.cpp | 47 ++++++++++++++++++++++++++++++++++ be/src/vec/columns/column_nullable.h | 4 +++ 2 files changed, 51 insertions(+) diff --git a/be/src/vec/columns/column_nullable.cpp b/be/src/vec/columns/column_nullable.cpp index e80e9d9b636..fea85917d72 100644 --- a/be/src/vec/columns/column_nullable.cpp +++ b/be/src/vec/columns/column_nullable.cpp @@ -422,6 +422,53 @@ int ColumnNullable::compare_at(size_t n, size_t m, const IColumn& rhs_, return get_nested_column().compare_at(n, m, nullable_rhs.get_nested_column(), null_direction_hint); } +void ColumnNullable::compare_internal(size_t rhs_row_id, const IColumn& rhs, int nan_direction_hint, + int direction, std::vector<uint8>& cmp_res, + uint8* __restrict filter) const { + const auto& rhs_null_column = assert_cast<const ColumnNullable&>(rhs); + const bool right_is_null = rhs.is_null_at(rhs_row_id); + const bool left_contains_null = has_null(); + if (!left_contains_null && !right_is_null) { + get_nested_column().compare_internal(rhs_row_id, rhs_null_column.get_nested_column(), + nan_direction_hint, direction, cmp_res, filter); + } else { + auto sz = this->size(); + DCHECK(cmp_res.size() == sz); + + size_t begin = simd::find_zero(cmp_res, 0); + while (begin < sz) { + size_t end = simd::find_one(cmp_res, begin + 1); + if (right_is_null) { + for (size_t row_id = begin; row_id < end; row_id++) { + if (!is_null_at(row_id)) { + if ((-nan_direction_hint * direction) < 0) { + filter[row_id] = 1; + cmp_res[row_id] = 1; + } else if ((-nan_direction_hint * direction) > 0) { + cmp_res[row_id] = 1; + } + } + } + } else { + for (size_t row_id = begin; row_id < end; row_id++) { + if (is_null_at(row_id)) { + if (nan_direction_hint * direction < 0) { + filter[row_id] = 1; + cmp_res[row_id] = 1; + } else if (nan_direction_hint * direction > 0) { + cmp_res[row_id] = 1; + } + } + } + } + begin = simd::find_zero(cmp_res, end + 1); + } + if (!right_is_null) { + get_nested_column().compare_internal(rhs_row_id, rhs_null_column.get_nested_column(), + nan_direction_hint, direction, cmp_res, filter); + } + } +} void ColumnNullable::get_permutation(bool reverse, size_t limit, int null_direction_hint, Permutation& res) const { diff --git a/be/src/vec/columns/column_nullable.h b/be/src/vec/columns/column_nullable.h index 8842cc67ef2..01e2394f71e 100644 --- a/be/src/vec/columns/column_nullable.h +++ b/be/src/vec/columns/column_nullable.h @@ -212,6 +212,10 @@ public: ColumnPtr permute(const Permutation& perm, size_t limit) const override; // ColumnPtr index(const IColumn & indexes, size_t limit) const override; int compare_at(size_t n, size_t m, const IColumn& rhs_, int null_direction_hint) const override; + + void compare_internal(size_t rhs_row_id, const IColumn& rhs, int nan_direction_hint, + int direction, std::vector<uint8>& cmp_res, + uint8* __restrict filter) const override; void get_permutation(bool reverse, size_t limit, int null_direction_hint, Permutation& res) const override; void reserve(size_t n) override; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org