Merge branch 'filtered-methods' into 'master'

Filtered methods

See merge request spaceti-app/integrations/common/server-sdk!8
This commit is contained in:
Filip Bucek 2019-11-19 13:18:47 +00:00
commit 9dd13d2970
5 changed files with 73 additions and 25 deletions

View File

@ -13,9 +13,22 @@ DatabaseTable::DatabaseTable(QObject *parent) : QObject(parent)
{ {
} }
QByteArray DatabaseTable::jsonData() const QString DatabaseTable::primaryKey() const
{ {
QJsonDocument doc = QJsonDocument::fromVariant(this->toVariantMap()); 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<QString> &filters) const
{
auto variantMap = this->toVariantMap(filters);
QJsonDocument doc = QJsonDocument::fromVariant(variantMap);
return doc.toJson(QJsonDocument::Compact); return doc.toJson(QJsonDocument::Compact);
} }
@ -31,7 +44,7 @@ bool DatabaseTable::fromJson(const QByteArray &data)
} }
/** Creates universal variant structure to hold key / value pairs */ /** Creates universal variant structure to hold key / value pairs */
QVariantMap DatabaseTable::toVariantMap() const QVariantMap DatabaseTable::toVariantMap(const QSet<QString> &filters) const
{ {
QVariantMap variantMap; QVariantMap variantMap;
@ -44,6 +57,11 @@ QVariantMap DatabaseTable::toVariantMap() const
// Get key -> value pairs // Get key -> value pairs
QString name = prop.name(); QString name = prop.name();
// Filter property
if (filters.contains(name))
continue;
QVariant::Type type = prop.type(); QVariant::Type type = prop.type();
QVariant value(type); QVariant value(type);
value.setValue(prop.read(this)); value.setValue(prop.read(this));
@ -53,6 +71,7 @@ QVariantMap DatabaseTable::toVariantMap() const
return variantMap; return variantMap;
} }
bool DatabaseTable::fromVariantMap(const QVariantMap &variantMap) bool DatabaseTable::fromVariantMap(const QVariantMap &variantMap)
{ {

View File

@ -2,6 +2,7 @@
#include <QObject> #include <QObject>
#include <QVariantMap> #include <QVariantMap>
#include <QSet>
#include <memory> #include <memory>
@ -83,11 +84,13 @@ class DatabaseTable : public QObject
public: public:
explicit DatabaseTable(QObject *parent = nullptr); explicit DatabaseTable(QObject *parent = nullptr);
QString primaryKey() const;
/** /**
* @brief Creates JSON from QMetaObject data ( Q_PROPERTY ) -> TABLE_PROPERTY * @brief Creates JSON from QMetaObject data ( Q_PROPERTY ) -> TABLE_PROPERTY
* @return text json e.g. { "id": 00344 } * @return text json e.g. { "id": 00344 }
*/ */
virtual QByteArray jsonData() const; virtual QByteArray jsonData(const QSet<QString> &filters = {}) const;
/** /**
* @brief Populates object with JSON {"id": 300} ) * @brief Populates object with JSON {"id": 300} )
@ -99,7 +102,7 @@ public:
* @brief Creates VariantMap from QMetaObject data ( Q_PROPERTY ) * @brief Creates VariantMap from QMetaObject data ( Q_PROPERTY )
* @return QVariantMap containing property with key/value pairs * @return QVariantMap containing property with key/value pairs
*/ */
virtual QVariantMap toVariantMap() const; virtual QVariantMap toVariantMap(const QSet<QString> &filters = {}) const;
/** /**

View File

@ -109,7 +109,14 @@ QSqlQuery DatabaseUtils::createTable(const DatabaseTable *table, const QString t
return mDatabaseManager->execPlainSql(sql); 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 QSqlQuery DatabaseUtils::insertIntoTable(const DatabaseTable *table, const QString table_name) const
{ {
QString columns; QString columns;
@ -145,6 +152,7 @@ QSqlQuery DatabaseUtils::insertIntoTable(const DatabaseTable *table, const QStri
return res; return res;
} }
QSqlQuery DatabaseUtils::updateTable(const DatabaseTable *table, const QString table_name) const QSqlQuery DatabaseUtils::updateTable(const DatabaseTable *table, const QString table_name) const
{ {
QString columnsAndValues; QString columnsAndValues;
@ -157,7 +165,8 @@ QSqlQuery DatabaseUtils::updateTable(const DatabaseTable *table, const QString t
// Primary key is first user property ( first VariantMap item ) // Primary key is first user property ( first VariantMap item )
// in ( primary key ): id // in ( primary key ): id
// out: id = :id // out: id = :id
primaryKeyCondition = keys.at(0) + " = :" + keys.at(0); const QString primaryKey = table->primaryKey();
primaryKeyCondition = primaryKey + " = :" + primaryKey;
for (auto _key : keys) { for (auto _key : keys) {
QString key = fromCamelCase(_key); QString key = fromCamelCase(_key);

View File

@ -32,9 +32,9 @@ class EnumTest : public serversdk::DatabaseTable
TABLE_PROPERTY(bool, noValidity, setNoValidity, false); TABLE_PROPERTY(bool, noValidity, setNoValidity, false);
TABLE_PROPERTY(QString, subjectId, setSubjectId, QString()); TABLE_PROPERTY(QString, subjectId, setSubjectId, QString());
public: public:
QByteArray jsonData() const override QByteArray jsonData(const QSet<QString> &filters = QSet<QString>()) const override
{ {
auto variantMap = this->toVariantMap(); auto variantMap = this->toVariantMap(filters);
auto enabled = variantMap["enabled"].toBool(); auto enabled = variantMap["enabled"].toBool();
auto noValidity = variantMap["noValidity"].toBool(); auto noValidity = variantMap["noValidity"].toBool();
variantMap.remove("enabled"); variantMap.remove("enabled");
@ -105,8 +105,11 @@ void DatabaseTableTest::constructor_test()
auto table = std::make_unique<BookTable>(); auto table = std::make_unique<BookTable>();
QCOMPARE(table->id(), 0); QCOMPARE(table->id(), 0);
QCOMPARE(table->name(), QStringLiteral("Test")); QCOMPARE(table->name(), QStringLiteral("Test"));
QCOMPARE(table->primaryKey(), QStringLiteral("uuid"));
} }
void DatabaseTableTest::qvariant_test() void DatabaseTableTest::qvariant_test()
{ {
auto table = std::make_unique<BookTable>(); auto table = std::make_unique<BookTable>();
@ -149,8 +152,12 @@ void DatabaseTableTest::enum_test()
void DatabaseTableTest::filter_json_test() void DatabaseTableTest::filter_json_test()
{ {
auto book = std::make_shared<BookTable>(); auto book = std::make_shared<BookTable>();
QCOMPARE(book->jsonData(), QByteArray("{\"author\":\"Me\",\"id\":0,\"name\":\"Test\",\"uuid\":\"\"}")); QCOMPARE(book->jsonData(), QByteArray(R"({"author":"Me","id":0,"name":"Test","uuid":""})"));
QCOMPARE(book->filteredJson(), QByteArray("{\"id\":0,\"name\":\"Test\",\"uuid\":\"\"}"));
const QByteArray filtered(R"({"id":0,"name":"Test","uuid":""})");
QCOMPARE(book->filteredJson(), filtered);
QCOMPARE(book->jsonData({"author"}), filtered);
} }

View File

@ -107,35 +107,45 @@ void SqliteTest::updateTable_test()
db.openSQLite(dbpath); db.openSQLite(dbpath);
QVERIFY(db.isOpen()); QVERIFY(db.isOpen());
Name names; Name name_A, name_B;
// CREATE TABLE // CREATE TABLE
serversdk::DatabaseUtils utils(&db); serversdk::DatabaseUtils utils(&db);
QSqlQuery query = utils.createTable(&names, "names"); QSqlQuery query = utils.createTable(&name_A, "names");
// INSERT INTO TABLE // INSERT INTO TABLE
const QString uuidA = "48f64fab-ba2a-40b5-8fbb-75361099dfb6"; const QString uuidA = "48f64fab-ba2a-40b5-8fbb-75361099dfb6";
names.set_uuid(uuidA); const QString uuidB = "d70143ab-8c14-4ee0-85cb-f0d1b72df104";
names.set_id(2); name_A.set_uuid(uuidA);
names.set_name("Testname"); 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 // NOW UPDATING TABLE WITH name: NewName
names.set_name("NewName"); name_A.set_name("TestnameA-new");
utils.updateTable(&names, "names"); utils.updateTable(&name_A, "names");
name_B.set_name("TestnameB-new");
utils.updateTable(&name_B, "names");
// SELECT FROM TABLE // SELECT FROM TABLE
QSqlQuery selectSQL = db.execPlainSql("SELECT * FROM names"); QSqlQuery selectSQL = db.execPlainSql("SELECT * FROM names");
auto list = utils.tableFromQuery<Name>(selectSQL); auto list = utils.tableFromQuery<Name>(selectSQL);
QCOMPARE(list.count(), 2);
// ENSURE SAME auto dbA = list.first();
QCOMPARE(list.count(), 1); auto dbB = list.last();
auto names_tab = list.first(); QCOMPARE(dbA->name(), name_A.name());
QVERIFY(names_tab); QCOMPARE(dbB->name(), name_B.name());
QCOMPARE(names_tab->name(), QStringLiteral("NewName"));
QCOMPARE(list.first()->jsonData(), names.jsonData()); QCOMPARE(dbA->jsonData(), name_A.jsonData());
QCOMPARE(dbB->jsonData(), name_B.jsonData());
} }
QTEST_APPLESS_MAIN(SqliteTest) QTEST_APPLESS_MAIN(SqliteTest)