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 "common/log/log.h"
18#include "sql/expr/expression.h"
19#include "sql/expr/tuple_cell.h"
20#include "sql/parser/parse.h"
21#include "common/value.h"
22#include "storage/record/record.h"
23
24class Table;
25
48{
49public:
50 void append_cell(const TupleCellSpec &cell) { cells_.push_back(cell); }
51 void append_cell(const char *table, const char *field) { append_cell(TupleCellSpec(table, field)); }
52 void append_cell(const char *alias) { append_cell(TupleCellSpec(alias)); }
53 int cell_num() const { return static_cast<int>(cells_.size()); }
54
55 const TupleCellSpec &cell_at(int i) const { return cells_[i]; }
56
57private:
58 vector<TupleCellSpec> cells_;
59};
60
65class Tuple
66{
67public:
68 Tuple() = default;
69 virtual ~Tuple() = default;
70
75 virtual int cell_num() const = 0;
76
83 virtual RC cell_at(int index, Value &cell) const = 0;
84
85 virtual RC spec_at(int index, TupleCellSpec &spec) const = 0;
86
93 virtual RC find_cell(const TupleCellSpec &spec, Value &cell) const = 0;
94
95 virtual string to_string() const
96 {
97 string str;
98 const int cell_num = this->cell_num();
99 for (int i = 0; i < cell_num - 1; i++) {
100 Value cell;
101 cell_at(i, cell);
102 str += cell.to_string();
103 str += ", ";
104 }
105
106 if (cell_num > 0) {
107 Value cell;
108 cell_at(cell_num - 1, cell);
109 str += cell.to_string();
110 }
111 return str;
112 }
113
114 virtual RC compare(const Tuple &other, int &result) const
115 {
116 RC rc = RC::SUCCESS;
117
118 const int this_cell_num = this->cell_num();
119 const int other_cell_num = other.cell_num();
120 if (this_cell_num < other_cell_num) {
121 result = -1;
122 return rc;
123 }
124 if (this_cell_num > other_cell_num) {
125 result = 1;
126 return rc;
127 }
128
129 Value this_value;
130 Value other_value;
131 for (int i = 0; i < this_cell_num; i++) {
132 rc = this->cell_at(i, this_value);
133 if (OB_FAIL(rc)) {
134 return rc;
135 }
136
137 rc = other.cell_at(i, other_value);
138 if (OB_FAIL(rc)) {
139 return rc;
140 }
141
142 result = this_value.compare(other_value);
143 if (0 != result) {
144 return rc;
145 }
146 }
147
148 result = 0;
149 return rc;
150 }
151};
152
158class RowTuple : public Tuple
159{
160public:
161 RowTuple() = default;
162 virtual ~RowTuple()
163 {
164 for (FieldExpr *spec : speces_) {
165 delete spec;
166 }
167 speces_.clear();
168 }
169
170 void set_record(Record *record) { this->record_ = record; }
171
172 void set_schema(const Table *table, const vector<FieldMeta> *fields)
173 {
174 table_ = table;
175 // fix:join当中会多次调用右表的open,open当中会调用set_scheme,从而导致tuple当中会存储
176 // 很多无意义的field和value,因此需要先clear掉
177 for (FieldExpr *spec : speces_) {
178 delete spec;
179 }
180 this->speces_.clear();
181 this->speces_.reserve(fields->size());
182 for (const FieldMeta &field : *fields) {
183 speces_.push_back(new FieldExpr(table, &field));
184 }
185 }
186
187 int cell_num() const override { return speces_.size(); }
188
189 RC cell_at(int index, Value &cell) const override
190 {
191 if (index < 0 || index >= static_cast<int>(speces_.size())) {
192 LOG_WARN("invalid argument. index=%d", index);
193 return RC::INVALID_ARGUMENT;
194 }
195
196 FieldExpr *field_expr = speces_[index];
197 const FieldMeta *field_meta = field_expr->field().meta();
198 cell.set_type(field_meta->type());
199 cell.set_data(this->record_->data() + field_meta->offset(), field_meta->len());
200 return RC::SUCCESS;
201 }
202
203 RC spec_at(int index, TupleCellSpec &spec) const override
204 {
205 const Field &field = speces_[index]->field();
206 spec = TupleCellSpec(table_->name(), field.field_name());
207 return RC::SUCCESS;
208 }
209
210 RC find_cell(const TupleCellSpec &spec, Value &cell) const override
211 {
212 const char *table_name = spec.table_name();
213 const char *field_name = spec.field_name();
214 if (0 != strcmp(table_name, table_->name())) {
215 return RC::NOTFOUND;
216 }
217
218 for (size_t i = 0; i < speces_.size(); ++i) {
219 const FieldExpr *field_expr = speces_[i];
220 const Field &field = field_expr->field();
221 if (0 == strcmp(field_name, field.field_name())) {
222 return cell_at(i, cell);
223 }
224 }
225 return RC::NOTFOUND;
226 }
227
228#if 0
229 RC cell_spec_at(int index, const TupleCellSpec *&spec) const override
230 {
231 if (index < 0 || index >= static_cast<int>(speces_.size())) {
232 LOG_WARN("invalid argument. index=%d", index);
233 return RC::INVALID_ARGUMENT;
234 }
235 spec = speces_[index];
236 return RC::SUCCESS;
237 }
238#endif
239
240 Record &record() { return *record_; }
241
242 const Record &record() const { return *record_; }
243
244private:
245 Record *record_ = nullptr;
246 const Table *table_ = nullptr;
247 vector<FieldExpr *> speces_;
248};
249
256class ProjectTuple : public Tuple
257{
258public:
259 ProjectTuple() = default;
260 virtual ~ProjectTuple() = default;
261
262 void set_expressions(vector<unique_ptr<Expression>> &&expressions) { expressions_ = std::move(expressions); }
263
264 auto get_expressions() const -> const vector<unique_ptr<Expression>> & { return expressions_; }
265
266 void set_tuple(Tuple *tuple) { this->tuple_ = tuple; }
267
268 int cell_num() const override { return static_cast<int>(expressions_.size()); }
269
270 RC cell_at(int index, Value &cell) const override
271 {
272 if (index < 0 || index >= cell_num()) {
273 return RC::INTERNAL;
274 }
275 if (tuple_ == nullptr) {
276 return RC::INTERNAL;
277 }
278
279 Expression *expr = expressions_[index].get();
280 return expr->get_value(*tuple_, cell);
281 }
282
283 RC spec_at(int index, TupleCellSpec &spec) const override
284 {
285 spec = TupleCellSpec(expressions_[index]->name());
286 return RC::SUCCESS;
287 }
288
289 RC find_cell(const TupleCellSpec &spec, Value &cell) const override { return tuple_->find_cell(spec, cell); }
290
291#if 0
292 RC cell_spec_at(int index, const TupleCellSpec *&spec) const override
293 {
294 if (index < 0 || index >= static_cast<int>(speces_.size())) {
295 return RC::NOTFOUND;
296 }
297 spec = speces_[index];
298 return RC::SUCCESS;
299 }
300#endif
301private:
302 vector<unique_ptr<Expression>> expressions_;
303 Tuple *tuple_ = nullptr;
304};
305
311class ValueListTuple : public Tuple
312{
313public:
314 ValueListTuple() = default;
315 virtual ~ValueListTuple() = default;
316
317 void set_names(const vector<TupleCellSpec> &specs) { specs_ = specs; }
318 void set_cells(const vector<Value> &cells) { cells_ = cells; }
319
320 virtual int cell_num() const override { return static_cast<int>(cells_.size()); }
321
322 virtual RC cell_at(int index, Value &cell) const override
323 {
324 if (index < 0 || index >= cell_num()) {
325 return RC::NOTFOUND;
326 }
327
328 cell = cells_[index];
329 return RC::SUCCESS;
330 }
331
332 RC spec_at(int index, TupleCellSpec &spec) const override
333 {
334 if (index < 0 || index >= cell_num()) {
335 return RC::NOTFOUND;
336 }
337
338 spec = specs_[index];
339 return RC::SUCCESS;
340 }
341
342 virtual RC find_cell(const TupleCellSpec &spec, Value &cell) const override
343 {
344 ASSERT(cells_.size() == specs_.size(), "cells_.size()=%d, specs_.size()=%d", cells_.size(), specs_.size());
345
346 const int size = static_cast<int>(specs_.size());
347 for (int i = 0; i < size; i++) {
348 if (specs_[i].equals(spec)) {
349 cell = cells_[i];
350 return RC::SUCCESS;
351 }
352 }
353 return RC::NOTFOUND;
354 }
355
356 static RC make(const Tuple &tuple, ValueListTuple &value_list)
357 {
358 const int cell_num = tuple.cell_num();
359 for (int i = 0; i < cell_num; i++) {
360 Value cell;
361 RC rc = tuple.cell_at(i, cell);
362 if (OB_FAIL(rc)) {
363 return rc;
364 }
365
366 TupleCellSpec spec;
367 rc = tuple.spec_at(i, spec);
368 if (OB_FAIL(rc)) {
369 return rc;
370 }
371
372 value_list.cells_.push_back(cell);
373 value_list.specs_.push_back(spec);
374 }
375 return RC::SUCCESS;
376 }
377
378private:
379 vector<Value> cells_;
380 vector<TupleCellSpec> specs_;
381};
382
389class JoinedTuple : public Tuple
390{
391public:
392 JoinedTuple() = default;
393 virtual ~JoinedTuple() = default;
394
395 void set_left(Tuple *left) { left_ = left; }
396 void set_right(Tuple *right) { right_ = right; }
397
398 int cell_num() const override { return left_->cell_num() + right_->cell_num(); }
399
400 RC cell_at(int index, Value &value) const override
401 {
402 const int left_cell_num = left_->cell_num();
403 if (index >= 0 && index < left_cell_num) {
404 return left_->cell_at(index, value);
405 }
406
407 if (index >= left_cell_num && index < left_cell_num + right_->cell_num()) {
408 return right_->cell_at(index - left_cell_num, value);
409 }
410
411 return RC::NOTFOUND;
412 }
413
414 RC spec_at(int index, TupleCellSpec &spec) const override
415 {
416 const int left_cell_num = left_->cell_num();
417 if (index >= 0 && index < left_cell_num) {
418 return left_->spec_at(index, spec);
419 }
420
421 if (index >= left_cell_num && index < left_cell_num + right_->cell_num()) {
422 return right_->spec_at(index - left_cell_num, spec);
423 }
424
425 return RC::NOTFOUND;
426 }
427
428 RC find_cell(const TupleCellSpec &spec, Value &value) const override
429 {
430 RC rc = left_->find_cell(spec, value);
431 if (rc == RC::SUCCESS || rc != RC::NOTFOUND) {
432 return rc;
433 }
434
435 return right_->find_cell(spec, value);
436 }
437
438private:
439 Tuple *left_ = nullptr;
440 Tuple *right_ = nullptr;
441};
表达式的抽象描述
Definition: expression.h:66
virtual RC get_value(const Tuple &tuple, Value &value) const =0
根据具体的tuple,来计算当前表达式的值。tuple有可能是一个具体某个表的行数据
字段表达式
Definition: expression.h:193
字段元数据
Definition: field_meta.h:30
字段
Definition: field.h:25
将两个tuple合并为一个tuple
Definition: tuple.h:390
RC cell_at(int index, Value &value) const override
获取指定位置的Cell
Definition: tuple.h:400
int cell_num() const override
获取元组中的Cell的个数
Definition: tuple.h:398
RC find_cell(const TupleCellSpec &spec, Value &value) const override
根据cell的描述,获取cell的值
Definition: tuple.h:428
从一行数据中,选择部分字段组成的元组,也就是投影操作
Definition: tuple.h:257
RC cell_at(int index, Value &cell) const override
获取指定位置的Cell
Definition: tuple.h:270
int cell_num() const override
获取元组中的Cell的个数
Definition: tuple.h:268
RC find_cell(const TupleCellSpec &spec, Value &cell) const override
根据cell的描述,获取cell的值
Definition: tuple.h:289
表示一个记录
Definition: record.h:101
一行数据的元组
Definition: tuple.h:159
int cell_num() const override
获取元组中的Cell的个数
Definition: tuple.h:187
RC cell_at(int index, Value &cell) const override
获取指定位置的Cell
Definition: tuple.h:189
RC find_cell(const TupleCellSpec &spec, Value &cell) const override
根据cell的描述,获取cell的值
Definition: tuple.h:210
Definition: table.h:42
Definition: tuple_cell.h:20
元组的结构,包含哪些字段(这里成为Cell),每个字段的说明
Definition: tuple.h:48
元组的抽象描述
Definition: tuple.h:66
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
一些常量值组成的TupleTODO 使用单独文件
Definition: tuple.h:312
virtual int cell_num() const override
获取元组中的Cell的个数
Definition: tuple.h:320
virtual RC find_cell(const TupleCellSpec &spec, Value &cell) const override
根据cell的描述,获取cell的值
Definition: tuple.h:342
virtual RC cell_at(int index, Value &cell) const override
获取指定位置的Cell
Definition: tuple.h:322
属性的值
Definition: value.h:30