if (this->data.size() == 0)
THROW(ErrCode::RuntimeError) << "Data is not exist.";
- std::string key = metaDB.getColumnName(field);
+ /// TODO: Refactor
+ Column anonymous("anonymous", field);
+ std::string key = metaDB.getColumnName(anonymous);
if (key.empty())
THROW(ErrCode::RuntimeError) << "Column is not exist.";
{
static_cast<T*>(this)->cache.clear();
- auto columnNames = static_cast<T*>(this)->_getColumnNames(std::forward<ColumnTypes>(cts)...);
- auto tableNames = static_cast<T*>(this)->_getTableNames(std::forward<ColumnTypes>(cts)...);
+ auto columnNames = static_cast<T*>(this)->getColumnNames(std::forward<ColumnTypes>(cts)...);
+ auto tableNames = static_cast<T*>(this)->getTableNames(std::forward<ColumnTypes>(cts)...);
std::stringstream ss;
ss << "SELECT ";
{
static_cast<T*>(this)->cache.clear();
- auto columnNames = static_cast<T*>(this)->_getColumnNames(std::forward<ColumnTypes>(cts)...);
+ auto columnNames = static_cast<T*>(this)->getColumnNames(std::forward<ColumnTypes>(cts)...);
std::stringstream ss;
ss << "UPDATE " << static_cast<T*>(this)->name << " ";
{
static_cast<T*>(this)->cache.clear();
- auto columnNames = static_cast<T*>(this)->_getColumnNames(std::forward<ColumnTypes>(cts)...);
+ auto columnNames = static_cast<T*>(this)->getColumnNames(std::forward<ColumnTypes>(cts)...);
std::stringstream ss;
ss << "INSERT INTO " << static_cast<T*>(this)->name << " (";
std::string Crud<T>::processWhere(Expr expr)
{
std::stringstream ss;
- ss << static_cast<T*>(this)->getColumnName(expr.l.type);
+ ss << static_cast<T*>(this)->getColumnName(expr.l);
ss << " " << std::string(expr) << " ?";
return ss.str();
public: // CRTP(Curiously Recurring Template Pattern) for CRUD
template<typename... Cs>
std::vector<std::string> getTableNames(Cs&& ...columns) const noexcept;
+ template<typename Table>
+ std::string getTableName(Table&& table) const noexcept;
template<typename... Cs>
std::vector<std::string> getColumnNames(Cs&& ...columns) const noexcept;
- template<typename TableType>
- std::string getTableName(TableType&& type) const noexcept;
- template<typename ColumnType>
- std::string getColumnName(ColumnType&& type) const noexcept;
- template<typename... Cs>
- std::vector<std::string> _getTableNames(Cs&& ...columns) const noexcept;
- template<typename... Cs>
- std::vector<std::string> _getColumnNames(Cs&& ...columns) const noexcept;
- template<typename ColumnType> // remove_cv or ref
- std::string _getColumnName(ColumnType&& type) const noexcept;
+ template<typename Column>
+ std::string getColumnName(Column&& column) const noexcept;
std::vector<std::string> cache;
{
std::set<std::string> names;
- auto predicate = [this, &names](const auto& type) {
- Column anonymous("anonymous", type);
- using TableType = typename decltype(anonymous)::Table;
- auto name = this->getTableName(TableType());
- if (!name.empty())
- names.emplace(name);
- };
-
- auto closure = [&predicate](const auto&... iter) {
- (predicate(iter), ...);
- };
-
- std::apply(closure, std::tuple(columns...));
-
- return std::vector<std::string>(names.begin(), names.end());
-}
-
-template<typename... Tables>
-template<typename... Cs>
-std::vector<std::string> Database<Tables...>::_getTableNames(Cs&& ...columns) const noexcept
-{
- std::set<std::string> names;
-
auto predicate = [this, &names](const auto& column) {
using ColumnType = std::remove_reference_t<decltype(column)>;
using TableType = typename ColumnType::Table;
std::vector<std::string> Database<Tables...>::getColumnNames(Cs&& ...columns) const noexcept
{
std::vector<std::string> names;
- auto predicate = [this, &names](const auto& iter) {
- auto name = this->getColumnName(iter);
- if (!name.empty())
- names.emplace_back(name);
- };
-
- auto closure = [&predicate](const auto&... iter) {
- (predicate(iter), ...);
- };
-
- std::apply(closure, std::tuple(columns...));
-
- return names;
-}
-
-template<typename... Tables>
-template<typename... Cs>
-std::vector<std::string> Database<Tables...>::_getColumnNames(Cs&& ...columns) const noexcept
-{
- std::vector<std::string> names;
auto predicate = [this, &names](const auto& column) {
- auto name = this->_getColumnName(column);
+ auto name = this->getColumnName(column);
if (!name.empty())
names.emplace_back(name);
};
}
template<typename... Tables>
-template<typename ColumnType>
-std::string Database<Tables...>::getColumnName(ColumnType&& column) const noexcept
-{
- Column anonymous("anonymous", column);
- using TableType = typename decltype(anonymous)::Table;
- TableType table;
-
- std::string name;
- auto predicate = [&name, &table, &column](const auto& iter) {
- if (iter.compare(table)) {
- auto cname = iter.getColumnName(column);
- name = iter.name + "." + cname;
- }
- };
-
- auto closure = [&predicate](const auto&... iter) {
- (predicate(iter), ...);
- };
-
- std::apply(closure, this->tables);
-
- return name;
-}
-
-template<typename... Tables>
template<typename Column>
-std::string Database<Tables...>::_getColumnName(Column&& column) const noexcept
+std::string Database<Tables...>::getColumnName(Column&& column) const noexcept
{
using ColumnType = std::remove_reference_t<decltype(column)>;
using TableType = typename ColumnType::Table;
std::string name;
auto predicate = [&name, &table, &column](const auto& iter) {
if (iter.compare(table)) {
- auto cname = iter._getColumnName(column);
+ auto cname = iter.getColumnName(column);
name = iter.name + "." + cname;
}
};
public: // CRTP(Curiously Recurring Template Pattern) for CRUD
template<typename... Cs>
- std::vector<std::string> getTableNames(Cs&& ...coulmns) const noexcept;
+ std::vector<std::string> getTableNames(Cs&& ...) const noexcept;
template<typename That>
- std::string getTableName(That&& type) const noexcept;
+ std::string getTableName(That&&) const noexcept;
template<typename... Cs>
std::vector<std::string> getColumnNames(Cs&& ...columns) const noexcept;
template<typename Column>
- std::string getColumnName(const Column& column) const noexcept;
- template<typename... Cs>
- std::vector<std::string> _getTableNames(Cs&& ...) const noexcept;
- template<typename... Cs>
- std::vector<std::string> _getColumnNames(Cs&& ...columns) const noexcept;
- template<typename Column>
- std::string _getColumnName(const Column& column) const noexcept;
+ std::string getColumnName(Column&& column) const noexcept;
std::vector<std::string> cache;
template<typename... Columns>
template<typename... Cs>
-std::vector<std::string> Table<Columns...>::getTableNames(Cs&& ...) const noexcept
-{
- return {this->name};
-}
-
-template<typename... Columns>
-template<typename... Cs>
std::vector<std::string> Table<Columns...>::getColumnNames(Cs&& ...columns) const noexcept
{
std::vector<std::string> names;
return names;
}
-
-template<typename... Columns>
-template<typename... Cs>
-std::vector<std::string> Table<Columns...>::_getColumnNames(Cs&& ...columns) const noexcept
-{
- std::vector<std::string> names;
- auto predicate = [this, &names](const auto& type) {
- auto name = this->_getColumnName(type);
- if (!name.empty())
- names.emplace_back(name);
- };
-
- auto closure = [&predicate](const auto&... iter) {
- (predicate(iter), ...);
- };
-
- std::apply(closure, std::tuple(columns...));
-
- return names;
-}
-
template<typename... Columns>
template<typename That>
std::string Table<Columns...>::getTableName(That&&) const noexcept
}
template<typename... Columns>
-template<typename Column>
-std::string Table<Columns...>::getColumnName(const Column& column) const noexcept
-{
- std::string name;
- auto predicate = [&name, &column](const auto& iter) {
- if (type::cast_compare(column, iter.type))
- name = iter.name;
- };
-
- auto closure = [&predicate](const auto&... iter) {
- (predicate(iter), ...);
- };
-
- std::apply(closure, this->columns);
-
- return name;
-}
-
-template<typename... Columns>
template<typename... Cs>
-std::vector<std::string> Table<Columns...>::_getTableNames(Cs&& ...) const noexcept
+std::vector<std::string> Table<Columns...>::getTableNames(Cs&& ...) const noexcept
{
return {this->name};
}
template<typename... Columns>
template<typename Column>
-std::string Table<Columns...>::_getColumnName(const Column& column) const noexcept
+std::string Table<Columns...>::getColumnName(Column&& column) const noexcept
{
std::string name;
auto predicate = [&name, &column](const auto& iter) {
#include <vist/query-builder/database.hpp>
#include <vist/query-builder/table.hpp>
-using namespace vist::tsqb;
-
-namespace {
-
-struct Table1 {
- int column1;
- std::string column2;
- bool column3;
-
- inline static Column Column1 = { "column1", &Table1::column1 };
- inline static Column Column2 = { "column2", &Table1::column2 };
-};
-
-struct Table2 {
- int column1;
- std::string column2;
- bool column3;
- float column4;
- double column5;
-};
-
-Table table1 { "table1", Column("column1", &Table1::column1),
- Column("column2", &Table1::column2),
- Column("column3", &Table1::column3) };
+#include "schema.hpp"
-Table table2 { "table2", Column("column1", &Table2::column1),
- Column("column2", &Table2::column2),
- Column("column3", &Table2::column3),
- Column("column4", &Table2::column4),
- Column("column5", &Table2::column5) };
-
-Database database { "database", table1, table2 };
-
-} // anonymous namespace
+using namespace vist::tsqb;
+using namespace vist::test;
TEST(QueryBuilderDatabaseTests, size)
{
EXPECT_EQ(database.getTableName(Table1()), "table1");
EXPECT_EQ(database.getTableName(Table2()), "table2");
- EXPECT_EQ(database._getColumnName(Table1::Column1), "table1.column1");
- EXPECT_EQ(database.getColumnName(&Table1::column2), "table1.column2");
- EXPECT_EQ(database.getColumnName(&Table1::column3), "table1.column3");
+ EXPECT_EQ(database.getColumnName(Table1::Column2), "table1.column2");
+ EXPECT_EQ(database.getColumnName(Table1::Column3), "table1.column3");
- EXPECT_EQ(database.getColumnName(&Table2::column1), "table2.column1");
- EXPECT_EQ(database.getColumnName(&Table2::column2), "table2.column2");
- EXPECT_EQ(database.getColumnName(&Table2::column3), "table2.column3");
- EXPECT_EQ(database.getColumnName(&Table2::column4), "table2.column4");
- EXPECT_EQ(database.getColumnName(&Table2::column5), "table2.column5");
+ EXPECT_EQ(database.getColumnName(Table2::Column1), "table2.column1");
+ EXPECT_EQ(database.getColumnName(Table2::Column2), "table2.column2");
+ EXPECT_EQ(database.getColumnName(Table2::Column3), "table2.column3");
+ EXPECT_EQ(database.getColumnName(Table2::Column4), "table2.column4");
+ EXPECT_EQ(database.getColumnName(Table2::Column5), "table2.column5");
}
TEST(QueryBuilderDatabaseTests, get_names)
{
- {
- auto columns = database._getColumnNames(Table1::Column1, Table1::Column2);
- EXPECT_EQ(columns[0], "table1.column1");
- EXPECT_EQ(columns[1], "table1.column2");
- }
-
- auto columns = database.getColumnNames(&Table1::column1, &Table2::column3);
- auto tables = database.getTableNames(&Table1::column1, &Table2::column1, &Table2::column1);
+ auto columns = database.getColumnNames(Table1::Column1, Table2::Column3);
+ auto tables = database.getTableNames(Table1::Column1, Table2::Column1, Table2::Column1);
if (columns.size() == 2 && tables.size() == 2) {
EXPECT_EQ(columns[0], "table1.column1");
EXPECT_EQ(columns[1], "table2.column3");
--- /dev/null
+/*
+ * Copyright (c) 2020-present Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+#pragma once
+
+#include <vist/query-builder.hpp>
+
+using namespace vist::tsqb;
+
+namespace vist {
+namespace test {
+
+struct Table1 {
+ int column1;
+ std::string column2;
+ bool column3;
+
+ inline static Column Column1 = { "column1", &Table1::column1 };
+ inline static Column Column2 = { "column2", &Table1::column2 };
+ inline static Column Column3 = { "column3", &Table1::column3 };
+};
+
+struct Table2 {
+ int column1;
+ std::string column2;
+ bool column3;
+ float column4;
+ double column5;
+
+ inline static Column Column1 = { "column1", &Table2::column1 };
+ inline static Column Column2 = { "column2", &Table2::column2 };
+ inline static Column Column3 = { "column3", &Table2::column3 };
+ inline static Column Column4 = { "column4", &Table2::column4 };
+ inline static Column Column5 = { "column5", &Table2::column5 };
+};
+
+inline Table table1 { "table1", Table1::Column1, Table1::Column2, Table1::Column3 };
+inline Table table2 { "table2", Table2::Column1,
+ Table2::Column2,
+ Table2::Column3,
+ Table2::Column4,
+ Table2::Column5 };
+
+inline Database database { "database", table1, table2 };
+
+} // namespace test
+} // namespace vist
#include <vist/query-builder/column.hpp>
#include <vist/query-builder/table.hpp>
-using namespace vist::tsqb;
-
-namespace {
-
-struct Table1 {
- int column1;
- std::string column2;
- bool column3;
-
- inline static Column Column1 = { "column1", &Table1::column1 };
-};
+#include "schema.hpp"
-struct Table2 {
- int column1;
- std::string column2;
- bool column3;
- float column4;
- double column5;
-};
-
-Table table1 { "table1", Column("column1", &Table1::column1),
- Column("column2", &Table1::column2),
- Column("column3", &Table1::column3) };
-
-Table table2 { "table2", Column("column1", &Table2::column1),
- Column("column2", &Table2::column2),
- Column("column3", &Table2::column3),
- Column("column4", &Table2::column4),
- Column("column5", &Table2::column5) };
-
-} // anonymous namespace
+using namespace vist::tsqb;
+using namespace vist::test;
TEST(QueryBuilderTableTests, size)
{
EXPECT_EQ(table1.getName(), "table1");
EXPECT_EQ(table2.name, "table2");
- EXPECT_EQ(table1._getColumnName(Table1::Column1), "column1");
- EXPECT_EQ(table1.getColumnName(&Table1::column1), "column1");
- EXPECT_EQ(table1.getColumnName(&Table1::column2), "column2");
- EXPECT_EQ(table1.getColumnName(&Table1::column3), "column3");
+ EXPECT_EQ(table1.getColumnName(Table1::Column1), "column1");
+ EXPECT_EQ(table1.getColumnName(Table1::Column2), "column2");
+ EXPECT_EQ(table1.getColumnName(Table1::Column3), "column3");
- EXPECT_EQ(table2.getColumnName(&Table2::column1), "column1");
- EXPECT_EQ(table2.getColumnName(&Table2::column2), "column2");
- EXPECT_EQ(table2.getColumnName(&Table2::column3), "column3");
- EXPECT_EQ(table2.getColumnName(&Table2::column4), "column4");
- EXPECT_EQ(table2.getColumnName(&Table2::column5), "column5");
+ EXPECT_EQ(table2.getColumnName(Table2::Column1), "column1");
+ EXPECT_EQ(table2.getColumnName(Table2::Column2), "column2");
+ EXPECT_EQ(table2.getColumnName(Table2::Column3), "column3");
+ EXPECT_EQ(table2.getColumnName(Table2::Column4), "column4");
+ EXPECT_EQ(table2.getColumnName(Table2::Column5), "column5");
}
TEST(QueryBuilderTableTests, get_names)