expression.h 6.6 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 27 28 29 30 31 32 33
/**
 * @defgroup Expression
 * @brief 表达式
 */

/**
 * @brief 表达式类型
 * @ingroup Expression
 */
羽飞's avatar
羽飞 已提交
34 35
enum class ExprType 
{
羽飞's avatar
羽飞 已提交
36
  NONE,
羽飞's avatar
羽飞 已提交
37 38 39 40 41
  FIELD,        ///< 字段。在实际执行时,根据行数据内容提取对应字段的值
  VALUE,        ///< 常量值
  CAST,         ///< 需要做类型转换的表达式
  COMPARISON,   ///< 需要做比较的表达式
  CONJUNCTION,  ///< 多个表达式使用同一种关系(AND或OR)来联结
羽飞's avatar
羽飞 已提交
42 43
};

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

  /**
羽飞's avatar
羽飞 已提交
62
   * @brief 根据具体的tuple,来计算当前表达式的值。tuple有可能是一个具体某个表的行数据
羽飞's avatar
羽飞 已提交
63
   */
羽飞's avatar
羽飞 已提交
64
  virtual RC get_value(const Tuple &tuple, TupleCell &cell) const = 0;
羽飞's avatar
羽飞 已提交
65 66

  /**
羽飞's avatar
羽飞 已提交
67
   * @brief 表达式的类型
羽飞's avatar
羽飞 已提交
68 69
   * 可以根据表达式类型来转换为具体的子类
   */
羽飞's avatar
羽飞 已提交
70
  virtual ExprType type() const = 0;
羽飞's avatar
羽飞 已提交
71 72

  /**
羽飞's avatar
羽飞 已提交
73 74
   * @brief 表达式值的类型
   * @details 一个表达式运算出结果后,只有一个值
羽飞's avatar
羽飞 已提交
75
   */
L
Longda Feng 已提交
76
  virtual AttrType value_type() const = 0;
羽飞's avatar
羽飞 已提交
77 78
};

羽飞's avatar
羽飞 已提交
79 80 81 82
/**
 * @brief 字段表达式
 * @ingroup Expression
 */
羽飞's avatar
羽飞 已提交
83 84
class FieldExpr : public Expression 
{
羽飞's avatar
羽飞 已提交
85 86 87 88
public:
  FieldExpr() = default;
  FieldExpr(const Table *table, const FieldMeta *field) : field_(table, field)
  {}
羽飞's avatar
羽飞 已提交
89 90
  FieldExpr(const Field &field) : field_(field)
  {}
羽飞's avatar
羽飞 已提交
91 92 93

  virtual ~FieldExpr() = default;

羽飞's avatar
羽飞 已提交
94 95 96 97
  ExprType type() const override
  {
    return ExprType::FIELD;
  }
羽飞's avatar
羽飞 已提交
98 99 100 101
  AttrType value_type() const override
  {
    return field_.attr_type();
  }
羽飞's avatar
羽飞 已提交
102

羽飞's avatar
羽飞 已提交
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
  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 已提交
124

羽飞's avatar
羽飞 已提交
125 126 127 128
private:
  Field field_;
};

羽飞's avatar
羽飞 已提交
129 130 131 132
/**
 * @brief 常量值表达式
 * @ingroup Expression
 */
羽飞's avatar
羽飞 已提交
133 134
class ValueExpr : public Expression 
{
羽飞's avatar
羽飞 已提交
135 136
public:
  ValueExpr() = default;
羽飞's avatar
羽飞 已提交
137
  ValueExpr(const Value &value)
羽飞's avatar
羽飞 已提交
138
  {
羽飞's avatar
羽飞 已提交
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
    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
羽飞 已提交
155 156
    }
  }
羽飞's avatar
羽飞 已提交
157 158
  ValueExpr(const TupleCell &cell) : tuple_cell_(cell)
  {}
羽飞's avatar
羽飞 已提交
159 160 161

  virtual ~ValueExpr() = default;

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

羽飞's avatar
羽飞 已提交
164 165 166 167 168
  ExprType type() const override
  {
    return ExprType::VALUE;
  }

羽飞's avatar
羽飞 已提交
169 170 171 172 173
  AttrType value_type() const override
  {
    return tuple_cell_.attr_type();
  }

L
Longda Feng 已提交
174 175
  void get_tuple_cell(TupleCell &cell) const
  {
羽飞's avatar
羽飞 已提交
176 177
    cell = tuple_cell_;
  }
