expression.h 5.7 KB
Newer Older
羽飞's avatar
羽飞 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/* 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. */

//
// Created by Wangyunlai on 2022/07/05.
//

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

羽飞's avatar
羽飞 已提交
17
#include <string.h>
羽飞's avatar
羽飞 已提交
18
#include <memory>
羽飞's avatar
羽飞 已提交
19 20
#include "storage/common/field.h"
#include "sql/expr/tuple_cell.h"
羽飞's avatar
羽飞 已提交
21
#include "common/log/log.h"
羽飞's avatar
羽飞 已提交
22 23 24

class Tuple;

羽飞's avatar
羽飞 已提交
25 26 27 28
enum class ExprType {
  NONE,
  FIELD,
  VALUE,
羽飞's avatar
羽飞 已提交
29 30 31
  CAST,
  COMPARISON,
  CONJUNCTION,
羽飞's avatar
羽飞 已提交
32 33
};

羽飞's avatar
羽飞 已提交
34 35 36 37 38 39 40 41 42 43
/**
 * 表达式的抽象描述
 * 在SQL的元素中,任何需要得出值的元素都可以使用表达式来描述
 * 比如获取某个字段的值、比较运算、类型转换
 * 当然还有一些当前没有实现的表达式,比如算术运算。
 *
 * 通常表达式的值,是在真实的算子运算过程中,拿到具体的tuple后
 * 才能计算出来真实的值。但是有些表达式可能就表示某一个固定的
 * 值,比如ValueExpr。
 */
羽飞's avatar
羽飞 已提交
44 45 46 47 48
class Expression
{
public: 
  Expression() = default;
  virtual ~Expression() = default;
羽飞's avatar
羽飞 已提交
49 50 51 52

  /**
   * 根据具体的tuple,来计算当前表达式的值
   */
羽飞's avatar
羽飞 已提交
53
  virtual RC get_value(const Tuple &tuple, TupleCell &cell) const = 0;
羽飞's avatar
羽飞 已提交
54 55 56 57 58

  /**
   * 表达式的类型
   * 可以根据表达式类型来转换为具体的子类
   */
羽飞's avatar
羽飞 已提交
59
  virtual ExprType type() const = 0;
羽飞's avatar
羽飞 已提交
60 61 62 63 64

  /**
   * 表达式值的类型
   */
  virtual AttrType value_type() const = 0;  
羽飞's avatar
羽飞 已提交
65 66 67 68 69 70 71 72
};

class FieldExpr : public Expression
{
public:
  FieldExpr() = default;
  FieldExpr(const Table *table, const FieldMeta *field) : field_(table, field)
  {}
羽飞's avatar
羽飞 已提交
73 74
  FieldExpr(const Field &field) : field_(field)
  {}
羽飞's avatar
羽飞 已提交
75 76 77

  virtual ~FieldExpr() = default;

羽飞's avatar
羽飞 已提交
78 79 80 81
  ExprType type() const override
  {
    return ExprType::FIELD;
  }
羽飞's avatar
羽飞 已提交
82 83 84 85
  AttrType value_type() const override
  {
    return field_.attr_type();
  }
羽飞's avatar
羽飞 已提交
86

羽飞's avatar
羽飞 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
  Field &field()
  {
    return field_;
  }

  const Field &field() const
  {
    return field_;
  }

  const char *table_name() const
  {
    return field_.table_name();
  }

  const char *field_name() const
  {
    return field_.field_name();
  }

  RC get_value(const Tuple &tuple, TupleCell &cell) const override;
private:
  Field field_;
};

