expression.h 5.8 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。
 */
L
Longda Feng 已提交
44 45
class Expression {
public:
羽飞's avatar
羽飞 已提交
46 47
  Expression() = default;
  virtual ~Expression() = default;
羽飞's avatar
羽飞 已提交
48 49 50 51

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

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

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

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

  virtual ~FieldExpr() = default;

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

羽飞's avatar
羽飞 已提交
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
  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 已提交
106

羽飞's avatar
羽飞 已提交
107 108 109 110
private:
  Field field_;
};

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

  virtual ~ValueExpr() = default;

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

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

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

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

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

羽飞's avatar
羽飞 已提交
161
private:
羽飞's avatar
羽飞 已提交
162
  TupleCell tuple_cell_;
羽飞's avatar
羽飞 已提交
163
};
羽飞's avatar
羽飞 已提交
164

L
Longda Feng 已提交
165 166
class CastExpr : public Expression {
public:
羽飞's avatar
羽飞 已提交
167 168 169
  CastExpr(std::unique_ptr<Expression> child, AttrType cast_type);
  virtual ~CastExpr();

L
Longda Feng 已提交
170 171 172 173
  ExprType type() const override
  {
    return ExprType::CAST;
  }
羽飞's avatar
羽飞 已提交
174 175 176 177 178 179
  RC get_value(const Tuple &tuple, TupleCell &cell) const override;
  AttrType value_type() const override
  {
    return cast_type_;
  }

L
Longda Feng 已提交
180 181 182 183 184
  std::unique_ptr<Expression> &child()
  {
    return child_;
  }

羽飞's avatar
羽飞 已提交
185 186 187 188 189
private:
  std::unique_ptr<Expression> child_;
  AttrType cast_type_;
};

L
Longda Feng 已提交
190
class ComparisonExpr : public Expression {
羽飞's avatar
羽飞 已提交
191 192 193
public:
  ComparisonExpr(CompOp comp, std::unique_ptr<Expression> left, std::unique_ptr<Expression> right);
  virtual ~ComparisonExpr();
L
Longda Feng 已提交
194 195 196 197 198

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

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

  /**
   * 尝试在没有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操作
 */
L
Longda Feng 已提交
240
class ConjunctionExpr : public Expression {
羽飞's avatar
羽飞 已提交
241
public:
L
Longda Feng 已提交
242
  enum class Type {
羽飞's avatar
羽飞 已提交
243 244 245
    AND,
    OR,
  };
L
Longda Feng 已提交
246

羽飞's avatar
羽飞 已提交
247 248 249 250
public:
  ConjunctionExpr(Type type, std::vector<std::unique_ptr<Expression>> &children);
  virtual ~ConjunctionExpr() = default;

L
Longda Feng 已提交
251 252 253 254 255 256 257 258
  ExprType type() const override
  {
    return ExprType::CONJUNCTION;
  }
  AttrType value_type() const override
  {
    return BOOLEANS;
  }
羽飞's avatar
羽飞 已提交
259 260
  RC get_value(const Tuple &tuple, TupleCell &cell) const override;

L
Longda Feng 已提交
261 262 263 264 265 266 267 268 269
  Type conjunction_type() const
  {
    return conjunction_type_;
  }

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

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