tuple.h 6.4 KB
Newer Older
羽飞's avatar
羽飞 已提交
1 2 3 4 5 6 7 8 9 10 11
/* Copyright (c) 2021 Xie Meiyi(xiemeiyi@hust.edu.cn) and OceanBase and/or its affiliates. All rights reserved.
miniob is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
         http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details. */

//
羽飞's avatar
羽飞 已提交
12
// Created by Wangyunlai on 2021/5/14.
羽飞's avatar
羽飞 已提交
13 14
//

羽飞's avatar
羽飞 已提交
15
#pragma once
羽飞's avatar
羽飞 已提交
16 17 18 19

#include <memory>
#include <vector>

羽飞's avatar
羽飞 已提交
20
#include "common/log/log.h"
羽飞's avatar
羽飞 已提交
21
#include "sql/parser/parse.h"
羽飞's avatar
羽飞 已提交
22 23
#include "sql/expr/tuple_cell.h"
#include "sql/expr/expression.h"
羽飞's avatar
羽飞 已提交
24
#include "storage/record/record.h"
羽飞's avatar
羽飞 已提交
25 26 27

class Table;

羽飞's avatar
羽飞 已提交
28
class TupleSchema
羽飞's avatar
羽飞 已提交
29
{
羽飞's avatar
羽飞 已提交
30 31 32 33 34 35
public: 
  void append_cell(const TupleCellSpec &cell) { cells_.push_back(cell); }
  void append_cell(const char *table, const char *field) { append_cell(TupleCellSpec(table, field)); }
  void append_cell(const char *alias) { append_cell(TupleCellSpec(alias)); }
  int cell_num() const { return static_cast<int>(cells_.size()); }
  const TupleCellSpec &cell_at(int i) const { return cells_[i]; }
羽飞's avatar
羽飞 已提交
36 37

private:
羽飞's avatar
羽飞 已提交
38
  std::vector<TupleCellSpec> cells_;
羽飞's avatar
羽飞 已提交
39 40 41 42
};

class Tuple
{
羽飞's avatar
羽飞 已提交
43 44
public:
  Tuple() = default;
羽飞's avatar
羽飞 已提交
45
  virtual ~Tuple() = default;
羽飞's avatar
羽飞 已提交
46

羽飞's avatar
羽飞 已提交
47 48
  virtual int cell_num() const = 0; 
  virtual RC  cell_at(int index, TupleCell &cell) const = 0;
羽飞's avatar
羽飞 已提交
49
  virtual RC  find_cell(const TupleCellSpec &spec, TupleCell &cell) const = 0;
羽飞's avatar
羽飞 已提交
50
};
羽飞's avatar
羽飞 已提交
51

羽飞's avatar
羽飞 已提交
52 53 54 55
class RowTuple : public Tuple
{
public:
  RowTuple() = default;
羽飞's avatar
羽飞 已提交
56 57
  virtual ~RowTuple()
  {
羽飞's avatar
羽飞 已提交
58
    for (FieldExpr *spec : speces_) {
羽飞's avatar
羽飞 已提交
59 60 61 62
      delete spec;
    }
    speces_.clear();
  }
羽飞's avatar
羽飞 已提交
63 64
  
