Select.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // Copyright: All Rights Reserved
  2. // Author: egametang@gmail.com (tanghai)
  3. #ifndef ORM_QUERY_H
  4. #define ORM_QUERY_H
  5. #include <string>
  6. #include <vector>
  7. #include <boost/lexical_cast.hpp>
  8. #include <google/protobuf/descriptor.h>
  9. #include "Base/Marcos.h"
  10. #include "Orm/Expr.h"
  11. #include "Orm/Column.h"
  12. namespace Egametang {
  13. template <typename Table>
  14. class Select
  15. {
  16. private:
  17. Column select;
  18. bool distinct;
  19. Expr where;
  20. Column groupBy;
  21. Expr having;
  22. Column orderBy;
  23. bool desc;
  24. int limit;
  25. int offset;
  26. public:
  27. explicit Select(Column columns):
  28. select(columns),
  29. distinct(false), groupBy(),
  30. orderBy(), desc(false),
  31. limit(0), offset(0)
  32. {
  33. columns.CheckAllColumns(Table::default_instance());
  34. }
  35. Select<Table>& Distinct()
  36. {
  37. distinct = true;
  38. return *this;
  39. }
  40. Select<Table>& Where(Expr expr)
  41. {
  42. expr.CheckAllColumns(Table::default_instance());
  43. where = expr;
  44. return *this;
  45. }
  46. Select<Table>& GroupBy(Column columns)
  47. {
  48. columns.CheckAllColumns(Table::default_instance());
  49. groupBy = columns;
  50. return *this;
  51. }
  52. Select<Table>& Having(Expr expr)
  53. {
  54. expr.CheckAllColumns(Table::default_instance());
  55. having = expr;
  56. return *this;
  57. }
  58. Select<Table>& OrderBy(Column columns)
  59. {
  60. columns.CheckAllColumns(Table::default_instance());
  61. orderBy = columns;
  62. return *this;
  63. }
  64. Select<Table>& Desc()
  65. {
  66. desc = true;
  67. return *this;
  68. }
  69. Select<Table>& Limit(int value)
  70. {
  71. limit = value;
  72. return *this;
  73. }
  74. Select<Table>& Offset(int value)
  75. {
  76. offset = value;
  77. return *this;
  78. }
  79. std::string ToString() const
  80. {
  81. std::string sql = "select ";
  82. if (!select.Empty())
  83. {
  84. sql += select.ToString();
  85. }
  86. if (distinct)
  87. {
  88. sql += " distinct";
  89. }
  90. sql += " from " + Table::descriptor()->full_name();
  91. if (!where.Empty())
  92. {
  93. sql += " where " + where.ToString();
  94. }
  95. if (!groupBy.Empty())
  96. {
  97. sql += " group by " + groupBy.ToString();
  98. if (!having.Empty())
  99. {
  100. sql += " having " + having.ToString();
  101. }
  102. if (!orderBy.Empty())
  103. {
  104. sql += " order by " + orderBy.ToString();
  105. }
  106. if (desc)
  107. {
  108. sql += " desc ";
  109. }
  110. }
  111. if (limit)
  112. {
  113. sql += " limit " + boost::lexical_cast<std::string>(limit);
  114. }
  115. if (offset)
  116. {
  117. sql += " offset " + boost::lexical_cast<std::string>(offset);
  118. }
  119. return sql;
  120. }
  121. };
  122. }
  123. // namespace Egametang
  124. #endif // ORM_QUERY_H