mirror of
https://gitlab.com/spaceti-app/integrations/common/server-sdk.git
synced 2026-07-12 20:20:37 +02:00
Merge branch 'filtered-methods' into 'master'
Filtered methods See merge request spaceti-app/integrations/common/server-sdk!8
This commit is contained in:
commit
9dd13d2970
@ -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)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user