Kuzu C++ API
Loading...
Searching...
No Matches
sel_vector.h
Go to the documentation of this file.
1#pragma once
2
3#include <string.h>
4
5#include <memory>
6
7#include "types.h"
8#include <span>
9
10namespace kuzu {
11namespace common {
12
13class ValueVector;
14
15// A lightweight, immutable view over a SelectionVector, or a subsequence of a selection vector
16// SelectionVectors are also SelectionViews so that you can pass a SelectionVector to functions
17// which take a SelectionView&
19protected:
20 // In DYNAMIC mode, selectedPositions points to a mutable buffer that can be modified through
21 // getMutableBuffer In STATIC mode, selectedPositions points to somewhere in
22 // INCREMENTAL_SELECTED_POS
23 // Note that the vector is considered unfiltered only if it is both STATIC and the first
24 // selected position is 0
25 enum class State {
28 };
29
30public:
31 // STATIC selectionView over 0..selectedSize
33 // STATIC selectionView over startPos..selectedSize
35
36 template<class Func>
37 void forEach(Func&& func) const {
38 if (state == State::DYNAMIC) {
39 for (size_t i = 0; i < selectedSize; i++) {
40 func(selectedPositions[i]);
41 }
42 } else {
43 const auto start = selectedPositions[0];
44 for (size_t i = start; i < start + selectedSize; i++) {
45 func(i);
46 }
47 }
48 }
49
50 template<class Func>
51 void forEachBreakWhenFalse(Func&& func) const {
52 if (state == State::DYNAMIC) {
53 for (size_t i = 0; i < selectedSize; i++) {
54 if (!func(selectedPositions[i])) {
55 break;
56 }
57 }
58 } else {
59 const auto start = selectedPositions[0];
60 for (size_t i = start; i < start + selectedSize; i++) {
61 if (!func(i)) {
62 break;
63 }
64 }
65 }
66 }
67
68 sel_t getSelSize() const { return selectedSize; }
69
70 sel_t operator[](sel_t index) const {
71 KU_ASSERT(index < selectedSize);
72 return selectedPositions[index];
73 }
74
75 bool isUnfiltered() const { return state == State::STATIC && selectedPositions[0] == 0; }
76 bool isStatic() const { return state == State::STATIC; }
77
78 std::span<const sel_t> getSelectedPositions() const {
79 return std::span<const sel_t>(selectedPositions, selectedSize);
80 }
81
82protected:
83 static SelectionView slice(std::span<const sel_t> selectedPositions, State state) {
85 }
86
87 // Intended to be used only as a subsequence of a SelectionVector in SelectionVector::slice
91
92protected:
96};
97
99public:
100 explicit SelectionVector(sel_t capacity)
101 : SelectionView{std::span<const sel_t>(), State::STATIC},
102 selectedPositionsBuffer{std::make_unique<sel_t[]>(capacity)}, capacity{capacity} {
104 }
105
106 // This View should be considered invalid if the SelectionVector it was created from has been
107 // modified
109 return SelectionView::slice(getSelectedPositions().subspan(startIndex, selectedSize),
110 state);
111 }
112
114
117 void setRange(sel_t startPos, sel_t size) {
118 KU_ASSERT(startPos + size <= capacity);
119 selectedPositions = selectedPositionsBuffer.get();
120 for (auto i = 0u; i < size; ++i) {
121 selectedPositionsBuffer[i] = startPos + i;
122 }
123 selectedSize = size;
125 }
126
127 // Set to filtered is not very accurate. It sets selectedPositions to a mutable array.
129 selectedPositions = selectedPositionsBuffer.get();
131 }
132 void setToFiltered(sel_t size) {
133 KU_ASSERT(size <= capacity && selectedPositionsBuffer);
135 selectedSize = size;
136 }
137
138 // Copies the data in selectedPositions into selectedPositionsBuffer
139 void makeDynamic() {
140 memcpy(selectedPositionsBuffer.get(), selectedPositions, selectedSize * sizeof(sel_t));
142 selectedPositions = selectedPositionsBuffer.get();
143 }
144
145 std::span<sel_t> getMutableBuffer() const {
146 return std::span<sel_t>(selectedPositionsBuffer.get(), capacity);
147 }
148
149 void setSelSize(sel_t size) {
150 KU_ASSERT(size <= capacity);
151 selectedSize = size;
152 }
153 void incrementSelSize(sel_t increment = 1) {
154 KU_ASSERT(selectedSize < capacity);
155 selectedSize += increment;
156 }
157
158 sel_t operator[](sel_t index) const {
159 KU_ASSERT(index < capacity);
160 return const_cast<sel_t&>(selectedPositions[index]);
161 }
163 KU_ASSERT(index < capacity);
164 return const_cast<sel_t&>(selectedPositions[index]);
165 }
166
167 static std::vector<SelectionVector*> fromValueVectors(
168 const std::vector<std::shared_ptr<common::ValueVector>>& vec);
169
170private:
171 std::unique_ptr<sel_t[]> selectedPositionsBuffer;
172 sel_t capacity;
173};
174
175} // namespace common
176} // namespace kuzu
#define KUZU_API
Definition api.h:25
#define KU_ASSERT(condition)
Definition assert.h:19
static std::vector< SelectionVector * > fromValueVectors(const std::vector< std::shared_ptr< common::ValueVector > > &vec)
KUZU_API void setToUnfiltered()
void setToFiltered()
Definition sel_vector.h:128
void makeDynamic()
Definition sel_vector.h:139
sel_t & operator[](sel_t index)
Definition sel_vector.h:162
SelectionView slice(sel_t startIndex, sel_t selectedSize) const
Definition sel_vector.h:108
void setRange(sel_t startPos, sel_t size)
Definition sel_vector.h:117
KUZU_API void setToUnfiltered(sel_t size)
void setToFiltered(sel_t size)
Definition sel_vector.h:132
void incrementSelSize(sel_t increment=1)
Definition sel_vector.h:153
std::span< sel_t > getMutableBuffer() const
Definition sel_vector.h:145
SelectionVector(sel_t capacity)
Definition sel_vector.h:100
sel_t operator[](sel_t index) const
Definition sel_vector.h:158
void setSelSize(sel_t size)
Definition sel_vector.h:149
sel_t getSelSize() const
Definition sel_vector.h:68
sel_t operator[](sel_t index) const
Definition sel_vector.h:70
SelectionView(sel_t selectedSize)
Definition sel_vector.h:32
State
Definition sel_vector.h:25
@ DYNAMIC
Definition sel_vector.h:26
@ STATIC
Definition sel_vector.h:27
std::span< const sel_t > getSelectedPositions() const
Definition sel_vector.h:78
void forEachBreakWhenFalse(Func &&func) const
Definition sel_vector.h:51
SelectionView(std::span< const sel_t > selectedPositions, State state)
Definition sel_vector.h:88
void forEach(Func &&func) const
Definition sel_vector.h:37
static SelectionView slice(std::span< const sel_t > selectedPositions, State state)
Definition sel_vector.h:83
bool isStatic() const
Definition sel_vector.h:76
SelectionView(sel_t startPos, sel_t selectedSize)
sel_t selectedSize
Definition sel_vector.h:94
bool isUnfiltered() const
Definition sel_vector.h:75
State state
Definition sel_vector.h:95
const sel_t * selectedPositions
Definition sel_vector.h:93
Definition value_vector.h:21
Definition array_utils.h:7
uint64_t sel_t
Definition types.h:30
Definition array_utils.h:7