wip: new method: feresh and fast but complicated!

This commit is contained in:
Hamed Masafi 2018-01-14 00:13:51 +03:30
parent 556f990dee
commit 02037ba2b2
5 changed files with 45 additions and 27 deletions

View File

@ -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<RelationModel*>::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<TableModel*> 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);

View File

@ -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);

View File

@ -27,6 +27,7 @@
#include <QtCore/QRegularExpression>
#include <QtCore/QMetaObject>
#include <QtSql/QSqlResult>
#include <QElapsedTimer>
#include <QSqlError>
#include "query_p.h"
@ -129,22 +130,28 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
Q_D(Query);
QList<T*> 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() <<"==========================" <<q.numRowsAffected();
if (q.lastError().isValid())
qDebug() << q.lastError().text();
if (q.lastError().isValid())
qDebug() << q.lastError().text();
QSet<QString> relatedTables;
foreach (RelationModel *rel, d->relations)
relatedTables << rel->slaveTable->name() << rel->masterTable->name();
QStringList childTables, masterTables;
QMap<QString, Table*> 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="<<levels.count();
@ -208,9 +219,9 @@ qDebug()<<"count="<<levels.count();
while (p) {
for (int i = 0; i < levels.count(); i++) {
LevelData &data = levels[i];
qDebug()<<"key="<<data.key;
qDebug() << "level"<<i << data.className;
--p;
if (/*!data.tableSet ||*/ data.keyValue != q.value(data.key)) {
--p;
data.keyValue = q.value(data.key);
//create table row
@ -235,16 +246,17 @@ qDebug()<<"count="<<levels.count();
table->setParent(this);
table->clear();
qDebug() << "table created" << table;
//set last created row
data.lastRow = table;
qDebug() << "*" << data.masters << data.slaves;
}
}
}
}
if (m_autoDelete)
deleteLater();
qDebug() << "Elapsed time:" << QString("%1ms").arg(t.elapsed() / 1000.);
return returnList;
}

View File

@ -178,10 +178,12 @@ void MainTest::join()
->join<Post>();
// 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");
}

View File

@ -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();