template<typename... ColumnTypes>
Self select(ColumnTypes&&... cts);
+ template<typename Type>
+ Self select(Distinct<Type> distinct);
+
Self selectAll(void);
template<typename... ColumnTypes>
template<typename ...Cs>
friend Table<Cs...> make_table(const std::string& name, Cs&& ...columns);
+ template<typename ColumnTuple>
+ Self selectInternal(ColumnTuple&& ct, bool distinct = false);
+
template<typename Cs>
std::vector<std::string> getColumnNames(Cs&& tuple);
template<typename... Columns>
template<typename... ColumnTypes>
Table<Columns...> Table<Columns...>::select(ColumnTypes&&... cts)
+{
+ auto columnTuple = std::make_tuple(std::forward<ColumnTypes>(cts)...);
+
+ return this->selectInternal(std::move(columnTuple));
+}
+
+template<typename... Columns>
+template<typename Type>
+Table<Columns...> Table<Columns...>::select(Distinct<Type> distinct)
+{
+ return this->selectInternal(std::move(distinct.value), true);
+}
+
+template<typename... Columns>
+template<typename ColumnTuple>
+Table<Columns...> Table<Columns...>::selectInternal(ColumnTuple&& ct, bool distinct)
{
this->cache.clear();
- auto columnTuple = std::make_tuple(std::forward<ColumnTypes>(cts)...);
- auto columnNames = this->getColumnNames(std::move(columnTuple));
+ auto columnNames = this->getColumnNames(std::move(ct));
std::stringstream ss;
ss << "SELECT ";
+ if (distinct)
+ ss << "DISTINCT ";
+
for (const auto& c : columnNames)
ss << c << " ";
expr(&Admin::pkg) == "dpm");
std::string select6 = admin.selectAll().where(expr(&Admin::uid) > 3 ||
expr(&Admin::pkg) == "dpm");
+ std::string select7 = admin.select(distinct(&Admin::uid, &Admin::key))
+ .where(expr(&Admin::id) > 3);
std::cout << select1 << '\n'; // SELECT id pkg uid key FROM admin
std::cout << select2 << '\n'; // SELECT id uid key FROM admin
std::cout << select4 << '\n'; // SELECT * FROM admin WHERE uid = ?
std::cout << select5 << '\n'; // SELECT * FROM admin WHERE uid = ? AND pkg = ?
std::cout << select6 << '\n'; // SELECT * FROM admin WHERE uid = ? OR pkg = ?
+ std::cout << select7 << '\n'; // SELECT DISTINCT uid key FROM admin WHERE id = ?
int uid = 0, id = 1;
std::string update1 = admin.update(&Admin::id, &Admin::pkg, &Admin::uid, &Admin::key);