This commit is contained in:
Hamed Masafi 2020-08-10 12:21:43 +04:30
parent d39c6aee37
commit 9a10c53bee
10 changed files with 102 additions and 90 deletions

@ -1 +1 @@
Subproject commit 2dc11b380a07424a4face3046cc6b5e50aefb700 Subproject commit acbd68924feb9ee412b4d69bbf24cb3a3cffdfd6

View File

@ -281,7 +281,7 @@ bool DatabasePrivate::getCurrectSchema()
DatabaseModel DatabasePrivate::getLastSchema() DatabaseModel DatabasePrivate::getLastSchema()
{ {
Row<ChangeLogTable> u = changeLogs->query() Row<ChangeLogTable> u = changeLogs->query()
->orderBy(!ChangeLogTable::idField()) .orderBy(!ChangeLogTable::idField())
.first(); .first();
// DatabaseModel ret(q->metaObject()->className()); // DatabaseModel ret(q->metaObject()->className());

View File

@ -63,7 +63,21 @@ struct NUT_EXPORT QueryData {
ConditionalPhrase wherePhrase; ConditionalPhrase wherePhrase;
QueryData *clone() { QueryData *clone() {
return new QueryData; auto r = new QueryData;
r->sql = sql;
r->className = className;
r->tableName = tableName;
r->select = select;
r->database = database;
r->tableSet = tableSet;
r->joins = joins;
r->relations = relations;
r->skip = skip;
r->take = take;
r->orderPhrase = orderPhrase;
r->fieldPhrase = fieldPhrase;
r->wherePhrase = wherePhrase;
return r;
} }
}; };
@ -189,7 +203,7 @@ Q_OUTOFLINE_TEMPLATE Query<T>::Query(const Query<T> &other) {
template<class T> template<class T>
Q_OUTOFLINE_TEMPLATE Query<T>::Query(Query<T> &&other) { Q_OUTOFLINE_TEMPLATE Query<T>::Query(Query<T> &&other) {
d = std::move(other.d); d = std::move(other.d);
other._data = nullptr; other.d = nullptr;
} }
template <class T> template <class T>
@ -204,7 +218,7 @@ Q_OUTOFLINE_TEMPLATE Query<T> &Query<T>::operator=(const Query<T> &q)
{ {
if (this != &q) if (this != &q)
{ {
T *p = q._data ? q._data->detach() : nullptr; QueryData *p = q.d ? q.d->clone() : nullptr;
delete d; delete d;
d = p; d = p;
} }
@ -371,7 +385,7 @@ Q_OUTOFLINE_TEMPLATE RowList<T> Query<T>::toList(int count)
} }
row->setStatus(Table::FetchedFromDB); row->setStatus(Table::FetchedFromDB);
row->setParent(this); // row->setParent(this);
row->clear(); row->clear();
//set last created row //set last created row

View File

@ -63,7 +63,7 @@ public:
Row<T> at(int i) const; Row<T> at(int i) const;
Row<T> operator[](int i) const; Row<T> operator[](int i) const;
Query<T> *query(bool autoDelete = true); Query<T> query(bool autoDelete = true);
BulkInserter *bulkInserter(); BulkInserter *bulkInserter();
}; };
@ -80,11 +80,9 @@ Q_OUTOFLINE_TEMPLATE TableSet<T>::TableSet(Table *parent) : AbstractTableSet(par
} }
template<class T> template<class T>
Q_OUTOFLINE_TEMPLATE Query<T> *TableSet<T>::query(bool autoDelete) Q_OUTOFLINE_TEMPLATE Query<T> TableSet<T>::query(bool autoDelete)
{ {
Query<T> *q = new Query<T>(data->database, this, autoDelete); return Query<T>(data->database, this, autoDelete);
return q;
} }
template<class T> template<class T>

View File

