CodeCommitsIssuesPull requestsActionsInsightsSecurity
452bcdcb51c5e5859e216c8ca5376042ca1e7590

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/Columns/ColumnConst.h

234lines · modecode

1#pragma once
2
3#include <Core/Field.h>
4#include <Common/Exception.h>
5#include <Columns/IColumn.h>
6#include <Common/typeid_cast.h>
7#include <Common/assert_cast.h>
8
9
10namespace DB
11{
12
13namespace ErrorCodes
14{
15 extern const int NOT_IMPLEMENTED;
16}
17
18
19/** ColumnConst contains another column with single element,
20 * but looks like a column with arbitrary amount of same elements.
21 */
22class ColumnConst final : public COWHelper<IColumn, ColumnConst>
23{
24private:
25 friend class COWHelper<IColumn, ColumnConst>;
26
27 WrappedPtr data;
28 size_t s;
29
30 ColumnConst(const ColumnPtr & data, size_t s_);
31 ColumnConst(const ColumnConst & src) = default;
32
33public:
34 ColumnPtr convertToFullColumn() const;
35
36 ColumnPtr convertToFullColumnIfConst() const override
37 {
38 return convertToFullColumn();
39 }
40
41 ColumnPtr removeLowCardinality() const;
42
43 std::string getName() const override
44 {
45 return "Const(" + data->getName() + ")";
46 }
47
48 const char * getFamilyName() const override
49 {
50 return "Const";
51 }
52
53 MutableColumnPtr cloneResized(size_t new_size) const override
54 {
55 return ColumnConst::create(data, new_size);
56 }
57
58 size_t size() const override
59 {
60 return s;
61 }
62
63 Field operator[](size_t) const override
64 {
65 return (*data)[0];
66 }
67
68 void get(size_t, Field & res) const override
69 {
70 data->get(0, res);
71 }
72
73 StringRef getDataAt(size_t) const override
74 {
75 return data->getDataAt(0);
76 }
77
78 StringRef getDataAtWithTerminatingZero(size_t) const override
79 {
80 return data->getDataAtWithTerminatingZero(0);
81 }
82
83 UInt64 get64(size_t) const override
84 {
85 return data->get64(0);
86 }
87
88 UInt64 getUInt(size_t) const override
89 {
90 return data->getUInt(0);
91 }
92
93 Int64 getInt(size_t) const override
94 {
95 return data->getInt(0);
96 }
97
98 bool getBool(size_t) const override
99 {
100 return data->getBool(0);
101 }
102
103 Float64 getFloat64(size_t) const override
104 {
105 return data->getFloat64(0);
106 }
107
108 Float32 getFloat32(size_t) const override
109 {
110 return data->getFloat32(0);
111 }
112
113 bool isNullAt(size_t) const override
114 {
115 return data->isNullAt(0);
116 }
117
118 void insertRangeFrom(const IColumn &, size_t /*start*/, size_t length) override
119 {
120 s += length;
121 }
122
123 void insert(const Field &) override
124 {
125 ++s;
126 }
127
128 void insertData(const char *, size_t) override
129 {
130 ++s;
131 }
132
133 void insertFrom(const IColumn &, size_t) override
134 {
135 ++s;
136 }
137
138 void insertDefault() override
139 {
140 ++s;
141 }
142
143 void popBack(size_t n) override
144 {
145 s -= n;
146 }
147
148 StringRef serializeValueIntoArena(size_t, Arena & arena, char const *& begin) const override
149 {
150 return data->serializeValueIntoArena(0, arena, begin);
151 }
152
153 const char * deserializeAndInsertFromArena(const char * pos) override
154 {
155 auto res = data->deserializeAndInsertFromArena(pos);
156 data->popBack(1);
157 ++s;
158 return res;
159 }
160
161 void updateHashWithValue(size_t, SipHash & hash) const override
162 {
163 data->updateHashWithValue(0, hash);
164 }
165
166 void updateWeakHash32(WeakHash32 & hash) const override;
167
168 ColumnPtr filter(const Filter & filt, ssize_t result_size_hint) const override;
169 ColumnPtr replicate(const Offsets & offsets) const override;
170 ColumnPtr permute(const Permutation & perm, size_t limit) const override;
171 ColumnPtr index(const IColumn & indexes, size_t limit) const override;
172 void getPermutation(bool reverse, size_t limit, int nan_direction_hint, Permutation & res) const override;
173
174 size_t byteSize() const override
175 {
176 return data->byteSize() + sizeof(s);
177 }
178
179 size_t allocatedBytes() const override
180 {
181 return data->allocatedBytes() + sizeof(s);
182 }
183
184 int compareAt(size_t, size_t, const IColumn & rhs, int nan_direction_hint) const override
185 {
186 return data->compareAt(0, 0, *assert_cast<const ColumnConst &>(rhs).data, nan_direction_hint);
187 }
188
189 MutableColumns scatter(ColumnIndex num_columns, const Selector & selector) const override;
190
191 void gather(ColumnGathererStream &) override
192 {
193 throw Exception("Cannot gather into constant column " + getName(), ErrorCodes::NOT_IMPLEMENTED);
194 }
195
196 void getExtremes(Field & min, Field & max) const override
197 {
198 data->getExtremes(min, max);
199 }
200
201 void forEachSubcolumn(ColumnCallback callback) override
202 {
203 callback(data);
204 }
205
206 bool structureEquals(const IColumn & rhs) const override
207 {
208 if (auto rhs_concrete = typeid_cast<const ColumnConst *>(&rhs))
209 return data->structureEquals(*rhs_concrete->data);
210 return false;
211 }
212
213 bool isNullable() const override { return isColumnNullable(*data); }
214 bool onlyNull() const override { return data->isNullAt(0); }
215 bool isNumeric() const override { return data->isNumeric(); }
216 bool isFixedAndContiguous() const override { return data->isFixedAndContiguous(); }
217 bool valuesHaveFixedSize() const override { return data->valuesHaveFixedSize(); }
218 size_t sizeOfValueIfFixed() const override { return data->sizeOfValueIfFixed(); }
219 StringRef getRawData() const override { return data->getRawData(); }
220
221 /// Not part of the common interface.
222
223 IColumn & getDataColumn() { return *data; }
224 const IColumn & getDataColumn() const { return *data; }
225 const ColumnPtr & getDataColumnPtr() const { return data; }
226
227 Field getField() const { return getDataColumn()[0]; }
228
229 /// The constant value. It is valid even if the size of the column is 0.
230 template <typename T>
231 T getValue() const { return getField().safeGet<NearestFieldType<T>>(); }
232};
233
234}