Coverage Report

Created: 2025-12-27 17:30

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/root/doris/be/src/vec/runtime/partitioner.h
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
#pragma once
19
20
#include <algorithm>
21
22
#include "vec/exprs/vexpr.h"
23
#include "vec/exprs/vexpr_context.h"
24
25
namespace doris::vectorized {
26
#include "common/compile_check_begin.h"
27
struct ChannelField {
28
    const void* channel_id;
29
    const uint32_t len;
30
31
    template <typename T>
32
27
    const T* get() const {
33
27
        CHECK_EQ(sizeof(T), len) << " sizeof(T): " << sizeof(T) << " len: " << len;
34
27
        return reinterpret_cast<const T*>(channel_id);
35
27
    }
_ZNK5doris10vectorized12ChannelField3getIjEEPKT_v
Line
Count
Source
32
27
    const T* get() const {
33
27
        CHECK_EQ(sizeof(T), len) << " sizeof(T): " << sizeof(T) << " len: " << len;
34
27
        return reinterpret_cast<const T*>(channel_id);
35
27
    }
Unexecuted instantiation: _ZNK5doris10vectorized12ChannelField3getIlEEPKT_v
36
};
37
38
class PartitionerBase {
39
public:
40
20
    PartitionerBase(size_t partition_count) : _partition_count(partition_count) {}
41
20
    virtual ~PartitionerBase() = default;
42
43
    virtual Status init(const std::vector<TExpr>& texprs) = 0;
44
45
    virtual Status prepare(RuntimeState* state, const RowDescriptor& row_desc) = 0;
46
47
    virtual Status open(RuntimeState* state) = 0;
48
49
    virtual Status close(RuntimeState* state) = 0;
50
51
    virtual Status do_partitioning(RuntimeState* state, Block* block, bool eos = false,
52
                                   bool* already_sent = nullptr) const = 0;
53
54
    virtual ChannelField get_channel_ids() const = 0;
55
56
    virtual Status clone(RuntimeState* state, std::unique_ptr<PartitionerBase>& partitioner) = 0;
57
58
0
    size_t partition_count() const { return _partition_count; }
59
60
protected:
61
    const size_t _partition_count;
62
};
63
64
template <typename ChannelIds>
65
class Crc32HashPartitioner : public PartitionerBase {
66
public:
67
19
    Crc32HashPartitioner(int partition_count) : PartitionerBase(partition_count) {}
_ZN5doris10vectorized20Crc32HashPartitionerINS0_17ShuffleChannelIdsEEC2Ei
Line
Count
Source
67
5
    Crc32HashPartitioner(int partition_count) : PartitionerBase(partition_count) {}
_ZN5doris10vectorized20Crc32HashPartitionerINS0_24SpillPartitionChannelIdsEEC2Ei
Line
Count
Source
67
14
    Crc32HashPartitioner(int partition_count) : PartitionerBase(partition_count) {}
Unexecuted instantiation: _ZN5doris10vectorized20Crc32HashPartitionerINS0_15ShiftChannelIdsEEC2Ei
68
19
    ~Crc32HashPartitioner() override = default;
_ZN5doris10vectorized20Crc32HashPartitionerINS0_17ShuffleChannelIdsEED2Ev
Line
Count
Source
68
5
    ~Crc32HashPartitioner() override = default;
_ZN5doris10vectorized20Crc32HashPartitionerINS0_24SpillPartitionChannelIdsEED2Ev
Line
Count
Source
68
14
    ~Crc32HashPartitioner() override = default;
Unexecuted instantiation: _ZN5doris10vectorized20Crc32HashPartitionerINS0_15ShiftChannelIdsEED2Ev
69
70
11
    Status init(const std::vector<TExpr>& texprs) override {
71
11
        return VExpr::create_expr_trees(texprs, _partition_expr_ctxs);
72
11
    }
Unexecuted instantiation: _ZN5doris10vectorized20Crc32HashPartitionerINS0_15ShiftChannelIdsEE4initERKSt6vectorINS_5TExprESaIS5_EE
Unexecuted instantiation: _ZN5doris10vectorized20Crc32HashPartitionerINS0_17ShuffleChannelIdsEE4initERKSt6vectorINS_5TExprESaIS5_EE
_ZN5doris10vectorized20Crc32HashPartitionerINS0_24SpillPartitionChannelIdsEE4initERKSt6vectorINS_5TExprESaIS5_EE
Line
Count
Source
70
11
    Status init(const std::vector<TExpr>& texprs) override {
71
11
        return VExpr::create_expr_trees(texprs, _partition_expr_ctxs);
72
11
    }
73
74
9
    Status prepare(RuntimeState* state, const RowDescriptor& row_desc) override {
75
9
        return VExpr::prepare(_partition_expr_ctxs, state, row_desc);
76
9
    }
Unexecuted instantiation: _ZN5doris10vectorized20Crc32HashPartitionerINS0_15ShiftChannelIdsEE7prepareEPNS_12RuntimeStateERKNS_13RowDescriptorE
Unexecuted instantiation: _ZN5doris10vectorized20Crc32HashPartitionerINS0_17ShuffleChannelIdsEE7prepareEPNS_12RuntimeStateERKNS_13RowDescriptorE
_ZN5doris10vectorized20Crc32HashPartitionerINS0_24SpillPartitionChannelIdsEE7prepareEPNS_12RuntimeStateERKNS_13RowDescriptorE
Line
Count
Source
74
9
    Status prepare(RuntimeState* state, const RowDescriptor& row_desc) override {
75
9
        return VExpr::prepare(_partition_expr_ctxs, state, row_desc);
76
9
    }
77
78
4
    Status open(RuntimeState* state) override { return VExpr::open(_partition_expr_ctxs, state); }
Unexecuted instantiation: _ZN5doris10vectorized20Crc32HashPartitionerINS0_15ShiftChannelIdsEE4openEPNS_12RuntimeStateE
Unexecuted instantiation: _ZN5doris10vectorized20Crc32HashPartitionerINS0_17ShuffleChannelIdsEE4openEPNS_12RuntimeStateE
_ZN5doris10vectorized20Crc32HashPartitionerINS0_24SpillPartitionChannelIdsEE4openEPNS_12RuntimeStateE
Line
Count
Source
78
4
    Status open(RuntimeState* state) override { return VExpr::open(_partition_expr_ctxs, state); }
79
80
0
    Status close(RuntimeState* state) override { return Status::OK(); }
Unexecuted instantiation: _ZN5doris10vectorized20Crc32HashPartitionerINS0_15ShiftChannelIdsEE5closeEPNS_12RuntimeStateE
Unexecuted instantiation: _ZN5doris10vectorized20Crc32HashPartitionerINS0_17ShuffleChannelIdsEE5closeEPNS_12RuntimeStateE
Unexecuted instantiation: _ZN5doris10vectorized20Crc32HashPartitionerINS0_24SpillPartitionChannelIdsEE5closeEPNS_12RuntimeStateE
81
82
    Status do_partitioning(RuntimeState* state, Block* block, bool eos,
83
                           bool* already_sent) const override;
84
85
27
    ChannelField get_channel_ids() const override {
86
27
        return {.channel_id = _hash_vals.data(), .len = sizeof(uint32_t)};
87
27
    }
Unexecuted instantiation: _ZNK5doris10vectorized20Crc32HashPartitionerINS0_15ShiftChannelIdsEE15get_channel_idsEv
_ZNK5doris10vectorized20Crc32HashPartitionerINS0_17ShuffleChannelIdsEE15get_channel_idsEv
Line
Count
Source
85
21
    ChannelField get_channel_ids() const override {
86
21
        return {.channel_id = _hash_vals.data(), .len = sizeof(uint32_t)};
87
21
    }
_ZNK5doris10vectorized20Crc32HashPartitionerINS0_24SpillPartitionChannelIdsEE15get_channel_idsEv
Line
Count
Source
85
6
    ChannelField get_channel_ids() const override {
86
6
        return {.channel_id = _hash_vals.data(), .len = sizeof(uint32_t)};
87
6
    }
88
89
    Status clone(RuntimeState* state, std::unique_ptr<PartitionerBase>& partitioner) override;
90
91
protected:
92
27
    Status _get_partition_column_result(Block* block, std::vector<int>& result) const {
93
27
        int counter = 0;
94
27
        for (auto ctx : _partition_expr_ctxs) {
95
27
            RETURN_IF_ERROR(ctx->execute(block, &result[counter++]));
96
27
        }
97
27
        return Status::OK();
98
27
    }
_ZNK5doris10vectorized20Crc32HashPartitionerINS0_17ShuffleChannelIdsEE28_get_partition_column_resultEPNS0_5BlockERSt6vectorIiSaIiEE
Line
Count
Source
92
21
    Status _get_partition_column_result(Block* block, std::vector<int>& result) const {
93
21
        int counter = 0;
94
21
        for (auto ctx : _partition_expr_ctxs) {
95
21
            RETURN_IF_ERROR(ctx->execute(block, &result[counter++]));
96
21
        }
97
21
        return Status::OK();
98
21
    }
_ZNK5doris10vectorized20Crc32HashPartitionerINS0_24SpillPartitionChannelIdsEE28_get_partition_column_resultEPNS0_5BlockERSt6vectorIiSaIiEE
Line
Count
Source
92
6
    Status _get_partition_column_result(Block* block, std::vector<int>& result) const {
93
6
        int counter = 0;
94
6
        for (auto ctx : _partition_expr_ctxs) {
95
6
            RETURN_IF_ERROR(ctx->execute(block, &result[counter++]));
96
6
        }
97
6
        return Status::OK();
98
6
    }
Unexecuted instantiation: _ZNK5doris10vectorized20Crc32HashPartitionerINS0_15ShiftChannelIdsEE28_get_partition_column_resultEPNS0_5BlockERSt6vectorIiSaIiEE
99
100
3
    Status _clone_expr_ctxs(RuntimeState* state, VExprContextSPtrs& new_partition_expr_ctxs) const {
101
3
        new_partition_expr_ctxs.resize(_partition_expr_ctxs.size());
102
6
        for (size_t i = 0; i < _partition_expr_ctxs.size(); i++) {
103
3
            RETURN_IF_ERROR(_partition_expr_ctxs[i]->clone(state, new_partition_expr_ctxs[i]));
104
3
        }
105
3
        return Status::OK();
106
3
    }
Unexecuted instantiation: _ZNK5doris10vectorized20Crc32HashPartitionerINS0_17ShuffleChannelIdsEE16_clone_expr_ctxsEPNS_12RuntimeStateERSt6vectorISt10shared_ptrINS0_12VExprContextEESaIS9_EE
_ZNK5doris10vectorized20Crc32HashPartitionerINS0_24SpillPartitionChannelIdsEE16_clone_expr_ctxsEPNS_12RuntimeStateERSt6vectorISt10shared_ptrINS0_12VExprContextEESaIS9_EE
Line
Count
Source
100
3
    Status _clone_expr_ctxs(RuntimeState* state, VExprContextSPtrs& new_partition_expr_ctxs) const {
101
3
        new_partition_expr_ctxs.resize(_partition_expr_ctxs.size());
102
6
        for (size_t i = 0; i < _partition_expr_ctxs.size(); i++) {
103
3
            RETURN_IF_ERROR(_partition_expr_ctxs[i]->clone(state, new_partition_expr_ctxs[i]));
104
3
        }
105
3
        return Status::OK();
106
3
    }
Unexecuted instantiation: _ZNK5doris10vectorized20Crc32HashPartitionerINS0_15ShiftChannelIdsEE16_clone_expr_ctxsEPNS_12RuntimeStateERSt6vectorISt10shared_ptrINS0_12VExprContextEESaIS9_EE
107
108
    virtual void _do_hash(const ColumnPtr& column, uint32_t* __restrict result, int idx) const;
109
27
    virtual void _initialize_hash_vals(size_t rows) const {
110
27
        _hash_vals.resize(rows);
111
27
        std::ranges::fill(_hash_vals, 0);
112
27
    }
Unexecuted instantiation: _ZNK5doris10vectorized20Crc32HashPartitionerINS0_15ShiftChannelIdsEE21_initialize_hash_valsEm
_ZNK5doris10vectorized20Crc32HashPartitionerINS0_17ShuffleChannelIdsEE21_initialize_hash_valsEm
Line
Count
Source
109
21
    virtual void _initialize_hash_vals(size_t rows) const {
110
21
        _hash_vals.resize(rows);
111
21
        std::ranges::fill(_hash_vals, 0);
112
21
    }
_ZNK5doris10vectorized20Crc32HashPartitionerINS0_24SpillPartitionChannelIdsEE21_initialize_hash_valsEm
Line
Count
Source
109
6
    virtual void _initialize_hash_vals(size_t rows) const {
110
6
        _hash_vals.resize(rows);
111
6
        std::ranges::fill(_hash_vals, 0);
112
6
    }
113
114
    VExprContextSPtrs _partition_expr_ctxs;
115
    mutable std::vector<uint32_t> _hash_vals;
116
};
117
118
struct ShuffleChannelIds {
119
    template <typename HashValueType>
120
210
    HashValueType operator()(HashValueType l, size_t r) {
121
210
        return l % r;
122
210
    }
123
};
124
125
struct SpillPartitionChannelIds {
126
    template <typename HashValueType>
127
3.14M
    HashValueType operator()(HashValueType l, size_t r) {
128
3.14M
        return ((l >> 16) | (l << 16)) % r;
129
3.14M
    }
130
};
131
132
0
static inline uint32_t crc32c_shuffle_mix(uint32_t h) {
133
    // Step 1: fold high entropy into low bits
134
0
    h ^= h >> 16;
135
    // Step 2: odd multiplicative scramble (cheap avalanche)
136
0
    h *= 0xA5B35705U;
137
    // Step 3: final fold to break remaining linearity
138
0
    h ^= h >> 13;
139
0
    return h;
140
0
}
Unexecuted instantiation: wal_manager_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: multi_cast_data_streamer_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: vdata_stream_recvr_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: local_exchanger_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: agg_operator_group_by_limit_opt_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: agg_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: analytic_sink_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: assert_nums_rows_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: datagen_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: distinct_streaming_aggregation_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: empty_set_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: exchange_sink_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: exchange_source_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: hash_join_test_helper.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: hashjoin_build_sink_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: hashjoin_probe_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: join_test_helper.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: local_merge_sort_source_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: materialization_shared_state_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: partition_sort_sink_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: partitioned_aggregation_sink_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: partitioned_aggregation_source_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: partitioned_aggregation_test_helper.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: partitioned_hash_join_probe_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: partitioned_hash_join_sink_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: partitioned_hash_join_test_helper.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: query_cache_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: repeat_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: scan_normalize_predicate_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: set_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: sort_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: spill_sort_sink_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: spill_sort_source_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: spill_sort_test_helper.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: spillable_operator_test_helper.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: streaming_agg_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: table_function_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: union_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: pipeline_task_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: pipeline_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: memory_reclamation_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: workload_sched_policy_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: runtime_filter_consumer_helper_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: runtime_filter_consumer_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: runtime_filter_merger_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: runtime_filter_mgr_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: runtime_filter_producer_helper_cross_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: runtime_filter_producer_helper_set_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: runtime_filter_producer_helper_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: runtime_filter_producer_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: scanner_context_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: profile_spec_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: exchange_sink_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: parquet_read_lines.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: orc_convert_to_orc_literal_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: orc_read_lines.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: scan_operator_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: vfile_scanner_exception_test.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: exec_env_init.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: fragment_mgr.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: query_context.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: runtime_state.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: workload_group.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: workload_group_manager.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: query_task_controller.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: runtime_filter_producer_helper.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: rowid_fetcher.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: pipeline_task_action.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: vparquet_reader.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: file_scanner.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: olap_scanner.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: scanner.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: scanner_context.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: scanner_scheduler.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: vectorized_fn_call.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: vexpr.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: partitioner.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: vdata_stream_recvr.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: vdata_stream_sender.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: dependency.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: aggregation_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: aggregation_source_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: analytic_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: analytic_source_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: assert_num_rows_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: cache_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: cache_source_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: datagen_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: distinct_streaming_aggregation_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: empty_set_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: exchange_sink_buffer.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: exchange_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: tablet_sink_hash_partitioner.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: exchange_source_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: file_scan_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: hashjoin_build_sink.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: hashjoin_probe_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: full_outer_join_impl.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: inner_join_impl.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: left_anti_join_impl.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: left_outer_join_impl.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: left_semi_join_impl.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: null_aware_left_anti_join_impl.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: null_aware_left_semi_join_impl.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: right_anti_join_impl.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: right_outer_join_impl.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: right_semi_join_impl.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: join_build_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: join_probe_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: local_merge_sort_source_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: materialization_opertor.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: multi_cast_data_streamer.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: nested_loop_join_build_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: nested_loop_join_probe_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: olap_scan_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: parallel_scanner_builder.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: memory_scratch_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: hive_table_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: iceberg_table_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: blackhole_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: multi_cast_data_stream_sink.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: group_commit_block_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: dict_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: group_commit_scan_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: jdbc_scan_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: jdbc_scanner.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: es_scan_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: es_scanner.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: multi_cast_data_stream_source.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: meta_scan_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: vfile_result_writer.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: jdbc_table_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: partition_sort_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: partition_sort_source_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: partitioned_aggregation_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: partitioned_aggregation_source_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: partitioned_hash_join_probe_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: partitioned_hash_join_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: repeat_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: result_file_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: result_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: scan_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: schema_scan_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: set_probe_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: set_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: set_source_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: sort_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: sort_source_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: spill_sort_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: spill_sort_source_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: streaming_aggregation_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: table_function_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: union_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: union_source_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: local_exchange_sink_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: local_exchange_source_operator.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: local_exchanger.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: pipeline.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: pipeline_fragment_context.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: pipeline_task.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: writer.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: task_queue.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
Unexecuted instantiation: task_scheduler.cpp:_ZN5doris10vectorizedL18crc32c_shuffle_mixEj
141
142
// use high 16 bits as channel id to avoid conflict with crc32c hash table
143
// shuffle hash function same with crc32c hash table(eg join hash table) will lead bad performance
144
// hash table offten use low 16 bits as bucket index, so we shift 16 bits to high bits to avoid conflict
145
struct ShiftChannelIds {
146
    template <typename HashValueType>
147
0
    HashValueType operator()(HashValueType l, size_t r) {
148
0
        return crc32c_shuffle_mix(l) % r;
149
0
    }
150
};
151
152
class Crc32CHashPartitioner : public Crc32HashPartitioner<ShiftChannelIds> {
153
public:
154
    Crc32CHashPartitioner(int partition_count)
155
0
            : Crc32HashPartitioner<ShiftChannelIds>(partition_count) {}
156
157
    Status clone(RuntimeState* state, std::unique_ptr<PartitionerBase>& partitioner) override;
158
159
private:
160
    void _do_hash(const ColumnPtr& column, uint32_t* __restrict result, int idx) const override;
161
162
0
    void _initialize_hash_vals(size_t rows) const override {
163
0
        _hash_vals.resize(rows);
164
        // use golden ratio to initialize hash values to avoid collision with hash table's hash function
165
0
        constexpr uint32_t CRC32C_SHUFFLE_SEED = 0x9E3779B9U;
166
0
        std::ranges::fill(_hash_vals, CRC32C_SHUFFLE_SEED);
167
0
    }
168
};
169
170
#include "common/compile_check_end.h"
171
} // namespace doris::vectorized