Kuzu C++ API
Loading...
Searching...
No Matches
mask.h
Go to the documentation of this file.
1#pragma once
2
3#include "types.h"
4
5namespace kuzu {
6namespace common {
7
8// Note that this class is NOT thread-safe.
9class SemiMask {
10public:
11 explicit SemiMask(offset_t maxOffset) : maxOffset{maxOffset}, enabled{false} {}
12
13 virtual ~SemiMask() = default;
14
15 virtual void mask(offset_t nodeOffset) = 0;
16 virtual void maskRange(offset_t startNodeOffset, offset_t endNodeOffset) = 0;
17
18 virtual bool isMasked(offset_t startNodeOffset) = 0;
19
20 // include&exclude
21 virtual offset_vec_t range(uint32_t start, uint32_t end) = 0;
22
23 virtual uint64_t getNumMaskedNodes() const = 0;
24
25 virtual offset_vec_t collectMaskedNodes(uint64_t size) const = 0;
26
27 offset_t getMaxOffset() const { return maxOffset; }
28
29 bool isEnabled() const { return enabled; }
30 void enable() { enabled = true; }
31
32private:
33 offset_t maxOffset;
34 bool enabled;
35};
36
38 KUZU_API static std::unique_ptr<SemiMask> createMask(offset_t maxOffset);
39};
40
42public:
43 NodeOffsetMaskMap() : enabled_{false} {}
44
45 void enable() { enabled_ = true; }
46 bool enabled() const { return enabled_; }
47
49
50 void addMask(table_id_t tableID, std::unique_ptr<SemiMask> mask) {
51 KU_ASSERT(!maskMap.contains(tableID));
52 maskMap.insert({tableID, std::move(mask)});
53 }
54
57 for (auto& [tableID, mask] : maskMap) {
58 result.emplace(tableID, mask.get());
59 }
60 return result;
61 }
62
63 bool containsTableID(table_id_t tableID) const { return maskMap.contains(tableID); }
65 KU_ASSERT(containsTableID(tableID));
66 return maskMap.at(tableID).get();
67 }
68
69 void pin(table_id_t tableID) {
70 if (maskMap.contains(tableID)) {
71 pinnedMask = maskMap.at(tableID).get();
72 } else {
73 pinnedMask = nullptr;
74 }
75 }
76 bool hasPinnedMask() const { return pinnedMask != nullptr; }
77 SemiMask* getPinnedMask() const { return pinnedMask; }
78
79 bool valid(offset_t offset) const {
80 KU_ASSERT(pinnedMask != nullptr);
81 return pinnedMask->isMasked(offset);
82 }
83 bool valid(nodeID_t nodeID) const {
84 KU_ASSERT(maskMap.contains(nodeID.tableID));
85 return maskMap.at(nodeID.tableID)->isMasked(nodeID.offset);
86 }
87
88private:
90 SemiMask* pinnedMask = nullptr;
91 // If mask map is enabled, then some nodes might be masked.
92 bool enabled_;
93};
94
95} // namespace common
96} // namespace kuzu
#define KUZU_API
Definition api.h:25
#define KU_ASSERT(condition)
Definition assert.h:19
bool enabled() const
Definition mask.h:46
void enable()
Definition mask.h:45
bool hasPinnedMask() const
Definition mask.h:76
void addMask(table_id_t tableID, std::unique_ptr< SemiMask > mask)
Definition mask.h:50
NodeOffsetMaskMap()
Definition mask.h:43
table_id_map_t< SemiMask * > getMasks() const
Definition mask.h:55
offset_t getNumMaskedNode() const
bool containsTableID(table_id_t tableID) const
Definition mask.h:63
SemiMask * getPinnedMask() const
Definition mask.h:77
bool valid(offset_t offset) const
Definition mask.h:79
void pin(table_id_t tableID)
Definition mask.h:69
bool valid(nodeID_t nodeID) const
Definition mask.h:83
SemiMask * getOffsetMask(table_id_t tableID) const
Definition mask.h:64
Definition mask.h:9
void enable()
Definition mask.h:30
virtual offset_vec_t collectMaskedNodes(uint64_t size) const =0
virtual void mask(offset_t nodeOffset)=0
virtual bool isMasked(offset_t startNodeOffset)=0
virtual offset_vec_t range(uint32_t start, uint32_t end)=0
bool isEnabled() const
Definition mask.h:29
virtual ~SemiMask()=default
offset_t getMaxOffset() const
Definition mask.h:27
virtual uint64_t getNumMaskedNodes() const =0
virtual void maskRange(offset_t startNodeOffset, offset_t endNodeOffset)=0
SemiMask(offset_t maxOffset)
Definition mask.h:11
Definition array_utils.h:7
std::unordered_map< table_id_t, T > table_id_map_t
Definition types.h:76
oid_t table_id_t
Definition types.h:72
internalID_t nodeID_t
Definition types.h:83
std::vector< offset_t > offset_vec_t
Definition types.h:88
uint64_t offset_t
Definition types.h:79
Definition array_utils.h:7
Definition mask.h:37
static KUZU_API std::unique_ptr< SemiMask > createMask(offset_t maxOffset)
offset_t offset
Definition types.h:91
table_id_t tableID
Definition types.h:92