From 0f47ffd28ad17fa27436cb24f5034d0132bcdad8 Mon Sep 17 00:00:00 2001 From: blackdal Date: Wed, 9 Aug 2017 17:49:35 +0430 Subject: [PATCH] #4 maintext refactored --- src/database.cpp | 6 +++- src/defines.h | 2 +- src/sqlgeneratorbase.cpp | 19 +++++++++-- src/sqlgeneratorbase_p.h | 1 + src/wherephrase.cpp | 2 +- test/basic/maintest.cpp | 51 ++++++++++------------------- test/basic/maintest.h | 3 +- test/commands/maintest.cpp | 59 ++++++++++++++++++++++++++++++++++ test/commands/maintest.h | 28 ++++++++++++++++ test/commands/tst_commands.pro | 21 ++++++++++++ 10 files changed, 151 insertions(+), 41 deletions(-) create mode 100644 test/commands/maintest.cpp create mode 100644 test/commands/maintest.h create mode 100644 test/commands/tst_commands.pro diff --git a/src/database.cpp b/src/database.cpp index 57ae623..bd02b61 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -392,7 +392,11 @@ DatabaseModel Database::model() const QString Database::tableName(QString className) { Q_D(Database); - return model().modelByClass(className)->name(); + TableModel *m = model().modelByClass(className); + if (m) + return m->name(); + else + return QString::null;; } void Database::setDatabaseName(QString databaseName) diff --git a/src/defines.h b/src/defines.h index 946e6b4..1916472 100644 --- a/src/defines.h +++ b/src/defines.h @@ -109,7 +109,7 @@ public: \ #define NUT_NOT_NULL(x) Q_CLASSINFO(QT_STRINGIFY(__nut_NAME_PERFIX #x " " __nut_NOT_NULL), "1") #ifndef NUT_NO_KEYWORDS -# define FROM(x) /*QScopedPointer*/(x->createQuery()) +# define FROM(x) (x->query()) # define WHERE(x) ->setWhere(x) # define JOIN(x) ->join(#x) # define ORDERBY(x) ->orderBy(#x, "ASC"); diff --git a/src/sqlgeneratorbase.cpp b/src/sqlgeneratorbase.cpp index f79507b..92047cb 100644 --- a/src/sqlgeneratorbase.cpp +++ b/src/sqlgeneratorbase.cpp @@ -285,6 +285,9 @@ QString SqlGeneratorBase::deleteRecords(QString tableName, QString where) sql = "DELETE FROM " + tableName; else sql = "DELETE FROM " + tableName + " WHERE " + where; + + replaceTableNames(sql); + return sql; } @@ -312,6 +315,8 @@ QString SqlGeneratorBase::selectCommand(SqlGeneratorBase::AgregateType t, QStrin for(int i = 0; i < _database->model().count(); i++) sql = sql.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + "."); + replaceTableNames(sql); + return sql; } @@ -340,6 +345,8 @@ QString SqlGeneratorBase::selectCommand(QString selectPhrase, QString agregateAr for(int i = 0; i < _database->model().count(); i++) sql = sql.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + "."); + replaceTableNames(sql); + return sql; } @@ -368,6 +375,12 @@ QString SqlGeneratorBase::createWhere(QList &wheres) return whereText; } +void SqlGeneratorBase::replaceTableNames(QString &command) +{ + foreach (TableModel *m, TableModel::allModels()) + command = command.replace("[" + m->className() + "]." , m->name() + "."); +} + QString SqlGeneratorBase::selectCommand(QString selectPhrase, QList &wheres, QHash &orders, QString tableName, QString joinClassName) { QString orderText = ""; @@ -414,8 +427,7 @@ QString SqlGeneratorBase::selectCommand(QString selectPhrase, QList + whereText + orderText; - foreach (TableModel *m, TableModel::allModels()) - command = command.replace(m->className() + "." , m->name() + "."); + replaceTableNames(command); return command; } @@ -430,6 +442,9 @@ QString SqlGeneratorBase::deleteCommand(QList &wheres, QString tabl for(int i = 0; i < _database->model().count(); i++) command = command.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + "."); + + replaceTableNames(command); + return command; } diff --git a/src/sqlgeneratorbase_p.h b/src/sqlgeneratorbase_p.h index a282cf7..86718c3 100644 --- a/src/sqlgeneratorbase_p.h +++ b/src/sqlgeneratorbase_p.h @@ -105,6 +105,7 @@ private: QString fromTableText(const QString &tableName, QString &joinClassName, QString &orderBy) const; QString createWhere(QList &wheres); QString phraseOrder(const PhraseData *d) const; + void replaceTableNames(QString &command); }; NUT_END_NAMESPACE diff --git a/src/wherephrase.cpp b/src/wherephrase.cpp index 3a64ac4..8d4a93d 100644 --- a/src/wherephrase.cpp +++ b/src/wherephrase.cpp @@ -28,7 +28,7 @@ NUT_BEGIN_NAMESPACE PhraseData::PhraseData(const char *className, const char *s) { Q_UNUSED(className) - text = QString(s); // QString(className) + "." + s; + text = QString("[%1].%2").arg(className).arg(s); type = Field; operatorCond = NotAssign; } diff --git a/test/basic/maintest.cpp b/test/basic/maintest.cpp index 8c3e173..7bb0b6d 100644 --- a/test/basic/maintest.cpp +++ b/test/basic/maintest.cpp @@ -33,11 +33,6 @@ void MainTest::initTestCase() bool ok = db.open(); QTEST_ASSERT(ok); - -// FROM(db.comments()) -// DELETE(); -// FROM(db.posts()) -// DELETE(); } void MainTest::dataScheema() @@ -96,10 +91,7 @@ void MainTest::createPost2() void MainTest::selectPosts() { -// auto q = FROM(db.posts()) -// JOIN(Comment) -// WHERE(Post::idField() == postId); - auto q = db.posts()->createQuery(); + auto q = db.posts()->query(); q->join(Post::commentsTable()); q->orderBy(!Post::saveDateField() & Post::bodyField()); q->setWhere(Post::idField() == postId); @@ -121,22 +113,13 @@ void MainTest::selectPosts() void MainTest::selectPostsWithoutTitle() { - auto q = db.posts()->createQuery(); + auto q = db.posts()->query(); q->setWhere(Post::titleField().isNull()); auto count = q->count(); qDebug() << "selectPostsWithoutTitle, count=" << count; QTEST_ASSERT(count == 0); } -void MainTest::selectComments() -{ - auto comments = FROM(post->comments()) - SELECT(); - - qDebug() << "comments count"<id()) - FIRST(); + auto q = db.posts()->query() + ->setWhere(Post::idField() == newPost->id()) + ->first(); QTEST_ASSERT(q->saveDate() == d); } @@ -161,21 +144,21 @@ void MainTest::testDate() void MainTest::selectWithInvalidRelation() { - auto q = db.posts()->createQuery(); + auto q = db.posts()->query(); q->join("Invalid_Class_Name"); q->toList(); } void MainTest::select10NewstPosts() { - auto q = db.posts()->createQuery(); + auto q = db.posts()->query(); q->orderBy(!Post::saveDateField()); q->toList(10); } void MainTest::modifyPost() { - auto q = db.posts()->createQuery(); + auto q = db.posts()->query(); q->setWhere(Post::idField() == postId); Post *post = q->first(); @@ -185,24 +168,24 @@ void MainTest::modifyPost() post->setTitle("new name"); db.saveChanges(); - q = FROM(db.posts()) - WHERE(Post::idField() == postId); + q = db.posts()->query() + ->setWhere(Post::idField() == postId); post = q->first(); QTEST_ASSERT(post->title() == "new name"); } -void MainTest::deletePost() +void MainTest::emptyDatabase() { - auto count = FROM(db.posts()) - WHERE(Post::idField() == postId) - DELETE(); + auto count = db.posts()->query() + ->setWhere(Post::idField() == postId) + ->remove(); QTEST_ASSERT(count == 1); - count = FROM(db.posts()) - WHERE(Post::idField() == postId) - COUNT(); + count = db.posts()->query() + ->setWhere(Post::idField() == postId) + ->count(); QTEST_ASSERT(count == 0); } diff --git a/test/basic/maintest.h b/test/basic/maintest.h index 9dcd20d..7689640 100644 --- a/test/basic/maintest.h +++ b/test/basic/maintest.h @@ -25,12 +25,11 @@ private slots: void createPost2(); void selectPosts(); void selectPostsWithoutTitle(); - void selectComments(); void testDate(); void selectWithInvalidRelation(); void select10NewstPosts(); void modifyPost(); - void deletePost(); + void emptyDatabase(); }; #endif // MAINTEST_H diff --git a/test/commands/maintest.cpp b/test/commands/maintest.cpp new file mode 100644 index 0000000..fab0c86 --- /dev/null +++ b/test/commands/maintest.cpp @@ -0,0 +1,59 @@ +#include +#include +#include + +#include "consts.h" + +#include "maintest.h" +#include "query.h" +#include "tableset.h" +#include "tablemodel.h" +#include "databasemodel.h" + +#include "post.h" +#include "comment.h" + +MainTest::MainTest(QObject *parent) : QObject(parent) +{ + +} + +void MainTest::initTestCase() +{ + qDebug() << "User type id:" << qRegisterMetaType(); + qDebug() << "Comment type id:" << qRegisterMetaType(); + qDebug() << "DB type id:" << qRegisterMetaType(); + + db.setDriver(DRIVER); + db.setHostName(HOST); + db.setDatabaseName(DATABASE); + db.setUserName(USERNAME); + db.setPassword(PASSWORD); + + bool ok = db.open(); + + QTEST_ASSERT(ok); +} + +void MainTest::cmd1() +{ + Query *q = db.posts()->query() + ->setWhere(Post::titleField() == "test" && Post::idField() < 4 + 5); + + q->toList(); + + qDebug() << q->sqlCommand(); +} + +void MainTest::cmd2() +{ + Query *q = db.posts()->query() + ->setWhere(!Post::idField().in({1, 2, 3, 4})); + + q->toList(); +// q->update(Post::idField()++); + + qDebug() << q->sqlCommand(); +} + +QTEST_MAIN(MainTest) diff --git a/test/commands/maintest.h b/test/commands/maintest.h new file mode 100644 index 0000000..e54c53f --- /dev/null +++ b/test/commands/maintest.h @@ -0,0 +1,28 @@ +#ifndef MAINTEST_H +#define MAINTEST_H + +#include +#include + +#include "weblogdatabase.h" +class Post; +class MainTest : public QObject +{ + Q_OBJECT + WeblogDatabase db; + int postId; + Post *post; + Query *q; +public: + explicit MainTest(QObject *parent = 0); + +signals: + +private slots: + void initTestCase(); + + void cmd1(); + void cmd2(); +}; + +#endif // MAINTEST_H diff --git a/test/commands/tst_commands.pro b/test/commands/tst_commands.pro new file mode 100644 index 0000000..6400e16 --- /dev/null +++ b/test/commands/tst_commands.pro @@ -0,0 +1,21 @@ +QT += qml quick testlib sql + +QT -= gui + +TARGET = tst_nut +CONFIG += warn_on qmltestcase c++11 +INCLUDEPATH += $$PWD/../../src $$PWD/../common +include(../../nut.pri) +TEMPLATE = app +IMPORTPATH += $$OUT_PWD/../src/imports +SOURCES += \ + maintest.cpp \ + ../common/comment.cpp \ + ../common/post.cpp \ + ../common/weblogdatabase.cpp + +HEADERS += \ + maintest.h \ + ../common/comment.h \ + ../common/post.h \ + ../common/weblogdatabase.h