From d39c6aee37a3dbec26e17c74043fe2ed1742eb0d Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Mon, 10 Aug 2020 11:12:06 +0430 Subject: [PATCH] movable query --- src/nut/query.h | 160 +++++++++++++++++++++++++++++++----------------- 1 file changed, 104 insertions(+), 56 deletions(-) diff --git a/src/nut/query.h b/src/nut/query.h index 8cf076d..fbd36da 100644 --- a/src/nut/query.h +++ b/src/nut/query.h @@ -48,34 +48,59 @@ NUT_BEGIN_NAMESPACE +struct NUT_EXPORT QueryData { + QString sql; + QString className; + QString tableName; + QString select; + Database *database; + AbstractTableSet *tableSet; + QStringList joins; + QList relations; + int skip; + int take; + PhraseList orderPhrase, fieldPhrase; + ConditionalPhrase wherePhrase; + + QueryData *clone() { + return new QueryData; + } +}; + template class Query : public AbstractQuery { + QueryData *d; bool m_autoDelete; public: explicit Query(Database *database, AbstractTableSet *tableSet, bool autoDelete); + Query (const Query &other); + Query (Query &&other); + ~Query(); + Query& operator=(const Query &q); + //ddl - Query *join(const QString &className); - Query *join(Table *c); + Query &join(const QString &className); + Query &join(Table *c); template - Query *join() + Query &join() { join(TABLE::staticMetaObject.className()); - return this; + return *this; } - // Query *orderBy(QString fieldName, QString type); - Query *skip(int n); - Query *take(int n); - Query *fields(const PhraseList &ph); - Query *orderBy(const PhraseList &ph); - Query *where(const ConditionalPhrase &ph); - Query *setWhere(const ConditionalPhrase &ph); + // Query &orderBy(QString fieldName, QString type); + Query &skip(int n); + Query &take(int n); + Query &fields(const PhraseList &ph); + Query &orderBy(const PhraseList &ph); + Query &where(const ConditionalPhrase &ph); + Query &setWhere(const ConditionalPhrase &ph); //data selecting Row first(); @@ -110,7 +135,7 @@ template template Q_OUTOFLINE_TEMPLATE QList Query::select(const std::function allocator) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); QList ret; d->joins.prepend(d->tableName); @@ -135,7 +160,7 @@ Q_OUTOFLINE_TEMPLATE QList Query::select(const std::function -//inline Query *createQuery(TableSet *tableSet) +//inline Query &createQuery(TableSet *tableSet) //{ // return tableSet->query(); //} @@ -143,9 +168,9 @@ Q_OUTOFLINE_TEMPLATE QList Query::select(const std::function Q_OUTOFLINE_TEMPLATE Query::Query(Database *database, AbstractTableSet *tableSet, bool autoDelete) - : AbstractQuery(database), m_autoDelete(autoDelete) + : AbstractQuery(database), d(new QueryData), m_autoDelete(autoDelete) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->database = database; d->tableSet = tableSet; @@ -156,17 +181,40 @@ Q_OUTOFLINE_TEMPLATE Query::Query(Database *database, AbstractTableSet *table ->name(); } +template +Q_OUTOFLINE_TEMPLATE Query::Query(const Query &other) { + d = other.d->clone(); +} + +template +Q_OUTOFLINE_TEMPLATE Query::Query(Query &&other) { + d = std::move(other.d); + other._data = nullptr; +} + template Q_OUTOFLINE_TEMPLATE Query::~Query() { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); delete d; } +template +Q_OUTOFLINE_TEMPLATE Query &Query::operator=(const Query &q) +{ + if (this != &q) + { + T *p = q._data ? q._data->detach() : nullptr; + delete d; + d = p; + } + return *this; +} + template Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); RowList returnList; d->select = QStringLiteral("*"); @@ -343,7 +391,7 @@ template template Q_OUTOFLINE_TEMPLATE QList Query::select(const FieldPhrase f) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); QList ret; d->joins.prepend(d->tableName); @@ -381,7 +429,7 @@ Q_OUTOFLINE_TEMPLATE Row Query::first() template Q_OUTOFLINE_TEMPLATE int Query::count() { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->joins.prepend(d->tableName); d->select = QStringLiteral("COUNT(*)"); @@ -401,7 +449,7 @@ Q_OUTOFLINE_TEMPLATE int Query::count() template Q_OUTOFLINE_TEMPLATE QVariant Query::max(const FieldPhrase &f) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->joins.prepend(d->tableName); d->sql = d->database->sqlGenerator()->selectCommand( @@ -419,7 +467,7 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::max(const FieldPhrase &f) template Q_OUTOFLINE_TEMPLATE QVariant Query::min(const FieldPhrase &f) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->joins.prepend(d->tableName); d->sql = d->database->sqlGenerator()->selectCommand( @@ -437,7 +485,7 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::min(const FieldPhrase &f) template Q_OUTOFLINE_TEMPLATE QVariant Query::sum(const FieldPhrase &f) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->joins.prepend(d->tableName); d->sql = d->database->sqlGenerator()->selectCommand( @@ -455,7 +503,7 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::sum(const FieldPhrase &f) template Q_OUTOFLINE_TEMPLATE QVariant Query::average(const FieldPhrase &f) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->joins.prepend(d->tableName); d->sql = d->database->sqlGenerator()->selectCommand( @@ -473,7 +521,7 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::average(const FieldPhrase &f) template Q_OUTOFLINE_TEMPLATE QVariant Query::insert(const AssignmentPhraseList &p) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->sql = d->database->sqlGenerator() ->insertCommand(d->tableName, p); QSqlQuery q = d->database->exec(d->sql); @@ -482,9 +530,9 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::insert(const AssignmentPhraseList &p) } template -Q_OUTOFLINE_TEMPLATE Query *Query::join(const QString &className) +Q_OUTOFLINE_TEMPLATE Query &Query::join(const QString &className) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); RelationModel *rel = d->database->model() .relationByClassNames(d->className, className); @@ -495,85 +543,85 @@ Q_OUTOFLINE_TEMPLATE Query *Query::join(const QString &className) if (!rel) { qDebug() << "No relation between" << d->className << "and" << className; - return this; + return *this; } d->relations.append(rel); d->joins.append(className); - return this; + return *this; } template -Q_OUTOFLINE_TEMPLATE Query *Query::join(Table *c) +Q_OUTOFLINE_TEMPLATE Query &Query::join(Table *c) { join(c->metaObject()->className()); - return this; + return *this; } template -Q_OUTOFLINE_TEMPLATE Query *Query::where(const ConditionalPhrase &ph) +Q_OUTOFLINE_TEMPLATE Query &Query::where(const ConditionalPhrase &ph) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); if (d->wherePhrase.data) d->wherePhrase = d->wherePhrase && ph; else d->wherePhrase = ph; - return this; + return *this; } template -Q_OUTOFLINE_TEMPLATE Query *Query::setWhere(const ConditionalPhrase &ph) +Q_OUTOFLINE_TEMPLATE Query &Query::setWhere(const ConditionalPhrase &ph) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->wherePhrase = ph; - return this; + return *this; } template -Q_OUTOFLINE_TEMPLATE Query *Query::skip(int n) +Q_OUTOFLINE_TEMPLATE Query &Query::skip(int n) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->skip = n; - return this; + return *this; } template -Q_OUTOFLINE_TEMPLATE Query *Query::take(int n) +Q_OUTOFLINE_TEMPLATE Query &Query::take(int n) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->take = n; - return this; + return *this; } template -Q_OUTOFLINE_TEMPLATE Query *Query::fields(const PhraseList &ph) +Q_OUTOFLINE_TEMPLATE Query &Query::fields(const PhraseList &ph) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->fieldPhrase = ph; - return this; + return *this; } //template -//Q_OUTOFLINE_TEMPLATE Query *Query::orderBy(QString fieldName, +//Q_OUTOFLINE_TEMPLATE Query &Query::orderBy(QString fieldName, // QString type) //{ -// Q_D(AbstractQuery); +// //Q_D(AbstractQuery); // d->orderPhrases.append(fieldName, type); -// return this; +// return *this; //} template -Q_OUTOFLINE_TEMPLATE Query *Query::orderBy(const PhraseList &ph) +Q_OUTOFLINE_TEMPLATE Query &Query::orderBy(const PhraseList &ph) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->orderPhrase = ph; - return this; + return *this; } template Q_OUTOFLINE_TEMPLATE int Query::update(const AssignmentPhraseList &ph) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->sql = d->database->sqlGenerator()->updateCommand( d->tableName, @@ -590,7 +638,7 @@ Q_OUTOFLINE_TEMPLATE int Query::update(const AssignmentPhraseList &ph) template Q_OUTOFLINE_TEMPLATE int Query::remove() { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->sql = d->database->sqlGenerator()->deleteCommand( d->tableName, d->wherePhrase); @@ -612,7 +660,7 @@ Q_OUTOFLINE_TEMPLATE QSqlQueryModel *Query::toModel() template Q_OUTOFLINE_TEMPLATE void Query::toModel(QSqlQueryModel *model) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->sql = d->database->sqlGenerator()->selectCommand( d->tableName, @@ -649,7 +697,7 @@ Q_OUTOFLINE_TEMPLATE void Query::toModel(QSqlQueryModel *model) template Q_OUTOFLINE_TEMPLATE void Query::toModel(SqlModel *model) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->sql = d->database->sqlGenerator()->selectCommand( d->tableName, @@ -686,7 +734,7 @@ Q_OUTOFLINE_TEMPLATE void Query::toModel(SqlModel *model) template Q_OUTOFLINE_TEMPLATE QString Query::sqlCommand() const { - Q_D(const AbstractQuery); + //Q_D(const AbstractQuery); return d->sql; }