Skip to content

Commit

Permalink
Merge pull request #41136 from mrylov/hana_primarykeys
Browse files Browse the repository at this point in the history
Make primary key requirements less restrictive in HANA
  • Loading branch information
m-kuhn committed Jan 25, 2021
2 parents 0405dbb + 23bfee4 commit 7ba68b3
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 13 deletions.
6 changes: 6 additions & 0 deletions src/providers/hana/qgshanaconnection.cpp
Expand Up @@ -760,6 +760,12 @@ QgsHanaResultSetRef QgsHanaConnection::getColumns( const QString &schemaName, co
}
}

bool QgsHanaConnection::isTable( const QString &schemaName, const QString &tableName )
{
QString sql = QStringLiteral( "SELECT COUNT(*) FROM SYS.TABLES WHERE SCHEMA_NAME = ? AND TABLE_NAME = ?" );
return executeCountQuery( sql, {schemaName, tableName } ) == 1;
}

PreparedStatementRef QgsHanaConnection::createPreparedStatement( const QString &sql, const QVariantList &args )
{
PreparedStatementRef stmt = mConnection->prepareStatement( QgsHanaUtils::toUtf16( sql ) );
Expand Down
1 change: 1 addition & 0 deletions src/providers/hana/qgshanaconnection.h
Expand Up @@ -71,6 +71,7 @@ class QgsHanaConnection : public QObject
QString getColumnDataType( const QString &schemaName, const QString &tableName, const QString &columnName );
int getColumnSrid( const QString &schemaName, const QString &tableName, const QString &columnName );
QgsHanaResultSetRef getColumns( const QString &schemaName, const QString &tableName, const QString &fieldName );
bool isTable( const QString &schemaName, const QString &tableName );

static QgsHanaConnection *createConnection( const QgsDataSourceUri &uri );
static QgsHanaConnection *createConnection( const QgsDataSourceUri &uri, bool *canceled );
Expand Down
2 changes: 1 addition & 1 deletion src/providers/hana/qgshanaprimarykeys.cpp
Expand Up @@ -155,7 +155,7 @@ QPair<QgsHanaPrimaryKeyType, QList<int>> QgsHanaPrimaryKeyUtils::determinePrimar
if ( !attrs.isEmpty() )
keyType = ( attrs.size() == 1 ) ? getPrimaryKeyType( fields.at( attrs[0] ) ) : PktFidMap;
else
QgsMessageLog::logMessage( QObject::tr( "Keys for view/query undefined." ), QObject::tr( "SAP HANA" ) );
QgsMessageLog::logMessage( QObject::tr( "Keys for view/query undefined. Some functionality might not be available." ), QObject::tr( "SAP HANA" ) );

return qMakePair( keyType, attrs );
}
Expand Down
24 changes: 12 additions & 12 deletions src/providers/hana/qgshanaprovider.cpp
Expand Up @@ -336,8 +336,6 @@ QgsHanaProvider::QgsHanaProvider(
mDatabaseVersion = QgsHanaUtils::toHANAVersion( conn->getDatabaseVersion() );
readGeometryType();
readAttributeFields();
if ( !mIsQuery && mPrimaryKeyType == PktUnknown )
return;
readSrsInformation();
readMetadata();

Expand Down Expand Up @@ -1403,21 +1401,26 @@ void QgsHanaProvider::readSrsInformation()

void QgsHanaProvider::determinePrimaryKey()
{
QPair<QgsHanaPrimaryKeyType, QList<int>> primaryKey;
if ( !mIsQuery )
{
QgsHanaConnectionRef conn( mUri );
QStringList layerPrimaryKey = conn->getLayerPrimaryeKey( mSchemaName, mTableName );
auto primaryKey = QgsHanaPrimaryKeyUtils::determinePrimaryKeyFromColumns( layerPrimaryKey, mAttributeFields );
mPrimaryKeyType = primaryKey.first;
mPrimaryKeyAttrs = primaryKey.second;
if ( conn->isTable( mSchemaName, mTableName ) )
{
QStringList layerPrimaryKey = conn->getLayerPrimaryeKey( mSchemaName, mTableName );
primaryKey = QgsHanaPrimaryKeyUtils::determinePrimaryKeyFromColumns( layerPrimaryKey, mAttributeFields );
}
else
primaryKey = QgsHanaPrimaryKeyUtils::determinePrimaryKeyFromUriKeyColumn( mUri.keyColumn(), mAttributeFields );
}
else
{
auto primaryKey = QgsHanaPrimaryKeyUtils::determinePrimaryKeyFromUriKeyColumn( mUri.keyColumn(), mAttributeFields );
mPrimaryKeyType = primaryKey.first;
mPrimaryKeyAttrs = primaryKey.second;
primaryKey = QgsHanaPrimaryKeyUtils::determinePrimaryKeyFromUriKeyColumn( mUri.keyColumn(), mAttributeFields );
}

mPrimaryKeyType = primaryKey.first;
mPrimaryKeyAttrs = primaryKey.second;

if ( mPrimaryKeyAttrs.size() == 1 )
{
//primary keys are unique, not null
Expand All @@ -1426,9 +1429,6 @@ void QgsHanaProvider::determinePrimaryKey()
constraints.setConstraint( QgsFieldConstraints::ConstraintNotNull, QgsFieldConstraints::ConstraintOriginProvider );
mAttributeFields[ mPrimaryKeyAttrs[0] ].setConstraints( constraints );
}

if ( !mIsQuery )
mValid = mPrimaryKeyType != PktUnknown;
}

long QgsHanaProvider::getFeatureCount( const QString &whereClause ) const
Expand Down

0 comments on commit 7ba68b3

Please sign in to comment.