Coverage Report

Created: 2026-09-25 12:51

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