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 "";
|
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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
34
src/query.h
34
src/query.h
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue