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 <utility> |
21 | | #include <variant> |
22 | | #include <vector> |
23 | | |
24 | | #include "core/arena.h" |
25 | | #include "exec/common/hash_table/hash_map_context.h" |
26 | | #include "exec/common/hash_table/hash_map_util.h" |
27 | | #include "exec/common/hash_table/ph_hash_map.h" |
28 | | #include "exec/common/hash_table/string_hash_map.h" |
29 | | |
30 | | namespace doris { |
31 | | |
32 | | template <typename PostCreate, typename Rollback> |
33 | | void commit_aggregate_state(AggregateDataPtr& mapped, AggregateDataPtr new_state, |
34 | 1 | PostCreate&& post_create, Rollback&& rollback) { |
35 | 1 | try { |
36 | 1 | std::forward<PostCreate>(post_create)(); |
37 | 1 | } catch (...) { |
38 | 0 | std::forward<Rollback>(rollback)(new_state); |
39 | 0 | throw; |
40 | 0 | } |
41 | 1 | mapped = new_state; |
42 | 1 | } Unexecuted instantiation: aggregation_sink_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_17AggSinkLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERKSt6vectorIiSaIiEERS6_IPKNS_7IColumnESaISD_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberIhNS_15DataWithNullKeyI9PHHashMapIhS2_9HashCRC32IhEEEEEEEEEEbOT_ENKUlRSU_E_clIS2_EEDaSW_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SA_SG_jENKSI_IST_EEbSV_ENKSY_IS2_EEDaSW_EUlPSU_E_EEvRS2_S2_SV_OT0_ Unexecuted instantiation: aggregation_sink_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_17AggSinkLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERKSt6vectorIiSaIiEERS6_IPKNS_7IColumnESaISD_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberItNS_15DataWithNullKeyI9PHHashMapItS2_9HashCRC32ItEEEEEEEEEEbOT_ENKUlRSU_E_clIS2_EEDaSW_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SA_SG_jENKSI_IST_EEbSV_ENKSY_IS2_EEDaSW_EUlPSU_E_EEvRS2_S2_SV_OT0_ Unexecuted instantiation: aggregation_sink_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_17AggSinkLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERKSt6vectorIiSaIiEERS6_IPKNS_7IColumnESaISD_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberIjNS_15DataWithNullKeyI9PHHashMapIjS2_9HashCRC32IjEEEEEEEEEEbOT_ENKUlRSU_E_clIS2_EEDaSW_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SA_SG_jENKSI_IST_EEbSV_ENKSY_IS2_EEDaSW_EUlPSU_E_EEvRS2_S2_SV_OT0_ Unexecuted instantiation: aggregation_sink_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_17AggSinkLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERKSt6vectorIiSaIiEERS6_IPKNS_7IColumnESaISD_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberImNS_15DataWithNullKeyI9PHHashMapImS2_9HashCRC32ImEEEEEEEEEEbOT_ENKUlRSU_E_clIS2_EEDaSW_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SA_SG_jENKSI_IST_EEbSV_ENKSY_IS2_EEDaSW_EUlPSU_E_EEvRS2_S2_SV_OT0_ Unexecuted instantiation: aggregation_sink_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_17AggSinkLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERKSt6vectorIiSaIiEERS6_IPKNS_7IColumnESaISD_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberIjNS_15DataWithNullKeyI9PHHashMapIjS2_14HashMixWrapperIj9HashCRC32IjEEEEEEEEEEEbOT_ENKUlRSW_E_clIS2_EEDaSY_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SA_SG_jENKSI_ISV_EEbSX_ENKS10_IS2_EEDaSY_EUlPSW_E_EEvRS2_S2_SX_OT0_ aggregation_sink_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_17AggSinkLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERKSt6vectorIiSaIiEERS6_IPKNS_7IColumnESaISD_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberImNS_15DataWithNullKeyI9PHHashMapImS2_14HashMixWrapperIm9HashCRC32ImEEEEEEEEEEEbOT_ENKUlRSW_E_clIS2_EEDaSY_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SA_SG_jENKSI_ISV_EEbSX_ENKS10_IS2_EEDaSY_EUlPSW_E_EEvRS2_S2_SX_OT0_ Line | Count | Source | 34 | 1 | PostCreate&& post_create, Rollback&& rollback) { | 35 | 1 | try { | 36 | 1 | std::forward<PostCreate>(post_create)(); | 37 | 1 | } catch (...) { | 38 | 0 | std::forward<Rollback>(rollback)(new_state); | 39 | 0 | throw; | 40 | 0 | } | 41 | 1 | mapped = new_state; | 42 | 1 | } |
Unexecuted instantiation: aggregation_sink_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_17AggSinkLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERKSt6vectorIiSaIiEERS6_IPKNS_7IColumnESaISD_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberIN4wide7integerILm128EjEENS_15DataWithNullKeyI9PHHashMapISN_S2_9HashCRC32ISN_EEEEEEEEEEbOT_ENKUlRSX_E_clIS2_EEDaSZ_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SA_SG_jENKSI_ISW_EEbSY_ENKS11_IS2_EEDaSZ_EUlPSX_E_EEvRS2_S2_SY_OT0_ Unexecuted instantiation: aggregation_sink_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_17AggSinkLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERKSt6vectorIiSaIiEERS6_IPKNS_7IColumnESaISD_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberIN4wide7integerILm256EjEENS_15DataWithNullKeyI9PHHashMapISN_S2_9HashCRC32ISN_EEEEEEEEEEbOT_ENKUlRSX_E_clIS2_EEDaSZ_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SA_SG_jENKSI_ISW_EEbSY_ENKS11_IS2_EEDaSZ_EUlPSX_E_EEvRS2_S2_SY_OT0_ Unexecuted instantiation: aggregation_sink_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_17AggSinkLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERKSt6vectorIiSaIiEERS6_IPKNS_7IColumnESaISD_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_19MethodStringNoCacheINS_15DataWithNullKeyINS_13StringHashMapIS2_NS_9AllocatorILb1ELb1ELb0ENS_22DefaultMemoryAllocatorELb1EEEEEEEEEEEEEbOT_ENKUlRSV_E_clIS2_EEDaSX_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SA_SG_jENKSI_ISU_EEbSW_ENKSZ_IS2_EEDaSX_EUlPSV_E_EEvRS2_S2_SW_OT0_ Unexecuted instantiation: streaming_aggregation_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_22StreamingAggLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERSt6vectorIPKNS_7IColumnESaIS9_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberIhNS_15DataWithNullKeyI9PHHashMapIhS2_9HashCRC32IhEEEEEEEEEEbOT_ENKUlRSQ_E_clIS2_EEDaSS_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SC_jENKSE_ISP_EEbSR_ENKSU_IS2_EEDaSS_EUlPSQ_E_EEvRS2_S2_SR_OT0_ Unexecuted instantiation: streaming_aggregation_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_22StreamingAggLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERSt6vectorIPKNS_7IColumnESaIS9_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberItNS_15DataWithNullKeyI9PHHashMapItS2_9HashCRC32ItEEEEEEEEEEbOT_ENKUlRSQ_E_clIS2_EEDaSS_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SC_jENKSE_ISP_EEbSR_ENKSU_IS2_EEDaSS_EUlPSQ_E_EEvRS2_S2_SR_OT0_ Unexecuted instantiation: streaming_aggregation_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_22StreamingAggLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERSt6vectorIPKNS_7IColumnESaIS9_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberIjNS_15DataWithNullKeyI9PHHashMapIjS2_9HashCRC32IjEEEEEEEEEEbOT_ENKUlRSQ_E_clIS2_EEDaSS_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SC_jENKSE_ISP_EEbSR_ENKSU_IS2_EEDaSS_EUlPSQ_E_EEvRS2_S2_SR_OT0_ Unexecuted instantiation: streaming_aggregation_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_22StreamingAggLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERSt6vectorIPKNS_7IColumnESaIS9_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberImNS_15DataWithNullKeyI9PHHashMapImS2_9HashCRC32ImEEEEEEEEEEbOT_ENKUlRSQ_E_clIS2_EEDaSS_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SC_jENKSE_ISP_EEbSR_ENKSU_IS2_EEDaSS_EUlPSQ_E_EEvRS2_S2_SR_OT0_ Unexecuted instantiation: streaming_aggregation_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_22StreamingAggLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERSt6vectorIPKNS_7IColumnESaIS9_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberIjNS_15DataWithNullKeyI9PHHashMapIjS2_14HashMixWrapperIj9HashCRC32IjEEEEEEEEEEEbOT_ENKUlRSS_E_clIS2_EEDaSU_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SC_jENKSE_ISR_EEbST_ENKSW_IS2_EEDaSU_EUlPSS_E_EEvRS2_S2_ST_OT0_ Unexecuted instantiation: streaming_aggregation_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_22StreamingAggLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERSt6vectorIPKNS_7IColumnESaIS9_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberImNS_15DataWithNullKeyI9PHHashMapImS2_14HashMixWrapperIm9HashCRC32ImEEEEEEEEEEEbOT_ENKUlRSS_E_clIS2_EEDaSU_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SC_jENKSE_ISR_EEbST_ENKSW_IS2_EEDaSU_EUlPSS_E_EEvRS2_S2_ST_OT0_ Unexecuted instantiation: streaming_aggregation_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_22StreamingAggLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERSt6vectorIPKNS_7IColumnESaIS9_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberIN4wide7integerILm128EjEENS_15DataWithNullKeyI9PHHashMapISJ_S2_9HashCRC32ISJ_EEEEEEEEEEbOT_ENKUlRST_E_clIS2_EEDaSV_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SC_jENKSE_ISS_EEbSU_ENKSX_IS2_EEDaSV_EUlPST_E_EEvRS2_S2_SU_OT0_ Unexecuted instantiation: streaming_aggregation_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_22StreamingAggLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERSt6vectorIPKNS_7IColumnESaIS9_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_15MethodOneNumberIN4wide7integerILm256EjEENS_15DataWithNullKeyI9PHHashMapISJ_S2_9HashCRC32ISJ_EEEEEEEEEEbOT_ENKUlRST_E_clIS2_EEDaSV_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SC_jENKSE_ISS_EEbSU_ENKSX_IS2_EEDaSV_EUlPST_E_EEvRS2_S2_SU_OT0_ Unexecuted instantiation: streaming_aggregation_operator.cpp:_ZN5doris22commit_aggregate_stateIZZZNS_22StreamingAggLocalState30_emplace_into_hash_table_limitEPPcPNS_5BlockERSt6vectorIPKNS_7IColumnESaIS9_EEjENK3$_1clIRNS_26MethodSingleNullableColumnINS_19MethodStringNoCacheINS_15DataWithNullKeyINS_13StringHashMapIS2_NS_9AllocatorILb1ELb1ELb0ENS_22DefaultMemoryAllocatorELb1EEEEEEEEEEEEEbOT_ENKUlRSR_E_clIS2_EEDaST_EUlvE_ZZZNS1_30_emplace_into_hash_table_limitES3_S5_SC_jENKSE_ISQ_EEbSS_ENKSV_IS2_EEDaST_EUlPSR_E_EEvRS2_S2_SS_OT0_ |
43 | | |
44 | | template <typename T> |
45 | | using AggData = PHHashMap<T, AggregateDataPtr, HashCRC32<T>>; |
46 | | template <typename T> |
47 | | using AggDataNullable = DataWithNullKey<AggData<T>>; |
48 | | |
49 | | using AggregatedDataWithoutKey = AggregateDataPtr; |
50 | | using AggregatedDataWithStringKey = PHHashMap<StringRef, AggregateDataPtr>; |
51 | | using AggregatedDataWithShortStringKey = StringHashMap<AggregateDataPtr>; |
52 | | |
53 | | using AggregatedDataWithUInt32KeyPhase2 = |
54 | | PHHashMap<UInt32, AggregateDataPtr, HashMixWrapper<UInt32>>; |
55 | | using AggregatedDataWithUInt64KeyPhase2 = |
56 | | PHHashMap<UInt64, AggregateDataPtr, HashMixWrapper<UInt64>>; |
57 | | |
58 | | using AggregatedDataWithNullableUInt32KeyPhase2 = |
59 | | DataWithNullKey<AggregatedDataWithUInt32KeyPhase2>; |
60 | | using AggregatedDataWithNullableUInt64KeyPhase2 = |
61 | | DataWithNullKey<AggregatedDataWithUInt64KeyPhase2>; |
62 | | using AggregatedDataWithNullableShortStringKey = DataWithNullKey<AggregatedDataWithShortStringKey>; |
63 | | using AggregatedDataWithNullableStringKey = DataWithNullKey<AggregatedDataWithStringKey>; |
64 | | |
65 | | /// Parameterized method variant for aggregation hash tables. |
66 | | /// StringData / NullableStringData control which hash map is used for string keys: |
67 | | /// - AggregatedDataVariants uses StringHashMap (AggregatedDataWithShortStringKey) |
68 | | /// - BucketedAggDataVariants uses PHHashMap<StringRef> (AggregatedDataWithStringKey) |
69 | | /// to avoid StringHashMap's sub-table complexity and unify the emplace interface. |
70 | | template <typename StringData, typename NullableStringData> |
71 | | using AggMethodVariantsBase = std::variant< |
72 | | std::monostate, MethodSerialized<AggregatedDataWithStringKey>, |
73 | | MethodOneNumber<UInt8, AggData<UInt8>>, MethodOneNumber<UInt16, AggData<UInt16>>, |
74 | | MethodOneNumber<UInt32, AggData<UInt32>>, MethodOneNumber<UInt64, AggData<UInt64>>, |
75 | | MethodStringNoCache<StringData>, MethodOneNumber<UInt128, AggData<UInt128>>, |
76 | | MethodOneNumber<UInt256, AggData<UInt256>>, |
77 | | MethodOneNumber<UInt32, AggregatedDataWithUInt32KeyPhase2>, |
78 | | MethodOneNumber<UInt64, AggregatedDataWithUInt64KeyPhase2>, |
79 | | MethodSingleNullableColumn<MethodOneNumber<UInt8, AggDataNullable<UInt8>>>, |
80 | | MethodSingleNullableColumn<MethodOneNumber<UInt16, AggDataNullable<UInt16>>>, |
81 | | MethodSingleNullableColumn<MethodOneNumber<UInt32, AggDataNullable<UInt32>>>, |
82 | | MethodSingleNullableColumn<MethodOneNumber<UInt64, AggDataNullable<UInt64>>>, |
83 | | MethodSingleNullableColumn< |
84 | | MethodOneNumber<UInt32, AggregatedDataWithNullableUInt32KeyPhase2>>, |
85 | | MethodSingleNullableColumn< |
86 | | MethodOneNumber<UInt64, AggregatedDataWithNullableUInt64KeyPhase2>>, |
87 | | MethodSingleNullableColumn<MethodOneNumber<UInt128, AggDataNullable<UInt128>>>, |
88 | | MethodSingleNullableColumn<MethodOneNumber<UInt256, AggDataNullable<UInt256>>>, |
89 | | MethodSingleNullableColumn<MethodStringNoCache<NullableStringData>>, |
90 | | MethodKeysFixed<AggData<UInt64>>, MethodKeysFixed<AggData<UInt72>>, |
91 | | MethodKeysFixed<AggData<UInt96>>, MethodKeysFixed<AggData<UInt104>>, |
92 | | MethodKeysFixed<AggData<UInt128>>, MethodKeysFixed<AggData<UInt136>>, |
93 | | MethodKeysFixed<AggData<UInt256>>>; |
94 | | |
95 | | using AggregatedMethodVariants = AggMethodVariantsBase<AggregatedDataWithShortStringKey, |
96 | | AggregatedDataWithNullableShortStringKey>; |
97 | | |
98 | | /// Bucketed agg uses PHHashMap<StringRef> for string keys instead of StringHashMap. |
99 | | /// This avoids StringHashMap's sub-table complexity and unifies the emplace interface |
100 | | /// (3-arg PHHashMap::emplace), while still using HashMethodString for correct |
101 | | /// single-column string key extraction. |
102 | | using BucketedAggMethodVariants = |
103 | | AggMethodVariantsBase<AggregatedDataWithStringKey, AggregatedDataWithNullableStringKey>; |
104 | | |
105 | | /// Intermediate base that adds the shared init logic for aggregation data |
106 | | /// variants. Only the string_key case differs between AggregatedDataVariants |
107 | | /// and BucketedAggDataVariants; all other key types are identical. The |
108 | | /// StringData/NullableStringData template parameters control which hash map |
109 | | /// type is emplaced for string_key. |
110 | | template <typename MethodVariants, typename StringData, typename NullableStringData> |
111 | | struct AggDataVariantsBase : public DataVariants<MethodVariants, MethodSingleNullableColumn, |
112 | | MethodOneNumber, DataWithNullKey> { |
113 | 124k | void init_agg_data(const std::vector<DataTypePtr>& data_types, HashKeyType type) { |
114 | 124k | bool nullable = data_types.size() == 1 && data_types[0]->is_nullable(); |
115 | | |
116 | 124k | switch (type) { |
117 | 1 | case HashKeyType::without_key: |
118 | 1 | break; |
119 | 21.1k | case HashKeyType::serialized: |
120 | 21.1k | this->method_variant.template emplace<MethodSerialized<AggregatedDataWithStringKey>>(); |
121 | 21.1k | break; |
122 | 4.42k | case HashKeyType::int8_key: |
123 | 4.42k | this->template emplace_single<UInt8, AggData<UInt8>>(nullable); |
124 | 4.42k | break; |
125 | 5.70k | case HashKeyType::int16_key: |
126 | 5.70k | this->template emplace_single<UInt16, AggData<UInt16>>(nullable); |
127 | 5.70k | break; |
128 | 16.1k | case HashKeyType::int32_key: |
129 | 16.1k | this->template emplace_single<UInt32, AggData<UInt32>>(nullable); |
130 | 16.1k | break; |
131 | 14.8k | case HashKeyType::int32_key_phase2: |
132 | 14.8k | this->template emplace_single<UInt32, AggregatedDataWithUInt32KeyPhase2>(nullable); |
133 | 14.8k | break; |
134 | 8.42k | case HashKeyType::int64_key: |
135 | 8.42k | this->template emplace_single<UInt64, AggData<UInt64>>(nullable); |
136 | 8.42k | break; |
137 | 4.07k | case HashKeyType::int64_key_phase2: |
138 | 4.07k | this->template emplace_single<UInt64, AggregatedDataWithUInt64KeyPhase2>(nullable); |
139 | 4.07k | break; |
140 | 578 | case HashKeyType::int128_key: |
141 | 578 | this->template emplace_single<UInt128, AggData<UInt128>>(nullable); |
142 | 578 | break; |
143 | 12 | case HashKeyType::int256_key: |
144 | 12 | this->template emplace_single<UInt256, AggData<UInt256>>(nullable); |
145 | 12 | break; |
146 | 18.8k | case HashKeyType::string_key: |
147 | 18.8k | if (nullable) { |
148 | 10.7k | this->method_variant.template emplace< |
149 | 10.7k | MethodSingleNullableColumn<MethodStringNoCache<NullableStringData>>>(); |
150 | 10.7k | } else { |
151 | 8.09k | this->method_variant.template emplace<MethodStringNoCache<StringData>>(); |
152 | 8.09k | } |
153 | 18.8k | break; |
154 | 841 | case HashKeyType::fixed64: |
155 | 841 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt64>>>( |
156 | 841 | get_key_sizes(data_types)); |
157 | 841 | break; |
158 | 1.03k | case HashKeyType::fixed72: |
159 | 1.03k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt72>>>( |
160 | 1.03k | get_key_sizes(data_types)); |
161 | 1.03k | break; |
162 | 848 | case HashKeyType::fixed96: |
163 | 848 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt96>>>( |
164 | 848 | get_key_sizes(data_types)); |
165 | 848 | break; |
166 | 695 | case HashKeyType::fixed104: |
167 | 695 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt104>>>( |
168 | 695 | get_key_sizes(data_types)); |
169 | 695 | break; |
170 | 87 | case HashKeyType::fixed128: |
171 | 87 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt128>>>( |
172 | 87 | get_key_sizes(data_types)); |
173 | 87 | break; |
174 | 23.5k | case HashKeyType::fixed136: |
175 | 23.5k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt136>>>( |
176 | 23.5k | get_key_sizes(data_types)); |
177 | 23.5k | break; |
178 | 3.09k | case HashKeyType::fixed256: |
179 | 3.09k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt256>>>( |
180 | 3.09k | get_key_sizes(data_types)); |
181 | 3.09k | break; |
182 | 1 | default: |
183 | 1 | throw Exception(ErrorCode::INTERNAL_ERROR, "meet invalid agg key type, type={}", type); |
184 | 124k | } |
185 | 124k | } _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 | 113 | 50.8k | void init_agg_data(const std::vector<DataTypePtr>& data_types, HashKeyType type) { | 114 | 50.8k | bool nullable = data_types.size() == 1 && data_types[0]->is_nullable(); | 115 | | | 116 | 50.8k | switch (type) { | 117 | 1 | case HashKeyType::without_key: | 118 | 1 | break; | 119 | 7.53k | case HashKeyType::serialized: | 120 | 7.53k | this->method_variant.template emplace<MethodSerialized<AggregatedDataWithStringKey>>(); | 121 | 7.53k | break; | 122 | 3.05k | case HashKeyType::int8_key: | 123 | 3.05k | this->template emplace_single<UInt8, AggData<UInt8>>(nullable); | 124 | 3.05k | break; | 125 | 819 | case HashKeyType::int16_key: | 126 | 819 | this->template emplace_single<UInt16, AggData<UInt16>>(nullable); | 127 | 819 | break; | 128 | 4.19k | case HashKeyType::int32_key: | 129 | 4.19k | this->template emplace_single<UInt32, AggData<UInt32>>(nullable); | 130 | 4.19k | break; | 131 | 14.8k | case HashKeyType::int32_key_phase2: | 132 | 14.8k | this->template emplace_single<UInt32, AggregatedDataWithUInt32KeyPhase2>(nullable); | 133 | 14.8k | break; | 134 | 1.96k | case HashKeyType::int64_key: | 135 | 1.96k | this->template emplace_single<UInt64, AggData<UInt64>>(nullable); | 136 | 1.96k | break; | 137 | 4.07k | case HashKeyType::int64_key_phase2: | 138 | 4.07k | this->template emplace_single<UInt64, AggregatedDataWithUInt64KeyPhase2>(nullable); | 139 | 4.07k | break; | 140 | 578 | case HashKeyType::int128_key: | 141 | 578 | this->template emplace_single<UInt128, AggData<UInt128>>(nullable); | 142 | 578 | break; | 143 | 12 | case HashKeyType::int256_key: | 144 | 12 | this->template emplace_single<UInt256, AggData<UInt256>>(nullable); | 145 | 12 | break; | 146 | 5.70k | case HashKeyType::string_key: | 147 | 5.70k | if (nullable) { | 148 | 4.97k | this->method_variant.template emplace< | 149 | 4.97k | MethodSingleNullableColumn<MethodStringNoCache<NullableStringData>>>(); | 150 | 4.97k | } else { | 151 | 723 | this->method_variant.template emplace<MethodStringNoCache<StringData>>(); | 152 | 723 | } | 153 | 5.70k | break; | 154 | 841 | case HashKeyType::fixed64: | 155 | 841 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt64>>>( | 156 | 841 | get_key_sizes(data_types)); | 157 | 841 | break; | 158 | 1.03k | case HashKeyType::fixed72: | 159 | 1.03k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt72>>>( | 160 | 1.03k | get_key_sizes(data_types)); | 161 | 1.03k | break; | 162 | 592 | case HashKeyType::fixed96: | 163 | 592 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt96>>>( | 164 | 592 | get_key_sizes(data_types)); | 165 | 592 | break; | 166 | 695 | case HashKeyType::fixed104: | 167 | 695 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt104>>>( | 168 | 695 | get_key_sizes(data_types)); | 169 | 695 | break; | 170 | 87 | case HashKeyType::fixed128: | 171 | 87 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt128>>>( | 172 | 87 | get_key_sizes(data_types)); | 173 | 87 | break; | 174 | 1.82k | case HashKeyType::fixed136: | 175 | 1.82k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt136>>>( | 176 | 1.82k | get_key_sizes(data_types)); | 177 | 1.82k | break; | 178 | 3.09k | case HashKeyType::fixed256: | 179 | 3.09k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt256>>>( | 180 | 3.09k | get_key_sizes(data_types)); | 181 | 3.09k | break; | 182 | 1 | default: | 183 | 1 | throw Exception(ErrorCode::INTERNAL_ERROR, "meet invalid agg key type, type={}", type); | 184 | 50.8k | } | 185 | 50.8k | } |
_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 | 113 | 73.5k | void init_agg_data(const std::vector<DataTypePtr>& data_types, HashKeyType type) { | 114 | 73.5k | bool nullable = data_types.size() == 1 && data_types[0]->is_nullable(); | 115 | | | 116 | 73.5k | switch (type) { | 117 | 0 | case HashKeyType::without_key: | 118 | 0 | break; | 119 | 13.5k | case HashKeyType::serialized: | 120 | 13.5k | this->method_variant.template emplace<MethodSerialized<AggregatedDataWithStringKey>>(); | 121 | 13.5k | break; | 122 | 1.37k | case HashKeyType::int8_key: | 123 | 1.37k | this->template emplace_single<UInt8, AggData<UInt8>>(nullable); | 124 | 1.37k | break; | 125 | 4.88k | case HashKeyType::int16_key: | 126 | 4.88k | this->template emplace_single<UInt16, AggData<UInt16>>(nullable); | 127 | 4.88k | break; | 128 | 11.9k | case HashKeyType::int32_key: | 129 | 11.9k | this->template emplace_single<UInt32, AggData<UInt32>>(nullable); | 130 | 11.9k | break; | 131 | 0 | case HashKeyType::int32_key_phase2: | 132 | 0 | this->template emplace_single<UInt32, AggregatedDataWithUInt32KeyPhase2>(nullable); | 133 | 0 | break; | 134 | 6.45k | case HashKeyType::int64_key: | 135 | 6.45k | this->template emplace_single<UInt64, AggData<UInt64>>(nullable); | 136 | 6.45k | break; | 137 | 0 | case HashKeyType::int64_key_phase2: | 138 | 0 | this->template emplace_single<UInt64, AggregatedDataWithUInt64KeyPhase2>(nullable); | 139 | 0 | break; | 140 | 0 | case HashKeyType::int128_key: | 141 | 0 | this->template emplace_single<UInt128, AggData<UInt128>>(nullable); | 142 | 0 | break; | 143 | 0 | case HashKeyType::int256_key: | 144 | 0 | this->template emplace_single<UInt256, AggData<UInt256>>(nullable); | 145 | 0 | break; | 146 | 13.1k | case HashKeyType::string_key: | 147 | 13.1k | if (nullable) { | 148 | 5.77k | this->method_variant.template emplace< | 149 | 5.77k | MethodSingleNullableColumn<MethodStringNoCache<NullableStringData>>>(); | 150 | 7.36k | } else { | 151 | 7.36k | this->method_variant.template emplace<MethodStringNoCache<StringData>>(); | 152 | 7.36k | } | 153 | 13.1k | break; | 154 | 0 | case HashKeyType::fixed64: | 155 | 0 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt64>>>( | 156 | 0 | get_key_sizes(data_types)); | 157 | 0 | break; | 158 | 0 | case HashKeyType::fixed72: | 159 | 0 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt72>>>( | 160 | 0 | get_key_sizes(data_types)); | 161 | 0 | break; | 162 | 256 | case HashKeyType::fixed96: | 163 | 256 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt96>>>( | 164 | 256 | get_key_sizes(data_types)); | 165 | 256 | break; | 166 | 0 | case HashKeyType::fixed104: | 167 | 0 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt104>>>( | 168 | 0 | get_key_sizes(data_types)); | 169 | 0 | break; | 170 | 0 | case HashKeyType::fixed128: | 171 | 0 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt128>>>( | 172 | 0 | get_key_sizes(data_types)); | 173 | 0 | break; | 174 | 21.7k | case HashKeyType::fixed136: | 175 | 21.7k | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt136>>>( | 176 | 21.7k | get_key_sizes(data_types)); | 177 | 21.7k | break; | 178 | 0 | case HashKeyType::fixed256: | 179 | 0 | this->method_variant.template emplace<MethodKeysFixed<AggData<UInt256>>>( | 180 | 0 | get_key_sizes(data_types)); | 181 | 0 | break; | 182 | 0 | default: | 183 | 0 | throw Exception(ErrorCode::INTERNAL_ERROR, "meet invalid agg key type, type={}", type); | 184 | 73.5k | } | 185 | 73.5k | } |
|
186 | | }; |
187 | | |
188 | | struct AggregatedDataVariants |
189 | | : public AggDataVariantsBase<AggregatedMethodVariants, AggregatedDataWithShortStringKey, |
190 | | AggregatedDataWithNullableShortStringKey> { |
191 | | AggregatedDataWithoutKey without_key = nullptr; |
192 | | |
193 | | bool is_fixed_key = true; |
194 | | |
195 | 50.9k | void init(const std::vector<DataTypePtr>& data_types, HashKeyType type) { |
196 | 51.0k | is_fixed_key = !(type == HashKeyType::without_key || type == HashKeyType::EMPTY || |
197 | 51.1k | type == HashKeyType::serialized || type == HashKeyType::string_key); |
198 | 50.9k | this->init_agg_data(data_types, type); |
199 | 50.9k | } |
200 | | }; |
201 | | |
202 | | using AggregatedDataVariantsUPtr = std::unique_ptr<AggregatedDataVariants>; |
203 | | using ArenaUPtr = std::unique_ptr<Arena>; |
204 | | |
205 | | /// Data variants for bucketed hash aggregation. |
206 | | /// Uses BucketedAggMethodVariants (PHHashMap for string keys). |
207 | | struct BucketedAggDataVariants |
208 | | : public AggDataVariantsBase<BucketedAggMethodVariants, AggregatedDataWithStringKey, |
209 | | AggregatedDataWithNullableStringKey> { |
210 | 75.6k | void init(const std::vector<DataTypePtr>& data_types, HashKeyType type) { |
211 | 75.6k | this->init_agg_data(data_types, type); |
212 | 75.6k | } |
213 | | }; |
214 | | |
215 | | using BucketedAggDataVariantsUPtr = std::unique_ptr<BucketedAggDataVariants>; |
216 | | |
217 | | struct AggregateDataContainer { |
218 | | public: |
219 | | AggregateDataContainer(size_t size_of_key, size_t size_of_aggregate_states) |
220 | 49.0k | : _size_of_key(size_of_key), _size_of_aggregate_states(size_of_aggregate_states) {} |
221 | | |
222 | 53.7k | int64_t memory_usage() const { return _arena_pool.size(); } |
223 | | |
224 | | template <typename KeyType> |
225 | 2.58M | AggregateDataPtr append_data(const KeyType& key) { |
226 | 2.58M | DCHECK_EQ(sizeof(KeyType), _size_of_key); |
227 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero |
228 | 2.58M | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { |
229 | 23.2k | _expand(); |
230 | 23.2k | } |
231 | | |
232 | 2.58M | *reinterpret_cast<KeyType*>(_current_keys) = key; |
233 | 2.58M | auto* aggregate_data = _current_agg_data; |
234 | 2.58M | ++_total_count; |
235 | 2.58M | ++_index_in_sub_container; |
236 | 2.58M | _current_agg_data += _size_of_aggregate_states; |
237 | 2.58M | _current_keys += _size_of_key; |
238 | 2.58M | return aggregate_data; |
239 | 2.58M | } _ZN5doris22AggregateDataContainer11append_dataINS_9StringRefEEEPcRKT_ Line | Count | Source | 225 | 102k | AggregateDataPtr append_data(const KeyType& key) { | 226 | 102k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 227 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 228 | 102k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 229 | 5.10k | _expand(); | 230 | 5.10k | } | 231 | | | 232 | 102k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 233 | 102k | auto* aggregate_data = _current_agg_data; | 234 | 102k | ++_total_count; | 235 | 102k | ++_index_in_sub_container; | 236 | 102k | _current_agg_data += _size_of_aggregate_states; | 237 | 102k | _current_keys += _size_of_key; | 238 | 102k | return aggregate_data; | 239 | 102k | } |
_ZN5doris22AggregateDataContainer11append_dataIhEEPcRKT_ Line | Count | Source | 225 | 3.10k | AggregateDataPtr append_data(const KeyType& key) { | 226 | 3.10k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 227 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 228 | 3.10k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 229 | 1.56k | _expand(); | 230 | 1.56k | } | 231 | | | 232 | 3.10k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 233 | 3.10k | auto* aggregate_data = _current_agg_data; | 234 | 3.10k | ++_total_count; | 235 | 3.10k | ++_index_in_sub_container; | 236 | 3.10k | _current_agg_data += _size_of_aggregate_states; | 237 | 3.10k | _current_keys += _size_of_key; | 238 | 3.10k | return aggregate_data; | 239 | 3.10k | } |
_ZN5doris22AggregateDataContainer11append_dataItEEPcRKT_ Line | Count | Source | 225 | 749 | AggregateDataPtr append_data(const KeyType& key) { | 226 | 749 | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 227 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 228 | 749 | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 229 | 263 | _expand(); | 230 | 263 | } | 231 | | | 232 | 749 | *reinterpret_cast<KeyType*>(_current_keys) = key; | 233 | 749 | auto* aggregate_data = _current_agg_data; | 234 | 749 | ++_total_count; | 235 | 749 | ++_index_in_sub_container; | 236 | 749 | _current_agg_data += _size_of_aggregate_states; | 237 | 749 | _current_keys += _size_of_key; | 238 | 749 | return aggregate_data; | 239 | 749 | } |
_ZN5doris22AggregateDataContainer11append_dataIjEEPcRKT_ Line | Count | Source | 225 | 2.14M | AggregateDataPtr append_data(const KeyType& key) { | 226 | 2.14M | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 227 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 228 | 2.14M | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 229 | 10.4k | _expand(); | 230 | 10.4k | } | 231 | | | 232 | 2.14M | *reinterpret_cast<KeyType*>(_current_keys) = key; | 233 | 2.14M | auto* aggregate_data = _current_agg_data; | 234 | 2.14M | ++_total_count; | 235 | 2.14M | ++_index_in_sub_container; | 236 | 2.14M | _current_agg_data += _size_of_aggregate_states; | 237 | 2.14M | _current_keys += _size_of_key; | 238 | 2.14M | return aggregate_data; | 239 | 2.14M | } |
_ZN5doris22AggregateDataContainer11append_dataImEEPcRKT_ Line | Count | Source | 225 | 302k | AggregateDataPtr append_data(const KeyType& key) { | 226 | 302k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 227 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 228 | 302k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 229 | 2.75k | _expand(); | 230 | 2.75k | } | 231 | | | 232 | 302k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 233 | 302k | auto* aggregate_data = _current_agg_data; | 234 | 302k | ++_total_count; | 235 | 302k | ++_index_in_sub_container; | 236 | 302k | _current_agg_data += _size_of_aggregate_states; | 237 | 302k | _current_keys += _size_of_key; | 238 | 302k | return aggregate_data; | 239 | 302k | } |
_ZN5doris22AggregateDataContainer11append_dataIN4wide7integerILm128EjEEEEPcRKT_ Line | Count | Source | 225 | 11.6k | AggregateDataPtr append_data(const KeyType& key) { | 226 | 11.6k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 227 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 228 | 11.6k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 229 | 229 | _expand(); | 230 | 229 | } | 231 | | | 232 | 11.6k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 233 | 11.6k | auto* aggregate_data = _current_agg_data; | 234 | 11.6k | ++_total_count; | 235 | 11.6k | ++_index_in_sub_container; | 236 | 11.6k | _current_agg_data += _size_of_aggregate_states; | 237 | 11.6k | _current_keys += _size_of_key; | 238 | 11.6k | return aggregate_data; | 239 | 11.6k | } |
_ZN5doris22AggregateDataContainer11append_dataIN4wide7integerILm256EjEEEEPcRKT_ Line | Count | Source | 225 | 7.15k | AggregateDataPtr append_data(const KeyType& key) { | 226 | 7.15k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 227 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 228 | 7.15k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 229 | 674 | _expand(); | 230 | 674 | } | 231 | | | 232 | 7.15k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 233 | 7.15k | auto* aggregate_data = _current_agg_data; | 234 | 7.15k | ++_total_count; | 235 | 7.15k | ++_index_in_sub_container; | 236 | 7.15k | _current_agg_data += _size_of_aggregate_states; | 237 | 7.15k | _current_keys += _size_of_key; | 238 | 7.15k | return aggregate_data; | 239 | 7.15k | } |
_ZN5doris22AggregateDataContainer11append_dataINS_6UInt72EEEPcRKT_ Line | Count | Source | 225 | 1.01k | AggregateDataPtr append_data(const KeyType& key) { | 226 | 1.01k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 227 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 228 | 1.01k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 229 | 418 | _expand(); | 230 | 418 | } | 231 | | | 232 | 1.01k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 233 | 1.01k | auto* aggregate_data = _current_agg_data; | 234 | 1.01k | ++_total_count; | 235 | 1.01k | ++_index_in_sub_container; | 236 | 1.01k | _current_agg_data += _size_of_aggregate_states; | 237 | 1.01k | _current_keys += _size_of_key; | 238 | 1.01k | return aggregate_data; | 239 | 1.01k | } |
_ZN5doris22AggregateDataContainer11append_dataINS_6UInt96EEEPcRKT_ Line | Count | Source | 225 | 7.67k | AggregateDataPtr append_data(const KeyType& key) { | 226 | 7.67k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 227 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 228 | 7.67k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 229 | 557 | _expand(); | 230 | 557 | } | 231 | | | 232 | 7.67k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 233 | 7.67k | auto* aggregate_data = _current_agg_data; | 234 | 7.67k | ++_total_count; | 235 | 7.67k | ++_index_in_sub_container; | 236 | 7.67k | _current_agg_data += _size_of_aggregate_states; | 237 | 7.67k | _current_keys += _size_of_key; | 238 | 7.67k | return aggregate_data; | 239 | 7.67k | } |
_ZN5doris22AggregateDataContainer11append_dataINS_7UInt104EEEPcRKT_ Line | Count | Source | 225 | 727 | AggregateDataPtr append_data(const KeyType& key) { | 226 | 727 | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 227 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 228 | 727 | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 229 | 354 | _expand(); | 230 | 354 | } | 231 | | | 232 | 727 | *reinterpret_cast<KeyType*>(_current_keys) = key; | 233 | 727 | auto* aggregate_data = _current_agg_data; | 234 | 727 | ++_total_count; | 235 | 727 | ++_index_in_sub_container; | 236 | 727 | _current_agg_data += _size_of_aggregate_states; | 237 | 727 | _current_keys += _size_of_key; | 238 | 727 | return aggregate_data; | 239 | 727 | } |
_ZN5doris22AggregateDataContainer11append_dataINS_7UInt136EEEPcRKT_ Line | Count | Source | 225 | 2.59k | AggregateDataPtr append_data(const KeyType& key) { | 226 | 2.59k | DCHECK_EQ(sizeof(KeyType), _size_of_key); | 227 | | // SUB_CONTAINER_CAPACITY should add a new sub container, and also expand when it is zero | 228 | 2.59k | if (UNLIKELY(_index_in_sub_container % SUB_CONTAINER_CAPACITY == 0)) { | 229 | 887 | _expand(); | 230 | 887 | } | 231 | | | 232 | 2.59k | *reinterpret_cast<KeyType*>(_current_keys) = key; | 233 | 2.59k | auto* aggregate_data = _current_agg_data; | 234 | 2.59k | ++_total_count; | 235 | 2.59k | ++_index_in_sub_container; | 236 | 2.59k | _current_agg_data += _size_of_aggregate_states; | 237 | 2.59k | _current_keys += _size_of_key; | 238 | 2.59k | return aggregate_data; | 239 | 2.59k | } |
|
240 | | |
241 | | template <typename Derived, bool IsConst> |
242 | | class IteratorBase { |
243 | | using Container = |
244 | | std::conditional_t<IsConst, const AggregateDataContainer, AggregateDataContainer>; |
245 | | |
246 | | Container* container = nullptr; |
247 | | uint32_t index; |
248 | | uint32_t sub_container_index; |
249 | | uint32_t index_in_sub_container; |
250 | | |
251 | | friend class HashTable; |
252 | | |
253 | | public: |
254 | 49.0k | IteratorBase() = default; |
255 | | IteratorBase(Container* container_, uint32_t index_) |
256 | 2.54M | : container(container_), index(index_) { |
257 | 2.54M | sub_container_index = index / SUB_CONTAINER_CAPACITY; |
258 | 2.54M | index_in_sub_container = index - sub_container_index * SUB_CONTAINER_CAPACITY; |
259 | 2.54M | } |
260 | | |
261 | 46.4k | bool operator==(const IteratorBase& rhs) const { return index == rhs.index; } |
262 | 2.45M | bool operator!=(const IteratorBase& rhs) const { return index != rhs.index; } |
263 | | |
264 | 2.41M | Derived& operator++() { |
265 | 2.41M | index++; |
266 | 2.41M | index_in_sub_container++; |
267 | 2.41M | if (index_in_sub_container == SUB_CONTAINER_CAPACITY) { |
268 | 242 | index_in_sub_container = 0; |
269 | 242 | sub_container_index++; |
270 | 242 | } |
271 | 2.41M | return static_cast<Derived&>(*this); |
272 | 2.41M | } |
273 | | |
274 | | template <typename KeyType> |
275 | 2.40M | KeyType get_key() { |
276 | 2.40M | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); |
277 | 2.40M | return ((KeyType*)(container->_key_containers[sub_container_index])) |
278 | 2.40M | [index_in_sub_container]; |
279 | 2.40M | } _ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_9StringRefEEET_v Line | Count | Source | 275 | 123k | KeyType get_key() { | 276 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 277 | 123k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 278 | 123k | [index_in_sub_container]; | 279 | 123k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyIhEET_v Line | Count | Source | 275 | 3.11k | KeyType get_key() { | 276 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 277 | 3.11k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 278 | 3.11k | [index_in_sub_container]; | 279 | 3.11k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyItEET_v Line | Count | Source | 275 | 749 | KeyType get_key() { | 276 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 277 | 749 | return ((KeyType*)(container->_key_containers[sub_container_index])) | 278 | 749 | [index_in_sub_container]; | 279 | 749 | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyIjEET_v Line | Count | Source | 275 | 1.95M | KeyType get_key() { | 276 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 277 | 1.95M | return ((KeyType*)(container->_key_containers[sub_container_index])) | 278 | 1.95M | [index_in_sub_container]; | 279 | 1.95M | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyImEET_v Line | Count | Source | 275 | 284k | KeyType get_key() { | 276 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 277 | 284k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 278 | 284k | [index_in_sub_container]; | 279 | 284k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyIN4wide7integerILm128EjEEEET_v Line | Count | Source | 275 | 11.7k | KeyType get_key() { | 276 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 277 | 11.7k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 278 | 11.7k | [index_in_sub_container]; | 279 | 11.7k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyIN4wide7integerILm256EjEEEET_v Line | Count | Source | 275 | 11.2k | KeyType get_key() { | 276 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 277 | 11.2k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 278 | 11.2k | [index_in_sub_container]; | 279 | 11.2k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_6UInt72EEET_v Line | Count | Source | 275 | 1.01k | KeyType get_key() { | 276 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 277 | 1.01k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 278 | 1.01k | [index_in_sub_container]; | 279 | 1.01k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_6UInt96EEET_v Line | Count | Source | 275 | 7.72k | KeyType get_key() { | 276 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 277 | 7.72k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 278 | 7.72k | [index_in_sub_container]; | 279 | 7.72k | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_7UInt104EEET_v Line | Count | Source | 275 | 725 | KeyType get_key() { | 276 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 277 | 725 | return ((KeyType*)(container->_key_containers[sub_container_index])) | 278 | 725 | [index_in_sub_container]; | 279 | 725 | } |
_ZN5doris22AggregateDataContainer12IteratorBaseINS0_8IteratorELb0EE7get_keyINS_7UInt136EEET_v Line | Count | Source | 275 | 2.59k | KeyType get_key() { | 276 | | DCHECK_EQ(sizeof(KeyType), container->_size_of_key); | 277 | 2.59k | return ((KeyType*)(container->_key_containers[sub_container_index])) | 278 | 2.59k | [index_in_sub_container]; | 279 | 2.59k | } |
|
280 | | |
281 | 2.38M | AggregateDataPtr get_aggregate_data() { |
282 | 2.38M | return &(container->_value_containers[sub_container_index] |
283 | 2.38M | [container->_size_of_aggregate_states * |
284 | 2.38M | index_in_sub_container]); |
285 | 2.38M | } |
286 | | }; |
287 | | |
288 | | class Iterator : public IteratorBase<Iterator, false> { |
289 | | public: |
290 | | using IteratorBase<Iterator, false>::IteratorBase; |
291 | | }; |
292 | | |
293 | | class ConstIterator : public IteratorBase<ConstIterator, true> { |
294 | | public: |
295 | | using IteratorBase<ConstIterator, true>::IteratorBase; |
296 | | }; |
297 | | |
298 | | ConstIterator begin() const { return {this, 0}; } |
299 | | |
300 | | ConstIterator cbegin() const { return begin(); } |
301 | | |
302 | 46.4k | Iterator begin() { return {this, 0}; } |
303 | | |
304 | | ConstIterator end() const { return {this, _total_count}; } |
305 | | ConstIterator cend() const { return end(); } |
306 | 2.50M | Iterator end() { return {this, _total_count}; } |
307 | | |
308 | 10 | [[nodiscard]] uint32_t total_count() const { return _total_count; } |
309 | | |
310 | 19 | size_t estimate_memory(size_t rows) const { |
311 | 19 | bool need_to_expand = false; |
312 | 19 | if (_total_count == 0) { |
313 | 1 | need_to_expand = true; |
314 | 18 | } else if ((_index_in_sub_container + rows) > SUB_CONTAINER_CAPACITY) { |
315 | 2 | need_to_expand = true; |
316 | 2 | rows -= (SUB_CONTAINER_CAPACITY - _index_in_sub_container); |
317 | 2 | } |
318 | | |
319 | 19 | if (!need_to_expand) { |
320 | 16 | return 0; |
321 | 16 | } |
322 | | |
323 | 3 | size_t count = (rows + SUB_CONTAINER_CAPACITY - 1) / SUB_CONTAINER_CAPACITY; |
324 | 3 | size_t size = _size_of_key * SUB_CONTAINER_CAPACITY; |
325 | 3 | size += _size_of_aggregate_states * SUB_CONTAINER_CAPACITY; |
326 | 3 | size *= count; |
327 | 3 | return size; |
328 | 19 | } |
329 | | |
330 | 46.7k | void init_once() { |
331 | 46.7k | if (_inited) { |
332 | 386 | return; |
333 | 386 | } |
334 | 46.3k | _inited = true; |
335 | 46.3k | iterator = begin(); |
336 | 46.3k | } |
337 | | Iterator iterator; |
338 | | |
339 | | private: |
340 | 23.2k | void _expand() { |
341 | 23.2k | _index_in_sub_container = 0; |
342 | 23.2k | _current_keys = nullptr; |
343 | 23.2k | _current_agg_data = nullptr; |
344 | 23.2k | try { |
345 | 23.2k | _current_keys = _arena_pool.alloc(_size_of_key * SUB_CONTAINER_CAPACITY); |
346 | 23.2k | _key_containers.emplace_back(_current_keys); |
347 | | |
348 | 23.2k | _current_agg_data = (AggregateDataPtr)_arena_pool.alloc(_size_of_aggregate_states * |
349 | 23.2k | SUB_CONTAINER_CAPACITY); |
350 | 23.2k | _value_containers.emplace_back(_current_agg_data); |
351 | 23.2k | } catch (...) { |
352 | 0 | if (_current_keys) { |
353 | 0 | _key_containers.pop_back(); |
354 | 0 | _current_keys = nullptr; |
355 | 0 | } |
356 | 0 | if (_current_agg_data) { |
357 | 0 | _value_containers.pop_back(); |
358 | 0 | _current_agg_data = nullptr; |
359 | 0 | } |
360 | 0 | throw; |
361 | 0 | } |
362 | 23.2k | } |
363 | | |
364 | | static constexpr uint32_t SUB_CONTAINER_CAPACITY = 8192; |
365 | | Arena _arena_pool; |
366 | | std::vector<char*> _key_containers; |
367 | | std::vector<AggregateDataPtr> _value_containers; |
368 | | AggregateDataPtr _current_agg_data = nullptr; |
369 | | char* _current_keys = nullptr; |
370 | | size_t _size_of_key {}; |
371 | | size_t _size_of_aggregate_states {}; |
372 | | uint32_t _index_in_sub_container {}; |
373 | | uint32_t _total_count {}; |
374 | | bool _inited = false; |
375 | | }; |
376 | | } // namespace doris |