#4 maintext refactored

This commit is contained in:
blackdal 2017-08-09 17:49:35 +04:30
parent a1630271b1
commit 0f47ffd28a
10 changed files with 151 additions and 41 deletions

View File

@ -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)

View File

@ -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<QueryBase*>*/(x->createQuery())
# define FROM(x) (x->query())
# define WHERE(x) ->setWhere(x)
# define JOIN(x) ->join(#x)
# define ORDERBY(x) ->orderBy(#x, "ASC");

View File

@ -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<WherePhrase> &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<WherePhrase> &wheres, QHash<QString, QString> &orders, QString tableName, QString joinClassName)
{
QString orderText = "";
@ -414,8 +427,7 @@ QString SqlGeneratorBase::selectCommand(QString selectPhrase, QList<WherePhrase>
+ 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<WherePhrase> &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;
}

View File

@ -105,6 +105,7 @@ private:
QString fromTableText(const QString &tableName, QString &joinClassName, QString &orderBy) const;
QString createWhere(QList<WherePhrase> &wheres);
QString phraseOrder(const PhraseData *d) const;
void replaceTableNames(QString &command);
};
NUT_END_NAMESPACE

View File

@ -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;
}

View File

@ -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"<<comments.count();
// QTEST_ASSERT(comments.count());
}
void MainTest::testDate()
{
QDateTime d = QDateTime::currentDateTime();
@ -151,9 +134,9 @@ void MainTest::testDate()
db.saveChanges();
auto q = FROM(db.posts())
WHERE(Post::idField() == newPost->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);
}

View File

@ -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

View File

@ -0,0 +1,59 @@
#include <QtTest>
#include <QJsonDocument>
#include <QSqlError>
#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<Post*>();
qDebug() << "Comment type id:" << qRegisterMetaType<Comment*>();
qDebug() << "DB type id:" << qRegisterMetaType<WeblogDatabase*>();
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<Post> *q = db.posts()->query()
->setWhere(Post::titleField() == "test" && Post::idField() < 4 + 5);
q->toList();
qDebug() << q->sqlCommand();
}
void MainTest::cmd2()
{
Query<Post> *q = db.posts()->query()
->setWhere(!Post::idField().in({1, 2, 3, 4}));
q->toList();
// q->update(Post::idField()++);
qDebug() << q->sqlCommand();
}
QTEST_MAIN(MainTest)

28
test/commands/maintest.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef MAINTEST_H
#define MAINTEST_H
#include <QtCore/QObject>
#include <QtCore/qglobal.h>
#include "weblogdatabase.h"
class Post;
class MainTest : public QObject
{
Q_OBJECT
WeblogDatabase db;
int postId;
Post *post;
Query<Post> *q;
public:
explicit MainTest(QObject *parent = 0);
signals:
private slots:
void initTestCase();
void cmd1();
void cmd2();
};
#endif // MAINTEST_H

View File

@ -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