From c0385681241e64538d1999b588d9980ca12aef8b Mon Sep 17 00:00:00 2001 From: Filip Bucek Date: Tue, 19 Nov 2019 13:53:05 +0100 Subject: [PATCH 1/2] adding filtered methods --- src/serversdk/databasetable.cpp | 13 ++++++++++--- src/serversdk/databasetable.h | 5 +++-- test/auto/database/tst_databasetable.cpp | 12 ++++++++---- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/serversdk/databasetable.cpp b/src/serversdk/databasetable.cpp index b03e8d9..4cce529 100644 --- a/src/serversdk/databasetable.cpp +++ b/src/serversdk/databasetable.cpp @@ -13,9 +13,10 @@ DatabaseTable::DatabaseTable(QObject *parent) : QObject(parent) { } -QByteArray DatabaseTable::jsonData() const +QByteArray DatabaseTable::jsonData(const QSet &filters) const { - QJsonDocument doc = QJsonDocument::fromVariant(this->toVariantMap()); + auto variantMap = this->toVariantMap(filters); + QJsonDocument doc = QJsonDocument::fromVariant(variantMap); return doc.toJson(QJsonDocument::Compact); } @@ -31,7 +32,7 @@ bool DatabaseTable::fromJson(const QByteArray &data) } /** Creates universal variant structure to hold key / value pairs */ -QVariantMap DatabaseTable::toVariantMap() const +QVariantMap DatabaseTable::toVariantMap(const QSet &filters) const { QVariantMap variantMap; @@ -44,6 +45,11 @@ QVariantMap DatabaseTable::toVariantMap() const // Get key -> value pairs QString name = prop.name(); + + // Filter property + if (filters.contains(name)) + continue; + QVariant::Type type = prop.type(); QVariant value(type); value.setValue(prop.read(this)); @@ -53,6 +59,7 @@ QVariantMap DatabaseTable::toVariantMap() const return variantMap; } + bool DatabaseTable::fromVariantMap(const QVariantMap &variantMap) { diff --git a/src/serversdk/databasetable.h b/src/serversdk/databasetable.h index 01a5fc8..a90b5f8 100644 --- a/src/serversdk/databasetable.h +++ b/src/serversdk/databasetable.h @@ -2,6 +2,7 @@ #include #include +#include #include @@ -87,7 +88,7 @@ public: * @brief Creates JSON from QMetaObject data ( Q_PROPERTY ) -> TABLE_PROPERTY * @return text json e.g. { "id": 00344 } */ - virtual QByteArray jsonData() const; + virtual QByteArray jsonData(const QSet &filters = {}) const; /** * @brief Populates object with JSON {"id": 300} ) @@ -99,7 +100,7 @@ public: * @brief Creates VariantMap from QMetaObject data ( Q_PROPERTY ) * @return QVariantMap containing property with key/value pairs */ - virtual QVariantMap toVariantMap() const; + virtual QVariantMap toVariantMap(const QSet &filters = {}) const; /** diff --git a/test/auto/database/tst_databasetable.cpp b/test/auto/database/tst_databasetable.cpp index 7949a83..d246662 100644 --- a/test/auto/database/tst_databasetable.cpp +++ b/test/auto/database/tst_databasetable.cpp @@ -32,9 +32,9 @@ class EnumTest : public serversdk::DatabaseTable TABLE_PROPERTY(bool, noValidity, setNoValidity, false); TABLE_PROPERTY(QString, subjectId, setSubjectId, QString()); public: - QByteArray jsonData() const override + QByteArray jsonData(const QSet &filters = QSet()) const override { - auto variantMap = this->toVariantMap(); + auto variantMap = this->toVariantMap(filters); auto enabled = variantMap["enabled"].toBool(); auto noValidity = variantMap["noValidity"].toBool(); variantMap.remove("enabled"); @@ -149,8 +149,12 @@ void DatabaseTableTest::enum_test() void DatabaseTableTest::filter_json_test() { auto book = std::make_shared(); - QCOMPARE(book->jsonData(), QByteArray("{\"author\":\"Me\",\"id\":0,\"name\":\"Test\",\"uuid\":\"\"}")); - QCOMPARE(book->filteredJson(), QByteArray("{\"id\":0,\"name\":\"Test\",\"uuid\":\"\"}")); + QCOMPARE(book->jsonData(), QByteArray(R"({"author":"Me","id":0,"name":"Test","uuid":""})")); + + + const QByteArray filtered(R"({"id":0,"name":"Test","uuid":""})"); + QCOMPARE(book->filteredJson(), filtered); + QCOMPARE(book->jsonData({"author"}), filtered); } From f387b600f787fe4d71f647ad4a90ff41bbb4b412 Mon Sep 17 00:00:00 2001 From: Filip Bucek Date: Tue, 19 Nov 2019 14:15:40 +0100 Subject: [PATCH 2/2] DatabaseTable new method primaryKey --- src/serversdk/databasetable.cpp | 12 ++++++++ src/serversdk/databasetable.h | 2 ++ src/serversdk/databaseutils.cpp | 13 ++++++-- test/auto/database/tst_databasetable.cpp | 3 ++ test/auto/database/tst_sqlite.cpp | 38 +++++++++++++++--------- 5 files changed, 52 insertions(+), 16 deletions(-) diff --git a/src/serversdk/databasetable.cpp b/src/serversdk/databasetable.cpp index 4cce529..27679a7 100644 --- a/src/serversdk/databasetable.cpp +++ b/src/serversdk/databasetable.cpp @@ -13,6 +13,18 @@ DatabaseTable::DatabaseTable(QObject *parent) : QObject(parent) { } +QString DatabaseTable::primaryKey() const +{ + const QMetaObject *metaObj = this->metaObject(); + for (int i = metaObj->propertyOffset(); i < metaObj->propertyCount(); ++i) { + QMetaProperty prop = metaObj->property(i); + if (!prop.isUser()) + continue; + return prop.name(); + } + return QString(); +} + QByteArray DatabaseTable::jsonData(const QSet &filters) const { auto variantMap = this->toVariantMap(filters); diff --git a/src/serversdk/databasetable.h b/src/serversdk/databasetable.h index a90b5f8..f07f455 100644 --- a/src/serversdk/databasetable.h +++ b/src/serversdk/databasetable.h @@ -84,6 +84,8 @@ class DatabaseTable : public QObject public: explicit DatabaseTable(QObject *parent = nullptr); + QString primaryKey() const; + /** * @brief Creates JSON from QMetaObject data ( Q_PROPERTY ) -> TABLE_PROPERTY * @return text json e.g. { "id": 00344 } diff --git a/src/serversdk/databaseutils.cpp b/src/serversdk/databaseutils.cpp index d4fa87d..224e277 100644 --- a/src/serversdk/databaseutils.cpp +++ b/src/serversdk/databaseutils.cpp @@ -109,7 +109,14 @@ QSqlQuery DatabaseUtils::createTable(const DatabaseTable *table, const QString t return mDatabaseManager->execPlainSql(sql); } - +/** + * @brief DatabaseUtils::insertIntoTable + * @param table + * @param table_name + * @return + * + * @todo Loop VariantMap change to Loop over propertiess + */ QSqlQuery DatabaseUtils::insertIntoTable(const DatabaseTable *table, const QString table_name) const { QString columns; @@ -145,6 +152,7 @@ QSqlQuery DatabaseUtils::insertIntoTable(const DatabaseTable *table, const QStri return res; } + QSqlQuery DatabaseUtils::updateTable(const DatabaseTable *table, const QString table_name) const { QString columnsAndValues; @@ -157,7 +165,8 @@ QSqlQuery DatabaseUtils::updateTable(const DatabaseTable *table, const QString t // Primary key is first user property ( first VariantMap item ) // in ( primary key ): id // out: id = :id - primaryKeyCondition = keys.at(0) + " = :" + keys.at(0); + const QString primaryKey = table->primaryKey(); + primaryKeyCondition = primaryKey + " = :" + primaryKey; for (auto _key : keys) { QString key = fromCamelCase(_key); diff --git a/test/auto/database/tst_databasetable.cpp b/test/auto/database/tst_databasetable.cpp index d246662..81f10f9 100644 --- a/test/auto/database/tst_databasetable.cpp +++ b/test/auto/database/tst_databasetable.cpp @@ -105,8 +105,11 @@ void DatabaseTableTest::constructor_test() auto table = std::make_unique(); QCOMPARE(table->id(), 0); QCOMPARE(table->name(), QStringLiteral("Test")); + + QCOMPARE(table->primaryKey(), QStringLiteral("uuid")); } + void DatabaseTableTest::qvariant_test() { auto table = std::make_unique(); diff --git a/test/auto/database/tst_sqlite.cpp b/test/auto/database/tst_sqlite.cpp index f0dab35..9208183 100644 --- a/test/auto/database/tst_sqlite.cpp +++ b/test/auto/database/tst_sqlite.cpp @@ -107,35 +107,45 @@ void SqliteTest::updateTable_test() db.openSQLite(dbpath); QVERIFY(db.isOpen()); - Name names; + Name name_A, name_B; // CREATE TABLE serversdk::DatabaseUtils utils(&db); - QSqlQuery query = utils.createTable(&names, "names"); + QSqlQuery query = utils.createTable(&name_A, "names"); // INSERT INTO TABLE const QString uuidA = "48f64fab-ba2a-40b5-8fbb-75361099dfb6"; - names.set_uuid(uuidA); - names.set_id(2); - names.set_name("Testname"); + const QString uuidB = "d70143ab-8c14-4ee0-85cb-f0d1b72df104"; + name_A.set_uuid(uuidA); + name_A.set_id(2); + name_A.set_name("TestnameA"); + name_B.set_uuid(uuidB); + name_B.set_id(2); + name_B.set_name("TestnameB"); + + + utils.insertIntoTable(&name_A, "names"); + utils.insertIntoTable(&name_B, "names"); - utils.insertIntoTable(&names, "names"); // NOW UPDATING TABLE WITH name: NewName - names.set_name("NewName"); - utils.updateTable(&names, "names"); + name_A.set_name("TestnameA-new"); + utils.updateTable(&name_A, "names"); + name_B.set_name("TestnameB-new"); + utils.updateTable(&name_B, "names"); // SELECT FROM TABLE QSqlQuery selectSQL = db.execPlainSql("SELECT * FROM names"); auto list = utils.tableFromQuery(selectSQL); + QCOMPARE(list.count(), 2); - // ENSURE SAME - QCOMPARE(list.count(), 1); - auto names_tab = list.first(); - QVERIFY(names_tab); - QCOMPARE(names_tab->name(), QStringLiteral("NewName")); + auto dbA = list.first(); + auto dbB = list.last(); + QCOMPARE(dbA->name(), name_A.name()); + QCOMPARE(dbB->name(), name_B.name()); - QCOMPARE(list.first()->jsonData(), names.jsonData()); + QCOMPARE(dbA->jsonData(), name_A.jsonData()); + QCOMPARE(dbB->jsonData(), name_B.jsonData()); } QTEST_APPLESS_MAIN(SqliteTest)