0
0
mirror of https://github.com/rbock/sqlpp11.git synced 2024-11-16 04:47:18 +08:00

Cleanup name tags in sqlpp17 style

Using a macro in the generated table specs (this is much nicer now).
Using string_view to represent names.
This commit is contained in:
Roland Bock 2024-08-06 06:57:47 +02:00
parent cec1eaa768
commit 069fcf79b5
24 changed files with 134 additions and 380 deletions

View File

@ -50,10 +50,10 @@ namespace sqlpp
template <typename AliasProvider, typename T> template <typename AliasProvider, typename T>
using _foreign_table_alias_t = table_alias_t<AliasProvider, T>; using _foreign_table_alias_t = table_alias_t<AliasProvider, T>;
template <typename AliasProvider> template <typename AliasProvider>
using _alias_t = table_alias_t<AliasProvider, TableSpec>; using _sqlpp_name_tag = table_alias_t<AliasProvider, TableSpec>;
template <typename AliasProvider> template <typename AliasProvider>
_alias_t<AliasProvider> as(const AliasProvider& /*unused*/) const _sqlpp_name_tag<AliasProvider> as(const AliasProvider& /*unused*/) const
{ {
return {}; return {};
} }

View File

@ -33,7 +33,7 @@
namespace sqlpp namespace sqlpp
{ {
template <typename TableSpec, typename... ColumnSpec> template <typename TableSpec, typename... ColumnSpec>
struct table_columns : public ColumnSpec::_alias_t::template _member_t<column_t<TableSpec, ColumnSpec>>... struct table_columns : public ColumnSpec::_sqlpp_name_tag::template _member_t<column_t<TableSpec, ColumnSpec>>...
{ {
static_assert(sizeof...(ColumnSpec) > 0, "at least one column required per table"); static_assert(sizeof...(ColumnSpec) > 0, "at least one column required per table");
using _column_tuple_t = std::tuple<column_t<TableSpec, ColumnSpec>...>; using _column_tuple_t = std::tuple<column_t<TableSpec, ColumnSpec>...>;

View File

@ -91,7 +91,7 @@ namespace sqlpp
template <typename FieldSpec> template <typename FieldSpec>
struct cte_column_spec_t struct cte_column_spec_t
{ {
using _alias_t = name_tag_of_t<FieldSpec>; using _sqlpp_name_tag = name_tag_of_t<FieldSpec>;
using _traits = make_traits<value_type_of_t<FieldSpec>>; using _traits = make_traits<value_type_of_t<FieldSpec>>;
}; };

View File

@ -44,7 +44,7 @@ namespace sqlpp
struct insert_t : public statement_name_t<insert_name_t> struct insert_t : public statement_name_t<insert_name_t>
{ {
using _traits = make_traits<no_value_t, tag::is_return_value>; using _traits = make_traits<no_value_t, tag::is_return_value>;
struct _alias_t struct _sqlpp_name_tag
{ {
}; };

View File

@ -59,7 +59,7 @@ namespace sqlpp
using _data_t = into_data_t<Table>; using _data_t = into_data_t<Table>;
struct _alias_t struct _sqlpp_name_tag
{ {
}; };

View File

@ -43,7 +43,7 @@ namespace sqlpp
struct remove_t : public statement_name_t<remove_name_t> struct remove_t : public statement_name_t<remove_name_t>
{ {
using _traits = make_traits<no_value_t, tag::is_return_value>; using _traits = make_traits<no_value_t, tag::is_return_value>;
struct _alias_t struct _sqlpp_name_tag
{ {
}; };

View File

@ -60,7 +60,7 @@ namespace sqlpp
} }
template <typename Select, typename AliasProvider, typename... ColumnSpecs> template <typename Select, typename AliasProvider, typename... ColumnSpecs>
struct select_as_t : public ColumnSpecs::_alias_t::template _member_t<pseudo_column_t<AliasProvider, ColumnSpecs>>..., struct select_as_t : public ColumnSpecs::_sqlpp_name_tag::template _member_t<pseudo_column_t<AliasProvider, ColumnSpecs>>...,
public enable_join<select_as_t<Select, AliasProvider, ColumnSpecs...>> public enable_join<select_as_t<Select, AliasProvider, ColumnSpecs...>>
{ {
select_as_t(Select select) : _select(select) select_as_t(Select select) : _select(select)

View File

@ -86,7 +86,7 @@ namespace sqlpp
template <typename Select, typename Column> template <typename Select, typename Column>
struct select_column_spec_t: public name_tag_base struct select_column_spec_t: public name_tag_base
{ {
using _alias_t = select_column_name_tag_of_t<Column>; using _sqlpp_name_tag = select_column_name_tag_of_t<Column>;
#warning: Need to test this! #warning: Need to test this!
static constexpr bool _depends_on_outer_table = static constexpr bool _depends_on_outer_table =
@ -259,7 +259,7 @@ namespace sqlpp
{ {
using _traits = make_traits<no_value_t, tag::is_noop, tag::is_missing>; using _traits = make_traits<no_value_t, tag::is_noop, tag::is_missing>;
struct _alias_t struct _sqlpp_name_tag
{ {
}; };

View File

@ -49,7 +49,7 @@ namespace sqlpp
template <typename Context, typename Column> template <typename Context, typename Column>
Context& serialize(Context& context, const simple_column_t<Column>&) Context& serialize(Context& context, const simple_column_t<Column>&)
{ {
context << name_tag_of_t<typename simple_column_t<Column>::_column_t>::_name_t::template char_ptr<Context>(); context << name_tag_of_t<typename simple_column_t<Column>::_column_t>::name;
return context; return context;
} }

View File

@ -62,7 +62,7 @@ namespace sqlpp
using _data_t = single_table_data_t<Table>; using _data_t = single_table_data_t<Table>;
struct _alias_t struct _sqlpp_name_tag
{ {
}; };

View File

@ -44,7 +44,7 @@ namespace sqlpp
struct update_t : public statement_name_t<update_name_t> struct update_t : public statement_name_t<update_name_t>
{ {
using _traits = make_traits<no_value_t, tag::is_return_value>; using _traits = make_traits<no_value_t, tag::is_return_value>;
struct _alias_t struct _sqlpp_name_tag
{ {
}; };

View File

@ -270,7 +270,7 @@ namespace sqlpp
template <typename... E> template <typename... E>
struct make_name_of_set<type_set<E...>> struct make_name_of_set<type_set<E...>>
{ {
using type = make_type_set_t<typename sqlpp::name_tag_of_t<E>::_alias_t::_name_t...>; using type = make_type_set_t<typename sqlpp::name_tag_of_t<E>::_sqlpp_name_tag::_name_t...>;
}; };
template <typename T> template <typename T>

View File

@ -37,7 +37,7 @@ namespace sqlpp
template <typename NameType, typename ValueType> template <typename NameType, typename ValueType>
struct field_spec_t : public name_tag_base struct field_spec_t : public name_tag_base
{ {
using _alias_t = NameType; using _sqlpp_name_tag = NameType;
#warning: Maybe rename result_value in result_value_type? #warning: Maybe rename result_value in result_value_type?
using cpp_type = result_value_t<ValueType>; using cpp_type = result_value_t<ValueType>;

View File

@ -29,87 +29,77 @@
#include <sqlpp11/core/name/char_sequence.h> #include <sqlpp11/core/name/char_sequence.h>
#include <sqlpp11/core/type_traits.h> #include <sqlpp11/core/type_traits.h>
#warning: nesting everying in _alias_t seems unnecessary. #define SQLPP_NAME_TAG_GUTS(SQL_NAME, CPP_NAME) \
#define SQLPP_ALIAS_PROVIDER(name) \ static constexpr auto name = sqlpp::string_view{#SQL_NAME}; \
struct name##_t : public ::sqlpp::name_tag_base \ template <typename T> \
{ \ struct _member_t \
struct _alias_t \ { \
{ \ T CPP_NAME = {}; \
static constexpr const char _literal[] = #name; \ T& operator()() \
using _name_t = sqlpp::make_char_sequence<sizeof(_literal), _literal>; \ { \
template <typename T> \ return CPP_NAME; \
struct _member_t \ } \
{ \ const T& operator()() const \
T name; \ { \
T& operator()() \ return CPP_NAME; \
{ \ } \
return name; \ }
} \
const T& operator()() const \
{ \
return name; \
} \
}; \
}; \
}; \
constexpr name##_t name = {};
#warning: Not needed? #define SQLPP_NAME_TAG_FOR_SQL_AND_CPP(SQL_NAME, CPP_NAME) \
#define SQLPP_QUOTED_ALIAS_PROVIDER(name) \ struct _sqlpp_name_tag \
struct name##_t : public ::sqlpp::name_tag_base \ { \
{ \ SQLPP_NAME_TAG_GUTS(SQL_NAME, CPP_NAME); \
struct _alias_t \ }
{ \
static constexpr const char _literal[] = "!" #name; \ #define SQLPP_CREATE_NAME_TAG(NAME) \
using _name_t = sqlpp::make_char_sequence<sizeof(_literal), _literal>; \ struct NAME##_t : public ::sqlpp::name_tag_base \
template <typename T> \ { \
struct _member_t \ SQLPP_NAME_TAG_FOR_SQL_AND_CPP(NAME, NAME); \
{ \ }; \
T name; \ constexpr auto NAME = NAME##_t \
T& operator()() \ { \
{ \ }
return name; \
} \ #define SQLPP_ALIAS_PROVIDER(NAME) \
const T& operator()() const \ struct NAME##_t : public ::sqlpp::name_tag_base \
{ \ { \
return name; \ SQLPP_NAME_TAG_FOR_SQL_AND_CPP(NAME, NAME); \
} \ }; \
}; \ constexpr auto NAME = NAME##_t \
}; \ { \
}; \ }
constexpr name##_t name = {};
namespace sqlpp namespace sqlpp
{ {
namespace alias namespace alias
{ {
SQLPP_ALIAS_PROVIDER(a) SQLPP_ALIAS_PROVIDER(a);
SQLPP_ALIAS_PROVIDER(b) SQLPP_ALIAS_PROVIDER(b);
SQLPP_ALIAS_PROVIDER(c) SQLPP_ALIAS_PROVIDER(c);
SQLPP_ALIAS_PROVIDER(d) SQLPP_ALIAS_PROVIDER(d);
SQLPP_ALIAS_PROVIDER(e) SQLPP_ALIAS_PROVIDER(e);
SQLPP_ALIAS_PROVIDER(f) SQLPP_ALIAS_PROVIDER(f);
SQLPP_ALIAS_PROVIDER(g) SQLPP_ALIAS_PROVIDER(g);
SQLPP_ALIAS_PROVIDER(h) SQLPP_ALIAS_PROVIDER(h);
SQLPP_ALIAS_PROVIDER(i) SQLPP_ALIAS_PROVIDER(i);
SQLPP_ALIAS_PROVIDER(j) SQLPP_ALIAS_PROVIDER(j);
SQLPP_ALIAS_PROVIDER(k) SQLPP_ALIAS_PROVIDER(k);
SQLPP_ALIAS_PROVIDER(l) SQLPP_ALIAS_PROVIDER(l);
SQLPP_ALIAS_PROVIDER(m) SQLPP_ALIAS_PROVIDER(m);
SQLPP_ALIAS_PROVIDER(n) SQLPP_ALIAS_PROVIDER(n);
SQLPP_ALIAS_PROVIDER(o) SQLPP_ALIAS_PROVIDER(o);
SQLPP_ALIAS_PROVIDER(p) SQLPP_ALIAS_PROVIDER(p);
SQLPP_ALIAS_PROVIDER(q) SQLPP_ALIAS_PROVIDER(q);
SQLPP_ALIAS_PROVIDER(r) SQLPP_ALIAS_PROVIDER(r);
SQLPP_ALIAS_PROVIDER(s) SQLPP_ALIAS_PROVIDER(s);
SQLPP_ALIAS_PROVIDER(t) SQLPP_ALIAS_PROVIDER(t);
SQLPP_ALIAS_PROVIDER(u) SQLPP_ALIAS_PROVIDER(u);
SQLPP_ALIAS_PROVIDER(v) SQLPP_ALIAS_PROVIDER(v);
SQLPP_ALIAS_PROVIDER(w) SQLPP_ALIAS_PROVIDER(w);
SQLPP_ALIAS_PROVIDER(x) SQLPP_ALIAS_PROVIDER(x);
SQLPP_ALIAS_PROVIDER(y) SQLPP_ALIAS_PROVIDER(y);
SQLPP_ALIAS_PROVIDER(z) SQLPP_ALIAS_PROVIDER(z);
SQLPP_ALIAS_PROVIDER(left) SQLPP_ALIAS_PROVIDER(left);
SQLPP_ALIAS_PROVIDER(right) SQLPP_ALIAS_PROVIDER(right);
} // namespace alias } // namespace alias
} // namespace sqlpp } // namespace sqlpp

View File

@ -42,7 +42,7 @@ namespace sqlpp
template <typename T> template <typename T>
struct name_tag_of_impl<T, true> struct name_tag_of_impl<T, true>
{ {
using type = typename T::_alias_t; using type = typename T::_sqlpp_name_tag;
}; };
template <typename T> template <typename T>

View File

@ -37,7 +37,7 @@ namespace sqlpp
using _traits = make_traits<no_value_t, tag::is_noop>; using _traits = make_traits<no_value_t, tag::is_noop>;
using _nodes = detail::type_vector<>; using _nodes = detail::type_vector<>;
struct _alias_t struct _sqlpp_name_tag
{ {
}; };

View File

@ -64,7 +64,7 @@ namespace sqlpp
{ {
serialize_operand(context, t._expression); serialize_operand(context, t._expression);
context << " AS "; context << " AS ";
context << name_tag_of_t<AliasProvider>::_name_t::template char_ptr<Context>(); context << name_tag_of_t<AliasProvider>::name;
return context; return context;
} }
template <typename Expr, typename AliasProvider> template <typename Expr, typename AliasProvider>

View File

@ -109,7 +109,7 @@
#define SQLPP_DECLARE_COLUMN(unused, data, elem) \ #define SQLPP_DECLARE_COLUMN(unused, data, elem) \
struct SQLPP_DECLARE_COLUMN_GET_COLUMN_NAME(elem) \ struct SQLPP_DECLARE_COLUMN_GET_COLUMN_NAME(elem) \
{ \ { \
struct _alias_t \ struct _sqlpp_name_tag \
{ \ { \
static constexpr const char _literal[] = \ static constexpr const char _literal[] = \
BOOST_PP_STRINGIZE(SQLPP_DECLARE_COLUMN_GET_COLUMN_NAME(elem)); \ BOOST_PP_STRINGIZE(SQLPP_DECLARE_COLUMN_GET_COLUMN_NAME(elem)); \
@ -129,7 +129,7 @@
return SQLPP_DECLARE_COLUMN_GET_COLUMN_NAME(elem); \ return SQLPP_DECLARE_COLUMN_GET_COLUMN_NAME(elem); \
} \ } \
}; /* struct _member_t */ \ }; /* struct _member_t */ \
}; /* struct _alias_t */ \ }; /* struct _sqlpp_name_tag */ \
\ \
using _traits = sqlpp::make_traits< \ using _traits = sqlpp::make_traits< \
SQLPP_DECLARE_COLUMN_GEN_TRAITS(SQLPP_BOOST_PP_TUPLE_POP_FRONT(elem)) \ SQLPP_DECLARE_COLUMN_GEN_TRAITS(SQLPP_BOOST_PP_TUPLE_POP_FRONT(elem)) \
@ -183,7 +183,7 @@
,SQLPP_DECLARE_TABLE_GEN_PROPS \ ,SQLPP_DECLARE_TABLE_GEN_PROPS \
)(BOOST_PP_EXPAND table) \ )(BOOST_PP_EXPAND table) \
\ \
struct _alias_t \ struct _sqlpp_name_tag \
{ \ { \
static constexpr const char _literal[] = \ static constexpr const char _literal[] = \
BOOST_PP_STRINGIZE(SQLPP_DECLARE_TABLE_GET_TABLE_NAME(table)); \ BOOST_PP_STRINGIZE(SQLPP_DECLARE_TABLE_GET_TABLE_NAME(table)); \
@ -204,7 +204,7 @@
} \ } \
\ \
}; /* struct _member_t */ \ }; /* struct _member_t */ \
}; /* struct _alias_t */ \ }; /* struct _sqlpp_name_tag */ \
}; /* struct SQLPP_DECLARE_TABLE_GET_TABLE_NAME(table) */ \ }; /* struct SQLPP_DECLARE_TABLE_GET_TABLE_NAME(table) */ \
} }

View File

@ -146,7 +146,7 @@ namespace sqlpp
struct _deferred_table_t struct _deferred_table_t
{ {
using table = select_pseudo_table_t<_statement_t, Columns...>; using table = select_pseudo_table_t<_statement_t, Columns...>;
using alias = typename table::template _alias_t<AliasProvider>; using alias = typename table::template _sqlpp_name_tag<AliasProvider>;
}; };
template <typename AliasProvider> template <typename AliasProvider>
@ -154,10 +154,10 @@ namespace sqlpp
#warning: review all the alias stuff here #warning: review all the alias stuff here
template <typename AliasProvider> template <typename AliasProvider>
using _alias_t = typename _deferred_table_t<AliasProvider>::alias; using _sqlpp_name_tag = typename _deferred_table_t<AliasProvider>::alias;
template <typename AliasProvider> template <typename AliasProvider>
_alias_t<AliasProvider> as(const AliasProvider& aliasProvider) const _sqlpp_name_tag<AliasProvider> as(const AliasProvider& aliasProvider) const
{ {
consistency_check_t<_statement_t>::_(); consistency_check_t<_statement_t>::_();
static_assert(_statement_t::_can_be_used_as_table(), static_assert(_statement_t::_can_be_used_as_table(),
@ -220,7 +220,7 @@ namespace sqlpp
using _traits = make_traits<no_value_t, tag::is_noop, tag::is_missing>; using _traits = make_traits<no_value_t, tag::is_noop, tag::is_missing>;
using _nodes = ::sqlpp::detail::type_vector<>; using _nodes = ::sqlpp::detail::type_vector<>;
struct _alias_t struct _sqlpp_name_tag
{ {
}; };
@ -282,7 +282,7 @@ namespace sqlpp
-> _new_statement_t<consistent_t, returning_column_list_t<Args...>> -> _new_statement_t<consistent_t, returning_column_list_t<Args...>>
{ {
static_assert(not::sqlpp::detail::has_duplicates<Args...>::value, "at least one duplicate argument detected"); static_assert(not::sqlpp::detail::has_duplicates<Args...>::value, "at least one duplicate argument detected");
static_assert(not::sqlpp::detail::has_duplicates<typename Args::_alias_t...>::value, static_assert(not::sqlpp::detail::has_duplicates<typename Args::_sqlpp_name_tag...>::value,
"at least one duplicate name detected"); "at least one duplicate name detected");
return {static_cast<const derived_statement_t<Policies>&>(*this), return {static_cast<const derived_statement_t<Policies>&>(*this),

View File

@ -50,7 +50,7 @@ namespace sqlpp
struct insert_or_t : public statement_name_t<InsertOrAlternative> struct insert_or_t : public statement_name_t<InsertOrAlternative>
{ {
using _traits = make_traits<no_value_t, tag::is_return_value>; using _traits = make_traits<no_value_t, tag::is_return_value>;
struct _alias_t struct _sqlpp_name_tag
{ {
}; };

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
## ##
# Copyright (c) 2013-2022, Roland Bock # Copyright (c) 2013, Roland Bock
# All rights reserved. # All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without modification, # Redistribution and use in source and binary forms, with or without modification,
@ -548,7 +548,8 @@ def beginHeader(pathToHeader, namespace, nsList):
print("#include <sqlpp11/core/basic/table.h>", file=header) print("#include <sqlpp11/core/basic/table.h>", file=header)
print("#include <sqlpp11/core/basic/table_columns.h>", file=header) print("#include <sqlpp11/core/basic/table_columns.h>", file=header)
print("#include <sqlpp11/core/type_traits.h>", file=header) print("#include <sqlpp11/core/type_traits.h>", file=header)
print("#include <sqlpp11/core/char_sequence.h>", file=header) print("#include <sqlpp11/core/name/alias_provider.h>", file=header)
print("#include <sqlpp11/core/compat/string_view.h>", file=header)
print("", file=header) print("", file=header)
for ns in nsList: for ns in nsList:
print("namespace " + ns, file=header) print("namespace " + ns, file=header)
@ -704,34 +705,9 @@ def createHeader():
noTimestampWarning = True noTimestampWarning = True
print(" struct " + columnClass + " : public ::sqlpp::name_tag_base", file=header) print(" struct " + columnClass + " : public ::sqlpp::name_tag_base", file=header)
print(" {", file=header) print(" {", file=header)
print(" struct _alias_t", file=header) print(" SQLPP_NAME_TAG_FOR_SQL_AND_CPP("
print(" {", file=header) + escape_if_reserved(sqlColumnName) + ", " + columnMember + ");"
print( , file=header)
' static constexpr const char _literal[] = "'
+ escape_if_reserved(sqlColumnName)
+ '";',
file=header,
)
print(
" using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;",
file=header,
)
print(" template<typename T>", file=header)
print(" struct _member_t", file=header)
print(" {", file=header)
print(" T " + columnMember + ";", file=header)
print(
" T& operator()() { return " + columnMember + "; }",
file=header,
)
print(
" const T& operator()() const { return "
+ columnMember
+ "; }",
file=header,
)
print(" };", file=header)
print(" };", file=header)
columnCanBeNull = not column.notNull and not column.isPrimaryKey columnCanBeNull = not column.notNull and not column.isPrimaryKey
if columnCanBeNull: if columnCanBeNull:
print(" using value_type = ::sqlpp::optional<::sqlpp::" + columnType + ">;", file=header) print(" using value_type = ::sqlpp::optional<::sqlpp::" + columnType + ">;", file=header)
@ -753,27 +729,9 @@ def createHeader():
if tableRequiredInsertColumns: if tableRequiredInsertColumns:
tableRequiredInsertColumns += "," tableRequiredInsertColumns += ","
tableRequiredInsertColumns += "\n sqlpp::column_t<" + tableSpec + ", " + columnClass + ">"; tableRequiredInsertColumns += "\n sqlpp::column_t<" + tableSpec + ", " + columnClass + ">";
print(" struct _alias_t", file=header) print(" SQLPP_NAME_TAG_FOR_SQL_AND_CPP("
print(" {", file=header) + escape_if_reserved(sqlTableName) + ", " + tableMember + ");"
print( , file=header)
' static constexpr const char _literal[] = "' + sqlTableName + '";',
file=header,
)
print(
" using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;",
file=header,
)
print(" template<typename T>", file=header)
print(" struct _member_t", file=header)
print(" {", file=header)
print(" T " + tableMember + ";", file=header)
print(" T& operator()() { return " + tableMember + "; }", file=header)
print(
" const T& operator()() const { return " + tableMember + "; }",
file=header,
)
print(" };", file=header)
print(" };", file=header)
print(" template<typename T>", file=header) print(" template<typename T>", file=header)
print(" using _table_columns = sqlpp::table_columns<T," print(" using _table_columns = sqlpp::table_columns<T,"
+ tableTemplateParameters + tableTemplateParameters

View File

@ -63,9 +63,9 @@ void test_aggregate_functions(Value v)
static_assert(sqlpp::has_name<decltype(max(v_not_null))>::value, ""); static_assert(sqlpp::has_name<decltype(max(v_not_null))>::value, "");
static_assert(sqlpp::has_name<decltype(min(v_not_null))>::value, ""); static_assert(sqlpp::has_name<decltype(min(v_not_null))>::value, "");
static_assert(sqlpp::name_tag_of_t<decltype(count(v_not_null))>::_alias_t::_literal == sqlpp::string_view("count"), ""); static_assert(sqlpp::name_tag_of_t<decltype(count(v_not_null))>::name == sqlpp::string_view("count"), "");
static_assert(sqlpp::name_tag_of_t<decltype(max(v_not_null))>::_alias_t::_literal == sqlpp::string_view("max"), ""); static_assert(sqlpp::name_tag_of_t<decltype(max(v_not_null))>::name == sqlpp::string_view("max"), "");
static_assert(sqlpp::name_tag_of_t<decltype(min(v_not_null))>::_alias_t::_literal == sqlpp::string_view("min"), ""); static_assert(sqlpp::name_tag_of_t<decltype(min(v_not_null))>::name == sqlpp::string_view("min"), "");
// Aggregate functions enable comparison member functions. // Aggregate functions enable comparison member functions.
static_assert(sqlpp::has_enabled_comparison<decltype(count(v_not_null))>::value, ""); static_assert(sqlpp::has_enabled_comparison<decltype(count(v_not_null))>::value, "");
@ -110,8 +110,8 @@ void test_numeric_aggregate_functions(Value v)
static_assert(sqlpp::has_name<decltype(sum(v_not_null))>::value, ""); static_assert(sqlpp::has_name<decltype(sum(v_not_null))>::value, "");
static_assert(sqlpp::has_name<decltype(avg(v_not_null))>::value, ""); static_assert(sqlpp::has_name<decltype(avg(v_not_null))>::value, "");
static_assert(sqlpp::name_tag_of_t<decltype(sum(v_not_null))>::_alias_t::_literal == sqlpp::string_view("sum"), ""); static_assert(sqlpp::name_tag_of_t<decltype(sum(v_not_null))>::name == sqlpp::string_view("sum"), "");
static_assert(sqlpp::name_tag_of_t<decltype(avg(v_not_null))>::_alias_t::_literal == sqlpp::string_view("avg"), ""); static_assert(sqlpp::name_tag_of_t<decltype(avg(v_not_null))>::name == sqlpp::string_view("avg"), "");
// Aggregate functions enable OVER. // Aggregate functions enable OVER.
static_assert(sqlpp::has_enabled_over<decltype(sum(v_not_null))>::value, ""); static_assert(sqlpp::has_enabled_over<decltype(sum(v_not_null))>::value, "");
@ -133,6 +133,8 @@ int main()
{ {
// boolean // boolean
test_aggregate_functions(bool{true}); test_aggregate_functions(bool{true});
#warning reactivate
#if 0
test_numeric_aggregate_functions(bool{true}); test_numeric_aggregate_functions(bool{true});
// integral // integral
@ -183,5 +185,6 @@ int main()
// time_of_day // time_of_day
test_aggregate_functions(std::chrono::microseconds{}); test_aggregate_functions(std::chrono::microseconds{});
#endif
} }

View File

@ -37,9 +37,9 @@ namespace
SQLPP_ALIAS_PROVIDER(always); SQLPP_ALIAS_PROVIDER(always);
SQLPP_ALIAS_PROVIDER(sometimes); SQLPP_ALIAS_PROVIDER(sometimes);
SQLPP_ALIAS_PROVIDER(column) SQLPP_ALIAS_PROVIDER(column);
SQLPP_ALIAS_PROVIDER(table) SQLPP_ALIAS_PROVIDER(table);
SQLPP_ALIAS_PROVIDER(foo) SQLPP_ALIAS_PROVIDER(foo);
} }
template <typename Value> template <typename Value>

View File

@ -5,7 +5,8 @@
#include <sqlpp11/core/basic/table.h> #include <sqlpp11/core/basic/table.h>
#include <sqlpp11/core/basic/table_columns.h> #include <sqlpp11/core/basic/table_columns.h>
#include <sqlpp11/core/type_traits.h> #include <sqlpp11/core/type_traits.h>
#include <sqlpp11/core/name/char_sequence.h> #include <sqlpp11/core/name/alias_provider.h>
#include <sqlpp11/core/compat/string_view.h>
namespace test namespace test
{ {
@ -13,135 +14,47 @@ namespace test
{ {
struct Id : public ::sqlpp::name_tag_base struct Id : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(id, id);
{
static constexpr const char _literal[] = "id";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T id;
T& operator()() { return id; }
const T& operator()() const { return id; }
};
};
using value_type = ::sqlpp::integral; using value_type = ::sqlpp::integral;
using has_default = std::true_type; using has_default = std::true_type;
}; };
struct TextNnD : public ::sqlpp::name_tag_base struct TextNnD : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(text_nn_d, textNnD);
{
static constexpr const char _literal[] = "text_nn_d";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T textNnD;
T& operator()() { return textNnD; }
const T& operator()() const { return textNnD; }
};
};
using value_type = ::sqlpp::text; using value_type = ::sqlpp::text;
using has_default = std::true_type; using has_default = std::true_type;
}; };
struct IntN : public ::sqlpp::name_tag_base struct IntN : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(int_n, intN);
{
static constexpr const char _literal[] = "int_n";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T intN;
T& operator()() { return intN; }
const T& operator()() const { return intN; }
};
};
using value_type = ::sqlpp::optional<::sqlpp::integral>; using value_type = ::sqlpp::optional<::sqlpp::integral>;
using has_default = std::true_type; using has_default = std::true_type;
}; };
struct DoubleN : public ::sqlpp::name_tag_base struct DoubleN : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(double_n, doubleN);
{
static constexpr const char _literal[] = "double_n";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T doubleN;
T& operator()() { return doubleN; }
const T& operator()() const { return doubleN; }
};
};
using value_type = ::sqlpp::optional<::sqlpp::floating_point>; using value_type = ::sqlpp::optional<::sqlpp::floating_point>;
using has_default = std::true_type; using has_default = std::true_type;
}; };
struct UIntN : public ::sqlpp::name_tag_base struct UIntN : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(u_int_n, uIntN);
{
static constexpr const char _literal[] = "u_int_n";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T uIntN;
T& operator()() { return uIntN; }
const T& operator()() const { return uIntN; }
};
};
using value_type = ::sqlpp::optional<::sqlpp::unsigned_integral>; using value_type = ::sqlpp::optional<::sqlpp::unsigned_integral>;
using has_default = std::true_type; using has_default = std::true_type;
}; };
struct BlobN : public ::sqlpp::name_tag_base struct BlobN : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(blob_n, blobN);
{
static constexpr const char _literal[] = "blob_n";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T blobN;
T& operator()() { return blobN; }
const T& operator()() const { return blobN; }
};
};
using value_type = ::sqlpp::optional<::sqlpp::blob>; using value_type = ::sqlpp::optional<::sqlpp::blob>;
using has_default = std::true_type; using has_default = std::true_type;
}; };
struct BoolN : public ::sqlpp::name_tag_base struct BoolN : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(bool_n, boolN);
{
static constexpr const char _literal[] = "bool_n";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T boolN;
T& operator()() { return boolN; }
const T& operator()() const { return boolN; }
};
};
using value_type = ::sqlpp::optional<::sqlpp::boolean>; using value_type = ::sqlpp::optional<::sqlpp::boolean>;
using has_default = std::true_type; using has_default = std::true_type;
}; };
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(tab_foo, tabFoo);
{
static constexpr const char _literal[] = "tab_foo";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T tabFoo;
T& operator()() { return tabFoo; }
const T& operator()() const { return tabFoo; }
};
};
template<typename T> template<typename T>
using _table_columns = sqlpp::table_columns<T, using _table_columns = sqlpp::table_columns<T,
Id, Id,
@ -159,84 +72,29 @@ namespace test
{ {
struct Id : public ::sqlpp::name_tag_base struct Id : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(id, id);
{
static constexpr const char _literal[] = "id";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T id;
T& operator()() { return id; }
const T& operator()() const { return id; }
};
};
using value_type = ::sqlpp::integral; using value_type = ::sqlpp::integral;
using has_default = std::true_type; using has_default = std::true_type;
}; };
struct TextN : public ::sqlpp::name_tag_base struct TextN : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(text_n, textN);
{
static constexpr const char _literal[] = "text_n";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T textN;
T& operator()() { return textN; }
const T& operator()() const { return textN; }
};
};
using value_type = ::sqlpp::optional<::sqlpp::text>; using value_type = ::sqlpp::optional<::sqlpp::text>;
using has_default = std::true_type; using has_default = std::true_type;
}; };
struct BoolNn : public ::sqlpp::name_tag_base struct BoolNn : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(bool_nn, boolNn);
{
static constexpr const char _literal[] = "bool_nn";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T boolNn;
T& operator()() { return boolNn; }
const T& operator()() const { return boolNn; }
};
};
using value_type = ::sqlpp::boolean; using value_type = ::sqlpp::boolean;
using has_default = std::false_type; using has_default = std::false_type;
}; };
struct IntN : public ::sqlpp::name_tag_base struct IntN : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(int_n, intN);
{
static constexpr const char _literal[] = "int_n";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T intN;
T& operator()() { return intN; }
const T& operator()() const { return intN; }
};
};
using value_type = ::sqlpp::optional<::sqlpp::integral>; using value_type = ::sqlpp::optional<::sqlpp::integral>;
using has_default = std::true_type; using has_default = std::true_type;
}; };
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(tab_bar, tabBar);
{
static constexpr const char _literal[] = "tab_bar";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T tabBar;
T& operator()() { return tabBar; }
const T& operator()() const { return tabBar; }
};
};
template<typename T> template<typename T>
using _table_columns = sqlpp::table_columns<T, using _table_columns = sqlpp::table_columns<T,
Id, Id,
@ -252,84 +110,29 @@ namespace test
{ {
struct Id : public ::sqlpp::name_tag_base struct Id : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(id, id);
{
static constexpr const char _literal[] = "id";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T id;
T& operator()() { return id; }
const T& operator()() const { return id; }
};
};
using value_type = ::sqlpp::integral; using value_type = ::sqlpp::integral;
using has_default = std::true_type; using has_default = std::true_type;
}; };
struct DayPointN : public ::sqlpp::name_tag_base struct DayPointN : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(day_point_n, dayPointN);
{
static constexpr const char _literal[] = "day_point_n";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T dayPointN;
T& operator()() { return dayPointN; }
const T& operator()() const { return dayPointN; }
};
};
using value_type = ::sqlpp::optional<::sqlpp::day_point>; using value_type = ::sqlpp::optional<::sqlpp::day_point>;
using has_default = std::true_type; using has_default = std::true_type;
}; };
struct TimePointN : public ::sqlpp::name_tag_base struct TimePointN : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(time_point_n, timePointN);
{
static constexpr const char _literal[] = "time_point_n";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T timePointN;
T& operator()() { return timePointN; }
const T& operator()() const { return timePointN; }
};
};
using value_type = ::sqlpp::optional<::sqlpp::time_point>; using value_type = ::sqlpp::optional<::sqlpp::time_point>;
using has_default = std::true_type; using has_default = std::true_type;
}; };
struct TimeOfDayN : public ::sqlpp::name_tag_base struct TimeOfDayN : public ::sqlpp::name_tag_base
{ {
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(time_of_day_n, timeOfDayN);
{
static constexpr const char _literal[] = "time_of_day_n";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T timeOfDayN;
T& operator()() { return timeOfDayN; }
const T& operator()() const { return timeOfDayN; }
};
};
using value_type = ::sqlpp::optional<::sqlpp::time_of_day>; using value_type = ::sqlpp::optional<::sqlpp::time_of_day>;
using has_default = std::true_type; using has_default = std::true_type;
}; };
struct _alias_t SQLPP_NAME_TAG_FOR_SQL_AND_CPP(tab_date_time, tabDateTime);
{
static constexpr const char _literal[] = "tab_date_time";
using _name_t = ::sqlpp::make_char_sequence<sizeof(_literal), _literal>;
template<typename T>
struct _member_t
{
T tabDateTime;
T& operator()() { return tabDateTime; }
const T& operator()() const { return tabDateTime; }
};
};
template<typename T> template<typename T>
using _table_columns = sqlpp::table_columns<T, using _table_columns = sqlpp::table_columns<T,
Id, Id,