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"
56 cells_.push_back(cell);
58 void append_cell(
const char *table,
const char *field)
62 void append_cell(
const char *alias)
68 return static_cast<int>(cells_.size());
76 std::vector<TupleCellSpec> cells_;
87 virtual ~Tuple() =
default;
111 virtual std::string to_string()
const
115 for (
int i = 0; i <
cell_num - 1; i++) {
118 str += cell.to_string();
125 str += cell.to_string();
148 void set_record(
Record *record)
150 this->record_ = record;
153 void set_schema(
const Table *table,
const std::vector<FieldMeta> *fields)
156 this->speces_.reserve(fields->size());
158 speces_.push_back(
new FieldExpr(table, &field));
164 return speces_.size();
169 if (index < 0 || index >=
static_cast<int>(speces_.size())) {
170 LOG_WARN(
"invalid argument. index=%d", index);
171 return RC::INVALID_ARGUMENT;
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());
183 const char *table_name = spec.table_name();
184 const char *field_name = spec.field_name();
185 if (0 != strcmp(table_name, table_->name())) {
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())) {
200 RC cell_spec_at(
int index,
const TupleCellSpec *&spec)
const override
202 if (index < 0 || index >=
static_cast<int>(speces_.size())) {
203 LOG_WARN(
"invalid argument. index=%d", index);
204 return RC::INVALID_ARGUMENT;
206 spec = speces_[index];
216 const Record &record()
const
222 Record *record_ =
nullptr;
223 const Table *table_ =
nullptr;
224 std::vector<FieldExpr *> speces_;
246 void set_tuple(
Tuple *tuple)
248 this->tuple_ = tuple;
253 speces_.push_back(spec);
257 return speces_.size();
262 if (index < 0 || index >=
static_cast<int>(speces_.size())) {
265 if (tuple_ ==
nullptr) {
279 RC cell_spec_at(
int index,
const TupleCellSpec *&spec)
const override
281 if (index < 0 || index >=
static_cast<int>(speces_.size())) {
284 spec = speces_[index];
289 std::vector<TupleCellSpec *> speces_;
290 Tuple *tuple_ =
nullptr;
297 : expressions_(expressions)
307 return expressions_.size();
312 if (index < 0 || index >=
static_cast<int>(expressions_.size())) {
316 const Expression *expr = expressions_[index].get();
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);
332 const std::vector<std::unique_ptr<Expression>> &expressions_;
345 void set_cells(
const std::vector<Value> &cells)
352 return static_cast<int>(cells_.size());
357 if (index < 0 || index >=
cell_num()) {
361 cell = cells_[index];
371 std::vector<Value> cells_;
385 void set_left(
Tuple *left)
389 void set_right(
Tuple *right)
401 const int left_cell_num = left_->
cell_num();
402 if (index > 0 && index < left_cell_num) {
403 return left_->
cell_at(index, value);
406 if (index >= left_cell_num && index < left_cell_num + right_->
cell_num()) {
407 return right_->
cell_at(index - left_cell_num, value);
416 if (rc == RC::SUCCESS || rc != RC::NOTFOUND) {
424 Tuple *left_ =
nullptr;
425 Tuple *right_ =
nullptr;
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
将两个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: 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