class ValueExpr : public Expression
{
public:
  ValueExpr() = default;
羽飞's avatar
羽飞 已提交
116
  ValueExpr(const Value &value)
羽飞's avatar
羽飞 已提交
117
  {
羽飞's avatar
羽飞 已提交
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
    switch (value.type) {
      case UNDEFINED: {
        ASSERT(false, "value's type is invalid");
      } break;
      case INTS: {
        tuple_cell_.set_int(value.int_value);
      } break;
      case FLOATS: {
        tuple_cell_.set_float(value.float_value);
      } break;
      case CHARS: {
        tuple_cell_.set_string(value.string_value.c_str());
      } break;
      case BOOLEANS: {
        tuple_cell_.set_boolean(value.bool_value);
      } break;
羽飞's avatar
羽飞 已提交
134 135
    }
  }
羽飞's avatar
羽飞 已提交
136 137
  ValueExpr(const TupleCell &cell) : tuple_cell_(cell)
  {}
羽飞's avatar
羽飞 已提交
138 139 140 141

  virtual ~ValueExpr() = default;

  RC get_value(const Tuple &tuple, TupleCell & cell) const override;
羽飞's avatar
羽飞 已提交
142

羽飞's avatar
羽飞 已提交
143 144 145 146 147
  ExprType type() const override
  {
    return ExprType::VALUE;
  }

羽飞's avatar
羽飞 已提交
148 149 150 151 152
  AttrType value_type() const override
  {
    return tuple_cell_.attr_type();
  }

羽飞's avatar
羽飞 已提交
153 154 155
  void get_tuple_cell(TupleCell &cell) const {
    cell = tuple_cell_;
  }
羽飞's avatar
羽飞 已提交
156

羽飞's avatar
羽飞 已提交
157 158 159 160
  const TupleCell &get_tuple_cell() const {
    return tuple_cell_;
  }

羽飞's avatar
羽飞 已提交
161
private:
羽飞's avatar
羽飞 已提交
162
  TupleCell tuple_cell_;
羽飞's avatar
羽飞 已提交
163
};
羽飞's avatar
羽飞 已提交
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 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 235 236 237 238 239 240 241 242 243

class CastExpr : public Expression
{
public: 
  CastExpr(std::unique_ptr<Expression> child, AttrType cast_type);
  virtual ~CastExpr();

  ExprType type() const override { return ExprType::CAST; }
  RC get_value(const Tuple &tuple, TupleCell &cell) const override;
  AttrType value_type() const override
  {
    return cast_type_;
  }

  std::unique_ptr<Expression> &child()  { return child_; }
private:
  std::unique_ptr<Expression> child_;
  AttrType cast_type_;
};

class ComparisonExpr : public Expression
{
public:
  ComparisonExpr(CompOp comp, std::unique_ptr<Expression> left, std::unique_ptr<Expression> right);
  virtual ~ComparisonExpr();
  
  ExprType type() const override { return ExprType::COMPARISON; }
  RC get_value(const Tuple &tuple, TupleCell &cell) const override;
  AttrType value_type() const override { return BOOLEANS; }

  CompOp comp() const { return comp_; }
  std::unique_ptr<Expression> &left() { return left_; }
  std::unique_ptr<Expression> &right() { return right_; }

  /**
   * 尝试在没有tuple的情况下获取当前表达式的值
   * 在优化的时候,可能会使用到
   */
  RC try_get_value(TupleCell &cell) const;

  /**
   * compare the two tuple cells
   * @param value the result of comparison
   */
  RC compare_tuple_cell(const TupleCell &left, const TupleCell &right, bool &value) const;

private:
  CompOp comp_;
  std::unique_ptr<Expression> left_;
  std::unique_ptr<Expression> right_;
};

/**
 * 多个表达式使用同一种关系(AND或OR)来联结
 * 当前miniob仅有AND操作
 */
class ConjunctionExpr : public Expression
{
public:
  enum class Type
  {
    AND,
    OR,
  };
  
public:
  ConjunctionExpr(Type type, std::vector<std::unique_ptr<Expression>> &children);
  virtual ~ConjunctionExpr() = default;

  ExprType type() const override { return ExprType::CONJUNCTION; }
  AttrType value_type() const override { return BOOLEANS; }
  RC get_value(const Tuple &tuple, TupleCell &cell) const override;

  Type conjunction_type() const { return conjunction_type_; }

  std::vector<std::unique_ptr<Expression>> &children() { return children_; }
private:
  Type  conjunction_type_;
  std::vector<std::unique_ptr<Expression>> children_;
};