// Copyright: All Rights Reserved // Author: egametang@gmail.com (tanghai) #ifndef ORM_QUERY_H #define ORM_QUERY_H #include #include #include #include #include "Base/Marcos.h" #include "Orm/Expr.h" #include "Orm/Column.h" namespace Egametang { template class Select { private: Column select; bool distinct; Expr where; Column groupBy; Expr having; Column orderBy; bool desc; int limit; int offset; public: explicit Select(Column columns): select(columns), distinct(false), groupBy(), orderBy(), desc(false), limit(0), offset(0) { columns.CheckAllColumns(Table::default_instance()); } Select& Distinct() { distinct = true; return *this; } Select
& Where(Expr expr) { expr.CheckAllColumns(Table::default_instance()); where = expr; return *this; } Select
& GroupBy(Column columns) { columns.CheckAllColumns(Table::default_instance()); groupBy = columns; return *this; } Select
& Having(Expr expr) { expr.CheckAllColumns(Table::default_instance()); having = expr; return *this; } Select
& OrderBy(Column columns) { columns.CheckAllColumns(Table::default_instance()); orderBy = columns; return *this; } Select
& Desc() { desc = true; return *this; } Select
& Limit(int value) { limit = value; return *this; } Select
& Offset(int value) { offset = value; return *this; } std::string ToString() const { std::string sql = "select "; if (!select.Empty()) { sql += select.ToString(); } if (distinct) { sql += " distinct"; } sql += " from " + Table::descriptor()->full_name(); if (!where.Empty()) { sql += " where " + where.ToString(); } if (!groupBy.Empty()) { sql += " group by " + groupBy.ToString(); if (!having.Empty()) { sql += " having " + having.ToString(); } if (!orderBy.Empty()) { sql += " order by " + orderBy.ToString(); } if (desc) { sql += " desc "; } } if (limit) { sql += " limit " + boost::lexical_cast(limit); } if (offset) { sql += " offset " + boost::lexical_cast(offset); } return sql; } }; } // namespace Egametang #endif // ORM_QUERY_H