#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) QString Database::tableName(QString className)
{ {
Q_D(Database); 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) 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") #define NUT_NOT_NULL(x) Q_CLASSINFO(QT_STRINGIFY(__nut_NAME_PERFIX #x " " __nut_NOT_NULL), "1")
#ifndef NUT_NO_KEYWORDS #ifndef NUT_NO_KEYWORDS
# define FROM(x) /*QScopedPointer<QueryBase*>*/(x->createQuery()) # define FROM(x) (x->query())
# define WHERE(x) ->setWhere(x) # define WHERE(x) ->setWhere(x)
# define JOIN(x) ->join(#x) # define JOIN(x) ->join(#x)
# define ORDERBY(x) ->orderBy(#x, "ASC"); # define ORDERBY(x) ->orderBy(#x, "ASC");

View File

@ -285,6 +285,9 @@ QString SqlGeneratorBase::deleteRecords(QString tableName, QString where)
sql = "DELETE FROM " + tableName; sql = "DELETE FROM " + tableName;
else else
sql = "DELETE FROM " + tableName + " WHERE " + where; sql = "DELETE FROM " + tableName + " WHERE " + where;
replaceTableNames(sql);
return sql; return sql;
} }
@ -312,6 +315,8 @@ QString SqlGeneratorBase::selectCommand(SqlGeneratorBase::AgregateType t, QStrin
for(int i = 0; i < _database->model().count(); i++) for(int i = 0; i < _database->model().count(); i++)
sql = sql.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + "."); sql = sql.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + ".");
replaceTableNames(sql);
return sql; return sql;
} }
@ -340,6 +345,8 @@ QString SqlGeneratorBase::selectCommand(QString selectPhrase, QString agregateAr
for(int i = 0; i < _database->model().count(); i++) for(int i = 0; i < _database->model().count(); i++)
sql = sql.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + "."); sql = sql.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + ".");
replaceTableNames(sql);
return sql; return sql;
} }
@ -368,6 +375,12 @@ QString SqlGeneratorBase::createWhere(QList<WherePhrase> &wheres)
return whereText; 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 SqlGeneratorBase::selectCommand(QString selectPhrase, QList<WherePhrase> &wheres, QHash<QString, QString> &orders, QString tableName, QString joinClassName)
{ {
QString orderText = ""; QString orderText = "";
@ -414,8 +427,7 @@ QString SqlGeneratorBase::selectCommand(QString selectPhrase, QList<WherePhrase>
+ whereText + whereText
+ orderText; + orderText;
foreach (TableModel *m, TableModel::allModels()) replaceTableNames(command);
command = command.replace(m->className() + "." , m->name() + ".");
return command; return command;
} }
@ -430,6 +442,9 @@ QString SqlGeneratorBase::deleteCommand(QList<WherePhrase> &wheres, QString tabl
for(int i = 0; i < _database->model().count(); i++) for(int i = 0; i < _database->model().count(); i++)
command = command.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + "."); command = command.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + ".");
replaceTableNames(command);
return command; return command;
} }

View File

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

View File

@ -28,7 +28,7 @@ NUT_BEGIN_NAMESPACE
PhraseData::PhraseData(const char *className, const char *s) PhraseData::PhraseData(const char *className, const char *s)
{ {
Q_UNUSED(className) Q_UNUSED(className)
text = QString(s); // QString(className) + "." + s; text = QString("[%1].%2").arg(className).arg(s);
type = Field; type = Field;
operatorCond = NotAssign; operatorCond = NotAssign;
} }

View File

