diff options
author | Samuel Rødal <samuel.rodal@nokia.com> | 2011-07-21 14:42:46 +0200 |
---|---|---|
committer | Samuel Rødal <samuel.rodal@nokia.com> | 2011-07-21 14:42:46 +0200 |
commit | 7b3b6b5afaaf1db1bfbfa9b56fa7b955a61344bd (patch) | |
tree | 8be0d601853d021434e03cef9a9cfd64b3708e92 /src/sql | |
parent | 070fc2f694beaa56fc191f1a3f6a1b9812f4ed35 (diff) | |
parent | 56defa4725508608a85e2813b85af3a7fcefefa0 (diff) |
Merge remote branch 'gerrit/master' into refactor
Conflicts:
examples/opengl/cube/main.cpp
examples/widgets/applicationicon/main.cpp
examples/widgets/orientation/main.cpp
src/gui/image/qicon.cpp
src/gui/image/qimage.h
src/gui/image/qpixmap.h
src/gui/image/qpixmap_mac.cpp
src/gui/kernel/qapplication.cpp
src/gui/kernel/qpalette.cpp
src/gui/kernel/qwidget.cpp
src/gui/styles/qmacstyle_mac.mm
src/gui/widgets/qmenubar.cpp
src/gui/widgets/qslider.cpp
src/opengl/qwindowsurface_gl.cpp
tests/auto/qvariant/qvariant.pro
tests/benchmarks/corelib/kernel/qobject/qobject.pro
tests/benchmarks/gui/animation/qanimation/qanimation.pro
tests/benchmarks/gui/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro
tests/benchmarks/gui/graphicsview/qgraphicsitem/qgraphicsitem.pro
tests/benchmarks/gui/graphicsview/qgraphicsscene/qgraphicsscene.pro
tests/benchmarks/gui/graphicsview/qgraphicsview/qgraphicsview.pro
tests/benchmarks/gui/graphicsview/qgraphicswidget/qgraphicswidget.pro
tests/benchmarks/gui/image/qimagereader/qimagereader.pro
tests/benchmarks/gui/itemviews/qtableview/qtableview.pro
tests/benchmarks/gui/kernel/qapplication/qapplication.pro
tests/benchmarks/gui/kernel/qwidget/qwidget.pro
tests/benchmarks/gui/painting/qpainter/qpainter.pro
tests/benchmarks/gui/painting/qtbench/qtbench.pro
tests/benchmarks/gui/painting/qtracebench/qtracebench.pro
tests/benchmarks/gui/text/qtext/qtext.pro
Change-Id: I4b911c795ecb29d73b6a7fd18819711b49478a30
Diffstat (limited to 'src/sql')
-rw-r--r-- | src/sql/models/qsqlrelationaltablemodel.cpp | 75 | ||||
-rw-r--r-- | src/sql/models/qsqlrelationaltablemodel.h | 6 |
2 files changed, 69 insertions, 12 deletions
diff --git a/src/sql/models/qsqlrelationaltablemodel.cpp b/src/sql/models/qsqlrelationaltablemodel.cpp index bdc32ea6ac..f6c401842f 100644 --- a/src/sql/models/qsqlrelationaltablemodel.cpp +++ b/src/sql/models/qsqlrelationaltablemodel.cpp @@ -224,7 +224,8 @@ class QSqlRelationalTableModelPrivate: public QSqlTableModelPrivate Q_DECLARE_PUBLIC(QSqlRelationalTableModel) public: QSqlRelationalTableModelPrivate() - : QSqlTableModelPrivate() + : QSqlTableModelPrivate(), + joinMode( QSqlRelationalTableModel::InnerJoin ) {} QString relationField(const QString &tableName, const QString &fieldName) const; @@ -237,6 +238,7 @@ public: void revertCachedRow(int row); void translateFieldNames(int row, QSqlRecord &values) const; + QSqlRelationalTableModel::JoinMode joinMode; }; static void qAppendWhereClause(QString &query, const QString &clause1, const QString &clause2) @@ -575,29 +577,55 @@ QString QSqlRelationalTableModel::selectStatement() const fieldNames.insert(fieldList[i], fieldNames.value(fieldList[i])-1); } - // this needs fixing!! the below if is borken. - tables.append(relation.tableName().append(QLatin1Char(' ')).append(relTableAlias)); - if(!where.isEmpty()) - where.append(QLatin1String(" AND ")); - where.append(d->relationField(tableName(), d->db.driver()->escapeIdentifier(rec.fieldName(i), QSqlDriver::FieldName))); - where.append(QLatin1String(" = ")); - where.append(d->relationField(relTableAlias, relation.indexColumn())); + if (d->joinMode == QSqlRelationalTableModel::InnerJoin) { + // this needs fixing!! the below if is borken. + // Use LeftJoin mode if you want correct behavior + tables.append(relation.tableName().append(QLatin1Char(' ')).append(relTableAlias)); + if(!where.isEmpty()) + where.append(QLatin1String(" AND ")); + where.append(d->relationField(tableName(), d->db.driver()->escapeIdentifier(rec.fieldName(i), QSqlDriver::FieldName))); + where.append(QLatin1String(" = ")); + where.append(d->relationField(relTableAlias, relation.indexColumn())); + } else { + tables.append(QLatin1String(" LEFT JOIN")); + tables.append(relation.tableName().append(QLatin1Char(' ')).append(relTableAlias)); + tables.append(QLatin1String("ON")); + + QString clause; + clause.append(d->relationField(tableName(), d->db.driver()->escapeIdentifier(rec.fieldName(i), QSqlDriver::FieldName))); + clause.append(QLatin1String(" = ")); + clause.append(d->relationField(relTableAlias, relation.indexColumn())); + + tables.append(clause); + } } else { if (!fList.isEmpty()) fList.append(QLatin1String(", ")); fList.append(d->relationField(tableName(), d->db.driver()->escapeIdentifier(rec.fieldName(i), QSqlDriver::FieldName))); } } - if (!tables.isEmpty()) + + if (d->joinMode == QSqlRelationalTableModel::InnerJoin && !tables.isEmpty()) { tList.append(tables.join(QLatin1String(", "))); + if(!tList.isEmpty()) + tList.prepend(QLatin1String(", ")); + } else + tList.append(tables.join(QLatin1String(" "))); + if (fList.isEmpty()) return query; - if(!tList.isEmpty()) - tList.prepend(QLatin1String(", ")); + tList.prepend(tableName()); query.append(QLatin1String("SELECT ")); query.append(fList).append(QLatin1String(" FROM ")).append(tList); - qAppendWhereClause(query, where, filter()); + + if (d->joinMode == QSqlRelationalTableModel::InnerJoin) { + qAppendWhereClause(query, where, filter()); + } else if (!filter().isEmpty()) { + query.append(QLatin1String(" WHERE (")); + query.append(filter()); + query.append(QLatin1String(")")); + } QString orderBy = orderByClause(); if (!orderBy.isEmpty()) @@ -649,6 +677,29 @@ void QSqlRelationalTableModel::clear() QSqlTableModel::clear(); } + +/*! \enum QSqlRelationalTableModel::JoinMode + + \value InnerJoin - Inner join mode, return rows when there is at least one match in both tables. + \value LeftJoin - Left join mode, returns all rows from the left table (table_name1), even if there are no matches in the right table (table_name2). + + \see QSqlRelationalTableModel::setJoinMode + \since 4.8 +*/ + +/*! + Sets the SQL join mode to show or hide rows with NULL foreign keys. + In InnerJoin mode (the default) these rows will not be showed: use the + LeftJoin mode if you want to show them. + + \see QSqlRelationalTableModel::JoinMode + \since 4.8 +*/ +void QSqlRelationalTableModel::setJoinMode( QSqlRelationalTableModel::JoinMode joinMode ) +{ + Q_D(QSqlRelationalTableModel); + d->joinMode = joinMode; +} /*! \reimp */ diff --git a/src/sql/models/qsqlrelationaltablemodel.h b/src/sql/models/qsqlrelationaltablemodel.h index 15faae9b57..32d88b3189 100644 --- a/src/sql/models/qsqlrelationaltablemodel.h +++ b/src/sql/models/qsqlrelationaltablemodel.h @@ -76,6 +76,11 @@ class Q_SQL_EXPORT QSqlRelationalTableModel: public QSqlTableModel Q_OBJECT public: + enum JoinMode { + InnerJoin, + LeftJoin + }; + explicit QSqlRelationalTableModel(QObject *parent = 0, QSqlDatabase db = QSqlDatabase()); virtual ~QSqlRelationalTableModel(); @@ -91,6 +96,7 @@ public: virtual void setRelation(int column, const QSqlRelation &relation); QSqlRelation relation(int column) const; virtual QSqlTableModel *relationModel(int column) const; + void setJoinMode( QSqlRelationalTableModel::JoinMode joinMode ); public Q_SLOTS: void revertRow(int row); |