be/src/exec/common/agg_utils.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 <variant> |
21 | | #include <vector> |
22 | | |
23 | | #include "core/arena.h" |
24 | | #include "exec/common/hash_table/hash_map_context.h" |
25 | | #include "exec/common/hash_table/hash_map_util.h" |
26 | | #include "exec/common/hash_table/ph_hash_map.h" |
27 | | #include "exec/common/hash_table/string_hash_map.h" |
28 | | |
29 | | namespace doris { |
30 | | |
31 | | template <typename T> |
32 | | using AggData = PHHashMap<T, AggregateDataPtr, HashCRC32<T>>; |
33 | | template <typename T> |
34 | | using AggDataNullable = DataWithNullKey<AggData<T>>; |
35 | | |
36 | | using AggregatedDataWithoutKey = AggregateDataPtr; |
37 | | using AggregatedDataWithStringKey = PHHashMap<StringRef, AggregateDataPtr>; |
38 | | using AggregatedDataWithShortStringKey = StringHashMap<AggregateDataPtr>; |
39 | | |
40 | | using AggregatedDataWithUInt32KeyPhase2 = |
41 | | PHHashMap<UInt32, AggregateDataPtr, HashMixWrapper<UInt32>>; |
42 | | using AggregatedDataWithUInt64KeyPhase2 = |
43 | | PHHashMap<UInt64, AggregateDataPtr, HashMixWrapper<UInt64>>; |
44 | | |
45 | | using AggregatedDataWithNullableUInt32KeyPhase2 = |
46 | | DataWithNullKey<AggregatedDataWithUInt32KeyPhase2>; |
47 | | using AggregatedDataWithNullableUInt64KeyPhase2 = |
48 | | DataWithNullKey<AggregatedDataWithUInt64KeyPhase2>; |
49 | | using AggregatedDataWithNullableShortStringKey = DataWithNullKey<AggregatedDataWithShortStringKey>; |
50 | | using AggregatedDataWithNullableStringKey = DataWithNullKey<AggregatedDataWithStringKey>; |
51 | | |
52 | | /// Parameterized method variant for aggregation hash tables. |
53 | | /// StringData / NullableStringData control which hash map is used for string keys: |
54 | | /// - AggregatedDataVariants uses StringHashMap (AggregatedDataWithShortStringKey) |
55 | | /// - BucketedAggDataVariants uses PHHashMap<StringRef> (AggregatedDataWithStringKey) |
56 | | /// to avoid StringHashMap's sub-table complexity and unify the emplace interface. |
57 | | template <typename StringData, typename NullableStringData> |
58 | | using AggMethodVariantsBase = std::variant< |
59 | | std::monostate, MethodSerialized<AggregatedDataWithStringKey>, |
60 | | MethodOneNumber<UInt8, AggData<UInt8>>, MethodOneNumber<UInt16, AggData<UInt16>>, |
61 | | MethodOneNumber<UInt32, AggData<UInt32>>, MethodOneNumber<UInt64, AggData<UInt64>>, |
62 | | MethodStringNoCache<StringData>, MethodOneNumber<UInt128, AggData<UInt128>>, |
63 | | MethodOneNumber<UInt256, AggData<UInt256>>, |
64 | | MethodOneNumber<UInt32, AggregatedDataWithUInt32KeyPhase2>, |
65 | | MethodOneNumber<UInt64, AggregatedDataWithUInt64KeyPhase2>, |
66 | | MethodSingleNullableColumn<MethodOneNumber<UInt8, AggDataNullable<UInt8>>>, |
67 | | MethodSingleNullableColumn<MethodOneNumber<UInt16, AggDataNullable<UInt16>>>, |
68 | | MethodSingleNullableColumn<MethodOneNumber<UInt32, AggDataNullable<UInt32>>>, |
69 | | MethodSingleNullableColumn<MethodOneNumber<UInt64, AggDataNullable<UInt64>>>, |
70 | | MethodSingleNullableColumn< |
71 | | MethodOneNumber<UInt32, AggregatedDataWithNullableUInt32KeyPhase2>>, |
72 | | MethodSingleNullableColumn< |
73 | | MethodOneNumber<UInt64, AggregatedDataWithNullableUInt64KeyPhase2>>, |
74 | | MethodSingleNullableColumn<MethodOneNumber<UInt128, AggDataNullable<UInt128>>>, |
75 | | MethodSingleNullableColumn<MethodOneNumber<UInt256, AggDataNullable<UInt256>>>, |
76 | | MethodSingleNullableColumn<MethodStringNoCache<NullableStringData>>, |
77 | | MethodKeysFixed<AggData<UInt64>>, MethodKeysFixed<AggData<UInt72>>, |
78 | | MethodKeysFixed<AggData<UInt96>>, MethodKeysFixed<AggData<UInt104>>, |
79 | | MethodKeysFixed<AggData<UInt128>>, MethodKeysFixed<AggData<UInt136>>, |
80 | | MethodKeysFixed<AggData<UInt256>>>; |
81 | | |
82 | | using AggregatedMethodVariants = AggMethodVariantsBase<AggregatedDataWithShortStringKey, |
83 | | AggregatedDataWithNullableShortStringKey>; |
84 | | |
85 | | /// Bucketed agg uses PHHashMap<StringRef> for string keys instead of StringHashMap. |
86 | | /// This avoids StringHashMap's sub-table complexity and unifies the emplace interface |
87 | | /// (3-arg PHHashMap::emplace), while still using HashMethodString for correct |
88 | | /// single-column string key extraction. |
89 | | using BucketedAggMethodVariants = |
90 | | AggMethodVariantsBase<AggregatedDataWithStringKey, AggregatedDataWithNullableStringKey>; |
91 | | |
92 | | /// Intermediate base that adds the shared init logic for aggregation data |
93 | | /// variants. Only the string_key case differs between AggregatedDataVariants |
94 | | /// and BucketedAggDataVariants; all other key types are identical. The |
95 | | /// StringData/NullableStringData template parameters control which hash map |
96 | | /// type is emplaced for string_key. |
97 | | template <typename MethodVariants, typename StringData, typename NullableStringData> |
98 | | struct AggDataVariantsBase : public DataVariants<MethodVariants, MethodSingleNullableColumn, |
99 | | MethodOneNumber, DataWithNullKey> { |
100 | 143k | void init_agg_data(const std::vector<DataTypePtr>& data_types, HashKeyType type) { |
101 | 143k | bool nullable = data_types.size() == 1 && data_types[0]->is_nullable(); |
102 | | |
103 | 143k | switch (type) { |
104 | 1 | case HashKeyType::without_key: |
105 | 1 | break; |
106 | 19.7k | case HashKeyType::serialized: |
107 | 19.7k | this->method_variant.template emplace<MethodSerialized<AggregatedDataWithStringKey>>(); |
108 | 19.7k | break; |
109 | 5.41k | case HashKeyType::int8_key: |
110 | 5.41k | this->template emplace_single<UInt8, AggData<UInt8>>(nullable); |
111 | 5.41k | break; |
112 | 4.58k | case HashKeyType::int16_key: |
113 | 4.58k | this->template emplace_single<UInt16, AggData<UInt16>>(nullable); |
114 | 4.58k | break; |
115 | 7.92k | case HashKeyType::int32_key: |
116 | 7.92k | this->template emplace_single<UInt32, AggData<UInt32>>(nullable); |
117 | 7.92k | break; |
118 | 12.2k | case HashKeyType::int32_key_phase2: |
119 | 12.2k | this->template emplace_single<UInt32, AggregatedDataWithUInt32KeyPhase2>(nullable); |
120 | 12.2k | break; |
121 | 24.2k | case HashKeyType::int64_key: |
122 | 24.2k | this->template emplace_single<UInt64, AggData<UInt64>>(nullable); |
123 | 24.2k | break; |
124 | 4.04k | case HashKeyType::int64_key_phase2: |
125 | 4.04k | this->template emplace_single<UInt64, AggregatedDataWithUInt64KeyPhase2>(nullable); |
126 | 4.04k | break; |
127 | 542 | case HashKeyType::int128_key: |
128 | 542 | this->template emplace_single<UInt128, AggData<UInt128>>(nullable); |
129 | 542 | break; |
130 | 3 | case HashKeyType::int256_key: |
131 | 3 | this->template emplace_single<UInt256, AggData<UInt256>>(nullable); |
132 | 3 | break; |
133 | 29.0k | case HashKeyType::string_key: |
134 | 29.0k | if (nullable) { |
135 | 4.03k | this->method_variant.template emplace< |
136 | 4.03k | MethodSingleNullableColumn<MethodStringNoCache<NullableStringData>>>(); |
137 | 25.0k | } else { |
138 | 25.0k | this->method_variant.template emplace<MethodStringNoCache<StringData>>(); |
139 | 25.0k | } |
140 | 29.0k | break; |
141 | 1.23k | case HashKeyType::fixed64: |
142 | 1.23k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt64>>>( |
143 | 1.23k | get_key_sizes(data_types)); |
144 | 1.23k | break; |
145 | 1.11k | case HashKeyType::fixed72: |
146 | 1.11k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt72>>>( |
147 | 1.11k | get_key_sizes(data_types)); |
148 | 1.11k | break; |
149 | 957 | case HashKeyType::fixed96: |
150 | 957 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt96>>>( |
151 | 957 | get_key_sizes(data_types)); |
152 | 957 | break; |
153 | 1.08k | case HashKeyType::fixed104: |
154 | 1.08k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt104>>>( |
155 | 1.08k | get_key_sizes(data_types)); |
156 | 1.08k | break; |
157 | 120 | case HashKeyType::fixed128: |
158 | 120 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt128>>>( |
159 | 120 | get_key_sizes(data_types)); |
160 | 120 | break; |
161 | 23.0k | case HashKeyType::fixed136: |
162 | 23.0k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt136>>>( |
163 | 23.0k | get_key_sizes(data_types)); |
164 | 23.0k | break; |
165 | 4.03k | case HashKeyType::fixed256: |
166 | 4.03k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt256>>>( |
167 | 4.03k | get_key_sizes(data_types)); |
168 | 4.03k | break; |
169 | 1 | default: |
170 | 1 | throw Exception(ErrorCode::INTERNAL_ERROR, "meet invalid agg key type, type={}", type); |
171 | 143k | } |
172 | 143k | } _ZN5doris19AggDataVariantsBaseISt7variantIJSt9monostateNS_16MethodSerializedI9PHHashMapINS_9StringRefEPc11DefaultHashIS5_vEEEENS_15MethodOneNumberIhS4_IhS6_9HashCRC32IhEEEENSB_ItS4_ItS6_SC_ItEEEENSB_IjS4_IjS6_SC_IjEEEENSB_ImS4_ImS6_SC_ImEEEENS_19MethodStringNoCacheINS_13StringHashMapIS6_NS_9AllocatorILb1ELb1ELb0ENS_22DefaultMemoryAllocatorELb1EEEEEEENSB_IN4wide7integerILm128EjEES4_ISY_S6_SC_ISY_EEEENSB_INSX_ILm256EjEES4_IS12_S6_SC_IS12_EEEENSB_IjS4_IjS6_14HashMixWrapperIjSJ_EEEENSB_ImS4_ImS6_S16_ImSM_EEEENS_26MethodSingleNullableColumnINSB_IhNS_15DataWithNullKeyISE_EEEEEENS1D_INSB_ItNS1E_ISH_EEEEEENS1D_INSB_IjNS1E_ISK_EEEEEENS1D_INSB_ImNS1E_ISN_EEEEEENS1D_INSB_IjNS1E_IS18_EEEEEENS1D_INSB_ImNS1E_IS1B_EEEEEENS1D_INSB_ISY_NS1E_IS10_EEEEEENS1D_INSB_IS12_NS1E_IS14_EEEEEENS1D_INSP_INS1E_ISU_EEEEEENS_15MethodKeysFixedISN_EENS26_IS4_INS_6UInt72ES6_SC_IS28_EEEENS26_IS4_INS_6UInt96ES6_SC_IS2C_EEEENS26_IS4_INS_7UInt104ES6_SC_IS2G_EEEENS26_IS10_EENS26_IS4_INS_7UInt136ES6_SC_IS2L_EEEENS26_IS14_EEEESU_S23_E13init_agg_dataERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS2W_EENS_11HashKeyTypeE Line | Count | Source | 100 | 51.3k | void init_agg_data(const std::vector<DataTypePtr>& data_types, HashKeyType type) { | 101 | 51.3k | bool nullable = data_types.size() == 1 && data_types[0]->is_nullable(); | 102 | | | 103 | 51.3k | switch (type) { | 104 | 1 | case HashKeyType::without_key: | 105 | 1 | break; | 106 | 10.8k | case HashKeyType::serialized: | 107 | 10.8k | this->method_variant.template emplace<MethodSerialized<AggregatedDataWithStringKey>>(); | 108 | 10.8k | break; | 109 | 5.41k | case HashKeyType::int8_key: | 110 | 5.41k | this->template emplace_single<UInt8, AggData<UInt8>>(nullable); | 111 | 5.41k | break; | 112 | 600 | case HashKeyType::int16_key: | 113 | 600 | this->template emplace_single<UInt16, AggData<UInt16>>(nullable); | 114 | 600 | break; | 115 | 2.59k | case HashKeyType::int32_key: | 116 | 2.59k | this->template emplace_single<UInt32, AggData<UInt32>>(nullable); | 117 | 2.59k | break; | 118 | 12.2k | case HashKeyType::int32_key_phase2: | 119 | 12.2k | this->template emplace_single<UInt32, AggregatedDataWithUInt32KeyPhase2>(nullable); | 120 | 12.2k | break; | 121 | 1.12k | case HashKeyType::int64_key: | 122 | 1.12k | this->template emplace_single<UInt64, AggData<UInt64>>(nullable); | 123 | 1.12k | break; | 124 | 4.04k | case HashKeyType::int64_key_phase2: | 125 | 4.04k | this->template emplace_single<UInt64, AggregatedDataWithUInt64KeyPhase2>(nullable); | 126 | 4.04k | break; | 127 | 542 | case HashKeyType::int128_key: | 128 | 542 | this->template emplace_single<UInt128, AggData<UInt128>>(nullable); | 129 | 542 | break; | 130 | 3 | case HashKeyType::int256_key: | 131 | 3 | this->template emplace_single<UInt256, AggData<UInt256>>(nullable); | 132 | 3 | break; | 133 | 4.00k | case HashKeyType::string_key: | 134 | 4.00k | if (nullable) { | 135 | 3.26k | this->method_variant.template emplace< | 136 | 3.26k | MethodSingleNullableColumn<MethodStringNoCache<NullableStringData>>>(); | 137 | 3.26k | } else { | 138 | 741 | this->method_variant.template emplace<MethodStringNoCache<StringData>>(); | 139 | 741 | } | 140 | 4.00k | break; | 141 | 1.23k | case HashKeyType::fixed64: | 142 | 1.23k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt64>>>( | 143 | 1.23k | get_key_sizes(data_types)); | 144 | 1.23k | break; | 145 | 1.11k | case HashKeyType::fixed72: | 146 | 1.11k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt72>>>( | 147 | 1.11k | get_key_sizes(data_types)); | 148 | 1.11k | break; | 149 | 957 | case HashKeyType::fixed96: | 150 | 957 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt96>>>( | 151 | 957 | get_key_sizes(data_types)); | 152 | 957 | break; | 153 | 1.08k | case HashKeyType::fixed104: | 154 | 1.08k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt104>>>( | 155 | 1.08k | get_key_sizes(data_types)); | 156 | 1.08k | break; | 157 | 120 | case HashKeyType::fixed128: | 158 | 120 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt128>>>( | 159 | 120 | get_key_sizes(data_types)); | 160 | 120 | break; | 161 | 2.31k | case HashKeyType::fixed136: | 162 | 2.31k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt136>>>( | 163 | 2.31k | get_key_sizes(data_types)); | 164 | 2.31k | break; | 165 | 3.09k | case HashKeyType::fixed256: | 166 | 3.09k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt256>>>( | 167 | 3.09k | get_key_sizes(data_types)); | 168 | 3.09k | break; | 169 | 1 | default: | 170 | 1 | throw Exception(ErrorCode::INTERNAL_ERROR, "meet invalid agg key type, type={}", type); | 171 | 51.3k | } | 172 | 51.3k | } |
_ZN5doris19AggDataVariantsBaseISt7variantIJSt9monostateNS_16MethodSerializedI9PHHashMapINS_9StringRefEPc11DefaultHashIS5_vEEEENS_15MethodOneNumberIhS4_IhS6_9HashCRC32IhEEEENSB_ItS4_ItS6_SC_ItEEEENSB_IjS4_IjS6_SC_IjEEEENSB_ImS4_ImS6_SC_ImEEEENS_19MethodStringNoCacheIS9_EENSB_IN4wide7integerILm128EjEES4_IST_S6_SC_IST_EEEENSB_INSS_ILm256EjEES4_ISX_S6_SC_ISX_EEEENSB_IjS4_IjS6_14HashMixWrapperIjSJ_EEEENSB_ImS4_ImS6_S11_ImSM_EEEENS_26MethodSingleNullableColumnINSB_IhNS_15DataWithNullKeyISE_EEEEEENS18_INSB_ItNS19_ISH_EEEEEENS18_INSB_IjNS19_ISK_EEEEEENS18_INSB_ImNS19_ISN_EEEEEENS18_INSB_IjNS19_IS13_EEEEEENS18_INSB_ImNS19_IS16_EEEEEENS18_INSB_IST_NS19_ISV_EEEEEENS18_INSB_ISX_NS19_ISZ_EEEEEENS18_INSP_INS19_IS9_EEEEEENS_15MethodKeysFixedISN_EENS21_IS4_INS_6UInt72ES6_SC_IS23_EEEENS21_IS4_INS_6UInt96ES6_SC_IS27_EEEENS21_IS4_INS_7UInt104ES6_SC_IS2B_EEEENS21_ISV_EENS21_IS4_INS_7UInt136ES6_SC_IS2G_EEEENS21_ISZ_EEEES9_S1Y_E13init_agg_dataERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS2R_EENS_11HashKeyTypeE Line | Count | Source | 100 | 92.3k | void init_agg_data(const std::vector<DataTypePtr>& data_types, HashKeyType type) { | 101 | 92.3k | bool nullable = data_types.size() == 1 && data_types[0]->is_nullable(); | 102 | | | 103 | 92.3k | switch (type) { | 104 | 0 | case HashKeyType::without_key: | 105 | 0 | break; | 106 | 8.95k | case HashKeyType::serialized: | 107 | 8.95k | this->method_variant.template emplace<MethodSerialized<AggregatedDataWithStringKey>>(); | 108 | 8.95k | break; | 109 | 0 | case HashKeyType::int8_key: | 110 | 0 | this->template emplace_single<UInt8, AggData<UInt8>>(nullable); | 111 | 0 | break; | 112 | 3.98k | case HashKeyType::int16_key: | 113 | 3.98k | this->template emplace_single<UInt16, AggData<UInt16>>(nullable); | 114 | 3.98k | break; | 115 | 5.32k | case HashKeyType::int32_key: | 116 | 5.32k | this->template emplace_single<UInt32, AggData<UInt32>>(nullable); | 117 | 5.32k | break; | 118 | 0 | case HashKeyType::int32_key_phase2: | 119 | 0 | this->template emplace_single<UInt32, AggregatedDataWithUInt32KeyPhase2>(nullable); | 120 | 0 | break; | 121 | 23.1k | case HashKeyType::int64_key: | 122 | 23.1k | this->template emplace_single<UInt64, AggData<UInt64>>(nullable); | 123 | 23.1k | break; | 124 | 0 | case HashKeyType::int64_key_phase2: | 125 | 0 | this->template emplace_single<UInt64, AggregatedDataWithUInt64KeyPhase2>(nullable); | 126 | 0 | break; | 127 | 0 | case HashKeyType::int128_key: | 128 | 0 | this->template emplace_single<UInt128, AggData<UInt128>>(nullable); | 129 | 0 | break; | 130 | 0 | case HashKeyType::int256_key: | 131 | 0 | this->template emplace_single<UInt256, AggData<UInt256>>(nullable); | 132 | 0 | break; | 133 | 25.0k | case HashKeyType::string_key: | 134 | 25.0k | if (nullable) { | 135 | 768 | this->method_variant.template emplace< | 136 | 768 | MethodSingleNullableColumn<MethodStringNoCache<NullableStringData>>>(); | 137 | 24.2k | } else { | 138 | 24.2k | this->method_variant.template emplace<MethodStringNoCache<StringData>>(); | 139 | 24.2k | } | 140 | 25.0k | break; | 141 | 0 | case HashKeyType::fixed64: | 142 | 0 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt64>>>( | 143 | 0 | get_key_sizes(data_types)); | 144 | 0 | break; | 145 | 0 | case HashKeyType::fixed72: | 146 | 0 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt72>>>( | 147 | 0 | get_key_sizes(data_types)); | 148 | 0 | break; | 149 | 0 | case HashKeyType::fixed96: | 150 | 0 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt96>>>( | 151 | 0 | get_key_sizes(data_types)); | 152 | 0 | break; | 153 | 0 | case HashKeyType::fixed104: | 154 | 0 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt104>>>( | 155 | 0 | get_key_sizes(data_types)); | 156 | 0 | break; | 157 | 0 | case HashKeyType::fixed128: | 158 | 0 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt128>>>( | 159 | 0 | get_key_sizes(data_types)); | 160 | 0 | break; | 161 | 20.7k | case HashKeyType::fixed136: | 162 | 20.7k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt136>>>( | 163 | 20.7k | get_key_sizes(data_types)); | 164 | 20.7k | break; | 165 | 938 | case HashKeyType::fixed256: | 166 | 938 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt256>>>( | 167 | 938 | get_key_sizes(data_types)); | 168 | 938 | break; | 169 | 0 | default: | 170 | 0 | throw Exception(ErrorCode::INTERNAL_ERROR, "meet invalid agg key type, type={}", type); | 171 | 92.3k | } | 172 | 92.3k | } |
|
173 | | }; |
174 | | |
175 | | struct AggregatedDataVariants |
176 | | : public AggDataVariantsBase<AggregatedMethodVariants, AggregatedDataWithShortStringKey, |
177 | | AggregatedDataWithNullableShortStringKey> { |
178 | | AggregatedDataWithoutKey without_key = nullptr; |
179 | | |
180 | | bool is_fixed_key = true; |
181 | | |
182 | 51.3k | void init(const std::vector<DataTypePtr>& data_types, HashKeyType type) { |
183 | 51.3k | is_fixed_key = !(type == HashKeyType::without_key || type == HashKeyType::EMPTY || |
184 | 51.3k | type == HashKeyType::serialized || type == HashKeyType::string_key); |
185 | 51.3k | this->init_agg_data(data_types, type); |
186 | 51.3k | } |
187 | | }; |
188 | | |
189 | | using AggregatedDataVariantsUPtr = std::unique_ptr<AggregatedDataVariants>; |
190 | | using ArenaUPtr = std::unique_ptr<Arena>; |
191 | | |
192 | | /// Data variants for bucketed hash aggregation. |
193 | | /// Uses BucketedAggMethodVariants (PHHashMap for string keys). |
194 | | struct BucketedAggDataVariants |
195 | | : public AggDataVariantsBase<BucketedAggMethodVariants, AggregatedDataWithStringKey, |
196 | | AggregatedDataWithNullableStringKey> { |
197 | 91.3k | void init(const std::vector<DataTypePtr>& data_types, HashKeyType type) { |
198 | 91.3k | this->init_agg_data(data_types, type); |
199 | 91.3k | } |
200 | | }; |
201 | | |
202 | | using BucketedAggDataVariantsUPtr = std::unique_ptr<BucketedAggDataVariants>; |
203 | | |
204 | | struct AggregateDataContainer { |
205 | | public: |
206 | | AggregateDataContainer(size_t size_of_key, size_t size_of_aggregate_states) |
207 | 50.4k | : _size_of_key(size_of_key), _size_of_aggregate_states(size_of_aggregate_states) {} |
208 | | |
209 | 32.8k | int64_t memory_usage() const { return _arena_pool.size(); } |
210 | | |
211 | | template <typename KeyType> |
212 | 1.20M | AggregateDataPtr append_data(const KeyType& key) { |
213 | 1.20M | DCHECK_EQ(sizeof(KeyType), _size_of_key); |
214 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero |
215 | 1.20M | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { |
216 | 17.1k | _expand(); |
217 | 17.1k | } |
218 | | |
219 | 1.20M | *reinterpret_cast<KeyType*>(_current_keys) = key; |
220 | 1.20M | auto* aggregate_data = _current_agg_data; |
221 | 1.20M | ++_total_count; |
222 | 1.20M | ++_index_in_sub_container; |
223 | 1.20M | _current_agg_data += _size_of_aggregate_states; |
224 | 1.20M | _current_keys += _size_of_key; |
225 | 1.20M | return aggregate_data; |
226 | 1.20M | } _ZN5doris22AggregateDataContainer11append_dataINS_9StringRefEEEPcRKT_ Line | Count | Source | 212 | 80.0k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 80.0k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 214 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 215 | 80.0k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 3.74k | _expand(); | 217 | 3.74k | } | 218 | | | 219 | 80.0k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 80.0k | auto* aggregate_data = _current_agg_data; | 221 | 80.0k | ++_total_count; | 222 | 80.0k | ++_index_in_sub_container; | 223 | 80.0k | _current_agg_data += _size_of_aggregate_states; | 224 | 80.0k | _current_keys += _size_of_key; | 225 | 80.0k | return aggregate_data; | 226 | 80.0k | } |
_ZN5doris22AggregateDataContainer11append_dataIhEEPcRKT_ Line | Count | Source | 212 | 3.88k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 3.88k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 214 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 215 | 3.88k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 2.31k | _expand(); | 217 | 2.31k | } | 218 | | | 219 | 3.88k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 3.88k | auto* aggregate_data = _current_agg_data; | 221 | 3.88k | ++_total_count; | 222 | 3.88k | ++_index_in_sub_container; | 223 | 3.88k | _current_agg_data += _size_of_aggregate_states; | 224 | 3.88k | _current_keys += _size_of_key; | 225 | 3.88k | return aggregate_data; | 226 | 3.88k | } |
_ZN5doris22AggregateDataContainer11append_dataItEEPcRKT_ Line | Count | Source | 212 | 394 | AggregateDataPtr append_data(const KeyType& key) { | 213 | 394 | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 214 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 215 | 394 | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 204 | _expand(); | 217 | 204 | } | 218 | | | 219 | 394 | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 394 | auto* aggregate_data = _current_agg_data; | 221 | 394 | ++_total_count; | 222 | 394 | ++_index_in_sub_container; | 223 | 394 | _current_agg_data += _size_of_aggregate_states; | 224 | 394 | _current_keys += _size_of_key; | 225 | 394 | return aggregate_data; | 226 | 394 | } |
_ZN5doris22AggregateDataContainer11append_dataIjEEPcRKT_ Line | Count | Source | 212 | 792k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 792k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 214 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 215 | 792k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 6.36k | _expand(); | 217 | 6.36k | } | 218 | | | 219 | 792k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 792k | auto* aggregate_data = _current_agg_data; | 221 | 792k | ++_total_count; | 222 | 792k | ++_index_in_sub_container; | 223 | 792k | _current_agg_data += _size_of_aggregate_states; | 224 | 792k | _current_keys += _size_of_key; | 225 | 792k | return aggregate_data; | 226 | 792k | } |
_ZN5doris22AggregateDataContainer11append_dataImEEPcRKT_ Line | Count | Source | 212 | 308k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 308k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 214 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 215 | 308k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 1.33k | _expand(); | 217 | 1.33k | } | 218 | | | 219 | 308k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 308k | auto* aggregate_data = _current_agg_data; | 221 | 308k | ++_total_count; | 222 | 308k | ++_index_in_sub_container; | 223 | 308k | _current_agg_data += _size_of_aggregate_states; | 224 | 308k | _current_keys += _size_of_key; | 225 | 308k | return aggregate_data; | 226 | 308k | } |
_ZN5doris22AggregateDataContainer11append_dataIN4wide7integerILm128EjEEEEPcRKT_ Line | Count | Source | 212 | 1.58k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 1.58k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 214 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 215 | 1.58k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 206 | _expand(); | 217 | 206 | } | 218 | | | 219 | 1.58k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 1.58k | auto* aggregate_data = _current_agg_data; | 221 | 1.58k | ++_total_count; | 222 | 1.58k | ++_index_in_sub_container; | 223 | 1.58k | _current_agg_data += _size_of_aggregate_states; | 224 | 1.58k | _current_keys += _size_of_key; | 225 | 1.58k | return aggregate_data; | 226 | 1.58k | } |
_ZN5doris22AggregateDataContainer11append_dataIN4wide7integerILm256EjEEEEPcRKT_ Line | Count | Source | 212 | 6.91k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 6.91k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 214 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 215 | 6.91k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 667 | _expand(); | 217 | 667 | } | 218 | | | 219 | 6.91k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 6.91k | auto* aggregate_data = _current_agg_data; | 221 | 6.91k | ++_total_count; | 222 | 6.91k | ++_index_in_sub_container; | 223 | 6.91k | _current_agg_data += _size_of_aggregate_states; | 224 | 6.91k | _current_keys += _size_of_key; | 225 | 6.91k | return aggregate_data; | 226 | 6.91k | } |
_ZN5doris22AggregateDataContainer11append_dataINS_6UInt72EEEPcRKT_ Line | Count | Source | 212 | 1.00k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 1.00k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 214 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 215 | 1.00k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 449 | _expand(); | 217 | 449 | } | 218 | | | 219 | 1.00k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 1.00k | auto* aggregate_data = _current_agg_data; | 221 | 1.00k | ++_total_count; | 222 | 1.00k | ++_index_in_sub_container; | 223 | 1.00k | _current_agg_data += _size_of_aggregate_states; | 224 | 1.00k | _current_keys += _size_of_key; | 225 | 1.00k | return aggregate_data; | 226 | 1.00k | } |
_ZN5doris22AggregateDataContainer11append_dataINS_6UInt96EEEPcRKT_ Line | Count | Source | 212 | 7.63k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 7.63k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 214 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 215 | 7.63k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 562 | _expand(); | 217 | 562 | } | 218 | | | 219 | 7.63k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 7.63k | auto* aggregate_data = _current_agg_data; | 221 | 7.63k | ++_total_count; | 222 | 7.63k | ++_index_in_sub_container; | 223 | 7.63k | _current_agg_data += _size_of_aggregate_states; | 224 | 7.63k | _current_keys += _size_of_key; | 225 | 7.63k | return aggregate_data; | 226 | 7.63k | } |
_ZN5doris22AggregateDataContainer11append_dataINS_7UInt104EEEPcRKT_ Line | Count | Source | 212 | 675 | AggregateDataPtr append_data(const KeyType& key) { | 213 | 675 | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 214 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 215 | 675 | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 337 | _expand(); | 217 | 337 | } | 218 | | | 219 | 675 | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 675 | auto* aggregate_data = _current_agg_data; | 221 | 675 | ++_total_count; | 222 | 675 | ++_index_in_sub_container; | 223 | 675 | _current_agg_data += _size_of_aggregate_states; | 224 | 675 | _current_keys += _size_of_key; | 225 | 675 | return aggregate_data; | 226 | 675 | } |
_ZN5doris22AggregateDataContainer11append_dataINS_7UInt136EEEPcRKT_ Line | Count | Source | 212 | 1.87k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 1.87k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 214 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 215 | 1.87k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 961 | _expand(); | 217 | 961 | } | 218 | | | 219 | 1.87k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 1.87k | auto* aggregate_data = _current_agg_data; | 221 | 1.87k | ++_total_count; | 222 | 1.87k | ++_index_in_sub_container; | 223 | 1.87k | _current_agg_data += _size_of_aggregate_states; | 224 | 1.87k | _current_keys += _size_of_key; | 225 | 1.87k | return aggregate_data; | 226 | 1.87k | } |
|
227 | | |
228 | | template <typename Derived, bool IsConst> |
229 | | class IteratorBase { |
230 | | using Container = |
231 | | std::conditional_t<IsConst, const AggregateDataContainer, AggregateDataContainer>; |
232 | | |
233 | | Container* container = nullptr; |
234 | | uint32_t index; |
235 | | uint32_t sub_container_index; |
236 | | uint32_t index_in_sub_container; |
237 | | |
238 | | friend class HashTable; |
239 | | |
240 | | public: |
241 | 50.4k | IteratorBase() = default; |
242 | | IteratorBase(Container* container_, uint32_t index_) |
243 | 2.65M | : container(container_), index(index_) { |
244 | 2.65M | sub_container_index = index / SUB_CONTAINER_CAPACITY; |
245 | 2.65M | index_in_sub_container = index - sub_container_index * SUB_CONTAINER_CAPACITY; |
246 | 2.65M | } |
247 | | |
248 | 44.7k | bool operator==(const IteratorBase& rhs) const { return index == rhs.index; } |
249 | 2.56M | bool operator!=(const IteratorBase& rhs) const { return index != rhs.index; } |
250 | | |
251 | 2.52M | Derived& operator++() { |
252 | 2.52M | index++; |
253 | 2.52M | index_in_sub_container++; |
254 | 2.52M | if (index_in_sub_container == SUB_CONTAINER_CAPACITY) { |
255 | 254 | index_in_sub_container = 0; |
256 | 254 | sub_container_index++; |
257 | 254 | } |
258 | 2.52M | return static_cast<Derived&>(*this); |
259 | 2.52M | } |
260 | | |
261 | | template <typename KeyType> |
262 | 1.43M | KeyType get_key() { |
263 | 1.43M | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); |
264 | 1.43M | return ((KeyType*)(container->_key_containers[sub_container_index])) |
265 | 1.43M | [index_in_sub_container]; |
266 | 1.43M | } _ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_9StringRefEEET_v Line | Count | Source | 262 | 97.9k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 97.9k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 97.9k | [index_in_sub_container]; | 266 | 97.9k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyIhEET_v Line | Count | Source | 262 | 3.90k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 3.90k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 3.90k | [index_in_sub_container]; | 266 | 3.90k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyItEET_v Line | Count | Source | 262 | 394 | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 394 | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 394 | [index_in_sub_container]; | 266 | 394 | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyIjEET_v Line | Count | Source | 262 | 945k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 945k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 945k | [index_in_sub_container]; | 266 | 945k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyImEET_v Line | Count | Source | 262 | 361k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 361k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 361k | [index_in_sub_container]; | 266 | 361k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyIN4wide7integerILm128EjEEEET_v Line | Count | Source | 262 | 1.60k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 1.60k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 1.60k | [index_in_sub_container]; | 266 | 1.60k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyIN4wide7integerILm256EjEEEET_v Line | Count | Source | 262 | 11.5k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 11.5k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 11.5k | [index_in_sub_container]; | 266 | 11.5k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_6UInt72EEET_v Line | Count | Source | 262 | 1.00k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 1.00k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 1.00k | [index_in_sub_container]; | 266 | 1.00k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_6UInt96EEET_v Line | Count | Source | 262 | 7.58k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 7.58k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 7.58k | [index_in_sub_container]; | 266 | 7.58k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_7UInt104EEET_v Line | Count | Source | 262 | 674 | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 674 | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 674 | [index_in_sub_container]; | 266 | 674 | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_7UInt136EEET_v Line | Count | Source | 262 | 1.87k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 1.87k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 1.87k | [index_in_sub_container]; | 266 | 1.87k | } |
|
267 | | |
268 | 2.48M | AggregateDataPtr get_aggregate_data() { |
269 | 2.48M | return &(container->_value_containers[sub_container_index] |
270 | 2.48M | [container->_size_of_aggregate_states * |
271 | 2.48M | index_in_sub_container]); |
272 | 2.48M | } |
273 | | }; |
274 | | |
275 | | class Iterator : public IteratorBase<Iterator, false> { |
276 | | public: |
277 | | using IteratorBase<Iterator, false>::IteratorBase; |
278 | | }; |
279 | | |
280 | | class ConstIterator : public IteratorBase<ConstIterator, true> { |
281 | | public: |
282 | | using IteratorBase<ConstIterator, true>::IteratorBase; |
283 | | }; |
284 | | |
285 | | ConstIterator begin() const { return {this, 0}; } |
286 | | |
287 | | ConstIterator cbegin() const { return begin(); } |
288 | | |
289 | 44.5k | Iterator begin() { return {this, 0}; } |
290 | | |
291 | | ConstIterator end() const { return {this, _total_count}; } |
292 | | ConstIterator cend() const { return end(); } |
293 | 2.60M | Iterator end() { return {this, _total_count}; } |
294 | | |
295 | 10 | [[nodiscard]] uint32_t total_count() const { return _total_count; } |
296 | | |
297 | 19 | size_t estimate_memory(size_t rows) const { |
298 | 19 | bool need_to_expand = false; |
299 | 19 | if (_total_count == 0) { |
300 | 1 | need_to_expand = true; |
301 | 18 | } else if ((_index_in_sub_container + rows) > SUB_CONTAINER_CAPACITY) { |
302 | 2 | need_to_expand = true; |
303 | 2 | rows -= (SUB_CONTAINER_CAPACITY - _index_in_sub_container); |
304 | 2 | } |
305 | | |
306 | 19 | if (!need_to_expand) { |
307 | 16 | return 0; |
308 | 16 | } |
309 | | |
310 | 3 | size_t count = (rows + SUB_CONTAINER_CAPACITY - 1) / SUB_CONTAINER_CAPACITY; |
311 | 3 | size_t size = _size_of_key * SUB_CONTAINER_CAPACITY; |
312 | 3 | size += _size_of_aggregate_states * SUB_CONTAINER_CAPACITY; |
313 | 3 | size *= count; |
314 | 3 | return size; |
315 | 19 | } |
316 | | |
317 | 44.7k | void init_once() { |
318 | 44.7k | if (_inited) { |
319 | 292 | return; |
320 | 292 | } |
321 | 44.4k | _inited = true; |
322 | 44.4k | iterator = begin(); |
323 | 44.4k | } |
324 | | Iterator iterator; |
325 | | |
326 | | private: |
327 | 17.3k | void _expand() { |
328 | 17.3k | _index_in_sub_container = 0; |
329 | 17.3k | _current_keys = nullptr; |
330 | 17.3k | _current_agg_data = nullptr; |
331 | 17.3k | try { |
332 | 17.3k | _current_keys = _arena_pool.alloc(_size_of_key * SUB_CONTAINER_CAPACITY); |
333 | 17.3k | _key_containers.emplace_back(_current_keys); |
334 | | |
335 | 17.3k | _current_agg_data = (AggregateDataPtr)_arena_pool.alloc(_size_of_aggregate_states * |
336 | 17.3k | SUB_CONTAINER_CAPACITY); |
337 | 17.3k | _value_containers.emplace_back(_current_agg_data); |
338 | 17.3k | } catch (...) { |
339 | 0 | if (_current_keys) { |
340 | 0 | _key_containers.pop_back(); |
341 | 0 | _current_keys = nullptr; |
342 | 0 | } |
343 | 0 | if (_current_agg_data) { |
344 | 0 | _value_containers.pop_back(); |
345 | 0 | _current_agg_data = nullptr; |
346 | 0 | } |
347 | 0 | throw; |
348 | 0 | } |
349 | 17.3k | } |
350 | | |
351 | | static constexpr uint32_t SUB_CONTAINER_CAPACITY = 8192; |
352 | | Arena _arena_pool; |
353 | | std::vector<char*> _key_containers; |
354 | | std::vector<AggregateDataPtr> _value_containers; |
355 | | AggregateDataPtr _current_agg_data = nullptr; |
356 | | char* _current_keys = nullptr; |
357 | | size_t _size_of_key {}; |
358 | | size_t _size_of_aggregate_states {}; |
359 | | uint32_t _index_in_sub_container {}; |
360 | | uint32_t _total_count {}; |
361 | | bool _inited = false; |
362 | | }; |
363 | | } // namespace doris |