expression.h 5.8 KB
Newer Older
羽飞's avatar
羽飞 已提交
1
/* Copyright (c) 2021 OceanBase and/or its affiliates. All rights reserved.
羽飞's avatar
羽飞 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14
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
#include "storage/field/field.h"
羽飞's avatar
羽飞 已提交
20
#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
enum class ExprType 
{
羽飞's avatar
羽飞 已提交
27 28 29
  NONE,
  FIELD,
  VALUE,
羽飞's avatar
羽飞 已提交
30 31 32
  CAST,
  COMPARISON,
  CONJUNCTION,
羽飞's avatar
羽飞 已提交
33 34
};

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

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

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

  /**
   * 表达式值的类型
   */
L
Longda Feng 已提交
65
  virtual AttrType value_type() const = 0;
羽飞's avatar
羽飞 已提交
66 67
};

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

  virtual ~FieldExpr() = default;

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

羽飞's avatar
羽飞 已提交
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
  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;
L
Longda Feng 已提交
109

羽飞's avatar
羽飞 已提交
110 111 112 113
private:
  Field field_;
};

羽飞's avatar
羽飞 已提交
114 115
class ValueExpr : public Expression 
{
羽飞's avatar
羽飞 已提交
116 117
public:
  ValueExpr() = default;
羽飞's avatar
羽飞 已提交
118
  ValueExpr(const Value &value)
羽飞's avatar
羽飞 已提交
119
  {
羽飞's avatar
羽飞 已提交
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
    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
羽飞 已提交
136 137
    }
  }
羽飞's avatar
羽飞 已提交
138 139
  ValueExpr(const TupleCell &cell) : tuple_cell_(cell)
  {}
羽飞's avatar
羽飞 已提交
140 141 142

  virtual ~ValueExpr() = default;

L
Longda Feng 已提交
143
  RC get_value(const Tuple &tuple, TupleCell &cell) const override;
羽飞's avatar
羽飞 已提交
144

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

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

L
Longda Feng 已提交
155 156
  void get_tuple_cell(TupleCell &cell) const
  {
羽飞's avatar
羽飞 已提交
157 158
    cell = tuple_cell_;
  }
羽飞's avatar
羽飞 已提交
159

L
Longda Feng 已提交
160 161
  const TupleCell &get_tuple_cell() const
  {
羽飞's avatar
羽飞 已提交
162 163 164
    return tuple_cell_;
  }

羽飞's avatar
羽飞 已提交
165
private:
羽飞's avatar
羽飞 已提交
166
  TupleCell tuple_cell_;
羽飞's avatar
羽飞 已提交
167
};
羽飞's avatar
羽飞 已提交
168

羽飞's avatar
羽飞 已提交
169 170
class CastExpr : public Expression 
{
L
Longda Feng 已提交
171
public:
羽飞's avatar
羽飞 已提交
172 173 174
  CastExpr(std::unique_ptr<Expression> child, AttrType cast_type);
  virtual ~CastExpr();

L
Longda Feng 已提交
175 176 177 178
  ExprType type() const override
  {
    return ExprType::CAST;
  }
羽飞's avatar
羽飞 已提交
179 180 181 182 183 184
  RC get_value(const Tuple &tuple, TupleCell &cell) const override;
  AttrType value_type() const override
  {
    return cast_type_;
  }

L
Longda Feng 已提交
185 186 187 188 189
  std::unique_ptr<Expression> &child()
  {
    return child_;
  }

羽飞's avatar
羽飞 已提交
190 191 192 193 194
private:
  std::unique_ptr<Expression> child_;
  AttrType cast_type_;
};

羽飞's avatar
羽飞 已提交
195 196
class ComparisonExpr : public Expression 
{
羽飞's avatar
羽飞 已提交
197 198 199
public:
  ComparisonExpr(CompOp comp, std::unique_ptr<Expression> left, std::unique_ptr<Expression> right);
  virtual ~ComparisonExpr();
L
Longda Feng 已提交
200 201 202 203 204

  ExprType type() const override
  {
    return ExprType::COMPARISON;
  }
羽飞's avatar
羽飞 已提交
205
  RC get_value(const Tuple &tuple, TupleCell &cell) const override;
L
Longda Feng 已提交
206 207 208 209
  AttrType value_type() const override
  {
    return BOOLEANS;
  }
羽飞's avatar
羽飞 已提交
210

L
Longda Feng 已提交
211 212 213 214 215 216 217 218 219 220 221 222
  CompOp comp() const
  {
    return comp_;
  }
  std::unique_ptr<Expression> &left()
  {
    return left_;
  }
  std::unique_ptr<Expression> &right()
  {
    return right_;
  }
羽飞's avatar
羽飞 已提交
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245

  /**
   * 尝试在没有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操作
 */
羽飞's avatar
羽飞 已提交
246 247
class ConjunctionExpr : public Expression 
{
羽飞's avatar
羽飞 已提交
248
public:
L
Longda Feng 已提交
249
  enum class Type {
羽飞's avatar
羽飞 已提交
250 251 252
    AND,
    OR,
  };
L
Longda Feng 已提交
253

羽飞's avatar
羽飞 已提交
254 255 256 257
public:
  ConjunctionExpr(Type type, std::vector<std::unique_ptr<Expression>> &children);
  virtual ~ConjunctionExpr() = default;

L
Longda Feng 已提交
258 259 260 261 262 263 264 265
  ExprType type() const override
  {
    return ExprType::CONJUNCTION;
  }
  AttrType value_type() const override
  {
    return BOOLEANS;
  }
羽飞's avatar
羽飞 已提交
266 267
  RC get_value(const Tuple &tuple, TupleCell &cell) const override;

L
Longda Feng 已提交
268 269 270 271 272 273 274 275 276
  Type conjunction_type() const
  {
    return conjunction_type_;
  }

  std::vector<std::unique_ptr<Expression>> &children()
  {
    return children_;
  }
羽飞's avatar
羽飞 已提交
277 278

private:
L
Longda Feng 已提交
279
  Type conjunction_type_;
羽飞's avatar
羽飞 已提交
280 281
  std::vector<std::unique_ptr<Expression>> children_;
};