@ -33,11 +33,6 @@ void MainTest::initTestCase()
bool ok = db.open(); bool ok = db.open();
QTEST_ASSERT(ok); QTEST_ASSERT(ok);
// FROM(db.comments())
// DELETE();
// FROM(db.posts())
// DELETE();
} }
void MainTest::dataScheema() void MainTest::dataScheema()
@ -96,10 +91,7 @@ void MainTest::createPost2()
void MainTest::selectPosts() void MainTest::selectPosts()
{ {
// auto q = FROM(db.posts()) auto q = db.posts()->query();
// JOIN(Comment)
// WHERE(Post::idField() == postId);
auto q = db.posts()->createQuery();
q->join(Post::commentsTable()); q->join(Post::commentsTable());
q->orderBy(!Post::saveDateField() & Post::bodyField()); q->orderBy(!Post::saveDateField() & Post::bodyField());
q->setWhere(Post::idField() == postId); q->setWhere(Post::idField() == postId);
@ -121,22 +113,13 @@ void MainTest::selectPosts()
void MainTest::selectPostsWithoutTitle() void MainTest::selectPostsWithoutTitle()
{ {
auto q = db.posts()->createQuery(); auto q = db.posts()->query();
q->setWhere(Post::titleField().isNull()); q->setWhere(Post::titleField().isNull());
auto count = q->count(); auto count = q->count();
qDebug() << "selectPostsWithoutTitle, count=" << count; qDebug() << "selectPostsWithoutTitle, count=" << count;
QTEST_ASSERT(count == 0); 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() void MainTest::testDate()
{ {
QDateTime d = QDateTime::currentDateTime(); QDateTime d = QDateTime::currentDateTime();
@ -151,9 +134,9 @@ void MainTest::testDate()
db.saveChanges(); db.saveChanges();
auto q = FROM(db.posts()) auto q = db.posts()->query()
WHERE(Post::idField() == newPost->id()) ->setWhere(Post::idField() == newPost->id())
FIRST(); ->first();
QTEST_ASSERT(q->saveDate() == d); QTEST_ASSERT(q->saveDate() == d);
} }
@ -161,21 +144,21 @@ void MainTest::testDate()
void MainTest::selectWithInvalidRelation() void MainTest::selectWithInvalidRelation()
{ {
auto q = db.posts()->createQuery(); auto q = db.posts()->query();
q->join("Invalid_Class_Name"); q->join("Invalid_Class_Name");
q->toList(); q->toList();
} }
void MainTest::select10NewstPosts() void MainTest::select10NewstPosts()
{ {
auto q = db.posts()->createQuery(); auto q = db.posts()->query();
q->orderBy(!Post::saveDateField()); q->orderBy(!Post::saveDateField());
q->toList(10); q->toList(10);
} }
void MainTest::modifyPost() void MainTest::modifyPost()
{ {
auto q = db.posts()->createQuery(); auto q = db.posts()->query();
q->setWhere(Post::idField() == postId); q->setWhere(Post::idField() == postId);
Post *post = q->first(); Post *post = q->first();
@ -185,24 +168,24 @@ void MainTest::modifyPost()
post->setTitle("new name"); post->setTitle("new name");
db.saveChanges(); db.saveChanges();
q = FROM(db.posts()) q = db.posts()->query()
WHERE(Post::idField() == postId); ->setWhere(Post::idField() == postId);
post = q->first(); post = q->first();
QTEST_ASSERT(post->title() == "new name"); QTEST_ASSERT(post->title() == "new name");
} }
void MainTest::deletePost() void MainTest::emptyDatabase()
{ {
auto count = FROM(db.posts()) auto count = db.posts()->query()
WHERE(Post::idField() == postId) ->setWhere(Post::idField() == postId)
DELETE(); ->remove();
QTEST_ASSERT(count == 1); QTEST_ASSERT(count == 1);
count = FROM(db.posts()) count = db.posts()->query()
WHERE(Post::idField() == postId) ->setWhere(Post::idField() == postId)
COUNT(); ->count();
QTEST_ASSERT(count == 0); QTEST_ASSERT(count == 0);
} }

View File

@ -25,12 +25,11 @@ private slots:
void createPost2(); void createPost2();
void selectPosts(); void selectPosts();
void selectPostsWithoutTitle(); void selectPostsWithoutTitle();
void selectComments();
void testDate(); void testDate();
void selectWithInvalidRelation(); void selectWithInvalidRelation();
void select10NewstPosts(); void select10NewstPosts();
void modifyPost(); void modifyPost();
void deletePost(); void emptyDatabase();
}; };
#endif // MAINTEST_H #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