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 ""; return "";
} }
QString SqlGeneratorBase::recordsPhrase(QString className) QString SqlGeneratorBase::recordsPhrase(TableModel *table)
{ {
TableModel *table = _database->model().tableByClassName(className);
if (!table) if (!table)
return ""; return "";
@ -209,20 +208,20 @@ QString SqlGeneratorBase::join(const QString &mainTable,
QList<RelationModel*>::const_iterator i; QList<RelationModel*>::const_iterator i;
for (i = list.begin(); i != list.end(); ++i) { for (i = list.begin(); i != list.end(); ++i) {
if ((*i)->masterTable->name() == mainTable) { if ((*i)->masterTable->name() == mainTable) {
ret.append(QString(" INNER JOIN %1 ON %1.%2 = %3.%4") ret.append(QString(" INNER JOIN %3 ON %1.%2 = %3.%4")
.arg((*i)->slaveTable->name())
.arg((*i)->localColumn)
.arg((*i)->masterTable->name()) .arg((*i)->masterTable->name())
.arg((*i)->masterTable->primaryKey())); .arg((*i)->masterTable->primaryKey())
.arg((*i)->slaveTable->name())
.arg((*i)->localColumn));
if (order != Q_NULLPTR) if (order != Q_NULLPTR)
order->append(mainTable + "." + (*i)->slaveTable->primaryKey()); order->append(mainTable + "." + (*i)->slaveTable->primaryKey());
} else { } else {
ret.append(QString(" INNER JOIN %1 ON %1.%2 = %3.%4") ret.append(QString(" INNER JOIN %3 ON %1.%2 = %3.%4")
.arg((*i)->masterTable->name())
.arg((*i)->masterTable->primaryKey())
.arg(mainTable) .arg(mainTable)
.arg((*i)->localColumn)); .arg((*i)->localColumn)
.arg((*i)->masterTable->name())
.arg((*i)->masterTable->primaryKey()));
if (order != Q_NULLPTR) if (order != Q_NULLPTR)
order->append(mainTable + "." + (*i)->masterTable->primaryKey()); order->append(mainTable + "." + (*i)->masterTable->primaryKey());
@ -443,11 +442,16 @@ QString SqlGeneratorBase::selectCommand(SqlGeneratorBase::AgregateType t,
//TODO: temporatory disabled //TODO: temporatory disabled
if (t == SelectAll) { if (t == SelectAll) {
QSet<TableModel*> tables;
tables.insert(_database->model().tableByName(tableName));
foreach (RelationModel *rel, joins)
tables << rel->masterTable << rel->slaveTable;
select = ""; select = "";
foreach (RelationModel *c, joins) { foreach (TableModel *t, tables) {
if (!select.isEmpty()) if (!select.isEmpty())
select.append(", "); select.append(", ");
select.append(recordsPhrase(c->slaveTable->className())); select.append(recordsPhrase(t));
} }
} }
QString from = join(tableName, joins, &joinedOrders); QString from = join(tableName, joins, &joinedOrders);

View File

@ -76,7 +76,7 @@ public:
virtual QString saveRecord(Table *t, QString tableName); 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 insertRecord(Table *t, QString tableName);
virtual QString updateRecord(Table *t, QString tableName); virtual QString updateRecord(Table *t, QString tableName);

View File

@ -27,6 +27,7 @@
#include <QtCore/QRegularExpression> #include <QtCore/QRegularExpression>
#include <QtCore/QMetaObject> #include <QtCore/QMetaObject>
#include <QtSql/QSqlResult> #include <QtSql/QSqlResult>
#include <QElapsedTimer>
#include <QSqlError> #include <QSqlError>
#include "query_p.h" #include "query_p.h"
@ -129,22 +130,28 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
Q_D(Query); Q_D(Query);
QList<T*> result; QList<T*> result;
d->select = "*"; d->select = "*";
QElapsedTimer t;
t.start();
d->joins.prepend(d->className);
d->sql = d->database->sqlGenertor()->selectCommand( d->sql = d->database->sqlGenertor()->selectCommand(
SqlGeneratorBase::SelectAll, "", SqlGeneratorBase::SelectAll, "",
d->tableName, d->tableName,
d->wheres, d->orderPhrases, d->relations, d->wheres, d->orderPhrases, d->relations,
d->skip, d->take); d->skip, d->take);
// qDebug() << "JOINS=" << d->database->sqlGenertor()->join(d->relations);
qDebug() << "SQL=" << d->sql;
QSqlQuery q = d->database->exec(d->sql); QSqlQuery q = d->database->exec(d->sql);
qDebug() <<"==========================" <<q.numRowsAffected(); if (q.lastError().isValid())
if (q.lastError().isValid()) qDebug() << q.lastError().text();
qDebug() << q.lastError().text();
QSet<QString> relatedTables;
foreach (RelationModel *rel, d->relations)
relatedTables << rel->slaveTable->name() << rel->masterTable->name();
QStringList childTables, masterTables; QStringList childTables, masterTables;
QMap<QString, Table*> lastClassRow;
foreach (RelationModel *rel, d->relations) { foreach (RelationModel *rel, d->relations) {
childTables.append(rel->slaveTable->name()); childTables.append(rel->slaveTable->name());
masterTables.append(rel->masterTable->name()); masterTables.append(rel->masterTable->name());
@ -171,7 +178,12 @@ qDebug() << masterTables;
for (int i = 0; i < d->relations.count(); ++i) { for (int i = 0; i < d->relations.count(); ++i) {
LevelData data; LevelData data;
data.relation = d->relations[i]; 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.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; data.tableSet = 0;
for (int j = 0; j < i; ++j) { for (int j = 0; j < i; ++j) {
if (d->relations[i]->masterTable->name() == d->relations[j]->slaveTable->name()) { if (d->relations[i]->masterTable->name() == d->relations[j]->slaveTable->name()) {
@ -179,7 +191,6 @@ qDebug() << masterTables;
levels[i].slaves.append(i); levels[i].slaves.append(i);
} }
} }
data.typeId = d->relations[i]->slaveTable->typeId();
levels.append(data); levels.append(data);
} }
qDebug()<<"count="<<levels.count(); qDebug()<<"count="<<levels.count();
@ -208,9 +219,9 @@ qDebug()<<"count="<<levels.count();
while (p) { while (p) {
for (int i = 0; i < levels.count(); i++) { for (int i = 0; i < levels.count(); i++) {
LevelData &data = levels[i]; LevelData &data = levels[i];
qDebug()<<"key="<<data.key; qDebug() << "level"<<i << data.className;
--p;
if (/*!data.tableSet ||*/ data.keyValue != q.value(data.key)) { if (/*!data.tableSet ||*/ data.keyValue != q.value(data.key)) {
--p;
data.keyValue = q.value(data.key); data.keyValue = q.value(data.key);
//create table row //create table row
@ -235,16 +246,17 @@ qDebug()<<"count="<<levels.count();
table->setParent(this); table->setParent(this);
table->clear(); table->clear();
qDebug() << "table created" << table;
//set last created row //set last created row
data.lastRow = table; data.lastRow = table;
qDebug() << "*" << data.masters << data.slaves;
} }
} }
} }
} }
if (m_autoDelete) if (m_autoDelete)
deleteLater(); deleteLater();
qDebug() << "Elapsed time:" << QString("%1ms").arg(t.elapsed() / 1000.);
return returnList; return returnList;
} }

View File

@ -178,10 +178,12 @@ void MainTest::join()
->join<Post>(); ->join<Post>();
// Comment *comment = q->first(); // Comment *comment = q->first();
q->toList(); auto comments = q->toList();
// Comment *comment = q->toList().first(); // Comment *comment = q->toList().first();
qDebug() << q->sqlCommand(); 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 initTestCase();
void dataScheema(); void dataScheema();
void join();
void createUser(); void createUser();
void createPost(); void createPost();
void createPost2(); void createPost2();
void join();
void selectPosts(); void selectPosts();
void selectFirst(); void selectFirst();
void selectPostsWithoutTitle(); void selectPostsWithoutTitle();