From f1fb1b22a28bade3f7982370cfddff46fc74160f Mon Sep 17 00:00:00 2001 From: rbock Date: Wed, 16 Mar 2016 18:17:28 +0100 Subject: [PATCH] Added explicit without_table_check function This removes the "required" tables from an expression --- include/sqlpp11/sqlpp11.h | 3 +- include/sqlpp11/without_table_check.h | 77 +++++++++++++++++++++++++++ tests/SelectType.cpp | 5 +- 3 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 include/sqlpp11/without_table_check.h diff --git a/include/sqlpp11/sqlpp11.h b/include/sqlpp11/sqlpp11.h index eb8a2d0f..8c822e49 100644 --- a/include/sqlpp11/sqlpp11.h +++ b/include/sqlpp11/sqlpp11.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2015, Roland Bock + * Copyright (c) 2013-2016, Roland Bock * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -36,6 +36,7 @@ #include #include #include +#include #include #endif diff --git a/include/sqlpp11/without_table_check.h b/include/sqlpp11/without_table_check.h new file mode 100644 index 00000000..37bc26c9 --- /dev/null +++ b/include/sqlpp11/without_table_check.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2016-2016, 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_WITHOUT_TABLE_CHECK_H +#define SQLPP_ALIAS_H + +#include +#include + +namespace sqlpp +{ + template + struct without_table_check_t + { + using _traits = typename Expression::_traits; + using _nodes = detail::type_vector; + using _required_tables = detail::type_set<>; + + without_table_check_t(Expression expression) : _expression(expression) + { + } + + without_table_check_t(const without_table_check_t&) = default; + without_table_check_t(without_table_check_t&&) = default; + without_table_check_t& operator=(const without_table_check_t&) = default; + without_table_check_t& operator=(without_table_check_t&&) = default; + ~without_table_check_t() = default; + + Expression _expression; + }; + + template + struct serializer_t> + { + using _serialize_check = serialize_check_of; + using T = without_table_check_t; + + static Context& _(const T& t, Context& context) + { + serialize(t._expression, context); + return context; + } + }; + + template + auto without_table_check(Expression expr) -> without_table_check_t + { + static_assert(is_expression_t::value, "invalid argument (expression expected)"); + + return {expr}; + } +} + +#endif diff --git a/tests/SelectType.cpp b/tests/SelectType.cpp index 85978cdd..cb710b89 100644 --- a/tests/SelectType.cpp +++ b/tests/SelectType.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2015, Roland Bock + * Copyright (c) 2013-2016, Roland Bock * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -31,6 +31,7 @@ #include #include #include +#include namespace alias { @@ -327,7 +328,7 @@ int SelectType(int, char* []) { auto s = dynamic_select(db, all_of(t)).dynamic_from(t).dynamic_where().dynamic_limit().dynamic_offset(); s.from.add(dynamic_join(f).on(f.omega > t.alpha)); - s.where.add_ntc(t.alpha > 7 and t.alpha == any(select(t.alpha).from(t).where(t.alpha < 3))); + s.where.add(without_table_check(f.omega > 7 and t.alpha == any(select(t.alpha).from(t).where(t.alpha < 3)))); s.limit.set(30); s.limit.set(3); std::cerr << "------------------------\n";