fix: slave to master relation in select query

This commit is contained in:
Hamed Masafi 2021-04-09 10:57:32 +04:30
parent 97757d57b6
commit 08a77bb7a4
6 changed files with 50 additions and 66 deletions

View File

@ -85,8 +85,9 @@ public: \
(staticMetaObject.className(), #name "Id"); \
return f; \
} \
public Q_SLOTS: \
void write(Nut::Row<type> name); \
public : \
Q_INVOKABLE void write(Nut::Row<type> name); \
Q_INVOKABLE void write(Nut::Row<Nut::Table> 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>(); \
} \
keytype class::read##Id() const{ \
void class::write(Nut::Row<Nut::Table> name){ \
write(qSharedPointerObjectCast<type>(name)); \
} keytype class::read##Id() const{ \
if (m_##name) \
return m_##name->primaryValue().value<keytype>(); \
return m_##name##Id; \

View File

@ -383,6 +383,21 @@ Q_OUTOFLINE_TEMPLATE RowList<T> Query<T>::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<Nut::Table>,
levels[master].lastRow));
qDebug() << "data.masterFields[master]=" << setterName << ok;
}
}
row->setStatus(Table::FetchedFromDB);

View File

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

View File

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

View File

@ -225,6 +225,20 @@ void BasicTest::selectPostIds()
QCOMPARE(ids.count(), 2);
}
void BasicTest::selectPostsWithComments()
{
auto posts = db.posts()->query().join<Comment>().toList();
QCOMPARE(posts.first()->comments()->length(), 3);
}
void BasicTest::selectCommantsWithPost()
{
auto comments = db.comments()->query().join<Post>().toList();
QCOMPARE(comments.length(), 6);
QVERIFY(!comments.first()->post().isNull());
}
void BasicTest::testDate()
{
QDateTime d = QDateTime::currentDateTime();

View File

@ -38,6 +38,8 @@ private Q_SLOTS:
void selectPostsWithoutTitle();
void selectPostIds();
void updatePostOnTheFly();
void selectPostsWithComments();
void selectCommantsWithPost();
void testDate();
void testLimitedQuery();
void selectWithInvalidRelation();