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"
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()); }
55 const TupleCellSpec &cell_at(
int i)
const {
return cells_[i]; }
58 vector<TupleCellSpec> cells_;
69 virtual ~Tuple() =
default;
95 virtual string to_string()
const
99 for (
int i = 0; i <
cell_num - 1; i++) {
102 str += cell.to_string();
109 str += cell.to_string();
114 virtual RC compare(
const Tuple &other,
int &result)
const
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) {
124 if (this_cell_num > other_cell_num) {
131 for (
int i = 0; i < this_cell_num; i++) {
132 rc = this->
cell_at(i, this_value);
137 rc = other.
cell_at(i, other_value);
142 result = this_value.compare(other_value);
170 void set_record(
Record *record) { this->record_ = record; }
172 void set_schema(
const Table *table,
const vector<FieldMeta> *fields)
180 this->speces_.clear();
181 this->speces_.reserve(fields->size());
183 speces_.push_back(
new FieldExpr(table, &field));
187 int cell_num()
const override {
return speces_.size(); }
191 if (index < 0 || index >=
static_cast<int>(speces_.size())) {
192 LOG_WARN(
"invalid argument. index=%d", index);
193 return RC::INVALID_ARGUMENT;
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());
205 const Field &field = speces_[index]->field();
212 const char *table_name = spec.table_name();
213 const char *field_name = spec.field_name();
214 if (0 != strcmp(table_name, table_->name())) {
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())) {
229 RC cell_spec_at(
int index,
const TupleCellSpec *&spec)
const override
231 if (index < 0 || index >=
static_cast<int>(speces_.size())) {
232 LOG_WARN(
"invalid argument. index=%d", index);
233 return RC::INVALID_ARGUMENT;
235 spec = speces_[index];
240 Record &record() {
return *record_; }
242 const Record &record()
const {
return *record_; }
245 Record *record_ =
nullptr;
246 const Table *table_ =
nullptr;
247 vector<FieldExpr *> speces_;
262 void set_expressions(vector<unique_ptr<Expression>> &&expressions) { expressions_ = std::move(expressions); }
264 auto get_expressions()
const ->
const vector<unique_ptr<Expression>> & {
return expressions_; }
266 void set_tuple(
Tuple *tuple) { this->tuple_ = tuple; }
268 int cell_num()
const override {
return static_cast<int>(expressions_.size()); }
272 if (index < 0 || index >=
cell_num()) {
275 if (tuple_ ==
nullptr) {
292 RC cell_spec_at(
int index,
const TupleCellSpec *&spec)
const override
294 if (index < 0 || index >=
static_cast<int>(speces_.size())) {
297 spec = speces_[index];
302 vector<unique_ptr<Expression>> expressions_;
303 Tuple *tuple_ =
nullptr;
317 void set_names(
const vector<TupleCellSpec> &specs) { specs_ = specs; }
318 void set_cells(
const vector<Value> &cells) { cells_ = cells; }
320 virtual int cell_num()
const override {
return static_cast<int>(cells_.size()); }
324 if (index < 0 || index >=
cell_num()) {
328 cell = cells_[index];
334 if (index < 0 || index >=
cell_num()) {
338 spec = specs_[index];
344 ASSERT(cells_.size() == specs_.size(),
"cells_.size()=%d, specs_.size()=%d", cells_.size(), specs_.size());
346 const int size =
static_cast<int>(specs_.size());
347 for (
int i = 0; i < size; i++) {
348 if (specs_[i].equals(spec)) {
359 for (
int i = 0; i <
cell_num; i++) {
361 RC rc = tuple.
cell_at(i, cell);
367 rc = tuple.spec_at(i, spec);
372 value_list.cells_.push_back(cell);
373 value_list.specs_.push_back(spec);
379 vector<Value> cells_;
380 vector<TupleCellSpec> specs_;
395 void set_left(
Tuple *left) { left_ = left; }
396 void set_right(
Tuple *right) { right_ = right; }
402 const int left_cell_num = left_->
cell_num();
403 if (index >= 0 && index < left_cell_num) {
404 return left_->
cell_at(index, value);
407 if (index >= left_cell_num && index < left_cell_num + right_->
cell_num()) {
408 return right_->
cell_at(index - left_cell_num, value);
416 const int left_cell_num = left_->
cell_num();
417 if (index >= 0 && index < left_cell_num) {
418 return left_->spec_at(index, spec);
421 if (index >= left_cell_num && index < left_cell_num + right_->
cell_num()) {
422 return right_->spec_at(index - left_cell_num, spec);
431 if (rc == RC::SUCCESS || rc != RC::NOTFOUND) {
439 Tuple *left_ =
nullptr;
440 Tuple *right_ =
nullptr;
表达式的抽象描述
Definition: expression.h:66
virtual RC get_value(const Tuple &tuple, Value &value) const =0
根据具体的tuple,来计算当前表达式的值。tuple有可能是一个具体某个表的行数据
字段表达式
Definition: expression.h:193
将两个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: 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