Code_pred.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef ODBC_CODEGEN_Code_pred_hpp
  14. #define ODBC_CODEGEN_Code_pred_hpp
  15. #include <common/common.hpp>
  16. #include <common/DataField.hpp>
  17. #include "Code_base.hpp"
  18. enum Pred_value {
  19.     Pred_value_unknown = -1,
  20.     Pred_value_false = 0,
  21.     Pred_value_true = 1
  22. };
  23. class Ctx;
  24. class Plan_expr_row;
  25. class Exec_pred;
  26. /**
  27.  * @class Plan_pred
  28.  * @brief Base class for predicates in PlanTree
  29.  *
  30.  * Predicate represents a boolean value.
  31.  */
  32. class Plan_pred : public Plan_base {
  33. public:
  34.     // type is convenient since RTTI cannot be used
  35.     enum Type {
  36. TypeUndefined = 0,
  37. TypeComp = 1,
  38. TypeOp = 2
  39.     };
  40.     Plan_pred(Plan_root* root, Type type);
  41.     virtual ~Plan_pred() = 0;
  42.     Type type() const;
  43.     const TableSet& tableSet() const;
  44.     const TableSet& noInterp() const;
  45.     virtual bool isGroupBy(const Plan_expr_row* row) const;
  46.     // helpers
  47.     Plan_pred* opAnd(Plan_pred* pred2);
  48. protected:
  49.     const Type m_type;
  50.     TableSet m_tableSet; // depends on these tables
  51.     TableSet m_noInterp; // cannot use interpreted TUP program on these tables
  52.     Exec_pred* m_exec; // probably stupid
  53. };
  54. inline
  55. Plan_pred::Plan_pred(Plan_root* root, Type type) :
  56.     Plan_base(root),
  57.     m_type(type),
  58.     m_exec(0)
  59. {
  60. }
  61. inline Plan_pred::Type
  62. Plan_pred::type() const
  63. {
  64.     return m_type;
  65. }
  66. inline const Plan_pred::TableSet&
  67. Plan_pred::tableSet() const
  68. {
  69.     return m_tableSet;
  70. }
  71. inline const Plan_pred::TableSet&
  72. Plan_pred::noInterp() const
  73. {
  74.     return m_noInterp;
  75. }
  76. /**
  77.  * @class Exec_pred
  78.  * @brief Base class for predicates in ExecTree
  79.  */
  80. class Exec_pred : public Exec_base {
  81. public:
  82.     class Code : public Exec_base::Code {
  83.     public:
  84. Code();
  85. virtual ~Code() = 0;
  86.     protected:
  87. friend class Exec_pred;
  88.     };
  89.     class Data : public Exec_base::Data {
  90.     public:
  91. Data();
  92. virtual ~Data() = 0;
  93. Pred_value getValue() const;
  94. Pred_value groupValue(unsigned i) const;
  95.     protected:
  96. friend class Exec_pred;
  97. Pred_value m_value; // the value
  98. // group-by data
  99. typedef std::vector<Pred_value> GroupValue;
  100. GroupValue m_groupValue;
  101. Pred_value& groupValue(unsigned i, bool initFlag);
  102.     };
  103.     Exec_pred(Exec_root* root);
  104.     virtual ~Exec_pred() = 0;
  105.     virtual void execInterp(Ctx& ctx, Ctl& ctl) = 0;
  106.     virtual void evaluate(Ctx& ctx, Ctl& ctl) = 0;
  107.     // children
  108.     const Code& getCode() const;
  109.     Data& getData() const;
  110. };
  111. inline
  112. Exec_pred::Code::Code()
  113. {
  114. }
  115. inline
  116. Exec_pred::Data::Data() :
  117.     m_value(Pred_value_unknown)
  118. {
  119. }
  120. inline Pred_value
  121. Exec_pred::Data::getValue() const
  122. {
  123.     return m_value;
  124. }
  125. inline Pred_value
  126. Exec_pred::Data::groupValue(unsigned i) const
  127. {
  128.     ctx_assert(i != 0 && i < m_groupValue.size());
  129.     return m_groupValue[i];
  130. }
  131. inline
  132. Exec_pred::Exec_pred(Exec_root* root) :
  133.     Exec_base(root)
  134. {
  135. }
  136. // children
  137. inline const Exec_pred::Code&
  138. Exec_pred::getCode() const
  139. {
  140.     const Code* code = static_cast<const Code*>(m_code);
  141.     return *code;
  142. }
  143. inline Exec_pred::Data&
  144. Exec_pred::getData() const
  145. {
  146.     Data* data = static_cast<Data*>(m_data);
  147.     return *data;
  148. }
  149. #endif