From 08a77bb7a44781b6444072f94d77828f0f031c25 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Fri, 9 Apr 2021 10:57:32 +0430 Subject: [PATCH] fix: slave to master relation in select query --- src/nut/config/nut_macros.h | 9 ++-- src/nut/core/query.h | 15 ++++++ src/nut/nut.pri | 75 ++++++------------------------ tests/auto/common/comment.cpp | 1 - tests/auto/tst_basic/tst_basic.cpp | 14 ++++++ tests/auto/tst_basic/tst_basic.h | 2 + 6 files changed, 50 insertions(+), 66 deletions(-) diff --git a/src/nut/config/nut_macros.h b/src/nut/config/nut_macros.h index 9a8fe7f..260a786 100644 --- a/src/nut/config/nut_macros.h +++ b/src/nut/config/nut_macros.h @@ -85,8 +85,9 @@ public: \ (staticMetaObject.className(), #name "Id"); \ return f; \ } \ -public Q_SLOTS: \ - void write(Nut::Row name); \ +public : \ + Q_INVOKABLE void write(Nut::Row name); \ + Q_INVOKABLE void write(Nut::Row name); \ void write##Id(keytype name##Id); #define NUT_FOREIGN_KEY_IMPLEMENT(class, type, keytype, name, read, write) \ @@ -96,7 +97,9 @@ public Q_SLOTS: \ m_##name = name; \ m_##name##Id = name->primaryValue().value(); \ } \ - keytype class::read##Id() const{ \ + void class::write(Nut::Row name){ \ + write(qSharedPointerObjectCast(name)); \ + } keytype class::read##Id() const{ \ if (m_##name) \ return m_##name->primaryValue().value(); \ return m_##name##Id; \ diff --git a/src/nut/core/query.h b/src/nut/core/query.h index 3a46bea..ce488c2 100644 --- a/src/nut/core/query.h +++ b/src/nut/core/query.h @@ -383,6 +383,21 @@ Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) auto tableset = levels[master].lastRow.data()->childTableSet( data.table->className()); tableset->add(row); + + //set key + { + QString setterName = data.masterFields[master]; + setterName[0] = setterName[0].toUpper(); + setterName.prepend(QStringLiteral("set")); + + bool ok = row->metaObject()->invokeMethod(row.data(), + setterName.toStdString().c_str(), + Qt::DirectConnection, + Q_ARG(Nut::Row, + levels[master].lastRow)); + + qDebug() << "data.masterFields[master]=" << setterName << ok; + } } row->setStatus(Table::FetchedFromDB); diff --git a/src/nut/nut.pri b/src/nut/nut.pri index 380d07c..0493622 100644 --- a/src/nut/nut.pri +++ b/src/nut/nut.pri @@ -1,68 +1,19 @@ DEFINES += NUT_SHARED_POINTER +QT = core sql gui + +INCLUDEPATH += $$PWD + +include(config/config.pri) +include(core/core.pri) +include(generators/generators.pri) +include(types/types.pri) +include(phrases/phrases.pri) +include(models/models.pri) HEADERS += \ - $$PWD/generators/sqlgeneratorbase_p.h \ - $$PWD/generators/postgresqlgenerator.h \ - $$PWD/generators/mysqlgenerator.h \ - $$PWD/generators/sqlitegenerator.h \ - $$PWD/generators/sqlservergenerator.h \ - $$PWD/tablesetbasedata.h \ - $$PWD/types/dbgeography.h \ - $$PWD/tableset.h \ - $$PWD/defines_consts.h \ - $$PWD/nut_global.h \ - $$PWD/query.h \ - $$PWD/databasemodel.h \ - $$PWD/changelogtable.h \ - $$PWD/tablesetbase_p.h \ - $$PWD/querybase_p.h \ - $$PWD/tablemodel.h \ - $$PWD/query_p.h \ - $$PWD/table.h \ - $$PWD/database.h \ - $$PWD/database_p.h \ - $$PWD/serializableobject.h \ - $$PWD/sqlmodel.h \ - $$PWD/sqlmodel_p.h \ - $$PWD/phrase.h \ - $$PWD/phrases/abstractfieldphrase.h \ - $$PWD/phrases/assignmentphrase.h \ - $$PWD/phrases/assignmentphraselist.h \ - $$PWD/phrases/conditionalphrase.h \ - $$PWD/phrases/fieldphrase.h \ - $$PWD/phrases/phrasedata.h \ - $$PWD/phrases/phrasedatalist.h \ - $$PWD/phrases/phraselist.h \ - $$PWD/phrases/datephrase.h \ - $$PWD/table_p.h + $$PWD/phrase.h SOURCES += \ - $$PWD/generators/sqlgeneratorbase.cpp \ - $$PWD/generators/postgresqlgenerator.cpp \ - $$PWD/generators/mysqlgenerator.cpp \ - $$PWD/generators/sqlitegenerator.cpp \ - $$PWD/generators/sqlservergenerator.cpp \ - $$PWD/types/dbgeography.cpp \ - $$PWD/tableset.cpp \ - $$PWD/query.cpp \ - $$PWD/databasemodel.cpp \ - $$PWD/tablesetbase.cpp \ - $$PWD/changelogtable.cpp \ - $$PWD/querybase.cpp \ - $$PWD/tablemodel.cpp \ - $$PWD/table.cpp \ - $$PWD/database.cpp \ - $$PWD/serializableobject.cpp \ - $$PWD/sqlmodel.cpp \ - $$PWD/phrase.cpp \ - $$PWD/phrases/abstractfieldphrase.cpp \ - $$PWD/phrases/assignmentphrase.cpp \ - $$PWD/phrases/assignmentphraselist.cpp \ - $$PWD/phrases/conditionalphrase.cpp \ - $$PWD/phrases/fieldphrase.cpp \ - $$PWD/phrases/phrasedata.cpp \ - $$PWD/phrases/phrasedatalist.cpp \ - $$PWD/phrases/phraselist.cpp \ - $$PWD/phrases/datephrase.cpp + $$PWD/phrase.cpp -include($$PWD/../3rdparty/serializer/src/src.pri) +include($$PWD/3rdparty/serializer/src/src.pri) diff --git a/tests/auto/common/comment.cpp b/tests/auto/common/comment.cpp index 9a6498c..4fa3fa9 100644 --- a/tests/auto/common/comment.cpp +++ b/tests/auto/common/comment.cpp @@ -56,7 +56,6 @@ void Comment::setSaveDate(QDateTime saveDate) void Comment::setPoint(qreal point) { - qWarning("Floating point comparison needs context sanity check"); if (qFuzzyCompare(m_point, point)) return; diff --git a/tests/auto/tst_basic/tst_basic.cpp b/tests/auto/tst_basic/tst_basic.cpp index 62ebb63..87de847 100644 --- a/tests/auto/tst_basic/tst_basic.cpp +++ b/tests/auto/tst_basic/tst_basic.cpp @@ -225,6 +225,20 @@ void BasicTest::selectPostIds() QCOMPARE(ids.count(), 2); } +void BasicTest::selectPostsWithComments() +{ + auto posts = db.posts()->query().join().toList(); + + QCOMPARE(posts.first()->comments()->length(), 3); +} + +void BasicTest::selectCommantsWithPost() +{ + auto comments = db.comments()->query().join().toList(); + QCOMPARE(comments.length(), 6); + QVERIFY(!comments.first()->post().isNull()); +} + void BasicTest::testDate() { QDateTime d = QDateTime::currentDateTime(); diff --git a/tests/auto/tst_basic/tst_basic.h b/tests/auto/tst_basic/tst_basic.h index 12ac014..1f3163a 100644 --- a/tests/auto/tst_basic/tst_basic.h +++ b/tests/auto/tst_basic/tst_basic.h @@ -38,6 +38,8 @@ private Q_SLOTS: void selectPostsWithoutTitle(); void selectPostIds(); void updatePostOnTheFly(); + void selectPostsWithComments(); + void selectCommantsWithPost(); void testDate(); void testLimitedQuery(); void selectWithInvalidRelation();