  void set_record(Record *record)
65
  {
羽飞's avatar
羽飞 已提交
66
    this->record_ = record;
羽飞's avatar
羽飞 已提交
67 68
  }

羽飞's avatar
羽飞 已提交
69
  void set_schema(const Table *table, const std::vector<FieldMeta> *fields)
70
  {
羽飞's avatar
羽飞 已提交
71 72 73
    table_ = table;
    this->speces_.reserve(fields->size());
    for (const FieldMeta &field : *fields) {
羽飞's avatar
羽飞 已提交
74
      speces_.push_back(new FieldExpr(table, &field));
羽飞's avatar
羽飞 已提交
75
    }
羽飞's avatar
羽飞 已提交
76 77
  }

羽飞's avatar
羽飞 已提交
78
  int cell_num() const override
79
  {
羽飞's avatar
羽飞 已提交
80
    return speces_.size();
羽飞's avatar
羽飞 已提交
81 82
  }

羽飞's avatar
羽飞 已提交
83
  RC cell_at(int index, TupleCell &cell) const override
84
  {
羽飞's avatar
羽飞 已提交
85
    if (index < 0 || index >= static_cast<int>(speces_.size())) {
羽飞's avatar
羽飞 已提交
86 87 88 89
      LOG_WARN("invalid argument. index=%d", index);
      return RC::INVALID_ARGUMENT;
    }

羽飞's avatar
羽飞 已提交
90
    FieldExpr *field_expr = speces_[index];
羽飞's avatar
羽飞 已提交
91 92
    const FieldMeta *field_meta = field_expr->field().meta();
    cell.set_type(field_meta->type());
羽飞's avatar
羽飞 已提交
93
    cell.set_data(this->record_->data() + field_meta->offset(), field_meta->len());
羽飞's avatar
羽飞 已提交
94
    return RC::SUCCESS;
羽飞's avatar
羽飞 已提交
95 96
  }

羽飞's avatar
羽飞 已提交
97
  RC find_cell(const TupleCellSpec &spec, TupleCell &cell) const override
羽飞's avatar
羽飞 已提交
98
  {
羽飞's avatar
羽飞 已提交
99 100
    const char *table_name = spec.table_name();
    const char *field_name = spec.field_name();
羽飞's avatar
羽飞 已提交
101 102 103 104
    if (0 != strcmp(table_name, table_->name())) {
      return RC::NOTFOUND;
    }

羽飞's avatar
羽飞 已提交
105
    for (size_t i = 0; i < speces_.size(); ++i) {
羽飞's avatar
羽飞 已提交
106
      const FieldExpr * field_expr = speces_[i];
羽飞's avatar
羽飞 已提交
107 108
      const Field &field = field_expr->field();
      if (0 == strcmp(field_name, field.field_name())) {
羽飞's avatar
羽飞 已提交
109 110 111 112 113 114
	return cell_at(i, cell);
      }
    }
    return RC::NOTFOUND;
  }

羽飞's avatar
羽飞 已提交
115
  #if 0
羽飞's avatar
羽飞 已提交
116
  RC cell_spec_at(int index, const TupleCellSpec *&spec) const override
117
  {
羽飞's avatar
羽飞 已提交
118
    if (index < 0 || index >= static_cast<int>(speces_.size())) {
羽飞's avatar
羽飞 已提交
119 120 121
      LOG_WARN("invalid argument. index=%d", index);
      return RC::INVALID_ARGUMENT;
    }
羽飞's avatar
羽飞 已提交
122
    spec = speces_[index];
羽飞's avatar
羽飞 已提交
123
    return RC::SUCCESS;
羽飞's avatar
羽飞 已提交
124
  }
羽飞's avatar
羽飞 已提交
125
  #endif
羽飞's avatar
羽飞 已提交
126

羽飞's avatar
羽飞 已提交
127
  Record &record()
128
  {
羽飞's avatar
羽飞 已提交
129
    return *record_;
羽飞's avatar
羽飞 已提交
130 131
  }

羽飞's avatar
羽飞 已提交
132
  const Record &record() const
133
  {
羽飞's avatar
羽飞 已提交
134
    return *record_;
羽飞's avatar
羽飞 已提交
135 136
  }
private:
羽飞's avatar
羽飞 已提交
137
  Record *record_ = nullptr;
羽飞's avatar
羽飞 已提交
138
  const Table *table_ = nullptr;
羽飞's avatar
羽飞 已提交
139
  std::vector<FieldExpr *> speces_;
羽飞's avatar
羽飞 已提交
140
};
羽飞's avatar
羽飞 已提交
141 142 143 144 145

class ProjectTuple : public Tuple
{
public:
  ProjectTuple() = default;
羽飞's avatar
羽飞 已提交
146 147 148 149 150 151 152
  virtual ~ProjectTuple()
  {
    for (TupleCellSpec *spec : speces_) {
      delete spec;
    }
    speces_.clear();
  }
羽飞's avatar
羽飞 已提交
153 154 155 156 157 158

