Skip to content

Commit

Permalink
Consider comments for HANA provider
Browse files Browse the repository at this point in the history
  • Loading branch information
Maksim Rylov authored and mrylov committed Dec 7, 2020
1 parent 13add12 commit dee148e
Show file tree
Hide file tree
Showing 11 changed files with 55 additions and 40 deletions.
3 changes: 0 additions & 3 deletions src/providers/hana/CMakeLists.txt
Expand Up @@ -68,9 +68,6 @@ INCLUDE_DIRECTORIES (SYSTEM
ADD_LIBRARY(hanaprovider MODULE ${HANA_SRCS} ${HANA_HDRS} ${HANA_MOC_SRCS})
ADD_LIBRARY(hanaprovider_a STATIC ${HANA_SRCS} ${HANA_HDRS} ${HANA_MOC_SRCS})

SET_TARGET_PROPERTIES(hanaprovider PROPERTIES COMPILE_DEFINITIONS ODBC_EXPORTS)
SET_TARGET_PROPERTIES(hanaprovider_a PROPERTIES COMPILE_DEFINITIONS ODBC_EXPORTS)

TARGET_LINK_LIBRARIES(hanaprovider
qgis_core
${ODBC_LIBRARIES}
Expand Down
7 changes: 6 additions & 1 deletion src/providers/hana/qgshanacolumntypethread.cpp
Expand Up @@ -19,11 +19,16 @@
#include "qgshanasettings.h"
#include "qgslogger.h"
#include "qgsmessagelog.h"
#include <mutex>

QgsHanaColumnTypeThread::QgsHanaColumnTypeThread( const QgsHanaSettings &settings )
: mSettings( settings )
{
qRegisterMetaType<QgsHanaLayerProperty>( "QgsHanaLayerProperty" );
static std::once_flag initialized;
std::call_once( initialized, [ = ]( )
{
qRegisterMetaType<QgsHanaLayerProperty>( "QgsHanaLayerProperty" );
} );
}

void QgsHanaColumnTypeThread::stop()
Expand Down
2 changes: 1 addition & 1 deletion src/providers/hana/qgshanadataitems.cpp
Expand Up @@ -164,7 +164,7 @@ bool QgsHanaConnectionItem::handleDrop( const QMimeData *data, const QString &to

if ( srcLayer->isValid() )
{
bool fieldsInUpperCase = QgsHanaUtils::countFieldsInUppercase( srcLayer->fields() ) > srcLayer->fields().size() / 2;
bool fieldsInUpperCase = QgsHanaUtils::countFieldsWithFirstLetterInUppercase( srcLayer->fields() ) > srcLayer->fields().size() / 2;

uri.setWkbType( srcLayer->wkbType() );
uri.setDataSource( !toSchema.isNull() ? toSchema : nullptr,
Expand Down
21 changes: 21 additions & 0 deletions src/providers/hana/qgshanafeatureiterator.cpp
Expand Up @@ -78,6 +78,27 @@ QgsHanaFeatureIterator::QgsHanaFeatureIterator(
PreparedStatementRef stmt = mConnRef->getNativeRef()->prepareStatement( sql.toStdString().c_str() );
mSqlStatement = sql;
mClosed = false;

/// TODO : REMOVE ************
StatementRef stmtCount = mConnRef->getNativeRef()->createStatement();

QString sqlCount = QString( "SELECT COUNT(*) FROM %1.%2" ).arg( QgsHanaUtils::quotedIdentifier( mSource->mSchemaName ), QgsHanaUtils::quotedIdentifier( mSource->mTableName ) );
if ( !mSource->mQueryWhereClause.isEmpty() )
sqlCount += " WHERE " + mSource->mQueryWhereClause;
ResultSetRef rsCount = stmtCount->executeQuery( sqlCount.toStdString().c_str() );
rsCount->next();
int64_t tableRowsCount = *rsCount->getLong( 1 );
rsCount->close();

sqlCount = QString( "SELECT COUNT(*) FROM (%1)" ).arg( sql );
rsCount = stmtCount->executeQuery( sqlCount.toStdString().c_str() );
rsCount->next();
int64_t viewFeaturesCount = *rsCount->getLong( 1 );
rsCount->close();

mSelectivity = static_cast<double>( viewFeaturesCount ) / tableRowsCount;
/// ***************

rewind();
}
catch ( const odbc::Exception &ex )
Expand Down
1 change: 1 addition & 0 deletions src/providers/hana/qgshanafeatureiterator.h
Expand Up @@ -89,6 +89,7 @@ class QgsHanaFeatureIterator : public QgsAbstractFeatureIteratorFromSource<QgsHa
bool mHasGeometryColumn = false;
bool mExpressionCompiled = false;
bool mOrderByCompiled = false;
double mSelectivity = 0;
};

#endif // QGSHANAFEATUREITERATOR_H
2 changes: 1 addition & 1 deletion src/providers/hana/qgshanaprovider.cpp
Expand Up @@ -1512,7 +1512,7 @@ QgsVectorLayerExporter::ExportError QgsHanaProvider::createEmptyLayer(
bool fieldsInUpperCase = false;
if ( fields.size() > 0 )
{
int count = QgsHanaUtils::countFieldsInUppercase( fields );
int count = QgsHanaUtils::countFieldsWithFirstLetterInUppercase( fields );
fieldsInUpperCase = count > fields.size() / 2;
}

Expand Down
36 changes: 13 additions & 23 deletions src/providers/hana/qgshanatablemodel.cpp
Expand Up @@ -37,9 +37,6 @@ QgsHanaTableModel::QgsHanaTableModel()

void QgsHanaTableModel::addTableEntry( const QgsHanaLayerProperty &layerProperty )
{
// is there already a root item with the given scheme Name?
QStandardItem *schemaItem = nullptr;

QgsWkbTypes::Type wkbType = layerProperty.type;
int srid = layerProperty.srid;

Expand Down Expand Up @@ -133,22 +130,20 @@ void QgsHanaTableModel::addTableEntry( const QgsHanaLayerProperty &layerProperty
}
}

if ( !schemaItem )
{
QList<QStandardItem *> schemaItems = findItems( layerProperty.schemaName, Qt::MatchExactly, DbtmSchema );
QStandardItem *schemaItem = nullptr;
QList<QStandardItem *> schemaItems = findItems( layerProperty.schemaName, Qt::MatchExactly, DbtmSchema );

// there is already an item for this schema
if ( !schemaItems.isEmpty() )
{
schemaItem = schemaItems.at( DbtmSchema );
}
else
{
// create a new toplevel item for this schema
schemaItem = new QStandardItem( layerProperty.schemaName );
schemaItem->setFlags( Qt::ItemIsEnabled );
invisibleRootItem()->setChild( invisibleRootItem()->rowCount(), schemaItem );
}
// there is already an item for this schema
if ( !schemaItems.isEmpty() )
{
schemaItem = schemaItems.at( DbtmSchema );
}
else
{
// create a new toplevel item for this schema
schemaItem = new QStandardItem( layerProperty.schemaName );
schemaItem->setFlags( Qt::ItemIsEnabled );
invisibleRootItem()->setChild( invisibleRootItem()->rowCount(), schemaItem );
}

schemaItem->appendRow( childItemList );
Expand Down Expand Up @@ -333,8 +328,3 @@ QString QgsHanaTableModel::layerURI( const QModelIndex &index, const QString &co

return uri.uri();
}

QgsWkbTypes::Type QgsHanaTableModel::wkbTypeFromHana( const QString &type )
{
return QgsWkbTypes::parseType( type.toUpper() );
}
2 changes: 0 additions & 2 deletions src/providers/hana/qgshanatablemodel.h
Expand Up @@ -94,8 +94,6 @@ class QgsHanaTableModel : public QStandardItemModel

static QIcon iconForWkbType( QgsWkbTypes::Type type );

static QgsWkbTypes::Type wkbTypeFromHana( const QString &dbType );

private:
//! Number of tables in the model
int mTableCount = 0;
Expand Down
16 changes: 10 additions & 6 deletions src/providers/hana/qgshanautils.cpp
Expand Up @@ -268,15 +268,20 @@ QVariant QgsHanaUtils::toVariant( const String &value, int type, bool isSigned )
if ( isNull )
return QVariant( QVariant::Char );
else
return QVariant( QChar( value->operator[]( 0 ) ) );
{
QString str = QString( value->c_str() );
if ( str.isEmpty() )
return QVariant( QVariant::Char );
return QVariant( str.at( 0 ) );
}
case SQLDataTypes::VarChar:
case SQLDataTypes::WVarChar:
case SQLDataTypes::LongVarChar:
case SQLDataTypes::WLongVarChar:
if ( isNull )
return QVariant( QVariant::String );
else
return QVariant( value->c_str() );
return QVariant( QString( value->c_str() ) );
case SQLDataTypes::Binary:
case SQLDataTypes::VarBinary:
return QVariant( QByteArray( value->c_str(), static_cast< int >( value->length() ) ) );
Expand Down Expand Up @@ -343,7 +348,6 @@ QgsWkbTypes::Type QgsHanaUtils::toWkbType( const QString &hanaType )
QVersionNumber QgsHanaUtils::toHANAVersion( const QString &dbVersion )
{
QString version = dbVersion;
version.replace( " ", "." );
QStringList strs = version.replace( " ", "." ).split( "." );

if ( strs.length() < 3 )
Expand Down Expand Up @@ -424,7 +428,7 @@ bool QgsHanaUtils::convertField( QgsField &field )
else
{
if ( field.length() > 0 && field.precision() >= 0 )
fieldType = QStringLiteral( "DECIMAL(%2,%3)" ).arg( field.length(), field.precision() );
fieldType = QStringLiteral( "DECIMAL(%1,%2)" ).arg( field.length(), field.precision() );
else
fieldType = QStringLiteral( "DECIMAL" );
}
Expand All @@ -445,15 +449,15 @@ bool QgsHanaUtils::convertField( QgsField &field )
return true;
}

int QgsHanaUtils::countFieldsInUppercase( const QgsFields &fields )
int QgsHanaUtils::countFieldsWithFirstLetterInUppercase( const QgsFields &fields )
{
int count = 0;
for ( int i = 0, n = fields.size(); i < n; ++i )
{
QString name = fields.at( i ).name();
if ( name.isEmpty() )
continue;
if ( isupper( name.at( 0 ).toAscii() ) )
if ( name.at( 0 ).isUpper() )
++count;
}
return count;
Expand Down
3 changes: 1 addition & 2 deletions src/providers/hana/qgshanautils.h
Expand Up @@ -23,7 +23,6 @@
#include <qstring.h>
#include <QVariant>
#include <QVersionNumber>
#include <string.h>

#include "odbc/Types.h"

Expand Down Expand Up @@ -69,7 +68,7 @@ class QgsHanaUtils
static QVersionNumber toHANAVersion( const QString &dbVersion );
static int toPlanarSRID( int srid );
static bool convertField( QgsField &field );
static int countFieldsInUppercase( const QgsFields &fields );
static int countFieldsWithFirstLetterInUppercase( const QgsFields &fields );
static QString formatErrorMessage( const char *message, bool withPrefix = true );
};

Expand Down
2 changes: 1 addition & 1 deletion src/ui/qgisapp.ui
Expand Up @@ -1625,7 +1625,7 @@
<string>Add HANA Spatial Layer…</string>
</property>
<property name="shortcut">
<string>Ctrl+Shift+3</string>
<string>Ctrl+Shift+G</string>
</property>
</action>
<action name="mActionAddWmsLayer">
Expand Down

0 comments on commit dee148e

Please sign in to comment.