Example #1
0
 def prepareTestTable(self, table_name, create_sql, insert_sql, insert_args):
     res = QgsHanaProviderUtils.executeSQLFetchOne(self.conn,
                                                   f"SELECT COUNT(*) FROM SYS.TABLES WHERE "
                                                   f"SCHEMA_NAME='{self.schemaName}' AND TABLE_NAME='{table_name}'")
     if res != 0:
         QgsHanaProviderUtils.executeSQL(self.conn, f'DROP TABLE "{self.schemaName}"."{table_name}" CASCADE')
     QgsHanaProviderUtils.createAndFillTable(self.conn, create_sql, insert_sql, insert_args)
Example #2
0
    def testCompositeUniqueConstraints(self):
        create_sql = f'CREATE TABLE "{self.schemaName}"."unique_composite_constraints" ( ' \
            '"ID" INTEGER PRIMARY KEY,' \
            '"VAL1" INTEGER,' \
            '"VAL2" INTEGER,' \
            '"VAL3" INTEGER,' \
            'UNIQUE (VAL1, VAL2))'
        QgsHanaProviderUtils.executeSQL(self.conn, create_sql)

        vl = self.createVectorLayer(f'table="{self.schemaName}"."unique_composite_constraints" sql=',
                                    'testcompositeuniqueconstraints')

        fields = vl.dataProvider().fields()
        id_field_idx = fields.indexFromName('ID')
        val1_field_idx = vl.fields().indexFromName('VAL1')
        val2_field_idx = vl.fields().indexFromName('VAL2')
        val3_field_idx = vl.fields().indexFromName('VAL3')
        self.assertTrue(id_field_idx >= 0)
        self.assertTrue(val1_field_idx >= 0)
        self.assertTrue(val2_field_idx >= 0)
        self.assertTrue(val3_field_idx >= 0)
        self.assertTrue(bool(vl.fieldConstraints(id_field_idx) & QgsFieldConstraints.ConstraintUnique))
        self.assertFalse(bool(vl.fieldConstraints(val1_field_idx) & QgsFieldConstraints.ConstraintUnique))
        self.assertFalse(bool(vl.fieldConstraints(val2_field_idx) & QgsFieldConstraints.ConstraintUnique))
        self.assertFalse(bool(vl.fieldConstraints(val3_field_idx) & QgsFieldConstraints.ConstraintUnique))
Example #3
0
    def testCreateLayerViaExport(self):
        def runTest(crs, primaryKey, attributeNames, attributeValues):
            self.assertTrue(crs.isValid())

            layer = QgsVectorLayer(f"Point?crs={crs.authid()}", "new_table",
                                   "memory")
            pr = layer.dataProvider()

            fields = [
                QgsField("fldid", QVariant.LongLong),
                QgsField("fldtxt", QVariant.String),
                QgsField("fldint", QVariant.Int)
            ]

            if primaryKey == "fldid":
                constraints = QgsFieldConstraints()
                constraints.setConstraint(
                    QgsFieldConstraints.ConstraintNotNull,
                    QgsFieldConstraints.ConstraintOriginProvider)
                constraints.setConstraint(
                    QgsFieldConstraints.ConstraintUnique,
                    QgsFieldConstraints.ConstraintOriginProvider)
                fields[0].setConstraints(constraints)

            layer.startEditing()
            for f in fields:
                layer.addAttribute(f)
            layer.commitChanges(True)

            f1 = QgsFeature()
            f1.setAttributes([1, "test", 11])
            f1.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(1, 2)))
            f2 = QgsFeature()
            f2.setAttributes([2, "test2", 13])
            f3 = QgsFeature()
            f3.setAttributes([3, "test2", NULL])
            f3.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(3, 2)))
            f4 = QgsFeature()
            f4.setAttributes([4, NULL, 13])
            f4.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(4, 3)))
            pr.addFeatures([f1, f2, f3, f4])
            layer.commitChanges()

            QgsHanaProviderUtils.dropTableIfExists(self.conn, self.schemaName,
                                                   'import_data')
            uri = self.uri + f' key=\'{primaryKey}\' table="{self.schemaName}"."import_data" (geom) sql='
            error, message = QgsVectorLayerExporter.exportLayer(
                layer, uri, 'hana', crs)
            self.assertEqual(error, QgsVectorLayerExporter.NoError)

            import_layer = self.createVectorLayer(
                f'key=\'{primaryKey}\' table="{self.schemaName}"."import_data" (geom) sql=',
                'testimportedlayer')
            self.assertEqual(import_layer.wkbType(), QgsWkbTypes.Point)
            self.assertEqual([f.name() for f in import_layer.fields()],
                             attributeNames)

            features = [f.attributes() for f in import_layer.getFeatures()]
            self.assertEqual(features, attributeValues)
            geom = [f.geometry().asWkt() for f in import_layer.getFeatures()]
            self.assertEqual(geom,
                             ['Point (1 2)', '', 'Point (3 2)', 'Point (4 3)'])

            QgsHanaProviderUtils.dropTableIfExists(self.conn, self.schemaName,
                                                   'import_data')

        def is_crs_installed(srid):
            num_crs = QgsHanaProviderUtils.executeSQLFetchOne(
                self.conn,
                f'SELECT COUNT(*) FROM SYS.ST_SPATIAL_REFERENCE_SYSTEMS '
                f'WHERE SRS_ID = {srid}')
            return num_crs == 1

        crs_4326 = QgsCoordinateReferenceSystem('EPSG:4326')
        # primary key already exists in the  imported layer
        runTest(crs_4326, 'fldid', ['fldid', 'fldtxt', 'fldint'],
                [[1, 'test', 11], [2, 'test2', 13], [3, 'test2', NULL],
                 [4, NULL, 13]])
        # primary key doesn't exist in the imported layer
        runTest(crs_4326, 'pk', ['pk', 'fldid', 'fldtxt', 'fldint'],
                [[1, 1, 'test', 11], [2, 2, 'test2', 13],
                 [3, 3, 'test2', NULL], [4, 4, NULL, 13]])
        # crs id that do not exist
        # unfortunately, we cannot test new units of measure as
        # QgsCoordinateReferenceSystem does not allow creating
        # a new crs object from WKT that contain custom AUTHORITY
        # or UNIT values.
        unknown_srid = 3395
        if not is_crs_installed(unknown_srid):
            crs = QgsCoordinateReferenceSystem.fromEpsgId(unknown_srid)

            runTest(crs, 'fldid', ['fldid', 'fldtxt', 'fldint'],
                    [[1, 'test', 11], [2, 'test2', 13], [3, 'test2', NULL],
                     [4, NULL, 13]])
            self.assertTrue(is_crs_installed(unknown_srid))
            QgsHanaProviderUtils.executeSQL(
                self.conn,
                f'DROP SPATIAL REFERENCE SYSTEM "{crs.description()}"')