Files
TinyORM/include/orm/ormconcepts.hpp
silverqx a2714be30e added schema builder 🔥🚀
Added practically everything I wanted to have in except for updating
columns.
Needed to name the schema namespace as Orm::SchemaNs to avoid collision
with the Orm::Schema class.

 - unit tests with great coverage
 - new schema constants
 - a new prefix_indexes and engine DB conncetion configurations

Others:

 - IsModel tag
 - enhanced columnize in the BaseGrammar
 - used a new columnize logic in all grammars
 - new constants
 - new container utils class for joining containers
 - new DB::driver() getter for QSqlDriver
 - avoid possible crash in tests with pretend, added empty log checks
 - clang tidy, excluded to word from short variable names
2022-03-22 09:53:33 +01:00

85 lines
2.6 KiB
C++

#pragma once
#ifndef ORM_ORMCONCEPTS_HPP
#define ORM_ORMCONCEPTS_HPP
#include "orm/macros/systemheader.hpp"
TINY_SYSTEM_HEADER
#include <QString>
#include <QVariant>
#include "orm/macros/commonnamespace.hpp"
namespace std
{
template<typename ...Types>
class variant; // NOLINT(bugprone-forwarding-reference-overload)
}
TINYORM_BEGIN_COMMON_NAMESPACE
namespace Orm
{
namespace Query
{
class Builder;
class Expression;
}
using QueryBuilder = Query::Builder;
/*! Concept for a queryable parameter. */
template<typename T>
concept Queryable = std::convertible_to<T, Orm::QueryBuilder &> ||
std::invocable<T, Orm::QueryBuilder &>;
/*! Concept for whereSub()'s value parameter. */
template<typename T>
concept WhereValueSubQuery = Queryable<T>;
/*! Concept for the subquery, used in the from clause (tablename), join clause, ... */
template<typename T>
concept SubQuery = std::convertible_to<T, QString> ||
Queryable<T>;
/*! Concept for where()'s value parameter. */
template<typename T>
concept WhereValue = std::convertible_to<T, const QVariant &> ||
WhereValueSubQuery<T>;
/*! Concept for the join's table parameter. */
template<typename T>
concept JoinTable = std::same_as<T, Query::Expression> ||
std::convertible_to<T, QString>;
/*! Concept for the table column. */
template<typename T>
concept ColumnConcept =
std::convertible_to<T, std::variant<QString, Query::Expression>>;
/*! Concept for the QString. */
template<typename T>
concept QStringConcept = std::convertible_to<T, const QString &> ||
std::convertible_to<T, QString>;
/*! Type for the database column. */
using Column = std::variant<QString, Query::Expression>;
/*! QString container concept (QStringList or QVector<QString>). */
template<typename T>
concept ColumnContainer = std::convertible_to<T, const QStringList &> ||
std::convertible_to<T, const QVector<QString> &> ||
std::convertible_to<T, const QVector<Column> &>;
// CUR concepts, check if const QString & vs QString in convertible_to<> makes sense silverqx
/*! Concept for delimiter for joining containers. */
template<typename T>
concept DelimiterConcept = std::convertible_to<T, const QString &> ||
std::convertible_to<T, QString> ||
std::convertible_to<T, QChar>;
} // namespace Orm
TINYORM_END_COMMON_NAMESPACE
#endif // ORM_ORMCONCEPTS_HPP