@ -38,10 +38,10 @@ void BasicTest::initTestCase()
bool ok = db.open(); bool ok = db.open();
QVERIFY(ok); QVERIFY(ok);
db.comments()->query()->remove(); db.comments()->query().remove();
db.posts()->query()->remove(); db.posts()->query().remove();
db.users()->query()->remove(); db.users()->query().remove();
db.scores()->query()->remove(); db.scores()->query().remove();
} }
void BasicTest::dataSchema() void BasicTest::dataSchema()
@ -97,7 +97,7 @@ void BasicTest::createPost()
void BasicTest::createPost2() void BasicTest::createPost2()
{ {
//create post on the fly //create post on the fly
QVariant postIdVar = db.posts()->query()->insert( QVariant postIdVar = db.posts()->query().insert(
(Post::titleField() = QStringLiteral("This is a sample")) (Post::titleField() = QStringLiteral("This is a sample"))
& (Post::isPublicField() = true)); & (Post::isPublicField() = true));
@ -123,15 +123,15 @@ void BasicTest::createPost2()
void BasicTest::updatePostOnTheFly() void BasicTest::updatePostOnTheFly()
{ {
auto c = db.posts()->query() auto c = db.posts()->query()
->where(Post::idField() == postId) .where(Post::idField() == postId)
->update(Post::titleField() = QStringLiteral("New title")); .update(Post::titleField() = QStringLiteral("New title"));
QCOMPARE(c, 1); QCOMPARE(c, 1);
auto titles = db.posts() auto titles = db.posts()
->query() ->query()
->where(Post::idField() == postId) .where(Post::idField() == postId)
->select(Post::titleField()); .select(Post::titleField());
QCOMPARE(titles.count(), 1); QCOMPARE(titles.count(), 1);
QCOMPARE(titles.at(0), QStringLiteral("New title")); QCOMPARE(titles.at(0), QStringLiteral("New title"));
@ -140,12 +140,12 @@ void BasicTest::updatePostOnTheFly()
void BasicTest::selectPublicts() void BasicTest::selectPublicts()
{ {
auto q = db.posts()->query() auto q = db.posts()->query()
->where(Post::isPublicField()) .where(Post::isPublicField())
->count(); .count();
auto q2 = db.posts()->query() auto q2 = db.posts()->query()
->where(!Post::isPublicField()) .where(!Post::isPublicField())
->count(); .count();
QCOMPARE(q, 1); QCOMPARE(q, 1);
QCOMPARE(q2, 1); QCOMPARE(q2, 1);
@ -154,11 +154,11 @@ void BasicTest::selectPublicts()
void BasicTest::selectPosts() void BasicTest::selectPosts()
{ {
auto q = db.posts()->query() auto q = db.posts()->query()
->join<Comment>() .join<Comment>()
->orderBy((!Post::saveDateField()) | Post::bodyField()) .orderBy((!Post::saveDateField()) | Post::bodyField())
->setWhere(Post::idField() == postId); .where(Post::idField() == postId);
auto posts = q->toList(); auto posts = q.toList();
post = posts.at(0); post = posts.at(0);
post->setBody(QStringLiteral("")); post->setBody(QStringLiteral(""));
@ -179,9 +179,9 @@ void BasicTest::selectScoreAverage()
bool ok; bool ok;
auto avg = db.scores() auto avg = db.scores()
->query() ->query()
->join<Post>() .join<Post>()
->where(Post::idField() == postId) .where(Post::idField() == postId)
->average(Score::scoreField()) .average(Score::scoreField())
.toInt(&ok); .toInt(&ok);
QVERIFY(ok); QVERIFY(ok);
@ -190,21 +190,21 @@ void BasicTest::selectScoreAverage()
void BasicTest::selectScoreSum() void BasicTest::selectScoreSum()
{ {
auto sum = db.scores()->query()->sum(Score::scoreField()); auto sum = db.scores()->query().sum(Score::scoreField());
QCOMPARE(sum, 20); QCOMPARE(sum, 20);
} }
void BasicTest::selectScoreCount() void BasicTest::selectScoreCount()
{ {
auto count = db.scores()->query()->count(); auto count = db.scores()->query().count();
QCOMPARE(count, 10); QCOMPARE(count, 10);
} }
void BasicTest::selectFirst() void BasicTest::selectFirst()
{ {
auto posts = db.posts()->query() auto posts = db.posts()->query()
->orderBy(Post::idField()) .orderBy(Post::idField())
->first(); .first();
QVERIFY(posts != Q_NULLPTR); QVERIFY(posts != Q_NULLPTR);
} }
@ -212,15 +212,15 @@ void BasicTest::selectFirst()
void BasicTest::selectPostsWithoutTitle() void BasicTest::selectPostsWithoutTitle()
{ {
auto q = db.posts()->query(); auto q = db.posts()->query();
q->setWhere(Post::titleField().isNull()); q.where(Post::titleField().isNull());
auto count = q->count(); auto count = q.count();
QCOMPARE(count, 0); QCOMPARE(count, 0);
} }
void BasicTest::selectPostIds() void BasicTest::selectPostIds()
{ {
auto q = db.posts()->query(); auto q = db.posts()->query();
auto ids = q->select(Post::idField()); auto ids = q.select(Post::idField());
QCOMPARE(ids.count(), 2); QCOMPARE(ids.count(), 2);
} }
@ -240,9 +240,9 @@ void BasicTest::testDate()
db.saveChanges(true); db.saveChanges(true);
auto q = db.posts()->query() auto q = db.posts()->query()
->setWhere(Post::idField() == newPost->id()) .where(Post::idField() == newPost->id())
->orderBy(Post::idField()) .orderBy(Post::idField())
->first(); .first();
QCOMPARE(q->saveDate(), d); QCOMPARE(q->saveDate(), d);
} }
@ -250,8 +250,8 @@ void BasicTest::testDate()
void BasicTest::testLimitedQuery() void BasicTest::testLimitedQuery()
{ {
auto q = db.comments()->query(); auto q = db.comments()->query();
auto comments = q->toList(2); auto comments = q.toList(2);
qDebug() << q->sqlCommand(); qDebug() << q.sqlCommand();
QCOMPARE(comments.length(), 2); QCOMPARE(comments.length(), 2);
} }
@ -274,17 +274,17 @@ void BasicTest::join()
void BasicTest::selectWithInvalidRelation() void BasicTest::selectWithInvalidRelation()
{ {
auto q = db.posts()->query(); auto q = db.posts()->query();
q->join(QStringLiteral("Invalid_Class_Name")); q.join(QStringLiteral("Invalid_Class_Name"));
q->toList(); q.toList();
} }
void BasicTest::modifyPost() void BasicTest::modifyPost()
{ {
auto q = db.posts()->query() auto q = db.posts()->query()
->setWhere(Post::idField() == postId) .where(Post::idField() == postId)
->orderBy(Post::idField()); .orderBy(Post::idField());
Nut::Row<Post> post = q->first(); Nut::Row<Post> post = q.first();
QTEST_ASSERT(post != nullptr); QTEST_ASSERT(post != nullptr);
@ -292,18 +292,18 @@ void BasicTest::modifyPost()
db.saveChanges(); db.saveChanges();
q = db.posts()->query() q = db.posts()->query()
->setWhere(Post::idField() == postId) .where(Post::idField() == postId)
->orderBy(Post::idField()); .orderBy(Post::idField());
post = q->first(); post = q.first();
PRINT(post->title()); PRINT(post->title());
QCOMPARE(post->title(), "new name"); QCOMPARE(post->title(), "new name");
} }
void BasicTest::emptyDatabase() void BasicTest::emptyDatabase()
{ {
// auto commentsCount = db.comments()->query()->remove(); // auto commentsCount = db.comments()->query().remove();
// auto postsCount = db.posts()->query()->remove(); // auto postsCount = db.posts()->query().remove();
// QTEST_ASSERT(postsCount == 3); // QTEST_ASSERT(postsCount == 3);
// QTEST_ASSERT(commentsCount == 6); // QTEST_ASSERT(commentsCount == 6);
} }

View File

@ -80,7 +80,7 @@ void DataTypesTest::initTestCase()
QTEST_ASSERT(ok); QTEST_ASSERT(ok);
db.sampleTables()->query()->remove(); db.sampleTables()->query().remove();
} }
void DataTypesTest::insert() void DataTypesTest::insert()
@ -130,7 +130,7 @@ void DataTypesTest::insert()
void DataTypesTest::retrive() void DataTypesTest::retrive()
{ {
Nut::RowList<SampleTable> list = db.sampleTables()->query()->toList(); Nut::RowList<SampleTable> list = db.sampleTables()->query().toList();
QTEST_ASSERT(list.count() == 1); QTEST_ASSERT(list.count() == 1);
Nut::Row<SampleTable> t = list.first(); Nut::Row<SampleTable> t = list.first();
@ -179,8 +179,8 @@ void DataTypesTest::retrive()
#define CHECK(name) \ #define CHECK(name) \
c = db.sampleTables()->query() \ c = db.sampleTables()->query() \
->where(SampleTable::f_ ## name ## Field() == f_ ## name) \ .where(SampleTable::f_ ## name ## Field() == f_ ## name) \
->count(); \ .count(); \
QTEST_ASSERT(c == 1); QTEST_ASSERT(c == 1);
void DataTypesTest::check() void DataTypesTest::check()
@ -224,7 +224,7 @@ void DataTypesTest::check()
void DataTypesTest::cleanupTestCase() void DataTypesTest::cleanupTestCase()
{ {
db.sampleTables()->query()->remove(); db.sampleTables()->query().remove();
db.close(); db.close();
PRINT_FORM(db); PRINT_FORM(db);

View File

@ -32,7 +32,7 @@ void DateTimeTest::initTestCase()
QTEST_ASSERT(db.open()); QTEST_ASSERT(db.open());
db.sampleTables()->query()->remove(); db.sampleTables()->query().remove();
} }
#define TEST_DATE(date, command, n) \ #define TEST_DATE(date, command, n) \
@ -42,8 +42,8 @@ do { \
db.sampleTables()->append(s); \ db.sampleTables()->append(s); \
db.saveChanges(); \ db.saveChanges(); \
auto count = db.sampleTables()->query() \ auto count = db.sampleTables()->query() \
->where(SampleTable::dField().command(n) == date.command(n)) \ .where(SampleTable::dField().command(n) == date.command(n)) \
->count(); \ .count(); \
QTEST_ASSERT(count); \ QTEST_ASSERT(count); \
} while (false) } while (false)
@ -54,8 +54,8 @@ do { \
db.sampleTables()->append(s); \ db.sampleTables()->append(s); \
db.saveChanges(); \ db.saveChanges(); \
auto count = db.sampleTables()->query() \ auto count = db.sampleTables()->query() \
->where(SampleTable::tField().command(n) == time.addSecs(num)) \ .where(SampleTable::tField().command(n) == time.addSecs(num)) \
->count(); \ .count(); \
QTEST_ASSERT(count); \ QTEST_ASSERT(count); \
} while (false) } while (false)
@ -66,8 +66,8 @@ do { \
db.sampleTables()->append(s); \ db.sampleTables()->append(s); \
db.saveChanges(); \ db.saveChanges(); \
auto count = db.sampleTables()->query() \ auto count = db.sampleTables()->query() \
->where(SampleTable::dtField().command(n) == datetime.command(n)) \ .where(SampleTable::dtField().command(n) == datetime.command(n)) \
->count(); \ .count(); \
QTEST_ASSERT(count); \ QTEST_ASSERT(count); \
} while (false) } while (false)
@ -78,8 +78,8 @@ do { \
db.sampleTables()->append(s); \ db.sampleTables()->append(s); \
db.saveChanges(); \ db.saveChanges(); \
auto count = db.sampleTables()->query() \ auto count = db.sampleTables()->query() \
->where(SampleTable::dtField().command(n) == datetime.addSecs(num)) \ .where(SampleTable::dtField().command(n) == datetime.addSecs(num)) \
->count(); \ .count(); \
QTEST_ASSERT(count); \ QTEST_ASSERT(count); \
} while (false) } while (false)
@ -136,7 +136,7 @@ void DateTimeTest::dateTimeAdd()
void DateTimeTest::datePart() void DateTimeTest::datePart()
{ {
db.sampleTables()->query()->remove(); db.sampleTables()->query().remove();
QDate d = QDate::currentDate(); QDate d = QDate::currentDate();
auto s = Nut::create<SampleTable>(); auto s = Nut::create<SampleTable>();
@ -146,18 +146,18 @@ void DateTimeTest::datePart()
int count; int count;
count = db.sampleTables()->query()->where(SampleTable::dField().year() == d.year())->count(); count = db.sampleTables()->query().where(SampleTable::dField().year() == d.year()).count();
QTEST_ASSERT(count); QTEST_ASSERT(count);
count = db.sampleTables()->query()->where(SampleTable::dField().month() == d.month())->count(); count = db.sampleTables()->query().where(SampleTable::dField().month() == d.month()).count();
QTEST_ASSERT(count); QTEST_ASSERT(count);
count = db.sampleTables()->query()->where(SampleTable::dField().day() == d.day())->count(); count = db.sampleTables()->query().where(SampleTable::dField().day() == d.day()).count();
QTEST_ASSERT(count); QTEST_ASSERT(count);
} }
void DateTimeTest::timePart() void DateTimeTest::timePart()
{ {
db.sampleTables()->query()->remove(); db.sampleTables()->query().remove();
QTime t = QTime::currentTime(); QTime t = QTime::currentTime();
auto s = Nut::create<SampleTable>(); auto s = Nut::create<SampleTable>();
@ -167,17 +167,17 @@ void DateTimeTest::timePart()
int count; int count;
count = db.sampleTables()->query()->where(SampleTable::tField().hour() == t.hour())->count(); count = db.sampleTables()->query().where(SampleTable::tField().hour() == t.hour()).count();
QTEST_ASSERT(count); QTEST_ASSERT(count);
count = db.sampleTables()->query()->where(SampleTable::tField().minute() == t.minute())->count(); count = db.sampleTables()->query().where(SampleTable::tField().minute() == t.minute()).count();
QTEST_ASSERT(count); QTEST_ASSERT(count);
count = db.sampleTables()->query()->where(SampleTable::tField().second() == t.second())->count(); count = db.sampleTables()->query().where(SampleTable::tField().second() == t.second()).count();
QTEST_ASSERT(count); QTEST_ASSERT(count);
} }
void DateTimeTest::dateTimePart() void DateTimeTest::dateTimePart()
{ {
db.sampleTables()->query()->remove(); db.sampleTables()->query().remove();
QDateTime dt = QDateTime::currentDateTime(); QDateTime dt = QDateTime::currentDateTime();
auto s = Nut::create<SampleTable>(); auto s = Nut::create<SampleTable>();
@ -187,24 +187,24 @@ void DateTimeTest::dateTimePart()
int count; int count;
count = db.sampleTables()->query()->where(SampleTable::dtField().year() == dt.date().year())->count(); count = db.sampleTables()->query().where(SampleTable::dtField().year() == dt.date().year()).count();
QTEST_ASSERT(count); QTEST_ASSERT(count);
count = db.sampleTables()->query()->where(SampleTable::dtField().month() == dt.date().month())->count(); count = db.sampleTables()->query().where(SampleTable::dtField().month() == dt.date().month()).count();
QTEST_ASSERT(count); QTEST_ASSERT(count);
count = db.sampleTables()->query()->where(SampleTable::dtField().day() == dt.date().day())->count(); count = db.sampleTables()->query().where(SampleTable::dtField().day() == dt.date().day()).count();
QTEST_ASSERT(count); QTEST_ASSERT(count);
count = db.sampleTables()->query()->where(SampleTable::dtField().hour() == dt.time().hour())->count(); count = db.sampleTables()->query().where(SampleTable::dtField().hour() == dt.time().hour()).count();
QTEST_ASSERT(count); QTEST_ASSERT(count);
count = db.sampleTables()->query()->where(SampleTable::dtField().minute() == dt.time().minute())->count(); count = db.sampleTables()->query().where(SampleTable::dtField().minute() == dt.time().minute()).count();
QTEST_ASSERT(count); QTEST_ASSERT(count);
count = db.sampleTables()->query()->where(SampleTable::dtField().second() == dt.time().second())->count(); count = db.sampleTables()->query().where(SampleTable::dtField().second() == dt.time().second()).count();
QTEST_ASSERT(count); QTEST_ASSERT(count);
} }
void DateTimeTest::cleanupTestCase() void DateTimeTest::cleanupTestCase()
{ {
db.sampleTables()->query()->remove(); db.sampleTables()->query().remove();
db.close(); db.close();
} }

View File

@ -49,9 +49,9 @@ void TestJson::store()
int id = t->id(); int id = t->id();
auto newObj = db.sampleTable()->query() auto newObj = db.sampleTable()->query()
->where(Table::idField() == id) .where(Table::idField() == id)
->orderBy(Table::idField()) .orderBy(Table::idField())
->first(); .first();
Q_ASSERT(newObj != nullptr); Q_ASSERT(newObj != nullptr);
Q_ASSERT(newObj->doc() == t->doc()); Q_ASSERT(newObj->doc() == t->doc());

View File

@ -32,7 +32,7 @@ void UuidTest::initTestCase()
bool ok = db.open(); bool ok = db.open();
db.tests()->query()->remove(); db.tests()->query().remove();
uuid = QUuid::createUuid(); uuid = QUuid::createUuid();
QTEST_ASSERT(ok); QTEST_ASSERT(ok);
@ -54,7 +54,7 @@ void UuidTest::save()
void UuidTest::restore() void UuidTest::restore()
{ {
TIC(); TIC();
auto test = db.tests()->query()->first(); auto test = db.tests()->query().first();
TOC(); TOC();
QTEST_ASSERT(!test->id().isNull()); QTEST_ASSERT(!test->id().isNull());
QTEST_ASSERT(test->uuid() == uuid); QTEST_ASSERT(test->uuid() == uuid);

View File

@ -49,7 +49,7 @@ void Upgrades::version1()
DB1 db; DB1 db;
initDb(db); initDb(db);
QTEST_ASSERT(db.open()); QTEST_ASSERT(db.open());
db.sampleTable()->query()->remove(); db.sampleTable()->query().remove();
} }
void Upgrades::version2() void Upgrades::version2()
@ -72,7 +72,7 @@ void Upgrades::version3()
QTEST_ASSERT(db.open()); QTEST_ASSERT(db.open());
auto t = db.sampleTable()->query() auto t = db.sampleTable()->query()
->first(); .first();
QTEST_ASSERT(id == t->id()); QTEST_ASSERT(id == t->id());
} }