wip: new method: feresh and fast but complicated!
This commit is contained in:
parent
556f990dee
commit
02037ba2b2
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
34
src/query.h
34
src/query.h
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue