From 45dc96611d0e63e981d68801ce6dc56f4b67b790 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 --- src/generators/postgresqlgenerator.cpp | 32 +++++++++++++++++++++++--- src/generators/postgresqlgenerator.h | 14 +++++++---- src/generators/sqlgeneratorbase_p.h | 2 +- 3 files changed, 39 insertions(+), 9 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);