From e45860eb599dd717574f8dd015553a3b77304cff Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Tue, 9 Jan 2018 21:02:28 +0330 Subject: [PATCH] wip:join --- src/generators/sqlgeneratorbase.cpp | 43 +++++++++++++++++++++++++++++ src/generators/sqlgeneratorbase_p.h | 4 +++ src/query.h | 9 ++++-- src/query_p.h | 1 + test/basic/maintest.cpp | 1 + test/common/post.h | 2 +- 6 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/generators/sqlgeneratorbase.cpp b/src/generators/sqlgeneratorbase.cpp index 4c90641..4d80067 100644 --- a/src/generators/sqlgeneratorbase.cpp +++ b/src/generators/sqlgeneratorbase.cpp @@ -33,6 +33,18 @@ NUT_BEGIN_NAMESPACE +/* + * Index: + * ALTER TABLE `travelLog` ADD INDEX(`driverId`); + * + * Foreign key: + * ALTER TABLE `travelLog` + * ADD CONSTRAINT `travelLog_ibfk_1` + * FOREIGN KEY (`driverId`) + * REFERENCES `account` (`id`) + * ON DELETE CASCADE + * ON UPDATE CASCADE; + */ SqlGeneratorBase::SqlGeneratorBase(Database *parent) : QObject((QObject *)parent) { @@ -50,6 +62,11 @@ QString SqlGeneratorBase::masterDatabaseName(QString databaseName) return ""; } +QString SqlGeneratorBase::createTable(TableModel *table) +{ + +} + QString SqlGeneratorBase::saveRecord(Table *t, QString tableName) { Q_ASSERT(!tableName.isEmpty() && !tableName.isNull()); @@ -161,6 +178,32 @@ QString SqlGeneratorBase::diff(TableModel *oldTable, TableModel *newTable) return sql; } +QString SqlGeneratorBase::join(const QStringList &list) +{ + if (!list.count()) + return ""; + + if (list.count() == 1) + return list.first(); + + DatabaseModel model = _database->model(); + QStringList clone = list; + QString mainTable = clone.takeFirst(); + QString ret = mainTable; + + do { + QString t = model.tableByClassName(clone.first())->name(); + RelationModel *rel = model.relationByTableNames(mainTable, t); + + if (rel) { + clone.takeFirst(); + ret.append(", " + _database->tableName(clone.takeFirst())); + } + } while (clone.count()); + + return ret; +} + QString SqlGeneratorBase::insertRecord(Table *t, QString tableName) { QString sql = ""; diff --git a/src/generators/sqlgeneratorbase_p.h b/src/generators/sqlgeneratorbase_p.h index a2bc6fe..2000d64 100644 --- a/src/generators/sqlgeneratorbase_p.h +++ b/src/generators/sqlgeneratorbase_p.h @@ -59,6 +59,8 @@ public: virtual QString masterDatabaseName(QString databaseName); + virtual QString createTable(TableModel *table); + virtual QString fieldType(FieldModel *field) = 0; virtual QString fieldDeclare(FieldModel *field); @@ -66,6 +68,8 @@ public: virtual QString diff(FieldModel *oldField, FieldModel *newField); virtual QString diff(TableModel *oldTable, TableModel *newTable); + virtual QString join(const QStringList &list); + virtual QString saveRecord(Table *t, QString tableName); 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 deac129..4d14886 100644 --- a/src/query.h +++ b/src/query.h @@ -53,7 +53,7 @@ public: //ddl Query *setWhere(WherePhrase where); - Query *join(const QString &tableName); + Query *join(const QString &className); Query *join(Table *c); template @@ -125,6 +125,8 @@ Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) QList result; d->select = "*"; + d->joins.prepend(d->tableName); + qDebug() << "JOINS="<< d->database->sqlGenertor()->join(d->joins); // QSqlQuery q = // d->database->exec(d->database->sqlGenertor()->selectCommand(d->wheres, // d->orders, d->tableName, d->joinClassName)); @@ -316,10 +318,11 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::average(FieldPhrase &f) } template -Q_OUTOFLINE_TEMPLATE Query *Query::join(const QString &tableName) +Q_OUTOFLINE_TEMPLATE Query *Query::join(const QString &className) { Q_D(Query); - d->joinClassName = tableName; + d->joinClassName = className; + d->joins.append(className); return this; } diff --git a/src/query_p.h b/src/query_p.h index 8046c3c..250a0f6 100644 --- a/src/query_p.h +++ b/src/query_p.h @@ -46,6 +46,7 @@ public: Database *database; TableSetBase *tableSet; QString joinClassName; + QStringList joins; QList wheres; QList orderPhrases; QHash orders; diff --git a/test/basic/maintest.cpp b/test/basic/maintest.cpp index d12ba0f..900ef67 100644 --- a/test/basic/maintest.cpp +++ b/test/basic/maintest.cpp @@ -98,6 +98,7 @@ void MainTest::selectPosts() auto q = db.posts()->query() // q->join(Post::commentsTable()); // q->join(Post::commentsTable()); + ->join() ->join() ->orderBy(!Post::saveDateField() & Post::bodyField()) ->setWhere(Post::idField() == postId); diff --git a/test/common/post.h b/test/common/post.h index fbca48f..5b25e23 100644 --- a/test/common/post.h +++ b/test/common/post.h @@ -29,7 +29,7 @@ class Post : public Table NUT_DECLARE_CHILD_TABLE(Comment, comments) public: - explicit Post(QObject *tableSet = 0); + Q_INVOKABLE Post(QObject *tableSet = 0); signals: