From 5f60b325aa0ab17e9eab1c79c02b064b10a2585d Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Sat, 8 Jun 2019 12:50:52 +0430 Subject: [PATCH] support PostGis types with equal operator [skip ci] --- src/generators/postgresqlgenerator.cpp | 32 +++++++++++++++++++++++--- src/generators/postgresqlgenerator.h | 14 +++++++---- src/generators/sqlgeneratorbase_p.h | 2 +- src/query.h | 2 +- test/tst_json/tst_json.cpp | 6 ++++- test/tst_json/tst_json.h | 6 +++++ test/tst_upgrades/tst_upgrades.cpp | 8 +++++++ test/tst_upgrades/tst_upgrades.h | 2 ++ 8 files changed, 61 insertions(+), 11 deletions(-) diff --git a/src/generators/postgresqlgenerator.cpp b/src/generators/postgresqlgenerator.cpp index 9f481c4..23b54f3 100644 --- a/src/generators/postgresqlgenerator.cpp +++ b/src/generators/postgresqlgenerator.cpp @@ -62,6 +62,16 @@ bool PostgreSqlGenerator::readInsideParentese(QString &text, QString &out) return false; } +bool PostgreSqlGenerator::isPostGisType(const QVariant::Type &t) const +{ + return t == QVariant::Point + || t == QVariant::PointF + || t == QVariant::Rect + || t == QVariant::RectF + || t == QVariant::Polygon + || t == QVariant::PolygonF; +} + PostgreSqlGenerator::PostgreSqlGenerator(Database *parent) : SqlGeneratorBase (parent) { @@ -215,14 +225,14 @@ QString PostgreSqlGenerator::escapeValue(const QVariant &v) const if (v.type() == QVariant::Point) { QPoint pt = v.toPoint(); - return QString("'(%1, %2)'").arg(pt.x()).arg(pt.y()); + return QString("point(%1, %2)").arg(pt.x()).arg(pt.y()); } if (v.type() == QVariant::PointF) { QPointF pt = v.toPointF(); - return QString("'(%1, %2)'").arg(pt.x()).arg(pt.y()); + return QString("point(%1, %2)").arg(pt.x()).arg(pt.y()); } if (v.userType() == QMetaType::QJsonDocument) { - return "'" + QString(v.toJsonDocument().toJson()) + "'"; + return "'" + QString(v.toJsonDocument().toJson(QJsonDocument::Compact)) + "'"; } #ifdef QT_GUI_LIB @@ -313,5 +323,21 @@ QVariant PostgreSqlGenerator::unescapeValue(const QMetaType::Type &type, const Q return SqlGeneratorBase::unescapeValue(type, dbValue); } +QString PostgreSqlGenerator::createConditionalPhrase(const PhraseData *d) const +{ + if (!d) + return QString(); + + if (d->type == PhraseData::WithVariant) { + if (isPostGisType(d->operand.type()) && d->operatorCond == PhraseData::Equal) { + return QString("%1 ~= %2") + .arg(SqlGeneratorBase::createConditionalPhrase(d->left), + escapeValue(d->operand)); + } + } + + return SqlGeneratorBase::createConditionalPhrase(d); +} + NUT_END_NAMESPACE diff --git a/src/generators/postgresqlgenerator.h b/src/generators/postgresqlgenerator.h index a631d06..bf637f1 100644 --- a/src/generators/postgresqlgenerator.h +++ b/src/generators/postgresqlgenerator.h @@ -30,18 +30,22 @@ class PostgreSqlGenerator : public SqlGeneratorBase { private: bool readInsideParentese(QString &ref, QString &out); - + bool isPostGisType(const QVariant::Type &t) const; public: explicit PostgreSqlGenerator(Database *parent = nullptr); - QString fieldType(FieldModel *field); + QString fieldType(FieldModel *field) override; - QString diff(FieldModel *oldField, FieldModel *newField); + QString diff(FieldModel *oldField, FieldModel *newField) override; // SqlGeneratorBase interface public: - QString escapeValue(const QVariant &v) const; - QVariant unescapeValue(const QMetaType::Type &type, const QVariant &dbValue); + QString escapeValue(const QVariant &v) const override; + QVariant unescapeValue(const QMetaType::Type &type, const QVariant &dbValue) override; + + // SqlGeneratorBase interface +protected: + QString createConditionalPhrase(const PhraseData *d) const override; }; NUT_END_NAMESPACE diff --git a/src/generators/sqlgeneratorbase_p.h b/src/generators/sqlgeneratorbase_p.h index bb67f9c..6115689 100644 --- a/src/generators/sqlgeneratorbase_p.h +++ b/src/generators/sqlgeneratorbase_p.h @@ -151,7 +151,7 @@ public: virtual QString primaryKeyConstraint(const TableModel *table) const; protected: - QString createConditionalPhrase(const PhraseData *d) const; + virtual QString createConditionalPhrase(const PhraseData *d) const; QString createFieldPhrase(const PhraseList &ph); QString createOrderPhrase(const PhraseList &ph); void createInsertPhrase(const AssignmentPhraseList &ph, QString &fields, QString &values); diff --git a/src/query.h b/src/query.h index 974520e..e7e121c 100644 --- a/src/query.h +++ b/src/query.h @@ -118,7 +118,7 @@ Q_OUTOFLINE_TEMPLATE Query::Query(Database *database, TableSetBase *tableSet, d->className = T::staticMetaObject.className(); d->tableName = d->database->model() - .tableByClassName(T::staticMetaObject.className()) + .tableByClassName(d->className) ->name(); } diff --git a/test/tst_json/tst_json.cpp b/test/tst_json/tst_json.cpp index 6d3e02e..4b56f3d 100644 --- a/test/tst_json/tst_json.cpp +++ b/test/tst_json/tst_json.cpp @@ -35,7 +35,6 @@ void TestJson::initTestCase() void TestJson::store() { - DB db; initDb(db); db.open(); @@ -57,5 +56,10 @@ void TestJson::store() Q_ASSERT(newObj->doc() == t->doc()); } +void TestJson::cleanupTestCase() +{ + PRINT_FORM(db); +} + QTEST_APPLESS_MAIN(TestJson) diff --git a/test/tst_json/tst_json.h b/test/tst_json/tst_json.h index 5271c65..2672db1 100644 --- a/test/tst_json/tst_json.h +++ b/test/tst_json/tst_json.h @@ -1,6 +1,8 @@ #ifndef TST_TESTJSON_H #define TST_TESTJSON_H +#include "db.h" + #include namespace Nut { @@ -10,6 +12,8 @@ class TestJson : public QObject { Q_OBJECT + DB db; + void initDb(Nut::Database &db); int id; @@ -22,6 +26,8 @@ private slots: void store(); + void cleanupTestCase(); + }; #endif // TST_TESTJSON_H diff --git a/test/tst_upgrades/tst_upgrades.cpp b/test/tst_upgrades/tst_upgrades.cpp index 959a935..602f9c6 100644 --- a/test/tst_upgrades/tst_upgrades.cpp +++ b/test/tst_upgrades/tst_upgrades.cpp @@ -49,6 +49,7 @@ void Upgrades::version1() DB1 db; initDb(db); QTEST_ASSERT(db.open()); + db.sampleTable()->query()->remove(); } void Upgrades::version2() @@ -75,6 +76,13 @@ void Upgrades::version3() QTEST_ASSERT(id == t->id()); } +void Upgrades::cleanupTestCase() +{ + DB1 db; + initDb(db); + PRINT_FORM(db); +} + QTEST_APPLESS_MAIN(Upgrades) diff --git a/test/tst_upgrades/tst_upgrades.h b/test/tst_upgrades/tst_upgrades.h index 7556eb4..9c78885 100644 --- a/test/tst_upgrades/tst_upgrades.h +++ b/test/tst_upgrades/tst_upgrades.h @@ -24,6 +24,8 @@ private slots: void version2(); void version3(); + void cleanupTestCase(); + }; #endif // TST_UPGRADES_H