From 8b5fc67af6d532aa0bccd26b3144170a86b7b576 Mon Sep 17 00:00:00 2001 From: rbock Date: Sat, 2 Aug 2014 09:18:01 +0200 Subject: [PATCH] Added generic boolean_expression --- include/sqlpp11/boolean_expression.h | 83 ++++++++++++++++++++++++++++ include/sqlpp11/functions.h | 1 - include/sqlpp11/sqlpp11.h | 1 + tests/BooleanExpressionTest.cpp | 42 ++++++++++++++ tests/CMakeLists.txt | 1 + 5 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 include/sqlpp11/boolean_expression.h create mode 100644 tests/BooleanExpressionTest.cpp diff --git a/include/sqlpp11/boolean_expression.h b/include/sqlpp11/boolean_expression.h new file mode 100644 index 00000000..b2c66acc --- /dev/null +++ b/include/sqlpp11/boolean_expression.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2013-2014, Roland Bock + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SQLPP_BOOLEAN_EXPRESSION_H +#define SQLPP_BOOLEAN_EXPRESSION_H + +#include +#include + +namespace sqlpp +{ + template + struct boolean_expression_t + { + using _traits = make_traits; + using _recursive_traits = make_recursive_traits<>; + + template + boolean_expression_t(Expression expression): + _expression(expression) + { + static_assert(is_expression_t::value, "boolean_expression requires a boolean expression argument"); + static_assert(is_boolean_t::value, "boolean_expression requires a boolean expression argument"); + } + + boolean_expression_t(const boolean_expression_t&) = default; + boolean_expression_t(boolean_expression_t&&) = default; + boolean_expression_t& operator=(const boolean_expression_t&) = default; + boolean_expression_t& operator=(boolean_expression_t&&) = default; + ~boolean_expression_t() = default; + + interpretable_t _expression; + }; + + template + boolean_expression_t boolean_expression(const Database&, T t) + { + return {t}; + } + + template + boolean_expression_t boolean_expression(T t) + { + return {t}; + } + + template + struct serializer_t> + { + using T = boolean_expression_t; + + static Context& _(const T& t, Context& context) + { + return serialize(t._expression); + } + }; + +} + +#endif diff --git a/include/sqlpp11/functions.h b/include/sqlpp11/functions.h index 34c79994..af8ebdb2 100644 --- a/include/sqlpp11/functions.h +++ b/include/sqlpp11/functions.h @@ -46,7 +46,6 @@ namespace sqlpp { -#warning add a template bool_expression which takes any bool expression as constructor argument template auto value(T t) -> wrap_operand_t { diff --git a/include/sqlpp11/sqlpp11.h b/include/sqlpp11/sqlpp11.h index e0ccca48..d4278a2f 100644 --- a/include/sqlpp11/sqlpp11.h +++ b/include/sqlpp11/sqlpp11.h @@ -35,6 +35,7 @@ #include #include #include +#include #endif diff --git a/tests/BooleanExpressionTest.cpp b/tests/BooleanExpressionTest.cpp new file mode 100644 index 00000000..3eaf8544 --- /dev/null +++ b/tests/BooleanExpressionTest.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2013-2014, Roland Bock + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include "Sample.h" +#include "MockDb.h" +#include + +MockDb db = {}; + +int main() +{ + test::TabBar t; + + auto x = boolean_expression(db, t.alpha == 7); + x = boolean_expression(db, t.gamma); + x = sqlpp::boolean_expression(t.beta.like("%cheesecake")); + + return 0; +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ed2c041d..6582425b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -6,6 +6,7 @@ macro (build_and_run arg) add_test(${arg} ${arg}) endmacro () +build_and_run(BooleanExpressionTest) build_and_run(InterpretTest) build_and_run(InsertTest) build_and_run(RemoveTest)