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

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_query_sort_hpp
  14. #define ODBC_CODEGEN_Code_query_sort_hpp
  15. #include <functional>
  16. #include <common/common.hpp>
  17. #include "Code_query.hpp"
  18. #include "Code_expr_row.hpp"
  19. /**
  20.  * @class Plan_query_sort
  21.  * @brief Project node in PlanTree
  22.  */
  23. class Plan_query_sort : public Plan_query {
  24. public:
  25.     Plan_query_sort(Plan_root* root);
  26.     virtual ~Plan_query_sort();
  27.     Plan_base* analyze(Ctx& ctx, Ctl& ctl);
  28.     Exec_base* codegen(Ctx& ctx, Ctl& ctl);
  29.     void print(Ctx& ctx);
  30.     // children
  31.     void setQuery(Plan_query* query);
  32.     void setRow(Plan_expr_row* sortRow);
  33. protected:
  34.     Plan_expr_row* getRow();
  35.     Plan_query* m_query;
  36.     Plan_expr_row* m_sortRow;
  37. };
  38. inline
  39. Plan_query_sort::Plan_query_sort(Plan_root* root) :
  40.     Plan_query(root),
  41.     m_query(0),
  42.     m_sortRow(0)
  43. {
  44. }
  45. // children
  46. inline void
  47. Plan_query_sort::setQuery(Plan_query* query)
  48. {
  49.     ctx_assert(query != 0);
  50.     m_query = query;
  51. }
  52. inline void
  53. Plan_query_sort::setRow(Plan_expr_row* sortRow)
  54. {
  55.     ctx_assert(sortRow != 0);
  56.     m_sortRow = sortRow;
  57. }
  58. /**
  59.  * Item to sort includes data row and sort row.
  60.  */
  61. struct SortItem {
  62.     SortItem(const SqlRow* dataRow, const SqlRow* sortRow);
  63.     const SqlRow* m_dataRow; // copy of fetched row from subquery
  64.     const SqlRow* m_sortRow; // copy of values to sort on
  65. };
  66. typedef std::vector<SortItem> SortList;
  67. class Exec_query_sort;
  68. struct SortLess : std::binary_function<SortItem, SortItem, bool> {
  69.     SortLess(const Exec_query_sort* node);
  70.     const Exec_query_sort* m_node;
  71.     bool operator()(SortItem s1, SortItem s2) const;
  72. };
  73. inline
  74. SortItem::SortItem(const SqlRow* dataRow, const SqlRow* sortRow) :
  75.     m_dataRow(dataRow),
  76.     m_sortRow(sortRow)
  77. {
  78. }
  79. inline
  80. SortLess::SortLess(const Exec_query_sort* node) :
  81.     m_node(node)
  82. {
  83. }
  84. /**
  85.  * @class Exec_query_sort
  86.  * @brief Project node in ExecTree
  87.  */
  88. class Exec_query_sort : public Exec_query {
  89. public:
  90.     class Code : public Exec_query::Code {
  91.     public:
  92. Code(const SqlSpecs& sqlSpecs, bool* asc);
  93. virtual ~Code();
  94. bool getAsc(unsigned i) const;
  95.     protected:
  96. friend class Exec_query_sort;
  97. const bool* const m_asc;
  98. // sets reference to Sqlspecs from subquery
  99.     };
  100.     class Data : public Exec_query::Data {
  101.     public:
  102. Data(Exec_query_sort* node, const SqlSpecs& sqlSpecs);
  103. virtual ~Data();
  104.     protected:
  105. friend class Exec_query_sort;
  106. SqlRow m_sqlRow; // current row
  107. bool m_sorted; // fetch and sort done
  108. SortList m_sortList;
  109. unsigned m_count; // number of rows
  110. unsigned m_index; // current fetch index
  111.     };
  112.     Exec_query_sort(Exec_root* root);
  113.     virtual ~Exec_query_sort();
  114.     void alloc(Ctx& ctx, Ctl& ctl);
  115.     void execImpl(Ctx& ctx, Ctl& ctl);
  116.     bool fetchImpl(Ctx& ctx, Ctl& ctl);
  117.     void close(Ctx& ctx);
  118.     void print(Ctx& ctx);
  119.     // children
  120.     const Code& getCode() const;
  121.     Data& getData() const;
  122.     void setQuery(Exec_query* query);
  123.     void setRow(Exec_expr_row* sortRow);
  124. protected:
  125.     friend class Exec_query;
  126.     Exec_query* m_query;
  127.     Exec_expr_row* m_sortRow;
  128. };
  129. inline
  130. Exec_query_sort::Code::Code(const SqlSpecs& sqlSpecs, bool* asc) :
  131.     Exec_query::Code(sqlSpecs),
  132.     m_asc(asc)
  133. {
  134. }
  135. inline bool
  136. Exec_query_sort::Code::getAsc(unsigned i) const
  137. {
  138.     return m_asc[i];
  139. }
  140. inline
  141. Exec_query_sort::Data::Data(Exec_query_sort* node, const SqlSpecs& sqlSpecs) :
  142.     Exec_query::Data(node, m_sqlRow),
  143.     m_sqlRow(sqlSpecs),
  144.     m_sorted(false),
  145.     m_count(0),
  146.     m_index(0)
  147. {
  148. }
  149. inline
  150. Exec_query_sort::Exec_query_sort(Exec_root* root) :
  151.     Exec_query(root),
  152.     m_query(0),
  153.     m_sortRow(0)
  154. {
  155. }
  156. // children
  157. inline const Exec_query_sort::Code&
  158. Exec_query_sort::getCode() const
  159. {
  160.     const Code* code = static_cast<const Code*>(m_code);
  161.     return *code;
  162. }
  163. inline Exec_query_sort::Data&
  164. Exec_query_sort::getData() const
  165. {
  166.     Data* data = static_cast<Data*>(m_data);
  167.     return *data;
  168. }
  169. inline void
  170. Exec_query_sort::setQuery(Exec_query* query)
  171. {
  172.     ctx_assert(m_query == 0 && query != 0);
  173.     m_query = query;
  174. }
  175. inline void
  176. Exec_query_sort::setRow(Exec_expr_row* sortRow)
  177. {
  178.     ctx_assert(m_sortRow == 0 && sortRow != 0);
  179.     m_sortRow = sortRow;
  180. }
  181. #endif