羽飞's avatar
羽飞 已提交
178

L
Longda Feng 已提交
179 180
  const TupleCell &get_tuple_cell() const
  {
羽飞's avatar
羽飞 已提交
181 182 183
    return tuple_cell_;
  }

羽飞's avatar
羽飞 已提交
184
private:
羽飞's avatar
羽飞 已提交
185
  TupleCell tuple_cell_;
羽飞's avatar
羽飞 已提交
186
};
羽飞's avatar
羽飞 已提交
187

羽飞's avatar
羽飞 已提交
188 189 190 191
/**
 * @brief 类型转换表达式
 * @ingroup Expression
 */
羽飞's avatar
羽飞 已提交
192 193
class CastExpr : public Expression 
{
L
Longda Feng 已提交
194
public:
羽飞's avatar
羽飞 已提交
195 196 197
  CastExpr(std::unique_ptr<Expression> child, AttrType cast_type);
  virtual ~CastExpr();

L
Longda Feng 已提交
198 199 200 201
  ExprType type() const override
  {
    return ExprType::CAST;
  }
羽飞's avatar
羽飞 已提交
202 203 204 205 206 207
  RC get_value(const Tuple &tuple, TupleCell &cell) const override;
  AttrType value_type() const override
  {
    return cast_type_;
  }

L
Longda Feng 已提交
208 209 210 211 212
  std::unique_ptr<Expression> &child()
  {
    return child_;
  }

羽飞's avatar
羽飞 已提交
213 214 215 216 217
private:
  std::unique_ptr<Expression> child_;
  AttrType cast_type_;
};

羽飞's avatar
羽飞 已提交
218 219 220 221
/**
 * @brief 比较表达式
 * @ingroup Expression
 */
羽飞's avatar
羽飞 已提交
222 223
class ComparisonExpr : public Expression 
{
羽飞's avatar
羽飞 已提交
224 225 226
public:
  ComparisonExpr(CompOp comp, std::unique_ptr<Expression> left, std::unique_ptr<Expression> right);
  virtual ~ComparisonExpr();
L
Longda Feng 已提交
227 228 229 230 231

  ExprType type() const override
  {
    return ExprType::COMPARISON;
  }
羽飞's avatar
羽飞 已提交
232
  RC get_value(const Tuple &tuple, TupleCell &cell) const override;
L
Longda Feng 已提交
233 234 235 236
  AttrType value_type() const override
  {
    return BOOLEANS;
  }
羽飞's avatar
羽飞 已提交
237

L
Longda Feng 已提交
238 239 240 241 242 243 244 245 246 247 248 249
  CompOp comp() const
  {
    return comp_;
  }
  std::unique_ptr<Expression> &left()
  {
    return left_;
  }
  std::unique_ptr<Expression> &right()
  {
    return right_;
  }
羽飞's avatar
羽飞 已提交
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269

  /**
   * 尝试在没有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_;
};

/**
羽飞's avatar
羽飞 已提交
270 271
 * @brief 联结表达式
 * @ingroup Expression
羽飞's avatar
羽飞 已提交
272 273 274
 * 多个表达式使用同一种关系(AND或OR)来联结
 * 当前miniob仅有AND操作
 */
羽飞's avatar
羽飞 已提交
275 276
class ConjunctionExpr : public Expression 
{
羽飞's avatar
羽飞 已提交
277
public:
L
Longda Feng 已提交
278
  enum class Type {
羽飞's avatar
羽飞 已提交
279 280 281
    AND,
    OR,
  };
L
Longda Feng 已提交
282

羽飞's avatar
羽飞 已提交
283 284 285 286
public:
  ConjunctionExpr(Type type, std::vector<std::unique_ptr<Expression>> &children);
  virtual ~ConjunctionExpr() = default;

L
Longda Feng 已提交
287 288 289 290 291 292 293 294
  ExprType type() const override
  {
    return ExprType::CONJUNCTION;
  }
  AttrType value_type() const override
  {
    return BOOLEANS;
  }
羽飞's avatar
羽飞 已提交
295 296
  RC get_value(const Tuple &tuple, TupleCell &cell) const override;

L
Longda Feng 已提交
297 298 299 300 301 302 303 304 305
  Type conjunction_type() const
  {
    return conjunction_type_;
  }

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

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