Coverage Report

Created: 2026-04-03 04:27

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/util/bitmap_intersect.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
#pragma once
18
#include <parallel_hashmap/phmap.h>
19
20
#include "common/cast_set.h"
21
#include "core/string_ref.h"
22
#include "core/value/bitmap_value.h"
23
24
namespace doris {
25
#include "common/compile_check_begin.h"
26
27
namespace detail {
28
class Helper {
29
public:
30
    static const int DATETIME_PACKED_TIME_BYTE_SIZE = 8;
31
    static const int DATETIME_TYPE_BYTE_SIZE = 4;
32
    static const int DECIMAL_BYTE_SIZE = 16;
33
34
    // serialize_size start
35
    template <typename T>
36
325
    static int32_t serialize_size(const T& v) {
37
325
        return sizeof(T);
38
325
    }
_ZN5doris6detail6Helper14serialize_sizeIaEEiRKT_
Line
Count
Source
36
6
    static int32_t serialize_size(const T& v) {
37
6
        return sizeof(T);
38
6
    }
_ZN5doris6detail6Helper14serialize_sizeIsEEiRKT_
Line
Count
Source
36
7
    static int32_t serialize_size(const T& v) {
37
7
        return sizeof(T);
38
7
    }
_ZN5doris6detail6Helper14serialize_sizeIiEEiRKT_
Line
Count
Source
36
312
    static int32_t serialize_size(const T& v) {
37
312
        return sizeof(T);
38
312
    }
Unexecuted instantiation: _ZN5doris6detail6Helper14serialize_sizeIlEEiRKT_
Unexecuted instantiation: _ZN5doris6detail6Helper14serialize_sizeInEEiRKT_
39
40
    // write_to start
41
    template <typename T>
42
325
    static char* write_to(const T& v, char* dest) {
43
325
        size_t type_size = sizeof(T);
44
325
        memcpy(dest, &v, type_size);
45
325
        dest += type_size;
46
325
        return dest;
47
325
    }
_ZN5doris6detail6Helper8write_toIaEEPcRKT_S3_
Line
Count
Source
42
6
    static char* write_to(const T& v, char* dest) {
43
6
        size_t type_size = sizeof(T);
44
6
        memcpy(dest, &v, type_size);
45
6
        dest += type_size;
46
6
        return dest;
47
6
    }
_ZN5doris6detail6Helper8write_toIsEEPcRKT_S3_
Line
Count
Source
42
7
    static char* write_to(const T& v, char* dest) {
43
7
        size_t type_size = sizeof(T);
44
7
        memcpy(dest, &v, type_size);
45
7
        dest += type_size;
46
7
        return dest;
47
7
    }
_ZN5doris6detail6Helper8write_toIiEEPcRKT_S3_
Line
Count
Source
42
312
    static char* write_to(const T& v, char* dest) {
43
312
        size_t type_size = sizeof(T);
44
312
        memcpy(dest, &v, type_size);
45
312
        dest += type_size;
46
312
        return dest;
47
312
    }
Unexecuted instantiation: _ZN5doris6detail6Helper8write_toIlEEPcRKT_S3_
Unexecuted instantiation: _ZN5doris6detail6Helper8write_toInEEPcRKT_S3_
48
49
    // read_from start
50
    template <typename T>
51
247
    static void read_from(const char** src, T* result) {
52
247
        size_t type_size = sizeof(T);
53
247
        memcpy(result, *src, type_size);
54
247
        *src += type_size;
55
247
    }
_ZN5doris6detail6Helper9read_fromIaEEvPPKcPT_
Line
Count
Source
51
6
    static void read_from(const char** src, T* result) {
52
6
        size_t type_size = sizeof(T);
53
6
        memcpy(result, *src, type_size);
54
6
        *src += type_size;
55
6
    }
_ZN5doris6detail6Helper9read_fromIsEEvPPKcPT_
Line
Count
Source
51
7
    static void read_from(const char** src, T* result) {
52
7
        size_t type_size = sizeof(T);
53
7
        memcpy(result, *src, type_size);
54
7
        *src += type_size;
55
7
    }
_ZN5doris6detail6Helper9read_fromIiEEvPPKcPT_
Line
Count
Source
51
234
    static void read_from(const char** src, T* result) {
52
234
        size_t type_size = sizeof(T);
53
234
        memcpy(result, *src, type_size);
54
234
        *src += type_size;
55
234
    }
Unexecuted instantiation: _ZN5doris6detail6Helper9read_fromIlEEvPPKcPT_
Unexecuted instantiation: _ZN5doris6detail6Helper9read_fromInEEvPPKcPT_
56
};
57
58
template <>
59
0
inline char* Helper::write_to<VecDateTimeValue>(const VecDateTimeValue& v, char* dest) {
60
0
    *(int64_t*)dest = v.to_int64_datetime_packed();
61
0
    dest += DATETIME_PACKED_TIME_BYTE_SIZE;
62
0
    *(int*)dest = v.type();
63
0
    dest += DATETIME_TYPE_BYTE_SIZE;
64
0
    return dest;
65
0
}
66
67
template <>
68
0
inline char* Helper::write_to<DecimalV2Value>(const DecimalV2Value& v, char* dest) {
69
0
    __int128 value = v.value();
70
0
    memcpy(dest, &value, DECIMAL_BYTE_SIZE);
71
0
    dest += DECIMAL_BYTE_SIZE;
72
0
    return dest;
73
0
}
74
75
template <>
76
0
inline char* Helper::write_to<StringRef>(const StringRef& v, char* dest) {
77
0
    *(int32_t*)dest = cast_set<int32_t>(v.size);
78
0
    dest += 4;
79
0
    memcpy(dest, v.data, v.size);
80
0
    dest += v.size;
81
0
    return dest;
82
0
}
83
84
template <>
85
6
inline char* Helper::write_to<std::string>(const std::string& v, char* dest) {
86
6
    *(uint32_t*)dest = cast_set<uint32_t>(v.size());
87
6
    dest += 4;
88
6
    memcpy(dest, v.c_str(), v.size());
89
6
    dest += v.size();
90
6
    return dest;
91
6
}
92
// write_to end
93
94
template <>
95
0
inline int32_t Helper::serialize_size<VecDateTimeValue>(const VecDateTimeValue& v) {
96
0
    return Helper::DATETIME_PACKED_TIME_BYTE_SIZE + Helper::DATETIME_TYPE_BYTE_SIZE;
97
0
}
98
99
template <>
100
0
inline int32_t Helper::serialize_size<DecimalV2Value>(const DecimalV2Value& v) {
101
0
    return Helper::DECIMAL_BYTE_SIZE;
102
0
}
103
104
template <>
105
0
inline int32_t Helper::serialize_size<StringRef>(const StringRef& v) {
106
0
    return cast_set<int32_t>(v.size + 4);
107
0
}
108
109
template <>
110
6
inline int32_t Helper::serialize_size<std::string>(const std::string& v) {
111
6
    return cast_set<int32_t>(v.size() + 4);
112
6
}
113
// serialize_size end
114
115
template <>
116
0
inline void Helper::read_from<VecDateTimeValue>(const char** src, VecDateTimeValue* result) {
117
0
    result->from_packed_time(*(int64_t*)(*src));
118
0
    *src += DATETIME_PACKED_TIME_BYTE_SIZE;
119
0
    if (*(int*)(*src) == TIME_DATE) {
120
0
        result->cast_to_date();
121
0
    }
122
0
    *src += DATETIME_TYPE_BYTE_SIZE;
123
0
}
124
125
template <>
126
0
inline void Helper::read_from<DecimalV2Value>(const char** src, DecimalV2Value* result) {
127
0
    __int128 v = 0;
128
0
    memcpy(&v, *src, DECIMAL_BYTE_SIZE);
129
0
    *src += DECIMAL_BYTE_SIZE;
130
0
    *result = DecimalV2Value(v);
131
0
}
132
133
template <>
134
0
inline void Helper::read_from<StringRef>(const char** src, StringRef* result) {
135
0
    int32_t length = *(int32_t*)(*src);
136
0
    *src += 4;
137
0
    *result = StringRef((char*)*src, length);
138
0
    *src += length;
139
0
}
140
141
template <>
142
6
inline void Helper::read_from<std::string>(const char** src, std::string* result) {
143
6
    int32_t length = *(int32_t*)(*src);
144
6
    *src += 4;
145
6
    *result = std::string((char*)*src, length);
146
6
    *src += length;
147
6
}
148
// read_from end
149
} // namespace detail
150
151
// Calculate the intersection of two or more bitmaps
152
// Usage: intersect_count(bitmap_column_to_count, filter_column, filter_values ...)
153
// Example: intersect_count(user_id, event, 'A', 'B', 'C'), meaning find the intersect count of user_id in all A/B/C 3 bitmaps
154
// Todo(kks) Use Array type instead of variable arguments
155
template <typename T>
156
struct BitmapIntersect {
157
public:
158
552
    BitmapIntersect() = default;
_ZN5doris15BitmapIntersectIaEC2Ev
Line
Count
Source
158
9
    BitmapIntersect() = default;
_ZN5doris15BitmapIntersectIsEC2Ev
Line
Count
Source
158
26
    BitmapIntersect() = default;
_ZN5doris15BitmapIntersectIiEC2Ev
Line
Count
Source
158
344
    BitmapIntersect() = default;
_ZN5doris15BitmapIntersectIlEC2Ev
Line
Count
Source
158
163
    BitmapIntersect() = default;
Unexecuted instantiation: _ZN5doris15BitmapIntersectInEC2Ev
_ZN5doris15BitmapIntersectINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC2Ev
Line
Count
Source
158
10
    BitmapIntersect() = default;
159
160
    explicit BitmapIntersect(const char* src) { deserialize(src); }
161
162
273
    void add_key(const T key) {
163
273
        BitmapValue empty_bitmap;
164
273
        _bitmaps[key] = empty_bitmap;
165
273
    }
_ZN5doris15BitmapIntersectIaE7add_keyEa
Line
Count
Source
162
6
    void add_key(const T key) {
163
6
        BitmapValue empty_bitmap;
164
6
        _bitmaps[key] = empty_bitmap;
165
6
    }
_ZN5doris15BitmapIntersectIsE7add_keyEs
Line
Count
Source
162
3
    void add_key(const T key) {
163
3
        BitmapValue empty_bitmap;
164
3
        _bitmaps[key] = empty_bitmap;
165
3
    }
_ZN5doris15BitmapIntersectIiE7add_keyEi
Line
Count
Source
162
236
    void add_key(const T key) {
163
236
        BitmapValue empty_bitmap;
164
236
        _bitmaps[key] = empty_bitmap;
165
236
    }
_ZN5doris15BitmapIntersectIlE7add_keyEl
Line
Count
Source
162
24
    void add_key(const T key) {
163
24
        BitmapValue empty_bitmap;
164
24
        _bitmaps[key] = empty_bitmap;
165
24
    }
Unexecuted instantiation: _ZN5doris15BitmapIntersectInE7add_keyEn
_ZN5doris15BitmapIntersectINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE7add_keyES6_
Line
Count
Source
162
4
    void add_key(const T key) {
163
4
        BitmapValue empty_bitmap;
164
4
        _bitmaps[key] = empty_bitmap;
165
4
    }
166
167
180
    void update(const T& key, const BitmapValue& bitmap) {
168
180
        if (_bitmaps.find(key) != _bitmaps.end()) {
169
51
            _bitmaps[key] |= bitmap;
170
51
        }
171
180
    }
_ZN5doris15BitmapIntersectIaE6updateERKaRKNS_11BitmapValueE
Line
Count
Source
167
15
    void update(const T& key, const BitmapValue& bitmap) {
168
15
        if (_bitmaps.find(key) != _bitmaps.end()) {
169
2
            _bitmaps[key] |= bitmap;
170
2
        }
171
15
    }
_ZN5doris15BitmapIntersectIsE6updateERKsRKNS_11BitmapValueE
Line
Count
Source
167
3
    void update(const T& key, const BitmapValue& bitmap) {
168
3
        if (_bitmaps.find(key) != _bitmaps.end()) {
169
3
            _bitmaps[key] |= bitmap;
170
3
        }
171
3
    }
_ZN5doris15BitmapIntersectIiE6updateERKiRKNS_11BitmapValueE
Line
Count
Source
167
130
    void update(const T& key, const BitmapValue& bitmap) {
168
130
        if (_bitmaps.find(key) != _bitmaps.end()) {
169
22
            _bitmaps[key] |= bitmap;
170
22
        }
171
130
    }
_ZN5doris15BitmapIntersectIlE6updateERKlRKNS_11BitmapValueE
Line
Count
Source
167
28
    void update(const T& key, const BitmapValue& bitmap) {
168
28
        if (_bitmaps.find(key) != _bitmaps.end()) {
169
20
            _bitmaps[key] |= bitmap;
170
20
        }
171
28
    }
Unexecuted instantiation: _ZN5doris15BitmapIntersectInE6updateERKnRKNS_11BitmapValueE
_ZN5doris15BitmapIntersectINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE6updateERKS6_RKNS_11BitmapValueE
Line
Count
Source
167
4
    void update(const T& key, const BitmapValue& bitmap) {
168
4
        if (_bitmaps.find(key) != _bitmaps.end()) {
169
4
            _bitmaps[key] |= bitmap;
170
4
        }
171
4
    }
172
173
127
    void merge(const BitmapIntersect& other) {
174
247
        for (auto& kv : other._bitmaps) {
175
247
            if (_bitmaps.find(kv.first) != _bitmaps.end()) {
176
128
                _bitmaps[kv.first] |= kv.second;
177
128
            } else {
178
119
                _bitmaps[kv.first] = kv.second;
179
119
            }
180
247
        }
181
127
    }
_ZN5doris15BitmapIntersectIaE5mergeERKS1_
Line
Count
Source
173
3
    void merge(const BitmapIntersect& other) {
174
6
        for (auto& kv : other._bitmaps) {
175
6
            if (_bitmaps.find(kv.first) != _bitmaps.end()) {
176
4
                _bitmaps[kv.first] |= kv.second;
177
4
            } else {
178
2
                _bitmaps[kv.first] = kv.second;
179
2
            }
180
6
        }
181
3
    }
_ZN5doris15BitmapIntersectIsE5mergeERKS1_
Line
Count
Source
173
7
    void merge(const BitmapIntersect& other) {
174
7
        for (auto& kv : other._bitmaps) {
175
7
            if (_bitmaps.find(kv.first) != _bitmaps.end()) {
176
0
                _bitmaps[kv.first] |= kv.second;
177
7
            } else {
178
7
                _bitmaps[kv.first] = kv.second;
179
7
            }
180
7
        }
181
7
    }
_ZN5doris15BitmapIntersectIiE5mergeERKS1_
Line
Count
Source
173
117
    void merge(const BitmapIntersect& other) {
174
234
        for (auto& kv : other._bitmaps) {
175
234
            if (_bitmaps.find(kv.first) != _bitmaps.end()) {
176
124
                _bitmaps[kv.first] |= kv.second;
177
124
            } else {
178
110
                _bitmaps[kv.first] = kv.second;
179
110
            }
180
234
        }
181
117
    }
Unexecuted instantiation: _ZN5doris15BitmapIntersectIlE5mergeERKS1_
Unexecuted instantiation: _ZN5doris15BitmapIntersectInE5mergeERKS1_
182
183
    // intersection
184
40
    BitmapValue intersect() const {
185
40
        BitmapValue result;
186
40
        if (_bitmaps.empty()) {
187
1
            return result;
188
1
        }
189
39
        auto it = _bitmaps.begin();
190
39
        result |= it->second;
191
39
        it++;
192
87
        for (; it != _bitmaps.end(); it++) {
193
48
            result &= it->second;
194
48
        }
195
39
        return result;
196
40
    }
_ZNK5doris15BitmapIntersectIaE9intersectEv
Line
Count
Source
184
1
    BitmapValue intersect() const {
185
1
        BitmapValue result;
186
1
        if (_bitmaps.empty()) {
187
0
            return result;
188
0
        }
189
1
        auto it = _bitmaps.begin();
190
1
        result |= it->second;
191
1
        it++;
192
2
        for (; it != _bitmaps.end(); it++) {
193
1
            result &= it->second;
194
1
        }
195
1
        return result;
196
1
    }
_ZNK5doris15BitmapIntersectIsE9intersectEv
Line
Count
Source
184
3
    BitmapValue intersect() const {
185
3
        BitmapValue result;
186
3
        if (_bitmaps.empty()) {
187
0
            return result;
188
0
        }
189
3
        auto it = _bitmaps.begin();
190
3
        result |= it->second;
191
3
        it++;
192
3
        for (; it != _bitmaps.end(); it++) {
193
0
            result &= it->second;
194
0
        }
195
3
        return result;
196
3
    }
_ZNK5doris15BitmapIntersectIiE9intersectEv
Line
Count
Source
184
17
    BitmapValue intersect() const {
185
17
        BitmapValue result;
186
17
        if (_bitmaps.empty()) {
187
0
            return result;
188
0
        }
189
17
        auto it = _bitmaps.begin();
190
17
        result |= it->second;
191
17
        it++;
192
34
        for (; it != _bitmaps.end(); it++) {
193
17
            result &= it->second;
194
17
        }
195
17
        return result;
196
17
    }
_ZNK5doris15BitmapIntersectIlE9intersectEv
Line
Count
Source
184
19
    BitmapValue intersect() const {
185
19
        BitmapValue result;
186
19
        if (_bitmaps.empty()) {
187
1
            return result;
188
1
        }
189
18
        auto it = _bitmaps.begin();
190
18
        result |= it->second;
191
18
        it++;
192
48
        for (; it != _bitmaps.end(); it++) {
193
30
            result &= it->second;
194
30
        }
195
18
        return result;
196
19
    }
Unexecuted instantiation: _ZNK5doris15BitmapIntersectInE9intersectEv
197
198
    // calculate the intersection for _bitmaps's bitmap values
199
37
    int64_t intersect_count() const {
200
37
        if (_bitmaps.empty()) {
201
4
            return 0;
202
4
        }
203
33
        return intersect().cardinality();
204
37
    }
_ZNK5doris15BitmapIntersectIaE15intersect_countEv
Line
Count
Source
199
1
    int64_t intersect_count() const {
200
1
        if (_bitmaps.empty()) {
201
0
            return 0;
202
0
        }
203
1
        return intersect().cardinality();
204
1
    }
_ZNK5doris15BitmapIntersectIsE15intersect_countEv
Line
Count
Source
199
3
    int64_t intersect_count() const {
200
3
        if (_bitmaps.empty()) {
201
0
            return 0;
202
0
        }
203
3
        return intersect().cardinality();
204
3
    }
_ZNK5doris15BitmapIntersectIiE15intersect_countEv
Line
Count
Source
199
19
    int64_t intersect_count() const {
200
19
        if (_bitmaps.empty()) {
201
2
            return 0;
202
2
        }
203
17
        return intersect().cardinality();
204
19
    }
_ZNK5doris15BitmapIntersectIlE15intersect_countEv
Line
Count
Source
199
14
    int64_t intersect_count() const {
200
14
        if (_bitmaps.empty()) {
201
2
            return 0;
202
2
        }
203
12
        return intersect().cardinality();
204
14
    }
Unexecuted instantiation: _ZNK5doris15BitmapIntersectInE15intersect_countEv
205
206
    // the serialize size
207
175
    size_t size() {
208
175
        size_t size = 4;
209
325
        for (auto& kv : _bitmaps) {
210
325
            size += detail::Helper::serialize_size(kv.first);
211
325
            size += kv.second.getSizeInBytes();
212
325
        }
213
175
        return size;
214
175
    }
_ZN5doris15BitmapIntersectIaE4sizeEv
Line
Count
Source
207
4
    size_t size() {
208
4
        size_t size = 4;
209
6
        for (auto& kv : _bitmaps) {
210
6
            size += detail::Helper::serialize_size(kv.first);
211
6
            size += kv.second.getSizeInBytes();
212
6
        }
213
4
        return size;
214
4
    }
_ZN5doris15BitmapIntersectIsE4sizeEv
Line
Count
Source
207
7
    size_t size() {
208
7
        size_t size = 4;
209
7
        for (auto& kv : _bitmaps) {
210
7
            size += detail::Helper::serialize_size(kv.first);
211
7
            size += kv.second.getSizeInBytes();
212
7
        }
213
7
        return size;
214
7
    }
_ZN5doris15BitmapIntersectIiE4sizeEv
Line
Count
Source
207
164
    size_t size() {
208
164
        size_t size = 4;
209
312
        for (auto& kv : _bitmaps) {
210
312
            size += detail::Helper::serialize_size(kv.first);
211
312
            size += kv.second.getSizeInBytes();
212
312
        }
213
164
        return size;
214
164
    }
Unexecuted instantiation: _ZN5doris15BitmapIntersectIlE4sizeEv
Unexecuted instantiation: _ZN5doris15BitmapIntersectInE4sizeEv
215
216
    //must call size() first
217
175
    void serialize(char* dest) {
218
175
        char* writer = dest;
219
175
        *(int32_t*)writer = cast_set<int32_t>(_bitmaps.size());
220
175
        writer += 4;
221
325
        for (auto& kv : _bitmaps) {
222
325
            writer = detail::Helper::write_to(kv.first, writer);
223
325
            kv.second.write_to(writer);
224
325
            writer += kv.second.getSizeInBytes();
225
325
        }
226
175
    }
_ZN5doris15BitmapIntersectIaE9serializeEPc
Line
Count
Source
217
4
    void serialize(char* dest) {
218
4
        char* writer = dest;
219
4
        *(int32_t*)writer = cast_set<int32_t>(_bitmaps.size());
220
4
        writer += 4;
221
6
        for (auto& kv : _bitmaps) {
222
6
            writer = detail::Helper::write_to(kv.first, writer);
223
6
            kv.second.write_to(writer);
224
6
            writer += kv.second.getSizeInBytes();
225
6
        }
226
4
    }
_ZN5doris15BitmapIntersectIsE9serializeEPc
Line
Count
Source
217
7
    void serialize(char* dest) {
218
7
        char* writer = dest;
219
7
        *(int32_t*)writer = cast_set<int32_t>(_bitmaps.size());
220
7
        writer += 4;
221
7
        for (auto& kv : _bitmaps) {
222
7
            writer = detail::Helper::write_to(kv.first, writer);
223
7
            kv.second.write_to(writer);
224
7
            writer += kv.second.getSizeInBytes();
225
7
        }
226
7
    }
_ZN5doris15BitmapIntersectIiE9serializeEPc
Line
Count
Source
217
164
    void serialize(char* dest) {
218
164
        char* writer = dest;
219
164
        *(int32_t*)writer = cast_set<int32_t>(_bitmaps.size());
220
164
        writer += 4;
221
312
        for (auto& kv : _bitmaps) {
222
312
            writer = detail::Helper::write_to(kv.first, writer);
223
312
            kv.second.write_to(writer);
224
312
            writer += kv.second.getSizeInBytes();
225
312
        }
226
164
    }
Unexecuted instantiation: _ZN5doris15BitmapIntersectIlE9serializeEPc
Unexecuted instantiation: _ZN5doris15BitmapIntersectInE9serializeEPc
227
228
136
    void deserialize(const char* src) {
229
136
        const char* reader = src;
230
136
        int32_t bitmaps_size = *(int32_t*)reader;
231
136
        reader += 4;
232
383
        for (int32_t i = 0; i < bitmaps_size; i++) {
233
247
            T key;
234
247
            detail::Helper::read_from(&reader, &key);
235
247
            BitmapValue bitmap(reader);
236
247
            reader += bitmap.getSizeInBytes();
237
247
            _bitmaps[key] = bitmap;
238
247
        }
239
136
    }
Unexecuted instantiation: _ZN5doris15BitmapIntersectINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE11deserializeEPKc
_ZN5doris15BitmapIntersectIaE11deserializeEPKc
Line
Count
Source
228
4
    void deserialize(const char* src) {
229
4
        const char* reader = src;
230
4
        int32_t bitmaps_size = *(int32_t*)reader;
231
4
        reader += 4;
232
10
        for (int32_t i = 0; i < bitmaps_size; i++) {
233
6
            T key;
234
6
            detail::Helper::read_from(&reader, &key);
235
6
            BitmapValue bitmap(reader);
236
6
            reader += bitmap.getSizeInBytes();
237
6
            _bitmaps[key] = bitmap;
238
6
        }
239
4
    }
_ZN5doris15BitmapIntersectIsE11deserializeEPKc
Line
Count
Source
228
7
    void deserialize(const char* src) {
229
7
        const char* reader = src;
230
7
        int32_t bitmaps_size = *(int32_t*)reader;
231
7
        reader += 4;
232
14
        for (int32_t i = 0; i < bitmaps_size; i++) {
233
7
            T key;
234
7
            detail::Helper::read_from(&reader, &key);
235
7
            BitmapValue bitmap(reader);
236
7
            reader += bitmap.getSizeInBytes();
237
7
            _bitmaps[key] = bitmap;
238
7
        }
239
7
    }
_ZN5doris15BitmapIntersectIiE11deserializeEPKc
Line
Count
Source
228
125
    void deserialize(const char* src) {
229
125
        const char* reader = src;
230
125
        int32_t bitmaps_size = *(int32_t*)reader;
231
125
        reader += 4;
232
359
        for (int32_t i = 0; i < bitmaps_size; i++) {
233
234
            T key;
234
234
            detail::Helper::read_from(&reader, &key);
235
234
            BitmapValue bitmap(reader);
236
234
            reader += bitmap.getSizeInBytes();
237
234
            _bitmaps[key] = bitmap;
238
234
        }
239
125
    }
Unexecuted instantiation: _ZN5doris15BitmapIntersectIlE11deserializeEPKc
Unexecuted instantiation: _ZN5doris15BitmapIntersectInE11deserializeEPKc
240
241
protected:
242
    std::map<T, BitmapValue> _bitmaps;
243
};
244
245
template <>
246
struct BitmapIntersect<std::string_view> {
247
public:
248
9
    BitmapIntersect() = default;
249
250
0
    explicit BitmapIntersect(const char* src) { deserialize(src); }
251
252
6
    void add_key(const std::string_view key) {
253
6
        BitmapValue empty_bitmap;
254
6
        _bitmaps[key] = empty_bitmap;
255
6
    }
256
257
15
    void update(const std::string_view& key, const BitmapValue& bitmap) {
258
15
        if (_bitmaps.find(key) != _bitmaps.end()) {
259
2
            _bitmaps[key] |= bitmap;
260
2
        }
261
15
    }
262
263
3
    void merge(const BitmapIntersect& other) {
264
6
        for (auto& kv : other._bitmaps) {
265
6
            if (_bitmaps.find(kv.first) != _bitmaps.end()) {
266
4
                _bitmaps[kv.first] |= kv.second;
267
4
            } else {
268
2
                _bitmaps[kv.first] = kv.second;
269
2
            }
270
6
        }
271
3
    }
272
273
    // intersection
274
1
    BitmapValue intersect() const {
275
1
        BitmapValue result;
276
1
        auto it = _bitmaps.begin();
277
1
        result |= it->second;
278
1
        it++;
279
2
        for (; it != _bitmaps.end(); it++) {
280
1
            result &= it->second;
281
1
        }
282
1
        return result;
283
1
    }
284
285
    // calculate the intersection for _bitmaps's bitmap values
286
1
    int64_t intersect_count() const {
287
1
        if (_bitmaps.empty()) {
288
0
            return 0;
289
0
        }
290
1
        return intersect().cardinality();
291
1
    }
292
293
    // the serialize size
294
4
    size_t size() {
295
4
        size_t size = 4;
296
6
        for (auto& kv : _bitmaps) {
297
6
            size += detail::Helper::serialize_size(kv.first);
298
6
            size += kv.second.getSizeInBytes();
299
6
        }
300
4
        return size;
301
4
    }
302
303
    //must call size() first
304
4
    void serialize(char* dest) {
305
4
        char* writer = dest;
306
4
        *(int32_t*)writer = cast_set<int32_t>(_bitmaps.size());
307
4
        writer += 4;
308
6
        for (auto& kv : _bitmaps) {
309
6
            writer = detail::Helper::write_to(kv.first, writer);
310
6
            kv.second.write_to(writer);
311
6
            writer += kv.second.getSizeInBytes();
312
6
        }
313
4
    }
314
315
4
    void deserialize(const char* src) {
316
4
        const char* reader = src;
317
4
        int32_t bitmaps_size = *(int32_t*)reader;
318
4
        reader += 4;
319
10
        for (int32_t i = 0; i < bitmaps_size; i++) {
320
6
            std::string key;
321
6
            detail::Helper::read_from(&reader, &key);
322
6
            BitmapValue bitmap(reader);
323
6
            reader += bitmap.getSizeInBytes();
324
6
            _bitmaps[key] = bitmap;
325
6
        }
326
4
    }
327
328
protected:
329
    phmap::flat_hash_map<std::string, BitmapValue> _bitmaps;
330
};
331
#include "common/compile_check_end.h"
332
} // namespace doris