From 8fab50d4ac1e07bb7775fd519abcea02ff9053b6 Mon Sep 17 00:00:00 2001 From: Sangwan Kwon Date: Mon, 17 Feb 2020 20:46:38 +0900 Subject: [PATCH] query-builder: Bind operand to where clause ex) AdminTable.select(Admin::Uid, Admin::Key).where(Admin::Id > 3); - Before: "SELECT uid, key FROM admin WHERE id > ?" - After: "SELECT uid, key FROM admin WHERE id > 3" Signed-off-by: Sangwan Kwon --- src/vist/policy/db-schema.hpp | 2 +- src/vist/query-builder/crud.hpp | 9 +++++---- src/vist/query-builder/expression.hpp | 6 ++++-- src/vist/query-builder/tests/expression.cpp | 15 +++++++++++++++ src/vist/query-builder/tests/query-builder.cpp | 16 ++++++++-------- src/vist/query-builder/util.hpp | 9 +++++++++ 6 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/vist/policy/db-schema.hpp b/src/vist/policy/db-schema.hpp index 516a5fe..883d28c 100644 --- a/src/vist/policy/db-schema.hpp +++ b/src/vist/policy/db-schema.hpp @@ -49,7 +49,7 @@ struct PolicyDefinition { std::string ivalue; DECLARE_COLUMN(Name, "name", &PolicyDefinition::name); - DECLARE_COLUMN(Ivalue, "policy", &PolicyDefinition::ivalue); + DECLARE_COLUMN(Ivalue, "ivalue", &PolicyDefinition::ivalue); }; DECLARE_TABLE(AdminTable, "ADMIN", Admin::Name, Admin::Activated); diff --git a/src/vist/query-builder/crud.hpp b/src/vist/query-builder/crud.hpp index 80c1b81..616fe03 100644 --- a/src/vist/query-builder/crud.hpp +++ b/src/vist/query-builder/crud.hpp @@ -56,7 +56,7 @@ private: std::string processWhere(Or& expr); template - std::string processWhere(Expr expr); + std::string processWhere(const Expr& expr); }; template @@ -234,11 +234,12 @@ std::string Crud::processWhere(Or& expr) template template -std::string Crud::processWhere(Expr expr) +std::string Crud::processWhere(const Expr& expr) { std::stringstream ss; - ss << static_cast(this)->getColumnName(expr.l); - ss << " " << std::string(expr) << " ?"; + ss << static_cast(this)->getColumnName(expr.l) << " "; + ss << static_cast(expr) << " "; + ss << expr.r; return ss.str(); } diff --git a/src/vist/query-builder/expression.hpp b/src/vist/query-builder/expression.hpp index 583b41e..a88c4b8 100644 --- a/src/vist/query-builder/expression.hpp +++ b/src/vist/query-builder/expression.hpp @@ -18,6 +18,7 @@ #include "column.hpp" #include "type.hpp" +#include "util.hpp" #include #include @@ -38,7 +39,7 @@ struct Binary : public Expression { /// L is Column and R is Value Binary(L l, R r) : l(l), r(r) { - /// preventing logical expressions like &&, || and == + /// Prevent logical expressions like &&, || and == if constexpr(!is_expression::value) { using FieldType = typename L::FieldType; type::assert_compare(FieldType(), r); @@ -51,7 +52,8 @@ struct Binary : public Expression { L l; std::string r; - Binary(L l, const char* r) : l(l), r(r) + /// Make r to 'r' + Binary(L l, const char* r) : l(l), r("'" + std::string(r) + "'") { using FieldType = typename L::FieldType; type::assert_compare(FieldType(), std::string()); diff --git a/src/vist/query-builder/tests/expression.cpp b/src/vist/query-builder/tests/expression.cpp index 558c657..a0489eb 100644 --- a/src/vist/query-builder/tests/expression.cpp +++ b/src/vist/query-builder/tests/expression.cpp @@ -25,6 +25,9 @@ TEST(QueryBuilderExpressionTests, equal) { std::string dump = (Table1::Column1 == 3); EXPECT_EQ(dump, "="); + + dump = (Table1::Column2 == "string"); + EXPECT_EQ(dump, "="); } TEST(QueryBuilderExpressionTests, greater) @@ -38,3 +41,15 @@ TEST(QueryBuilderExpressionTests, lesser) std::string dump = (Table1::Column1 < 3); EXPECT_EQ(dump, "<"); } + +TEST(QueryBuilderExpressionTests, and_) +{ + std::string dump = (Table1::Column1 < 3) && (Table1::Column1 == 3); + EXPECT_EQ(dump, "AND"); +} + +TEST(QueryBuilderExpressionTests, or_) +{ + std::string dump = (Table1::Column1 < 3) || (Table1::Column2 == "text"); + EXPECT_EQ(dump, "OR"); +} diff --git a/src/vist/query-builder/tests/query-builder.cpp b/src/vist/query-builder/tests/query-builder.cpp index 7f4da4b..41f016a 100644 --- a/src/vist/query-builder/tests/query-builder.cpp +++ b/src/vist/query-builder/tests/query-builder.cpp @@ -115,10 +115,10 @@ TEST(QueryBuilderTsqbTests, SELECT_WHERE) std::string select4 = admin.selectAll().where(Admin::Uid > 3 || Admin::Pkg == "dpm"); - EXPECT_EQ(select1, "SELECT uid, key FROM admin WHERE id > ?"); - EXPECT_EQ(select2, "SELECT * FROM admin WHERE uid > ?"); - EXPECT_EQ(select3, "SELECT * FROM admin WHERE uid > ? AND pkg = ?"); - EXPECT_EQ(select4, "SELECT * FROM admin WHERE uid > ? OR pkg = ?"); + EXPECT_EQ(select1, "SELECT uid, key FROM admin WHERE id > 3"); + EXPECT_EQ(select2, "SELECT * FROM admin WHERE uid > 3"); + EXPECT_EQ(select3, "SELECT * FROM admin WHERE uid > 3 AND pkg = 'dpm'"); + EXPECT_EQ(select4, "SELECT * FROM admin WHERE uid > 3 OR pkg = 'dpm'"); } TEST(QueryBuilderTsqbTests, UPDATE) @@ -131,8 +131,8 @@ TEST(QueryBuilderTsqbTests, UPDATE) .where((Admin::Uid == 0) && (Admin::Id == 1)); EXPECT_EQ(update1, "UPDATE admin SET id = ?, pkg = ?, uid = ?, key = ?"); - EXPECT_EQ(update2, "UPDATE admin SET key = ? WHERE uid = ? AND id = ?"); - EXPECT_EQ(update3, "UPDATE admin SET key = ?, pkg = ? WHERE uid = ? AND id = ?"); + EXPECT_EQ(update2, "UPDATE admin SET key = ? WHERE uid = 0 AND id = 1"); + EXPECT_EQ(update3, "UPDATE admin SET key = ?, pkg = ? WHERE uid = 0 AND id = 1"); } TEST(QueryBuilderTsqbTests, DELETE) @@ -142,7 +142,7 @@ TEST(QueryBuilderTsqbTests, DELETE) (Admin::Uid == 3)); EXPECT_EQ(delete1, "DELETE FROM admin"); - EXPECT_EQ(delete2, "DELETE FROM admin WHERE pkg = ? AND uid = ?"); + EXPECT_EQ(delete2, "DELETE FROM admin WHERE pkg = 'dpm' AND uid = 3"); } TEST(QueryBuilderTsqbTests, INSERT) @@ -181,7 +181,7 @@ TEST(QueryBuilderTsqbTests, MULTI_SELECT) "managed_policy.value FROM admin, managed_policy"); EXPECT_EQ(multiSelect2, "SELECT admin.uid, admin.key, managed_policy.id, " "managed_policy.value FROM admin, managed_policy " - "WHERE admin.uid > ? AND managed_policy.id = ?"); + "WHERE admin.uid > 0 AND managed_policy.id = 3"); } /* diff --git a/src/vist/query-builder/util.hpp b/src/vist/query-builder/util.hpp index 6156a17..d1a92e2 100644 --- a/src/vist/query-builder/util.hpp +++ b/src/vist/query-builder/util.hpp @@ -19,6 +19,7 @@ #include #include #include +#include namespace vist { namespace tsqb { @@ -32,6 +33,14 @@ inline std::string rtrim(std::string&& s) return s; } +template +std::string concat(const std::string& column, const std::string& op, const V& value) +{ + std::stringstream ss; + ss << column << " " << op << " " << value; + return ss.str(); +} + } // namespace util } // namespace tsqb } // namespace vist -- 2.34.1