  void set_tuple(Tuple *tuple)
  {
    this->tuple_ = tuple;
  }

羽飞's avatar
羽飞 已提交
159
  void add_cell_spec(TupleCellSpec *spec)
羽飞's avatar
羽飞 已提交
160 161 162 163 164 165 166 167 168 169
  {
    speces_.push_back(spec);
  }
  int cell_num() const override
  {
    return speces_.size();
  }

  RC cell_at(int index, TupleCell &cell) const override
  {
羽飞's avatar
羽飞 已提交
170
    if (index < 0 || index >= static_cast<int>(speces_.size())) {
羽飞's avatar
羽飞 已提交
171 172 173 174 175 176
      return RC::GENERIC_ERROR;
    }
    if (tuple_ == nullptr) {
      return RC::GENERIC_ERROR;
    }

羽飞's avatar
羽飞 已提交
177
    const TupleCellSpec *spec = speces_[index];
羽飞's avatar
羽飞 已提交
178
    return tuple_->find_cell(*spec, cell);
羽飞's avatar
羽飞 已提交
179 180
  }

羽飞's avatar
羽飞 已提交
181
  RC find_cell(const TupleCellSpec &spec, TupleCell &cell) const override
羽飞's avatar
羽飞 已提交
182
  {
羽飞's avatar
羽飞 已提交
183
    return tuple_->find_cell(spec, cell);
羽飞's avatar
羽飞 已提交
184
  }
羽飞's avatar
羽飞 已提交
185 186

  #if 0
羽飞's avatar
羽飞 已提交
187
  RC cell_spec_at(int index, const TupleCellSpec *&spec) const override
羽飞's avatar
羽飞 已提交
188
  {
羽飞's avatar
羽飞 已提交
189
    if (index < 0 || index >= static_cast<int>(speces_.size())) {
羽飞's avatar
羽飞 已提交
190 191 192 193 194
      return RC::NOTFOUND;
    }
    spec = speces_[index];
    return RC::SUCCESS;
  }
羽飞's avatar
羽飞 已提交
195
  #endif
羽飞's avatar
羽飞 已提交
196
private:
羽飞's avatar
羽飞 已提交
197
  std::vector<TupleCellSpec *> speces_;
羽飞's avatar
羽飞 已提交
198 199
  Tuple *tuple_ = nullptr;
};
羽飞's avatar
羽飞 已提交
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234

class ValueListTuple : public Tuple
{
public: 
  ValueListTuple() = default;
  virtual ~ValueListTuple() = default;

  void set_cells(const std::vector<TupleCell> &cells)
  {
    cells_ = cells;
  }

  virtual int cell_num() const override
  {
    return static_cast<int>(cells_.size());
  }

  virtual RC  cell_at(int index, TupleCell &cell) const override
  {
    if (index < 0 || index >= cell_num()) {
      return RC::NOTFOUND;
    }

    cell = cells_[index];
    return RC::SUCCESS;
  }

  virtual RC  find_cell(const TupleCellSpec &spec, TupleCell &cell) const override
  {
    return RC::INTERNAL;
  }

private:
  std::vector<TupleCell> cells_;
};
羽飞's avatar
羽飞 已提交
235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281

/**
 * 将两个tuple合并为一个tuple
 * 在join算子中使用
 */
class JoinedTuple : public Tuple
{
public:
  JoinedTuple() = default;
  virtual ~JoinedTuple() = default;

  void set_left(Tuple *left) { left_ = left; }
  void set_right(Tuple *right) { right_ = right; }
  
  int cell_num() const override
  {
    return left_->cell_num() + right_->cell_num();
  }

  RC cell_at(int index, TupleCell &cell) const override
  {
    const int left_cell_num = left_->cell_num();
    if (index >0 && index < left_cell_num) {
      return left_->cell_at(index, cell);
    }

    if (index >= left_cell_num && index < left_cell_num + right_->cell_num()) {
      return right_->cell_at(index - left_cell_num, cell);
    }

    return RC::NOTFOUND;
  }

  RC find_cell(const TupleCellSpec &spec, TupleCell &cell) const override
  {
    RC rc = left_->find_cell(spec, cell);
    if (rc == RC::SUCCESS || rc != RC::NOTFOUND) {
      return rc;
    }

    return right_->find_cell(spec, cell);
  }
  
private:
  Tuple * left_ = nullptr;
  Tuple * right_ = nullptr;
};