From 02037ba2b28810cf248125e57bcd3f4b006d069c Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Sun, 14 Jan 2018 00:13:51 +0330 Subject: [PATCH] wip: new method: feresh and fast but complicated! --- src/generators/sqlgeneratorbase.cpp | 28 ++++++++++++++---------- src/generators/sqlgeneratorbase_p.h | 2 +- src/query.h | 34 +++++++++++++++++++---------- test/basic/maintest.cpp | 6 +++-- test/basic/maintest.h | 2 +- 5 files changed, 45 insertions(+), 27 deletions(-) diff --git a/src/generators/sqlgeneratorbase.cpp b/src/generators/sqlgeneratorbase.cpp index 8cb634b..8158bbe 100644 --- a/src/generators/sqlgeneratorbase.cpp +++ b/src/generators/sqlgeneratorbase.cpp @@ -96,9 +96,8 @@ QString SqlGeneratorBase::saveRecord(Table *t, QString tableName) return ""; } -QString SqlGeneratorBase::recordsPhrase(QString className) +QString SqlGeneratorBase::recordsPhrase(TableModel *table) { - TableModel *table = _database->model().tableByClassName(className); if (!table) return ""; @@ -209,20 +208,20 @@ QString SqlGeneratorBase::join(const QString &mainTable, QList::const_iterator i; for (i = list.begin(); i != list.end(); ++i) { if ((*i)->masterTable->name() == mainTable) { - ret.append(QString(" INNER JOIN %1 ON %1.%2 = %3.%4") - .arg((*i)->slaveTable->name()) - .arg((*i)->localColumn) + ret.append(QString(" INNER JOIN %3 ON %1.%2 = %3.%4") .arg((*i)->masterTable->name()) - .arg((*i)->masterTable->primaryKey())); + .arg((*i)->masterTable->primaryKey()) + .arg((*i)->slaveTable->name()) + .arg((*i)->localColumn)); if (order != Q_NULLPTR) order->append(mainTable + "." + (*i)->slaveTable->primaryKey()); } else { - ret.append(QString(" INNER JOIN %1 ON %1.%2 = %3.%4") - .arg((*i)->masterTable->name()) - .arg((*i)->masterTable->primaryKey()) + ret.append(QString(" INNER JOIN %3 ON %1.%2 = %3.%4") .arg(mainTable) - .arg((*i)->localColumn)); + .arg((*i)->localColumn) + .arg((*i)->masterTable->name()) + .arg((*i)->masterTable->primaryKey())); if (order != Q_NULLPTR) order->append(mainTable + "." + (*i)->masterTable->primaryKey()); @@ -443,11 +442,16 @@ QString SqlGeneratorBase::selectCommand(SqlGeneratorBase::AgregateType t, //TODO: temporatory disabled if (t == SelectAll) { + QSet tables; + tables.insert(_database->model().tableByName(tableName)); + foreach (RelationModel *rel, joins) + tables << rel->masterTable << rel->slaveTable; + select = ""; - foreach (RelationModel *c, joins) { + foreach (TableModel *t, tables) { if (!select.isEmpty()) select.append(", "); - select.append(recordsPhrase(c->slaveTable->className())); + select.append(recordsPhrase(t)); } } QString from = join(tableName, joins, &joinedOrders); diff --git a/src/generators/sqlgeneratorbase_p.h b/src/generators/sqlgeneratorbase_p.h index 82256b1..011f6b1 100644 --- a/src/generators/sqlgeneratorbase_p.h +++ b/src/generators/sqlgeneratorbase_p.h @@ -76,7 +76,7 @@ public: virtual QString saveRecord(Table *t, QString tableName); - virtual QString recordsPhrase(QString className); + virtual QString recordsPhrase(TableModel *table); virtual QString insertRecord(Table *t, QString tableName); virtual QString updateRecord(Table *t, QString tableName); diff --git a/src/query.h b/src/query.h index b2d3270..a891d36 100644 --- a/src/query.h +++ b/src/query.h @@ -27,6 +27,7 @@ #include #include #include +#include #include #include "query_p.h" @@ -129,22 +130,28 @@ Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) Q_D(Query); QList result; d->select = "*"; + QElapsedTimer t; + t.start(); - d->joins.prepend(d->className); d->sql = d->database->sqlGenertor()->selectCommand( SqlGeneratorBase::SelectAll, "", d->tableName, d->wheres, d->orderPhrases, d->relations, d->skip, d->take); - // qDebug() << "JOINS=" << d->database->sqlGenertor()->join(d->relations); - qDebug() << "SQL=" << d->sql; QSqlQuery q = d->database->exec(d->sql); -qDebug() <<"==========================" < relatedTables; + foreach (RelationModel *rel, d->relations) + relatedTables << rel->slaveTable->name() << rel->masterTable->name(); + QStringList childTables, masterTables; + QMap lastClassRow; + foreach (RelationModel *rel, d->relations) { childTables.append(rel->slaveTable->name()); masterTables.append(rel->masterTable->name()); @@ -171,7 +178,12 @@ qDebug() << masterTables; for (int i = 0; i < d->relations.count(); ++i) { LevelData data; data.relation = d->relations[i]; + qDebug() <<"relation" << data.relation->masterTable->name() << data.relation->slaveTable->name(); data.key = data.relation->slaveTable->name() + "." + data.relation->localColumn; + data.className = data.relation->slaveTable->className(); + data.typeId = d->relations[i]->slaveTable->typeId(); + data.tableName = data.relation->slaveTable->name(); + data.tableSet = 0; for (int j = 0; j < i; ++j) { if (d->relations[i]->masterTable->name() == d->relations[j]->slaveTable->name()) { @@ -179,7 +191,6 @@ qDebug() << masterTables; levels[i].slaves.append(i); } } - data.typeId = d->relations[i]->slaveTable->typeId(); levels.append(data); } qDebug()<<"count="<join(); // Comment *comment = q->first(); - q->toList(); + auto comments = q->toList(); // Comment *comment = q->toList().first(); qDebug() << q->sqlCommand(); -// QTEST_ASSERT(comment->author()->username() == "admin"); + QTEST_ASSERT(comments.length()); + QTEST_ASSERT(comments[0]->author()); + QTEST_ASSERT(comments[0]->author()->username() == "admin"); } diff --git a/test/basic/maintest.h b/test/basic/maintest.h index 26c8a41..74bd47a 100644 --- a/test/basic/maintest.h +++ b/test/basic/maintest.h @@ -24,10 +24,10 @@ private slots: void initTestCase(); void dataScheema(); - void join(); void createUser(); void createPost(); void createPost2(); + void join(); void selectPosts(); void selectFirst(); void selectPostsWithoutTitle();