MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
载入中...
搜索中...
未找到
tuple.h
1/* Copyright (c) 2021 OceanBase and/or its affiliates. All rights reserved.
2miniob is licensed under Mulan PSL v2.
3You can use this software according to the terms and conditions of the Mulan PSL v2.
4You may obtain a copy of Mulan PSL v2 at:
5 http://license.coscl.org.cn/MulanPSL2
6THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
7EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
8MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
9See the Mulan PSL v2 for more details. */
10
11//
12// Created by Wangyunlai on 2021/5/14.
13//
14
15#pragma once
16
17#include <memory>
18#include <vector>
19#include <string>
20
21#include "common/log/log.h"
22#include "sql/expr/tuple_cell.h"
23#include "sql/parser/parse.h"
24#include "sql/parser/value.h"
25#include "sql/expr/expression.h"
26#include "storage/record/record.h"
27
28class Table;
29
52{
53public:
54 void append_cell(const TupleCellSpec &cell)
55 {
56 cells_.push_back(cell);
57 }
58 void append_cell(const char *table, const char *field)
59 {
60 append_cell(TupleCellSpec(table, field));
61 }
62 void append_cell(const char *alias)
63 {
64 append_cell(TupleCellSpec(alias));
65 }
66 int cell_num() const
67 {
68 return static_cast<int>(cells_.size());
69 }
70 const TupleCellSpec &cell_at(int i) const
71 {
72 return cells_[i];
73 }
74
75private:
76 std::vector<TupleCellSpec> cells_;
77};
78
83class Tuple
84{
85public:
86 Tuple() = default;
87 virtual ~Tuple() = default;
88
93 virtual int cell_num() const = 0;
94
101 virtual RC cell_at(int index, Value &cell) const = 0;
102
109 virtual RC find_cell(const TupleCellSpec &spec, Value &cell) const = 0;
110
111 virtual std::string to_string() const
112 {
113 std::string str;
114 const int cell_num = this->cell_num();
115 for (int i = 0; i < cell_num - 1; i++) {
116 Value cell;
117 cell_at(i, cell);
118 str += cell.to_string();
119 str += ", ";
120 }
121
122 if (cell_num > 0) {
123 Value cell;
124 cell_at(cell_num - 1, cell);
125 str += cell.to_string();
126 }
127 return str;
128 }
129};
130
136class RowTuple : public Tuple
137{
138public:
139 RowTuple() = default;
140 virtual ~RowTuple()
141 {
142 for (FieldExpr *spec : speces_) {
143 delete spec;
144 }
145 speces_.clear();
146 }
147
148 void set_record(Record *record)
149 {
150 this->record_ = record;
151 }
152
153 void set_schema(const Table *table, const std::vector<FieldMeta> *fields)
154 {
155 table_ = table;
156 this->speces_.reserve(fields->size());
157 for (const FieldMeta &field : *fields) {
158 speces_.push_back(new FieldExpr(table, &field));
159 }
160 }
161
162 int cell_num() const override
163 {
164 return speces_.size();
165 }
166
167 RC cell_at(int index, Value &cell) const override
168 {
169 if (index < 0 || index >= static_cast<int>(speces_.size())) {
170 LOG_WARN("invalid argument. index=%d", index);
171 return RC::INVALID_ARGUMENT;
172 }
173
174 FieldExpr *field_expr = speces_[index];
175 const FieldMeta *field_meta = field_expr->field().meta();
176 cell.set_type(field_meta->type());
177 cell.set_data(this->record_->data() + field_meta->offset(), field_meta->len());
178 return RC::SUCCESS;
179 }
180
181 RC find_cell(const TupleCellSpec &spec, Value &cell) const override
182 {
183 const char *table_name = spec.table_name();
184 const char *field_name = spec.field_name();
185 if (0 != strcmp(table_name, table_->name())) {
186 return RC::NOTFOUND;
187 }
188
189 for (size_t i = 0; i < speces_.size(); ++i) {
190 const FieldExpr *field_expr = speces_[i];
191 const Field &field = field_expr->field();
192 if (0 == strcmp(field_name, field.field_name())) {
193 return cell_at(i, cell);
194 }
195 }
196 return RC::NOTFOUND;
197 }
198
199#if 0
200 RC cell_spec_at(int index, const TupleCellSpec *&spec) const override
201 {
202 if (index < 0 || index >= static_cast<int>(speces_.size())) {
203 LOG_WARN("invalid argument. index=%d", index);
204 return RC::INVALID_ARGUMENT;
205 }
206 spec = speces_[index];
207 return RC::SUCCESS;
208 }
209#endif
210
211 Record &record()
212 {
213 return *record_;
214 }
215
216 const Record &record() const
217 {
218 return *record_;
219 }
220
221private:
222 Record *record_ = nullptr;
223 const Table *table_ = nullptr;
224 std::vector<FieldExpr *> speces_;
225};
226
234class ProjectTuple : public Tuple
235{
236public:
237 ProjectTuple() = default;
238 virtual ~ProjectTuple()
239 {
240 for (TupleCellSpec *spec : speces_) {
241 delete spec;
242 }
243 speces_.clear();
244 }
245
246 void set_tuple(Tuple *tuple)
247 {
248 this->tuple_ = tuple;
249 }
250
251 void add_cell_spec(TupleCellSpec *spec)
252 {
253 speces_.push_back(spec);
254 }
255 int cell_num() const override
256 {
257 return speces_.size();
258 }
259
260 RC cell_at(int index, Value &cell) const override
261 {
262 if (index < 0 || index >= static_cast<int>(speces_.size())) {
263 return RC::INTERNAL;
264 }
265 if (tuple_ == nullptr) {
266 return RC::INTERNAL;
267 }
268
269 const TupleCellSpec *spec = speces_[index];
270 return tuple_->find_cell(*spec, cell);
271 }
272
273 RC find_cell(const TupleCellSpec &spec, Value &cell) const override
274 {
275 return tuple_->find_cell(spec, cell);
276 }
277
278#if 0
279 RC cell_spec_at(int index, const TupleCellSpec *&spec) const override
280 {
281 if (index < 0 || index >= static_cast<int>(speces_.size())) {
282 return RC::NOTFOUND;
283 }
284 spec = speces_[index];
285 return RC::SUCCESS;
286 }
287#endif
288private:
289 std::vector<TupleCellSpec *> speces_;
290 Tuple *tuple_ = nullptr;
291};
292
293class ExpressionTuple : public Tuple
294{
295public:
296 ExpressionTuple(std::vector<std::unique_ptr<Expression>> &expressions)
297 : expressions_(expressions)
298 {
299 }
300
301 virtual ~ExpressionTuple()
302 {
303 }
304
305 int cell_num() const override
306 {
307 return expressions_.size();
308 }
309
310 RC cell_at(int index, Value &cell) const override
311 {
312 if (index < 0 || index >= static_cast<int>(expressions_.size())) {
313 return RC::INTERNAL;
314 }
315
316 const Expression *expr = expressions_[index].get();
317 return expr->try_get_value(cell);
318 }
319
320 RC find_cell(const TupleCellSpec &spec, Value &cell) const override
321 {
322 for (const std::unique_ptr<Expression> &expr : expressions_) {
323 if (0 == strcmp(spec.alias(), expr->name().c_str())) {
324 return expr->try_get_value(cell);
325 }
326 }
327 return RC::NOTFOUND;
328 }
329
330
331private:
332 const std::vector<std::unique_ptr<Expression>> &expressions_;
333};
334
339class ValueListTuple : public Tuple
340{
341public:
342 ValueListTuple() = default;
343 virtual ~ValueListTuple() = default;
344
345 void set_cells(const std::vector<Value> &cells)
346 {
347 cells_ = cells;
348 }
349
350 virtual int cell_num() const override
351 {
352 return static_cast<int>(cells_.size());
353 }
354
355 virtual RC cell_at(int index, Value &cell) const override
356 {
357 if (index < 0 || index >= cell_num()) {
358 return RC::NOTFOUND;
359 }
360
361 cell = cells_[index];
362 return RC::SUCCESS;
363 }
364
365 virtual RC find_cell(const TupleCellSpec &spec, Value &cell) const override
366 {
367 return RC::INTERNAL;
368 }
369
370private:
371 std::vector<Value> cells_;
372};
373
379class JoinedTuple : public Tuple
380{
381public:
382 JoinedTuple() = default;
383 virtual ~JoinedTuple() = default;
384
385 void set_left(Tuple *left)
386 {
387 left_ = left;
388 }
389 void set_right(Tuple *right)
390 {
391 right_ = right;
392 }
393
394 int cell_num() const override
395 {
396 return left_->cell_num() + right_->cell_num();
397 }
398
399 RC cell_at(int index, Value &value) const override
400 {
401 const int left_cell_num = left_->cell_num();
402 if (index > 0 && index < left_cell_num) {
403 return left_->cell_at(index, value);
404 }
405
406 if (index >= left_cell_num && index < left_cell_num + right_->cell_num()) {
407 return right_->cell_at(index - left_cell_num, value);
408 }
409
410 return RC::NOTFOUND;
411 }
412
413 RC find_cell(const TupleCellSpec &spec, Value &value) const override
414 {
415 RC rc = left_->find_cell(spec, value);
416 if (rc == RC::SUCCESS || rc != RC::NOTFOUND) {
417 return rc;
418 }
419
420 return right_->find_cell(spec, value);
421 }
422
423private:
424 Tuple *left_ = nullptr;
425 Tuple *right_ = nullptr;
426};
Definition: tuple.h:294
int cell_num() const override
获取元组中的Cell的个数
Definition: tuple.h:305
RC find_cell(const TupleCellSpec &spec, Value &cell) const override
根据cell的描述,获取cell的值
Definition: tuple.h:320
RC cell_at(int index, Value &cell) const override
获取指定位置的Cell
Definition: tuple.h:310
表达式的抽象描述
Definition: expression.h:60
virtual RC try_get_value(Value &value) const
在没有实际运行的情况下,也就是无法获取tuple的情况下,尝试获取表达式的值
Definition: expression.h:74
字段表达式
Definition: expression.h:106
字段元数据
Definition: field_meta.h:31
字段
Definition: field.h:25
将两个tuple合并为一个tuple
Definition: tuple.h:380
RC cell_at(int index, Value &value) const override
获取指定位置的Cell
Definition: tuple.h:399
int cell_num() const override
获取元组中的Cell的个数
Definition: tuple.h:394
RC find_cell(const TupleCellSpec &spec, Value &value) const override
根据cell的描述,获取cell的值
Definition: tuple.h:413
从一行数据中,选择部分字段组成的元组,也就是投影操作
Definition: tuple.h:235
RC cell_at(int index, Value &cell) const override
获取指定位置的Cell
Definition: tuple.h:260
int cell_num() const override
获取元组中的Cell的个数
Definition: tuple.h:255
RC find_cell(const TupleCellSpec &spec, Value &cell) const override
根据cell的描述,获取cell的值
Definition: tuple.h:273
表示一个记录 当前的记录都是连续存放的空间(内存或磁盘上)。 为了提高访问的效率,record通常直接记录指向页面上的内存,但是需要保证访问这种数据时,拿着锁资源。 为了方便,也提供了复制内存的方法。可...
Definition: record.h:92
一行数据的元组
Definition: tuple.h:137
int cell_num() const override
获取元组中的Cell的个数
Definition: tuple.h:162
RC cell_at(int index, Value &cell) const override
获取指定位置的Cell
Definition: tuple.h:167
RC find_cell(const TupleCellSpec &spec, Value &cell) const override
根据cell的描述,获取cell的值
Definition: tuple.h:181
Definition: table.h:37
Definition: tuple_cell.h:22
元组的结构,包含哪些字段(这里成为Cell),每个字段的说明
Definition: tuple.h:52
元组的抽象描述
Definition: tuple.h:84
virtual RC find_cell(const TupleCellSpec &spec, Value &cell) const =0
根据cell的描述,获取cell的值
virtual int cell_num() const =0
获取元组中的Cell的个数
virtual RC cell_at(int index, Value &cell) const =0
获取指定位置的Cell
一些常量值组成的Tuple
Definition: tuple.h:340
virtual int cell_num() const override
获取元组中的Cell的个数
Definition: tuple.h:350
virtual RC find_cell(const TupleCellSpec &spec, Value &cell) const override
根据cell的描述,获取cell的值
Definition: tuple.h:365
virtual RC cell_at(int index, Value &cell) const override
获取指定位置的Cell
Definition: tuple.h:355
属性的值
Definition: value.h:40