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 | 159k | void init_agg_data(const std::vector<DataTypePtr>& data_types, HashKeyType type) { |
101 | 159k | bool nullable = data_types.size() == 1 && data_types[0]->is_nullable(); |
102 | | |
103 | 159k | switch (type) { |
104 | 1 | case HashKeyType::without_key: |
105 | 1 | break; |
106 | 20.5k | case HashKeyType::serialized: |
107 | 20.5k | this->method_variant.template emplace<MethodSerialized<AggregatedDataWithStringKey>>(); |
108 | 20.5k | break; |
109 | 4.72k | case HashKeyType::int8_key: |
110 | 4.72k | this->template emplace_single<UInt8, AggData<UInt8>>(nullable); |
111 | 4.72k | break; |
112 | 8.94k | case HashKeyType::int16_key: |
113 | 8.94k | this->template emplace_single<UInt16, AggData<UInt16>>(nullable); |
114 | 8.94k | break; |
115 | 17.2k | case HashKeyType::int32_key: |
116 | 17.2k | this->template emplace_single<UInt32, AggData<UInt32>>(nullable); |
117 | 17.2k | break; |
118 | 12.6k | case HashKeyType::int32_key_phase2: |
119 | 12.6k | this->template emplace_single<UInt32, AggregatedDataWithUInt32KeyPhase2>(nullable); |
120 | 12.6k | break; |
121 | 26.4k | case HashKeyType::int64_key: |
122 | 26.4k | this->template emplace_single<UInt64, AggData<UInt64>>(nullable); |
123 | 26.4k | break; |
124 | 6.18k | case HashKeyType::int64_key_phase2: |
125 | 6.18k | this->template emplace_single<UInt64, AggregatedDataWithUInt64KeyPhase2>(nullable); |
126 | 6.18k | break; |
127 | 677 | case HashKeyType::int128_key: |
128 | 677 | this->template emplace_single<UInt128, AggData<UInt128>>(nullable); |
129 | 677 | break; |
130 | 3 | case HashKeyType::int256_key: |
131 | 3 | this->template emplace_single<UInt256, AggData<UInt256>>(nullable); |
132 | 3 | break; |
133 | 10.7k | case HashKeyType::string_key: |
134 | 10.7k | if (nullable) { |
135 | 8.20k | this->method_variant.template emplace< |
136 | 8.20k | MethodSingleNullableColumn<MethodStringNoCache<NullableStringData>>>(); |
137 | 8.20k | } else { |
138 | 2.49k | this->method_variant.template emplace<MethodStringNoCache<StringData>>(); |
139 | 2.49k | } |
140 | 10.7k | break; |
141 | 773 | case HashKeyType::fixed64: |
142 | 773 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt64>>>( |
143 | 773 | get_key_sizes(data_types)); |
144 | 773 | break; |
145 | 1.19k | case HashKeyType::fixed72: |
146 | 1.19k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt72>>>( |
147 | 1.19k | get_key_sizes(data_types)); |
148 | 1.19k | break; |
149 | 589 | case HashKeyType::fixed96: |
150 | 589 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt96>>>( |
151 | 589 | get_key_sizes(data_types)); |
152 | 589 | break; |
153 | 1.09k | case HashKeyType::fixed104: |
154 | 1.09k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt104>>>( |
155 | 1.09k | get_key_sizes(data_types)); |
156 | 1.09k | break; |
157 | 112 | case HashKeyType::fixed128: |
158 | 112 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt128>>>( |
159 | 112 | get_key_sizes(data_types)); |
160 | 112 | break; |
161 | 42.7k | case HashKeyType::fixed136: |
162 | 42.7k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt136>>>( |
163 | 42.7k | get_key_sizes(data_types)); |
164 | 42.7k | break; |
165 | 4.20k | case HashKeyType::fixed256: |
166 | 4.20k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt256>>>( |
167 | 4.20k | get_key_sizes(data_types)); |
168 | 4.20k | break; |
169 | 1 | default: |
170 | 1 | throw Exception(ErrorCode::INTERNAL_ERROR, "meet invalid agg key type, type={}", type); |
171 | 159k | } |
172 | 159k | } _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 | 59.3k | void init_agg_data(const std::vector<DataTypePtr>& data_types, HashKeyType type) { | 101 | 59.3k | bool nullable = data_types.size() == 1 && data_types[0]->is_nullable(); | 102 | | | 103 | 59.3k | switch (type) { | 104 | 1 | case HashKeyType::without_key: | 105 | 1 | break; | 106 | 9.41k | case HashKeyType::serialized: | 107 | 9.41k | this->method_variant.template emplace<MethodSerialized<AggregatedDataWithStringKey>>(); | 108 | 9.41k | break; | 109 | 4.72k | case HashKeyType::int8_key: | 110 | 4.72k | this->template emplace_single<UInt8, AggData<UInt8>>(nullable); | 111 | 4.72k | break; | 112 | 874 | case HashKeyType::int16_key: | 113 | 874 | this->template emplace_single<UInt16, AggData<UInt16>>(nullable); | 114 | 874 | break; | 115 | 5.13k | case HashKeyType::int32_key: | 116 | 5.13k | this->template emplace_single<UInt32, AggData<UInt32>>(nullable); | 117 | 5.13k | break; | 118 | 12.6k | case HashKeyType::int32_key_phase2: | 119 | 12.6k | this->template emplace_single<UInt32, AggregatedDataWithUInt32KeyPhase2>(nullable); | 120 | 12.6k | break; | 121 | 3.27k | case HashKeyType::int64_key: | 122 | 3.27k | this->template emplace_single<UInt64, AggData<UInt64>>(nullable); | 123 | 3.27k | break; | 124 | 6.18k | case HashKeyType::int64_key_phase2: | 125 | 6.18k | this->template emplace_single<UInt64, AggregatedDataWithUInt64KeyPhase2>(nullable); | 126 | 6.18k | break; | 127 | 677 | case HashKeyType::int128_key: | 128 | 677 | this->template emplace_single<UInt128, AggData<UInt128>>(nullable); | 129 | 677 | break; | 130 | 3 | case HashKeyType::int256_key: | 131 | 3 | this->template emplace_single<UInt256, AggData<UInt256>>(nullable); | 132 | 3 | break; | 133 | 6.67k | case HashKeyType::string_key: | 134 | 6.67k | if (nullable) { | 135 | 5.46k | this->method_variant.template emplace< | 136 | 5.46k | MethodSingleNullableColumn<MethodStringNoCache<NullableStringData>>>(); | 137 | 5.46k | } else { | 138 | 1.20k | this->method_variant.template emplace<MethodStringNoCache<StringData>>(); | 139 | 1.20k | } | 140 | 6.67k | break; | 141 | 773 | case HashKeyType::fixed64: | 142 | 773 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt64>>>( | 143 | 773 | get_key_sizes(data_types)); | 144 | 773 | break; | 145 | 1.19k | case HashKeyType::fixed72: | 146 | 1.19k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt72>>>( | 147 | 1.19k | get_key_sizes(data_types)); | 148 | 1.19k | break; | 149 | 589 | case HashKeyType::fixed96: | 150 | 589 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt96>>>( | 151 | 589 | get_key_sizes(data_types)); | 152 | 589 | break; | 153 | 1.09k | case HashKeyType::fixed104: | 154 | 1.09k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt104>>>( | 155 | 1.09k | get_key_sizes(data_types)); | 156 | 1.09k | break; | 157 | 112 | case HashKeyType::fixed128: | 158 | 112 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt128>>>( | 159 | 112 | get_key_sizes(data_types)); | 160 | 112 | break; | 161 | 2.60k | case HashKeyType::fixed136: | 162 | 2.60k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt136>>>( | 163 | 2.60k | get_key_sizes(data_types)); | 164 | 2.60k | break; | 165 | 3.44k | case HashKeyType::fixed256: | 166 | 3.44k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt256>>>( | 167 | 3.44k | get_key_sizes(data_types)); | 168 | 3.44k | break; | 169 | 1 | default: | 170 | 1 | throw Exception(ErrorCode::INTERNAL_ERROR, "meet invalid agg key type, type={}", type); | 171 | 59.3k | } | 172 | 59.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 | 99.9k | void init_agg_data(const std::vector<DataTypePtr>& data_types, HashKeyType type) { | 101 | 99.9k | bool nullable = data_types.size() == 1 && data_types[0]->is_nullable(); | 102 | | | 103 | 99.9k | switch (type) { | 104 | 0 | case HashKeyType::without_key: | 105 | 0 | break; | 106 | 11.1k | case HashKeyType::serialized: | 107 | 11.1k | this->method_variant.template emplace<MethodSerialized<AggregatedDataWithStringKey>>(); | 108 | 11.1k | break; | 109 | 0 | case HashKeyType::int8_key: | 110 | 0 | this->template emplace_single<UInt8, AggData<UInt8>>(nullable); | 111 | 0 | break; | 112 | 8.07k | case HashKeyType::int16_key: | 113 | 8.07k | this->template emplace_single<UInt16, AggData<UInt16>>(nullable); | 114 | 8.07k | break; | 115 | 12.1k | case HashKeyType::int32_key: | 116 | 12.1k | this->template emplace_single<UInt32, AggData<UInt32>>(nullable); | 117 | 12.1k | break; | 118 | 0 | case HashKeyType::int32_key_phase2: | 119 | 0 | this->template emplace_single<UInt32, AggregatedDataWithUInt32KeyPhase2>(nullable); | 120 | 0 | break; | 121 | 23.2k | case HashKeyType::int64_key: | 122 | 23.2k | this->template emplace_single<UInt64, AggData<UInt64>>(nullable); | 123 | 23.2k | 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 | 4.02k | case HashKeyType::string_key: | 134 | 4.02k | if (nullable) { | 135 | 2.74k | this->method_variant.template emplace< | 136 | 2.74k | MethodSingleNullableColumn<MethodStringNoCache<NullableStringData>>>(); | 137 | 2.74k | } else { | 138 | 1.28k | this->method_variant.template emplace<MethodStringNoCache<StringData>>(); | 139 | 1.28k | } | 140 | 4.02k | 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 | 40.1k | case HashKeyType::fixed136: | 162 | 40.1k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt136>>>( | 163 | 40.1k | get_key_sizes(data_types)); | 164 | 40.1k | break; | 165 | 765 | case HashKeyType::fixed256: | 166 | 765 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt256>>>( | 167 | 765 | get_key_sizes(data_types)); | 168 | 765 | break; | 169 | 0 | default: | 170 | 0 | throw Exception(ErrorCode::INTERNAL_ERROR, "meet invalid agg key type, type={}", type); | 171 | 99.9k | } | 172 | 99.9k | } |
|
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 | 59.4k | void init(const std::vector<DataTypePtr>& data_types, HashKeyType type) { |
183 | 59.4k | is_fixed_key = !(type == HashKeyType::without_key || type == HashKeyType::EMPTY || |
184 | 59.4k | type == HashKeyType::serialized || type == HashKeyType::string_key); |
185 | 59.4k | this->init_agg_data(data_types, type); |
186 | 59.4k | } |
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 | 99.4k | void init(const std::vector<DataTypePtr>& data_types, HashKeyType type) { |
198 | 99.4k | this->init_agg_data(data_types, type); |
199 | 99.4k | } |
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 | 56.7k | : _size_of_key(size_of_key), _size_of_aggregate_states(size_of_aggregate_states) {} |
208 | | |
209 | 51.7k | int64_t memory_usage() const { return _arena_pool.size(); } |
210 | | |
211 | | template <typename KeyType> |
212 | 2.75M | AggregateDataPtr append_data(const KeyType& key) { |
213 | 2.75M | 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 | 2.75M | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { |
216 | 23.0k | _expand(); |
217 | 23.0k | } |
218 | | |
219 | 2.75M | *reinterpret_cast<KeyType*>(_current_keys) = key; |
220 | 2.75M | auto* aggregate_data = _current_agg_data; |
221 | 2.75M | ++_total_count; |
222 | 2.75M | ++_index_in_sub_container; |
223 | 2.75M | _current_agg_data += _size_of_aggregate_states; |
224 | 2.75M | _current_keys += _size_of_key; |
225 | 2.75M | return aggregate_data; |
226 | 2.75M | } _ZN5doris22AggregateDataContainer11append_dataINS_9StringRefEEEPcRKT_ Line | Count | Source | 212 | 128k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 128k | 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 | 128k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 5.05k | _expand(); | 217 | 5.05k | } | 218 | | | 219 | 128k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 128k | auto* aggregate_data = _current_agg_data; | 221 | 128k | ++_total_count; | 222 | 128k | ++_index_in_sub_container; | 223 | 128k | _current_agg_data += _size_of_aggregate_states; | 224 | 128k | _current_keys += _size_of_key; | 225 | 128k | return aggregate_data; | 226 | 128k | } |
_ZN5doris22AggregateDataContainer11append_dataIhEEPcRKT_ Line | Count | Source | 212 | 4.36k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 4.36k | 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 | 4.36k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 2.17k | _expand(); | 217 | 2.17k | } | 218 | | | 219 | 4.36k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 4.36k | auto* aggregate_data = _current_agg_data; | 221 | 4.36k | ++_total_count; | 222 | 4.36k | ++_index_in_sub_container; | 223 | 4.36k | _current_agg_data += _size_of_aggregate_states; | 224 | 4.36k | _current_keys += _size_of_key; | 225 | 4.36k | return aggregate_data; | 226 | 4.36k | } |
_ZN5doris22AggregateDataContainer11append_dataItEEPcRKT_ Line | Count | Source | 212 | 1.79k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 1.79k | 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.79k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 381 | _expand(); | 217 | 381 | } | 218 | | | 219 | 1.79k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 1.79k | auto* aggregate_data = _current_agg_data; | 221 | 1.79k | ++_total_count; | 222 | 1.79k | ++_index_in_sub_container; | 223 | 1.79k | _current_agg_data += _size_of_aggregate_states; | 224 | 1.79k | _current_keys += _size_of_key; | 225 | 1.79k | return aggregate_data; | 226 | 1.79k | } |
_ZN5doris22AggregateDataContainer11append_dataIjEEPcRKT_ Line | Count | Source | 212 | 2.18M | AggregateDataPtr append_data(const KeyType& key) { | 213 | 2.18M | 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 | 2.18M | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 8.50k | _expand(); | 217 | 8.50k | } | 218 | | | 219 | 2.18M | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 2.18M | auto* aggregate_data = _current_agg_data; | 221 | 2.18M | ++_total_count; | 222 | 2.18M | ++_index_in_sub_container; | 223 | 2.18M | _current_agg_data += _size_of_aggregate_states; | 224 | 2.18M | _current_keys += _size_of_key; | 225 | 2.18M | return aggregate_data; | 226 | 2.18M | } |
_ZN5doris22AggregateDataContainer11append_dataImEEPcRKT_ Line | Count | Source | 212 | 394k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 394k | 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 | 394k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 3.71k | _expand(); | 217 | 3.71k | } | 218 | | | 219 | 394k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 394k | auto* aggregate_data = _current_agg_data; | 221 | 394k | ++_total_count; | 222 | 394k | ++_index_in_sub_container; | 223 | 394k | _current_agg_data += _size_of_aggregate_states; | 224 | 394k | _current_keys += _size_of_key; | 225 | 394k | return aggregate_data; | 226 | 394k | } |
_ZN5doris22AggregateDataContainer11append_dataIN4wide7integerILm128EjEEEEPcRKT_ Line | Count | Source | 212 | 12.6k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 12.6k | 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 | 12.6k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 355 | _expand(); | 217 | 355 | } | 218 | | | 219 | 12.6k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 12.6k | auto* aggregate_data = _current_agg_data; | 221 | 12.6k | ++_total_count; | 222 | 12.6k | ++_index_in_sub_container; | 223 | 12.6k | _current_agg_data += _size_of_aggregate_states; | 224 | 12.6k | _current_keys += _size_of_key; | 225 | 12.6k | return aggregate_data; | 226 | 12.6k | } |
_ZN5doris22AggregateDataContainer11append_dataIN4wide7integerILm256EjEEEEPcRKT_ Line | Count | Source | 212 | 8.99k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 8.99k | 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 | 8.99k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 567 | _expand(); | 217 | 567 | } | 218 | | | 219 | 8.99k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 8.99k | auto* aggregate_data = _current_agg_data; | 221 | 8.99k | ++_total_count; | 222 | 8.99k | ++_index_in_sub_container; | 223 | 8.99k | _current_agg_data += _size_of_aggregate_states; | 224 | 8.99k | _current_keys += _size_of_key; | 225 | 8.99k | return aggregate_data; | 226 | 8.99k | } |
_ZN5doris22AggregateDataContainer11append_dataINS_6UInt72EEEPcRKT_ Line | Count | Source | 212 | 970 | AggregateDataPtr append_data(const KeyType& key) { | 213 | 970 | 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 | 970 | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 484 | _expand(); | 217 | 484 | } | 218 | | | 219 | 970 | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 970 | auto* aggregate_data = _current_agg_data; | 221 | 970 | ++_total_count; | 222 | 970 | ++_index_in_sub_container; | 223 | 970 | _current_agg_data += _size_of_aggregate_states; | 224 | 970 | _current_keys += _size_of_key; | 225 | 970 | return aggregate_data; | 226 | 970 | } |
_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 | 550 | _expand(); | 217 | 550 | } | 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 | 829 | AggregateDataPtr append_data(const KeyType& key) { | 213 | 829 | 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 | 829 | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 392 | _expand(); | 217 | 392 | } | 218 | | | 219 | 829 | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 829 | auto* aggregate_data = _current_agg_data; | 221 | 829 | ++_total_count; | 222 | 829 | ++_index_in_sub_container; | 223 | 829 | _current_agg_data += _size_of_aggregate_states; | 224 | 829 | _current_keys += _size_of_key; | 225 | 829 | return aggregate_data; | 226 | 829 | } |
_ZN5doris22AggregateDataContainer11append_dataINS_7UInt136EEEPcRKT_ Line | Count | Source | 212 | 1.86k | AggregateDataPtr append_data(const KeyType& key) { | 213 | 1.86k | 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.86k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 216 | 860 | _expand(); | 217 | 860 | } | 218 | | | 219 | 1.86k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 220 | 1.86k | auto* aggregate_data = _current_agg_data; | 221 | 1.86k | ++_total_count; | 222 | 1.86k | ++_index_in_sub_container; | 223 | 1.86k | _current_agg_data += _size_of_aggregate_states; | 224 | 1.86k | _current_keys += _size_of_key; | 225 | 1.86k | return aggregate_data; | 226 | 1.86k | } |
|
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 | 56.7k | IteratorBase() = default; |
242 | | IteratorBase(Container* container_, uint32_t index_) |
243 | 2.75M | : container(container_), index(index_) { |
244 | 2.75M | sub_container_index = index / SUB_CONTAINER_CAPACITY; |
245 | 2.75M | index_in_sub_container = index - sub_container_index * SUB_CONTAINER_CAPACITY; |
246 | 2.75M | } |
247 | | |
248 | 51.2k | bool operator==(const IteratorBase& rhs) const { return index == rhs.index; } |
249 | 2.64M | bool operator!=(const IteratorBase& rhs) const { return index != rhs.index; } |
250 | | |
251 | 2.62M | Derived& operator++() { |
252 | 2.62M | index++; |
253 | 2.62M | index_in_sub_container++; |
254 | 2.62M | if (index_in_sub_container == SUB_CONTAINER_CAPACITY) { |
255 | 235 | index_in_sub_container = 0; |
256 | 235 | sub_container_index++; |
257 | 235 | } |
258 | 2.62M | return static_cast<Derived&>(*this); |
259 | 2.62M | } |
260 | | |
261 | | template <typename KeyType> |
262 | 2.61M | KeyType get_key() { |
263 | 2.61M | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); |
264 | 2.61M | return ((KeyType*)(container->_key_containers[sub_container_index])) |
265 | 2.61M | [index_in_sub_container]; |
266 | 2.61M | } _ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_9StringRefEEET_v Line | Count | Source | 262 | 173k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 173k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 173k | [index_in_sub_container]; | 266 | 173k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyIhEET_v Line | Count | Source | 262 | 4.35k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 4.35k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 4.35k | [index_in_sub_container]; | 266 | 4.35k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyItEET_v Line | Count | Source | 262 | 1.79k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 1.79k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 1.79k | [index_in_sub_container]; | 266 | 1.79k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyIjEET_v Line | Count | Source | 262 | 2.01M | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 2.01M | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 2.01M | [index_in_sub_container]; | 266 | 2.01M | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyImEET_v Line | Count | Source | 262 | 382k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 382k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 382k | [index_in_sub_container]; | 266 | 382k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyIN4wide7integerILm128EjEEEET_v Line | Count | Source | 262 | 12.5k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 12.5k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 12.5k | [index_in_sub_container]; | 266 | 12.5k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyIN4wide7integerILm256EjEEEET_v Line | Count | Source | 262 | 15.5k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 15.5k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 15.5k | [index_in_sub_container]; | 266 | 15.5k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_6UInt72EEET_v Line | Count | Source | 262 | 968 | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 968 | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 968 | [index_in_sub_container]; | 266 | 968 | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_6UInt96EEET_v Line | Count | Source | 262 | 7.65k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 7.65k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 7.65k | [index_in_sub_container]; | 266 | 7.65k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_7UInt104EEET_v Line | Count | Source | 262 | 808 | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 808 | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 808 | [index_in_sub_container]; | 266 | 808 | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_7UInt136EEET_v Line | Count | Source | 262 | 1.85k | KeyType get_key() { | 263 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 264 | 1.85k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 265 | 1.85k | [index_in_sub_container]; | 266 | 1.85k | } |
|
267 | | |
268 | 2.55M | AggregateDataPtr get_aggregate_data() { |
269 | 2.55M | return &(container->_value_containers[sub_container_index] |
270 | 2.55M | [container->_size_of_aggregate_states * |
271 | 2.55M | index_in_sub_container]); |
272 | 2.55M | } |
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 | 51.3k | Iterator begin() { return {this, 0}; } |
290 | | |
291 | | ConstIterator end() const { return {this, _total_count}; } |
292 | | ConstIterator cend() const { return end(); } |
293 | 2.71M | 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 | 51.4k | void init_once() { |
318 | 51.4k | if (_inited) { |
319 | 330 | return; |
320 | 330 | } |
321 | 51.1k | _inited = true; |
322 | 51.1k | iterator = begin(); |
323 | 51.1k | } |
324 | | Iterator iterator; |
325 | | |
326 | | private: |
327 | 23.0k | void _expand() { |
328 | 23.0k | _index_in_sub_container = 0; |
329 | 23.0k | _current_keys = nullptr; |
330 | 23.0k | _current_agg_data = nullptr; |
331 | 23.0k | try { |
332 | 23.0k | _current_keys = _arena_pool.alloc(_size_of_key * SUB_CONTAINER_CAPACITY); |
333 | 23.0k | _key_containers.emplace_back(_current_keys); |
334 | | |
335 | 23.0k | _current_agg_data = (AggregateDataPtr)_arena_pool.alloc(_size_of_aggregate_states * |
336 | 23.0k | SUB_CONTAINER_CAPACITY); |
337 | 23.0k | _value_containers.emplace_back(_current_agg_data); |
338 | 23.0k | } 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 | 23.0k | } |
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 |