From 8af466e4807a6cc5c5783b1a7c228ff2b45fda63 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Wed, 10 Jan 2018 19:48:49 +0330 Subject: [PATCH] join in select command --- src/defines.h | 15 +-------------- src/generators/mysqlgenerator.cpp | 11 +++++++++++ src/generators/mysqlgenerator.h | 1 + src/generators/sqlgeneratorbase.cpp | 19 +++++++++++++------ src/generators/sqlgeneratorbase_p.h | 5 ++--- src/generators/sqlitegenerator.cpp | 7 +++---- src/generators/sqlservergenerator.cpp | 5 ++--- src/generators/sqlservergenerator.h | 3 +-- src/query.h | 19 +++++++++++++------ test/common/user.h | 2 +- 10 files changed, 48 insertions(+), 39 deletions(-) diff --git a/src/defines.h b/src/defines.h index f5c965a..21a4bad 100644 --- a/src/defines.h +++ b/src/defines.h @@ -33,7 +33,7 @@ #endif #define NUT_INFO(type, name, value) \ - Q_CLASSINFO(QT_STRINGIFY(__nut_NAME_PERFIX #name "\n" #type), #value) + Q_CLASSINFO(__nut_NAME_PERFIX #type #name #value, #value) // Database //TODO: remove minor version @@ -107,17 +107,4 @@ public: \ #define NUT_NOT_NULL(x) Q_CLASSINFO(QT_STRINGIFY(__nut_NAME_PERFIX #x " " __nut_NOT_NULL), "1") #define NUT_INDEX(name, field, order) -#ifndef NUT_NO_KEYWORDS -# define FROM(x) (x->query()) -# define WHERE(x) ->setWhere(x) -# define JOIN(x) ->join() -# define ORDERBY(x) ->orderBy(#x); -# define ORDERBY_DESC(x) ->orderBy(!#x); - -# define SELECT() ->toList() -# define COUNT() ->count() -# define DELETE() ->remove() -# define FIRST() ->first() -#endif // NUT_NO_KEYWORDS - #endif // SYNTAX_DEFINES_H diff --git a/src/generators/mysqlgenerator.cpp b/src/generators/mysqlgenerator.cpp index e1ecb12..1436360 100644 --- a/src/generators/mysqlgenerator.cpp +++ b/src/generators/mysqlgenerator.cpp @@ -134,4 +134,15 @@ QString MySqlGenerator::phrase(const PhraseData *d) const return SqlGeneratorBase::phrase(d); } +QString MySqlGenerator::selectCommand(SqlGeneratorBase::AgregateType t, QString agregateArg, QList &wheres, QList &orders, QStringList joins, int skip, int take) +{ + QString command = SqlGeneratorBase::selectCommand(t, agregateArg, wheres, orders, joins, skip, take); + + if (take != -1 && skip != -1) + command.append(QString(" LIMIT %1 OFFSET %2") + .arg(skip) + .arg(take)); + return command; +} + NUT_END_NAMESPACE diff --git a/src/generators/mysqlgenerator.h b/src/generators/mysqlgenerator.h index 8243ada..335ebab 100644 --- a/src/generators/mysqlgenerator.h +++ b/src/generators/mysqlgenerator.h @@ -35,6 +35,7 @@ public: QString escapeValue(const QVariant &v) const; QVariant readValue(const QVariant::Type &type, const QVariant &dbValue); QString phrase(const PhraseData *d) const; + QString selectCommand(AgregateType t, QString agregateArg, QList &wheres, QList &orders, QStringList joins, int skip, int take); }; NUT_END_NAMESPACE diff --git a/src/generators/sqlgeneratorbase.cpp b/src/generators/sqlgeneratorbase.cpp index 1c630e2..d30538f 100644 --- a/src/generators/sqlgeneratorbase.cpp +++ b/src/generators/sqlgeneratorbase.cpp @@ -180,11 +180,12 @@ QString SqlGeneratorBase::diff(TableModel *oldTable, TableModel *newTable) sql = QString("CREATE TABLE %1 \n(%2)").arg(newTable->name()).arg( columnSql.join(",\n")); + qDebug() << sql; } return sql; } -QString SqlGeneratorBase::join(const QStringList &list) +QString SqlGeneratorBase::join(const QStringList &list, QStringList *order) { //TODO: make this ungly code better and bugless :-) /* @@ -215,6 +216,9 @@ QString SqlGeneratorBase::join(const QStringList &list) .arg(rel->localColumn) .arg(mainTable)); + if (order != Q_NULLPTR) + order->append(table + "." + rel->localColumn); + } else{ rel = model.relationByTableNames(table, mainTable); if (rel) { @@ -225,6 +229,9 @@ QString SqlGeneratorBase::join(const QStringList &list) .arg(rel->table->primaryKey()) .arg(mainTable)); + if (order != Q_NULLPTR) + order->append(table + "." + rel->table->primaryKey()); + } else { qInfo("Relation for %s and %s not exists", qPrintable(table), qPrintable(mainTable)); @@ -373,16 +380,16 @@ QString SqlGeneratorBase::selectCommand(SqlGeneratorBase::AgregateType t, QString agregateArg, QList &wheres, QList &orders, - QString tableName, - QString joinClassName, int skip, int take) + QStringList joins, int skip, int take) { Q_UNUSED(take); Q_UNUSED(skip); + QStringList joinedOrders; QString select = agregateText(t, agregateArg); + QString from = join(joins, &joinedOrders); QString where = createWhere(wheres); - QString order = ""; - QString from = fromTableText(tableName, joinClassName, order); + QString order = joinedOrders.join(", "); foreach (WherePhrase p, orders) { if (order != "") @@ -404,7 +411,7 @@ QString SqlGeneratorBase::selectCommand(SqlGeneratorBase::AgregateType t, replaceTableNames(sql); - return sql; + return sql + " "; } QString SqlGeneratorBase::createWhere(QList &wheres) diff --git a/src/generators/sqlgeneratorbase_p.h b/src/generators/sqlgeneratorbase_p.h index 2000d64..5803654 100644 --- a/src/generators/sqlgeneratorbase_p.h +++ b/src/generators/sqlgeneratorbase_p.h @@ -68,7 +68,7 @@ public: virtual QString diff(FieldModel *oldField, FieldModel *newField); virtual QString diff(TableModel *oldTable, TableModel *newTable); - virtual QString join(const QStringList &list); + virtual QString join(const QStringList &list, QStringList *order = Q_NULLPTR); virtual QString saveRecord(Table *t, QString tableName); virtual QString insertRecord(Table *t, QString tableName); @@ -82,8 +82,7 @@ public: QString agregateArg, QList &wheres, QList &orders, - QString tableName, - QString joinClassName, + QStringList joins, int skip = -1, int take = -1); virtual QString deleteCommand(QList &wheres, QString tableName); diff --git a/src/generators/sqlitegenerator.cpp b/src/generators/sqlitegenerator.cpp index 5219a61..a315831 100644 --- a/src/generators/sqlitegenerator.cpp +++ b/src/generators/sqlitegenerator.cpp @@ -54,10 +54,9 @@ QString SqliteGenerator::fieldType(FieldModel *field) dbType = "real"; break; case QVariant::Int: -// if(field->isPrimaryKey) -// dbType = "INTEGER PRIMARY KEY"; -// else - dbType = "integer"; + dbType = "integer"; +// if (field->isAutoIncrement) +// dbType.append(" PRIMARY KEY AUTOINCREMENT"); break; case QVariant::String: if(field->length) diff --git a/src/generators/sqlservergenerator.cpp b/src/generators/sqlservergenerator.cpp index a051d6d..5cddc97 100644 --- a/src/generators/sqlservergenerator.cpp +++ b/src/generators/sqlservergenerator.cpp @@ -135,10 +135,9 @@ QString SqlServerGenerator::escapeValue(const QVariant &v) const QString SqlServerGenerator::selectCommand( SqlGeneratorBase::AgregateType t, QString agregateArg, - QList &wheres, QList &orders, QString tableName, - QString joinClassName, int skip, int take) + QList &wheres, QList &orders, QStringList joins, int skip, int take) { - QString command = SqlGeneratorBase::selectCommand(t, agregateArg, wheres, orders, tableName, joinClassName, skip, take); + QString command = SqlGeneratorBase::selectCommand(t, agregateArg, wheres, orders, joins, skip, take); if (take != -1 && skip != -1) command.append(QString("OFFSET %1 ROWS FETCH NEXT %2 ROWS ONLY") diff --git a/src/generators/sqlservergenerator.h b/src/generators/sqlservergenerator.h index 0966b27..f006dca 100644 --- a/src/generators/sqlservergenerator.h +++ b/src/generators/sqlservergenerator.h @@ -40,8 +40,7 @@ public: QString selectCommand(AgregateType t, QString agregateArg, QList &wheres, - QList &orders, QString tableName, - QString joinClassName, int skip, int take); + QList &orders, QStringList joins, int skip, int take); }; NUT_END_NAMESPACE diff --git a/src/query.h b/src/query.h index 8f4ad76..4b6fa8a 100644 --- a/src/query.h +++ b/src/query.h @@ -126,13 +126,14 @@ Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) d->select = "*"; d->joins.prepend(d->tableName); + qDebug() << "JOINS="<< d->database->sqlGenertor()->join(d->joins); // QSqlQuery q = // d->database->exec(d->database->sqlGenertor()->selectCommand(d->wheres, // d->orders, d->tableName, d->joinClassName)); d->sql = d->database->sqlGenertor()->selectCommand( SqlGeneratorBase::SelectAll, "", d->wheres, d->orderPhrases, - d->tableName, d->joinClassName, d->skip, d->take); + d->joins, d->skip, d->take); QSqlQuery q = d->database->exec(d->sql); // QString pk = TableModel::findByName(d->tableName)->primaryKey(); @@ -229,9 +230,11 @@ Q_OUTOFLINE_TEMPLATE QList Query::select(const FieldPhrase f) { Q_D(Query); QList ret; + + d->joins.prepend(d->tableName); d->sql = d->database->sqlGenertor()->selectCommand( SqlGeneratorBase::SignleField, f.data()->text, d->wheres, - d->orderPhrases, d->tableName, d->joinClassName, d->skip, d->take); + d->orderPhrases, d->joins, d->skip, d->take); QSqlQuery q = d->database->exec(d->sql); @@ -263,9 +266,10 @@ Q_OUTOFLINE_TEMPLATE int Query::count() { Q_D(Query); + d->joins.prepend(d->tableName); d->select = "COUNT(*)"; d->sql = d->database->sqlGenertor()->selectCommand(SqlGeneratorBase::Count, - QStringLiteral("*"), d->wheres, d->orderPhrases, d->tableName, d->joinClassName); + QStringLiteral("*"), d->wheres, d->orderPhrases, d->joins); QSqlQuery q = d->database->exec(d->sql); if (q.next()) @@ -278,9 +282,10 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::max(FieldPhrase &f) { Q_D(Query); + d->joins.prepend(d->tableName); d->sql = d->database->sqlGenertor()->selectCommand( SqlGeneratorBase::Max, f.data()->text, d->wheres, d->orderPhrases, - d->tableName, d->joinClassName); + d->joins); QSqlQuery q = d->database->exec(d->sql); if (q.next()) @@ -293,9 +298,10 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::min(FieldPhrase &f) { Q_D(Query); + d->joins.prepend(d->tableName); d->sql = d->database->sqlGenertor()->selectCommand( SqlGeneratorBase::Min, f.data()->text, d->wheres, d->orderPhrases, - d->tableName, d->joinClassName); + d->joins); QSqlQuery q = d->database->exec(d->sql); if (q.next()) @@ -308,9 +314,10 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::average(FieldPhrase &f) { Q_D(Query); + d->joins.prepend(d->tableName); d->sql = d->database->sqlGenertor()->selectCommand( SqlGeneratorBase::Average, f.data()->text, d->wheres, d->orderPhrases, - d->tableName, d->joinClassName); + d->joins); QSqlQuery q = d->database->exec(d->sql); if (q.next()) diff --git a/test/common/user.h b/test/common/user.h index d2350f2..dd3330c 100644 --- a/test/common/user.h +++ b/test/common/user.h @@ -17,7 +17,7 @@ class User : public Nut::Table Q_OBJECT NUT_PRIMARY_AUTO_INCREMENT(id) - NUT_DECLARE_FIELD(QUuid, id, id, setId) + NUT_DECLARE_FIELD(int, id, id, setId) NUT_NOT_NULL(username) NUT_LEN(username, 50)