This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
The following commit(s) were added to refs/heads/geoapi-4.0 by this push: new 3b047f32e1 Add tests for the Geopackage module (work by Johann Sorel). 3b047f32e1 is described below commit 3b047f32e1fffc97a2086e8019f71f57a62f2792 Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Mon Aug 12 17:53:13 2024 +0200 Add tests for the Geopackage module (work by Johann Sorel). --- incubator/build.gradle.kts | 3 + .../apache/sis/storage/geopackage/StoreTest.java | 256 +++++++++++++++++++++ .../apache/sis/storage/geopackage/featureset.sql | 164 +++++++++++++ netbeans-project/nbproject/project.properties | 1 + 4 files changed, 424 insertions(+) diff --git a/incubator/build.gradle.kts b/incubator/build.gradle.kts index ef669f0f97..e3f96b3083 100644 --- a/incubator/build.gradle.kts +++ b/incubator/build.gradle.kts @@ -128,6 +128,9 @@ fun addExportForTests(args : MutableList<String>) { addExport(args, "org.apache.sis.feature", "org.apache.sis.geometry.wrapper.jts", "org.apache.sis.portrayal.map") + addExport(args, "org.apache.sis.feature", "org.apache.sis.geometry.wrapper", + "org.apache.sis.storage.geopackage") + addExport(args, "org.apache.sis.storage", "org.apache.sis.storage.base", "org.apache.sis.portrayal.map") } diff --git a/incubator/src/org.apache.sis.storage.geopackage/test/org/apache/sis/storage/geopackage/StoreTest.java b/incubator/src/org.apache.sis.storage.geopackage/test/org/apache/sis/storage/geopackage/StoreTest.java index c84452c26a..b09143b438 100644 --- a/incubator/src/org.apache.sis.storage.geopackage/test/org/apache/sis/storage/geopackage/StoreTest.java +++ b/incubator/src/org.apache.sis.storage.geopackage/test/org/apache/sis/storage/geopackage/StoreTest.java @@ -16,5 +16,261 @@ */ package org.apache.sis.storage.geopackage; +import java.net.URL; +import java.net.URISyntaxException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.List; +import java.util.stream.Stream; +import org.opengis.feature.AttributeType; +import org.opengis.feature.Feature; +import org.opengis.feature.PropertyType; +import org.apache.sis.geometry.wrapper.Geometries; +import org.apache.sis.geometry.wrapper.GeometryWrapper; +import org.apache.sis.referencing.IdentifiedObjects; +import org.apache.sis.storage.DataStore; +import org.apache.sis.storage.DataStoreException; +import org.apache.sis.storage.DataStores; +import org.apache.sis.storage.FeatureSet; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + + +/** + * Tests the Geopackage store. + * + * @author Johann Sorel (Geomatys) + */ public final class StoreTest { + /** + * Creates a new test case. + */ + public StoreTest() { + } + + /** + * Returns the URL to the {@code featureset.gpkg}. + * If that file does not exists, it is created from the SQL script. + * + * @return URL or path to the test Geopackage file. + * @throws DataStoreException if a the Geopackage test file cannot be created. + */ + private static Object getTestFile() throws DataStoreException { + URL file = StoreTest.class.getResource("featureset.gpkg"); + if (file == null) try { + final Path source = Path.of(StoreTest.class.getResource("featureset.sql").toURI()); + final Path target = source.resolveSibling("featureset.gpkg").toAbsolutePath(); + try (Connection c = DriverManager.getConnection("jdbc:sqlite:" + target)) { + try (Statement s = c.createStatement()) { + s.executeUpdate(Files.readString(source)); + } + } + return target; + } catch (URISyntaxException | IOException | SQLException e) { + throw new DataStoreException("Cannot create the Geopackage test file.", e); + } + return file; + } + + /** + * Tests reading a feature set from a Geopackage file. + * + * @throws DataStoreException if a the Geopackage test file cannot be created or read. + */ + @Test + public void testFeatureSet() throws DataStoreException { + try (DataStore store = DataStores.open(getTestFile())) { + final var gpkg = assertInstanceOf(GpkgStore.class, store); + assertEquals(7, gpkg.components().size()); + /* + * Reads and verifies two features from the Geopackage test file. + */ + FeatureSet fs = getResource(gpkg, "nogeom"); + assertPropertiesEqual(fs, null, "sis:identifier", "fid", "id"); + { // For keeping `the features` scope locale. + final Feature[] features = getFeatures(fs).toArray(Feature[]::new); + assertEquals(2, features.length); + assertEquals(1, features[0].getPropertyValue("fid")); + assertEquals(1, features[0].getPropertyValue("id")); + assertEquals(2, features[1].getPropertyValue("fid")); + assertEquals(2, features[1].getPropertyValue("id")); + } + /* + * Reads and verifies a feature containing a point. + */ + fs = getResource(gpkg, "point"); + assertPropertiesEqual(fs, "Point", + "sis:identifier", + "sis:envelope", + "sis:geometry", + "fid", + "geometry", + "text", + "int32", + "int64", + "float", + "date", + "datetime", + "bool"); + + assertGeometryEquals(fs, "OGC:CRS84", "POINT (3.8691634241245 43.64618798638135)"); + { // For keeping the `feature` scope local. + final Feature feature = getFeatures(fs).get(0); + assertEquals("some text", feature.getPropertyValue("text")); + assertEquals(123, feature.getPropertyValue("int32")); + assertEquals(123456, feature.getPropertyValue("int64")); + assertEquals(123.456, feature.getPropertyValue("float")); + assertEquals("2024-08-07", feature.getPropertyValue("date")); + assertEquals("2024-08-07T12:34:56.000", feature.getPropertyValue("datetime")); + assertEquals(1, feature.getPropertyValue("bool")); + } + /* + * Reads and verifies a feature containing a multi-point geometry. + */ + fs = getResource(gpkg, "multipoint"); + assertPropertiesEqual(fs, "MultiPoint", + "sis:identifier", + "sis:envelope", + "sis:geometry", + "fid", + "geom"); + + assertGeometryEquals(fs, "EPSG:2154", + "MULTIPOINT ((770147.9089501069 6283260.318250759), (770224.707537184 6283233.947140678))"); + /* + * Reads and verifies a feature containing a line string. + */ + fs = getResource(gpkg, "line"); + assertPropertiesEqual(fs, "LineString", + "sis:identifier", + "sis:envelope", + "sis:geometry", + "fid", + "geom"); + + assertGeometryEquals(fs, "EPSG:3857", + "LINESTRING (430669.3103960207 5411208.981453437, 430655.7744657199 5410643.121416978)"); + /* + * Reads and verifies a feature containing a multi-lines geometry. + */ + fs = getResource(gpkg, "multiline"); + assertPropertiesEqual(fs, "MultiLineString", + "sis:identifier", + "sis:envelope", + "sis:geometry", + "fid", + "geom"); + + assertGeometryEquals(fs, "EPSG:3395", + "MULTILINESTRING ((430750.52597782505 5381116.187674649, 430967.10086263693 5380950.761655851), " + + "(430753.08021745336 5381153.51545164, 430917.9595504581 5381182.577731505))"); + /* + * Reads and verifies a feature containing a polygon. + */ + fs = getResource(gpkg, "polygon"); + assertPropertiesEqual(fs, "Polygon", + "sis:identifier", + "sis:envelope", + "sis:geometry", + "fid", + "geom"); + + assertGeometryEquals(fs, "EPSG:3857", + "POLYGON ((430696.4716464551 5410782.480781593, 430696.03196823364 5410729.011400482, " + + "430716.6968446369 5410730.2266102545, 430718.01587930095 5410780.050348468, " + + "430696.4716464551 5410782.480781593))"); + /* + * Reads and verifies a feature containing a multi-polygons. + */ + fs = getResource(gpkg, "multipolygon"); + assertPropertiesEqual(fs, "MultiPolygon", + "sis:identifier", + "sis:envelope", + "sis:geometry", + "fid", + "geom"); + + assertGeometryEquals(fs, "EPSG:3395", + "MULTIPOLYGON (((430795.5091658133 5381110.830395544, " + + "430796.60836136667 5381129.2969556395, 430832.2222972956 5381126.118282802, " + + "430831.0131821869 5381108.711284476, 430795.5091658133 5381110.830395544)), " + + "((430849.25982837286 5381155.483207256, 430849.1499088174 5381151.396330676, " + + "430855.0855648057 5381151.547696444, 430855.4153234717 5381154.877743942, " + + "430849.25982837286 5381155.483207256)))"); + } + } + + /** + * Returns the resource of the given name. + * + * @param store the store from which to get the feature set. + * @param name name of the desired feature set. + * @return the requested feature set. + * @throws DataStoreException if no feature set of the given name was found. + */ + private static FeatureSet getResource(final GpkgStore store, final String name) throws DataStoreException { + return assertInstanceOf(FeatureSet.class, store.findResource(name)); + } + + /** + * Asserts that the properties of the given feature set have the specified names. + * The geometry is expected to be always in the property at index 4 for all features + * (this is the case for the {@code featureset.gpkg} test file). + * + * @param fs the feature set from which to get the properties. + * @param geometryIndex index of the geometry property. + * @param propertyNames the expected names of all properties. + */ + private static void assertPropertiesEqual(final FeatureSet fs, final String geometryType, + final String... propertyNames) throws DataStoreException + { + final PropertyType[] properties = fs.getType().getProperties(true).toArray(PropertyType[]::new); + assertEquals(propertyNames.length, properties.length, "properties.size()"); + for (int i=0; i<propertyNames.length; i++) { + assertEquals(propertyNames[i], properties[i].getName().toString()); + } + if (geometryType != null) { + var attribute = assertInstanceOf(AttributeType.class, properties[4]); + assertEquals(geometryType, attribute.getValueClass().getSimpleName()); + } + } + + /** + * Returns all feature instances as a list. + * + * @param fs the feature set from which to get the feature instances. + * @return all feature instances. + */ + private static List<Feature> getFeatures(final FeatureSet fs) throws DataStoreException { + try (Stream<Feature> stream = fs.features(false)) { + return stream.toList(); + } + } + + /** + * Asserts that the geometry of the given feature set is equal to the expected WKT. + * This method opportunistically verifies that the value of the {@code "fid"} property is 1. + * + * @param resource the feature set from which to get a single feature instance. + * @param expectedCRS identifier of the expected CRS. + * @param expectedWKT expected geometry in WKT format. + */ + private static void assertGeometryEquals(final FeatureSet resource, final String expectedCRS, final String expectedWKT) + throws DataStoreException + { + final List<Feature> features = getFeatures(resource); + assertEquals(1, features.size()); + final Feature feature = features.get(0); + + GeometryWrapper geometry = Geometries.wrap(feature.getPropertyValue("sis:geometry")).get(); + assertEquals(expectedCRS, IdentifiedObjects.getIdentifierOrName(geometry.getCoordinateReferenceSystem())); + assertEquals(expectedWKT, geometry.formatWKT(1)); + assertEquals(1, feature.getPropertyValue("fid")); + } } diff --git a/incubator/src/org.apache.sis.storage.geopackage/test/org/apache/sis/storage/geopackage/featureset.sql b/incubator/src/org.apache.sis.storage.geopackage/test/org/apache/sis/storage/geopackage/featureset.sql new file mode 100644 index 0000000000..d695c03cda --- /dev/null +++ b/incubator/src/org.apache.sis.storage.geopackage/test/org/apache/sis/storage/geopackage/featureset.sql @@ -0,0 +1,164 @@ +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; +CREATE TABLE gpkg_spatial_ref_sys (srs_name TEXT NOT NULL,srs_id INTEGER NOT NULL PRIMARY KEY,organization TEXT NOT NULL,organization_coordsys_id INTEGER NOT NULL,definition TEXT NOT NULL,description TEXT); +INSERT INTO gpkg_spatial_ref_sys VALUES('Undefined Cartesian SRS',-1,'NONE',-1,'undefined','undefined Cartesian coordinate reference system'); +INSERT INTO gpkg_spatial_ref_sys VALUES('Undefined geographic SRS',0,'NONE',0,'undefined','undefined geographic coordinate reference system'); +INSERT INTO gpkg_spatial_ref_sys VALUES('RGF93 v1 / Lambert-93',2154,'EPSG',2154,'PROJCS["RGF93 v1 / Lambert-93",GEOGCS["RGF93 v1",DATUM["Reseau_Geodesique_Francais_1993_v1",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6171"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4171"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["latitude_of_origin",46.5],PARAMETER["ce [...] +INSERT INTO gpkg_spatial_ref_sys VALUES('WGS 84 / World Mercator',3395,'EPSG',3395,'PROJCS["WGS 84 / World Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PA [...] +INSERT INTO gpkg_spatial_ref_sys VALUES('WGS 84 / Pseudo-Mercator',3857,'EPSG',3857,'PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0], [...] +INSERT INTO gpkg_spatial_ref_sys VALUES('WGS 84 geodetic',4326,'EPSG',4326,'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]','longitude/latitude coordinates in decimal degrees on the WGS 84 spheroid'); +INSERT INTO gpkg_spatial_ref_sys VALUES('WGS 84 (CRS84)',100000,'NONE',100000,'GEOGCS["WGS 84 (CRS84)",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Longitude",EAST],AXIS["Latitude",NORTH],AUTHORITY["OGC","CRS84"]]',NULL); +CREATE TABLE gpkg_contents (table_name TEXT NOT NULL PRIMARY KEY,data_type TEXT NOT NULL,identifier TEXT UNIQUE,description TEXT DEFAULT '',last_change DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),min_x DOUBLE, min_y DOUBLE,max_x DOUBLE, max_y DOUBLE,srs_id INTEGER,CONSTRAINT fk_gc_r_srs_id FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys(srs_id)); +INSERT INTO gpkg_contents VALUES('point','features','point','','2024-08-07T08:37:21.588Z',3.8691630363464351,43.6461868286132812,3.86916351318359286,43.6461944580078125,100000); +INSERT INTO gpkg_contents VALUES('nogeom','attributes','nogeom','','2024-08-07T09:00:12.373Z',NULL,NULL,NULL,NULL,0); +INSERT INTO gpkg_contents VALUES('multipoint','features','multipoint','','2024-08-07T08:45:50.870Z',770147.8125,6283233.0,770224.8125,6283260.5,2154); +INSERT INTO gpkg_contents VALUES('line','features','line','','2024-08-07T08:38:06.527Z',430655.71875,5410643.0,430669.3125,5411209.0,3857); +INSERT INTO gpkg_contents VALUES('multiline','features','multiline','','2024-08-07T08:44:38.990Z',430750.46875,5380950.0,430967.15625,5381183.0,3395); +INSERT INTO gpkg_contents VALUES('polygon','features','polygon','','2024-08-07T08:59:29.010Z',430696.03125,5410729.0,430718.03125,5410782.5,3857); +INSERT INTO gpkg_contents VALUES('multipolygon','features','multipolygon','','2024-08-07T08:58:52.118Z',430795.5,5381108.5,430855.46875,5381155.5,3395); +CREATE TABLE gpkg_ogr_contents(table_name TEXT NOT NULL PRIMARY KEY,feature_count INTEGER DEFAULT NULL); +INSERT INTO gpkg_ogr_contents VALUES('point',NULL); +INSERT INTO gpkg_ogr_contents VALUES('nogeom',2); +INSERT INTO gpkg_ogr_contents VALUES('multipoint',NULL); +INSERT INTO gpkg_ogr_contents VALUES('line',NULL); +INSERT INTO gpkg_ogr_contents VALUES('multiline',1); +INSERT INTO gpkg_ogr_contents VALUES('polygon',NULL); +INSERT INTO gpkg_ogr_contents VALUES('multipolygon',NULL); +CREATE TABLE gpkg_geometry_columns (table_name TEXT NOT NULL,column_name TEXT NOT NULL,geometry_type_name TEXT NOT NULL,srs_id INTEGER NOT NULL,z TINYINT NOT NULL,m TINYINT NOT NULL,CONSTRAINT pk_geom_cols PRIMARY KEY (table_name, column_name),CONSTRAINT uk_gc_table_name UNIQUE (table_name),CONSTRAINT fk_gc_tn FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name),CONSTRAINT fk_gc_srs FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys (srs_id)); +INSERT INTO gpkg_geometry_columns VALUES('point','geometry','POINT',100000,0,0); +INSERT INTO gpkg_geometry_columns VALUES('multipoint','geom','MULTIPOINT',2154,0,0); +INSERT INTO gpkg_geometry_columns VALUES('line','geom','LINESTRING',3857,0,0); +INSERT INTO gpkg_geometry_columns VALUES('multiline','geom','MULTILINESTRING',3395,0,0); +INSERT INTO gpkg_geometry_columns VALUES('polygon','geom','POLYGON',3857,0,0); +INSERT INTO gpkg_geometry_columns VALUES('multipolygon','geom','MULTIPOLYGON',3395,0,0); +CREATE TABLE gpkg_tile_matrix_set (table_name TEXT NOT NULL PRIMARY KEY,srs_id INTEGER NOT NULL,min_x DOUBLE NOT NULL,min_y DOUBLE NOT NULL,max_x DOUBLE NOT NULL,max_y DOUBLE NOT NULL,CONSTRAINT fk_gtms_table_name FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name),CONSTRAINT fk_gtms_srs FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys (srs_id)); +CREATE TABLE gpkg_tile_matrix (table_name TEXT NOT NULL,zoom_level INTEGER NOT NULL,matrix_width INTEGER NOT NULL,matrix_height INTEGER NOT NULL,tile_width INTEGER NOT NULL,tile_height INTEGER NOT NULL,pixel_x_size DOUBLE NOT NULL,pixel_y_size DOUBLE NOT NULL,CONSTRAINT pk_ttm PRIMARY KEY (table_name, zoom_level),CONSTRAINT fk_tmm_table_name FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name)); +CREATE TABLE IF NOT EXISTS "point" ( "fid" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "geometry" POINT, "text" TEXT, "int32" MEDIUMINT, "int64" INTEGER, "float" REAL, "date" DATE, "datetime" DATETIME, "bool" BOOLEAN); +INSERT INTO point VALUES(1,X'47500001a08601000101000000edf30bf40bf40e40ba49b649b6d24540','some text',123,123456,123.456000000000003,'2024-08-07','2024-08-07T12:34:56.000',1); +CREATE TABLE gpkg_extensions (table_name TEXT,column_name TEXT,extension_name TEXT NOT NULL,definition TEXT NOT NULL,scope TEXT NOT NULL,CONSTRAINT ge_tce UNIQUE (table_name, column_name, extension_name)); +INSERT INTO gpkg_extensions VALUES('point','geometry','gpkg_rtree_index','http://www.geopackage.org/spec120/#extension_rtree','write-only'); +INSERT INTO gpkg_extensions VALUES('multipoint','geom','gpkg_rtree_index','http://www.geopackage.org/spec120/#extension_rtree','write-only'); +INSERT INTO gpkg_extensions VALUES('line','geom','gpkg_rtree_index','http://www.geopackage.org/spec120/#extension_rtree','write-only'); +INSERT INTO gpkg_extensions VALUES('multiline','geom','gpkg_rtree_index','http://www.geopackage.org/spec120/#extension_rtree','write-only'); +INSERT INTO gpkg_extensions VALUES('polygon','geom','gpkg_rtree_index','http://www.geopackage.org/spec120/#extension_rtree','write-only'); +INSERT INTO gpkg_extensions VALUES('multipolygon','geom','gpkg_rtree_index','http://www.geopackage.org/spec120/#extension_rtree','write-only'); +CREATE TABLE IF NOT EXISTS "rtree_point_geometry_rowid"(rowid INTEGER PRIMARY KEY,nodeno); +INSERT INTO rtree_point_geometry_rowid VALUES(1,1); +CREATE TABLE IF NOT EXISTS "rtree_point_geometry_node"(nodeno INTEGER PRIMARY KEY,data); +INSERT INTO rtree_point_geometry_node VALUES(1,X'0000000100000000000000014077a05e4077a060422e95b2422e95b4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 [...] +CREATE TABLE IF NOT EXISTS "rtree_point_geometry_parent"(nodeno INTEGER PRIMARY KEY,parentnode); +CREATE TABLE IF NOT EXISTS "nogeom" ( "fid" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "id" MEDIUMINT); +INSERT INTO nogeom VALUES(1,1); +INSERT INTO nogeom VALUES(2,2); +CREATE TABLE IF NOT EXISTS "multipoint" ( "fid" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "geom" MULTIPOINT); +INSERT INTO multipoint VALUES(1,X'475000036a0800008ee861d1c78027415450426a61812741eff39d7cf8f757416e385e14fff7574101040000000200000001010000008ee861d1c78027416e385e14fff7574101010000005450426a61812741eff39d7cf8f75741'); +CREATE TABLE IF NOT EXISTS "rtree_multipoint_geom_rowid"(rowid INTEGER PRIMARY KEY,nodeno); +INSERT INTO rtree_multipoint_geom_rowid VALUES(1,1); +CREATE TABLE IF NOT EXISTS "rtree_multipoint_geom_node"(nodeno INTEGER PRIMARY KEY,data); +INSERT INTO rtree_multipoint_geom_node VALUES(1,X'000000010000000000000001493c063d493c0b0d4abfbfc24abfbff900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 [...] +CREATE TABLE IF NOT EXISTS "rtree_multipoint_geom_parent"(nodeno INTEGER PRIMARY KEY,parentnode); +CREATE TABLE IF NOT EXISTS "line" ( "fid" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "geom" LINESTRING); +INSERT INTO line VALUES(1,X'47500003110f0000ab8a0d19ff481a415774d83d35491a41b74bc5c7d4a354411422d03e62a454410102000000020000005774d83d35491a411422d03e62a45441ab8a0d19ff481a41b74bc5c7d4a35441'); +CREATE TABLE IF NOT EXISTS "rtree_line_geom_rowid"(rowid INTEGER PRIMARY KEY,nodeno); +INSERT INTO rtree_line_geom_rowid VALUES(1,1); +CREATE TABLE IF NOT EXISTS "rtree_line_geom_node"(nodeno INTEGER PRIMARY KEY,data); +INSERT INTO rtree_line_geom_node VALUES(1,X'00000001000000000000000148d247f748d249aa4aa51ea64aa5231200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 [...] +CREATE TABLE IF NOT EXISTS "rtree_line_geom_parent"(nodeno INTEGER PRIMARY KEY,parentnode); +CREATE TABLE IF NOT EXISTS "multiline" ( "fid" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "geom" MULTILINESTRING); +INSERT INTO multiline VALUES(1,X'47500003430d000054ee991a7a4a1a41fc884867dc4d1a412ff8beb0d5865441908df9a40f87544101050000000200000001020000000200000054ee991a7a4a1a4188dc020cff865441fc884867dc4d1a412ff8beb0d58654410102000000020000002b862452844a1a41e028fd6008875441326594d6174d1a41908df9a40f875441'); +CREATE TABLE IF NOT EXISTS "rtree_multiline_geom_rowid"(rowid INTEGER PRIMARY KEY,nodeno); +INSERT INTO rtree_multiline_geom_rowid VALUES(1,1); +CREATE TABLE IF NOT EXISTS "rtree_multiline_geom_node"(nodeno INTEGER PRIMARY KEY,data); +INSERT INTO rtree_multiline_geom_node VALUES(1,X'00000001000000000000000148d253cf48d26ee54aa436ac4aa4387e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 [...] +CREATE TABLE IF NOT EXISTS "rtree_multiline_geom_parent"(nodeno INTEGER PRIMARY KEY,parentnode); +CREATE TABLE IF NOT EXISTS "polygon" ( "fid" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "geom" POLYGON); +INSERT INTO polygon VALUES(1,X'47500003110f0000d847bc20a0491a41d9a94210f8491a4116c9ba40eaa354412920c59ef7a3544101030000000100000005000000d049f7e2a1491a412920c59ef7a35441d847bc20a0491a4116c9ba40eaa35441f8a391c9f2491a414cc8808eeaa35441d9a94210f8491a41c8e83803f7a35441d049f7e2a1491a412920c59ef7a35441'); +CREATE TABLE IF NOT EXISTS "rtree_polygon_geom_rowid"(rowid INTEGER PRIMARY KEY,nodeno); +INSERT INTO rtree_polygon_geom_rowid VALUES(1,1); +CREATE TABLE IF NOT EXISTS "rtree_polygon_geom_node"(nodeno INTEGER PRIMARY KEY,data); +INSERT INTO rtree_polygon_geom_node VALUES(1,X'00000001000000000000000148d24d0148d24fc14aa51f524aa51fbd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 [...] +CREATE TABLE IF NOT EXISTS "rtree_polygon_geom_parent"(nodeno INTEGER PRIMARY KEY,parentnode); +CREATE TABLE IF NOT EXISTS "multipolygon" ( "fid" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "geom" MULTIPOLYGON); +INSERT INTO multipolygon VALUES(1,X'47500003430d000051c362092e4b1a41618e4aa91d4c1a4153af852dfd86544120deecde088754410106000000020000000103000000010000000500000051c362092e4b1a415a3325b5fd8654413848f66e324b1a413a52015302875441fae6a1e3c04b1a4108f291870187544197a17f0dbc4b1a4153af852dfd86544151c362092e4b1a415a3325b5fd86544101030000000100000005000000f072100a054c1a4120deecde0887544170b28199044c1a41577b5dd907875441e94c9e571c4c1a4163750de307875441618e4aa91d4c1a41edf42cb808875441f072100a054c1a4120 [...] +CREATE TABLE IF NOT EXISTS "rtree_multipolygon_geom_rowid"(rowid INTEGER PRIMARY KEY,nodeno); +INSERT INTO rtree_multipolygon_geom_rowid VALUES(1,1); +CREATE TABLE IF NOT EXISTS "rtree_multipolygon_geom_node"(nodeno INTEGER PRIMARY KEY,data); +INSERT INTO rtree_multipolygon_geom_node VALUES(1,X'00000001000000000000000148d2597048d260ef4aa437e94aa43847000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 [...] +CREATE TABLE IF NOT EXISTS "rtree_multipolygon_geom_parent"(nodeno INTEGER PRIMARY KEY,parentnode); +PRAGMA writable_schema=ON; +INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)VALUES('table','rtree_point_geometry','rtree_point_geometry',0,'CREATE VIRTUAL TABLE "rtree_point_geometry" USING rtree(id, minx, maxx, miny, maxy)'); +INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)VALUES('table','rtree_multipoint_geom','rtree_multipoint_geom',0,'CREATE VIRTUAL TABLE "rtree_multipoint_geom" USING rtree(id, minx, maxx, miny, maxy)'); +INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)VALUES('table','rtree_line_geom','rtree_line_geom',0,'CREATE VIRTUAL TABLE "rtree_line_geom" USING rtree(id, minx, maxx, miny, maxy)'); +INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)VALUES('table','rtree_multiline_geom','rtree_multiline_geom',0,'CREATE VIRTUAL TABLE "rtree_multiline_geom" USING rtree(id, minx, maxx, miny, maxy)'); +INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)VALUES('table','rtree_polygon_geom','rtree_polygon_geom',0,'CREATE VIRTUAL TABLE "rtree_polygon_geom" USING rtree(id, minx, maxx, miny, maxy)'); +INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)VALUES('table','rtree_multipolygon_geom','rtree_multipolygon_geom',0,'CREATE VIRTUAL TABLE "rtree_multipolygon_geom" USING rtree(id, minx, maxx, miny, maxy)'); +DELETE FROM sqlite_sequence; +INSERT INTO sqlite_sequence VALUES('point',1); +INSERT INTO sqlite_sequence VALUES('line',1); +INSERT INTO sqlite_sequence VALUES('multiline',1); +INSERT INTO sqlite_sequence VALUES('multipoint',1); +INSERT INTO sqlite_sequence VALUES('multipolygon',1); +INSERT INTO sqlite_sequence VALUES('polygon',1); +INSERT INTO sqlite_sequence VALUES('nogeom',2); +CREATE TRIGGER 'gpkg_tile_matrix_zoom_level_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: zoom_level cannot be less than 0') WHERE (NEW.zoom_level < 0); END; +CREATE TRIGGER 'gpkg_tile_matrix_zoom_level_update' BEFORE UPDATE of zoom_level ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: zoom_level cannot be less than 0') WHERE (NEW.zoom_level < 0); END; +CREATE TRIGGER 'gpkg_tile_matrix_matrix_width_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: matrix_width cannot be less than 1') WHERE (NEW.matrix_width < 1); END; +CREATE TRIGGER 'gpkg_tile_matrix_matrix_width_update' BEFORE UPDATE OF matrix_width ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: matrix_width cannot be less than 1') WHERE (NEW.matrix_width < 1); END; +CREATE TRIGGER 'gpkg_tile_matrix_matrix_height_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: matrix_height cannot be less than 1') WHERE (NEW.matrix_height < 1); END; +CREATE TRIGGER 'gpkg_tile_matrix_matrix_height_update' BEFORE UPDATE OF matrix_height ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: matrix_height cannot be less than 1') WHERE (NEW.matrix_height < 1); END; +CREATE TRIGGER 'gpkg_tile_matrix_pixel_x_size_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: pixel_x_size must be greater than 0') WHERE NOT (NEW.pixel_x_size > 0); END; +CREATE TRIGGER 'gpkg_tile_matrix_pixel_x_size_update' BEFORE UPDATE OF pixel_x_size ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: pixel_x_size must be greater than 0') WHERE NOT (NEW.pixel_x_size > 0); END; +CREATE TRIGGER 'gpkg_tile_matrix_pixel_y_size_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: pixel_y_size must be greater than 0') WHERE NOT (NEW.pixel_y_size > 0); END; +CREATE TRIGGER 'gpkg_tile_matrix_pixel_y_size_update' BEFORE UPDATE OF pixel_y_size ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: pixel_y_size must be greater than 0') WHERE NOT (NEW.pixel_y_size > 0); END; +CREATE TRIGGER "rtree_point_geometry_insert" AFTER INSERT ON "point" WHEN (new."geometry" NOT NULL AND NOT ST_IsEmpty(NEW."geometry")) BEGIN INSERT OR REPLACE INTO "rtree_point_geometry" VALUES (NEW."fid",ST_MinX(NEW."geometry"), ST_MaxX(NEW."geometry"),ST_MinY(NEW."geometry"), ST_MaxY(NEW."geometry")); END; +CREATE TRIGGER "rtree_point_geometry_update1" AFTER UPDATE OF "geometry" ON "point" WHEN OLD."fid" = NEW."fid" AND (NEW."geometry" NOTNULL AND NOT ST_IsEmpty(NEW."geometry")) BEGIN INSERT OR REPLACE INTO "rtree_point_geometry" VALUES (NEW."fid",ST_MinX(NEW."geometry"), ST_MaxX(NEW."geometry"),ST_MinY(NEW."geometry"), ST_MaxY(NEW."geometry")); END; +CREATE TRIGGER "rtree_point_geometry_update2" AFTER UPDATE OF "geometry" ON "point" WHEN OLD."fid" = NEW."fid" AND (NEW."geometry" ISNULL OR ST_IsEmpty(NEW."geometry")) BEGIN DELETE FROM "rtree_point_geometry" WHERE id = OLD."fid"; END; +CREATE TRIGGER "rtree_point_geometry_update3" AFTER UPDATE ON "point" WHEN OLD."fid" != NEW."fid" AND (NEW."geometry" NOTNULL AND NOT ST_IsEmpty(NEW."geometry")) BEGIN DELETE FROM "rtree_point_geometry" WHERE id = OLD."fid"; INSERT OR REPLACE INTO "rtree_point_geometry" VALUES (NEW."fid",ST_MinX(NEW."geometry"), ST_MaxX(NEW."geometry"),ST_MinY(NEW."geometry"), ST_MaxY(NEW."geometry")); END; +CREATE TRIGGER "rtree_point_geometry_update4" AFTER UPDATE ON "point" WHEN OLD."fid" != NEW."fid" AND (NEW."geometry" ISNULL OR ST_IsEmpty(NEW."geometry")) BEGIN DELETE FROM "rtree_point_geometry" WHERE id IN (OLD."fid", NEW."fid"); END; +CREATE TRIGGER "rtree_point_geometry_delete" AFTER DELETE ON "point" WHEN old."geometry" NOT NULL BEGIN DELETE FROM "rtree_point_geometry" WHERE id = OLD."fid"; END; +CREATE TRIGGER "rtree_multipoint_geom_insert" AFTER INSERT ON "multipoint" WHEN (new."geom" NOT NULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_multipoint_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_multipoint_geom_update1" AFTER UPDATE OF "geom" ON "multipoint" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_multipoint_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_multipoint_geom_update2" AFTER UPDATE OF "geom" ON "multipoint" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multipoint_geom" WHERE id = OLD."fid"; END; +CREATE TRIGGER "rtree_multipoint_geom_update3" AFTER UPDATE ON "multipoint" WHEN OLD."fid" != NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multipoint_geom" WHERE id = OLD."fid"; INSERT OR REPLACE INTO "rtree_multipoint_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_multipoint_geom_update4" AFTER UPDATE ON "multipoint" WHEN OLD."fid" != NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multipoint_geom" WHERE id IN (OLD."fid", NEW."fid"); END; +CREATE TRIGGER "rtree_multipoint_geom_delete" AFTER DELETE ON "multipoint" WHEN old."geom" NOT NULL BEGIN DELETE FROM "rtree_multipoint_geom" WHERE id = OLD."fid"; END; +CREATE TRIGGER "rtree_line_geom_insert" AFTER INSERT ON "line" WHEN (new."geom" NOT NULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_line_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_line_geom_update1" AFTER UPDATE OF "geom" ON "line" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_line_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_line_geom_update2" AFTER UPDATE OF "geom" ON "line" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_line_geom" WHERE id = OLD."fid"; END; +CREATE TRIGGER "rtree_line_geom_update3" AFTER UPDATE ON "line" WHEN OLD."fid" != NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_line_geom" WHERE id = OLD."fid"; INSERT OR REPLACE INTO "rtree_line_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_line_geom_update4" AFTER UPDATE ON "line" WHEN OLD."fid" != NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_line_geom" WHERE id IN (OLD."fid", NEW."fid"); END; +CREATE TRIGGER "rtree_line_geom_delete" AFTER DELETE ON "line" WHEN old."geom" NOT NULL BEGIN DELETE FROM "rtree_line_geom" WHERE id = OLD."fid"; END; +CREATE TRIGGER "rtree_multiline_geom_insert" AFTER INSERT ON "multiline" WHEN (new."geom" NOT NULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_multiline_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_multiline_geom_update1" AFTER UPDATE OF "geom" ON "multiline" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_multiline_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_multiline_geom_update2" AFTER UPDATE OF "geom" ON "multiline" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multiline_geom" WHERE id = OLD."fid"; END; +CREATE TRIGGER "rtree_multiline_geom_update3" AFTER UPDATE ON "multiline" WHEN OLD."fid" != NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multiline_geom" WHERE id = OLD."fid"; INSERT OR REPLACE INTO "rtree_multiline_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_multiline_geom_update4" AFTER UPDATE ON "multiline" WHEN OLD."fid" != NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multiline_geom" WHERE id IN (OLD."fid", NEW."fid"); END; +CREATE TRIGGER "rtree_multiline_geom_delete" AFTER DELETE ON "multiline" WHEN old."geom" NOT NULL BEGIN DELETE FROM "rtree_multiline_geom" WHERE id = OLD."fid"; END; +CREATE TRIGGER "rtree_polygon_geom_insert" AFTER INSERT ON "polygon" WHEN (new."geom" NOT NULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_polygon_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_polygon_geom_update1" AFTER UPDATE OF "geom" ON "polygon" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_polygon_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_polygon_geom_update2" AFTER UPDATE OF "geom" ON "polygon" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_polygon_geom" WHERE id = OLD."fid"; END; +CREATE TRIGGER "rtree_polygon_geom_update3" AFTER UPDATE ON "polygon" WHEN OLD."fid" != NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_polygon_geom" WHERE id = OLD."fid"; INSERT OR REPLACE INTO "rtree_polygon_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_polygon_geom_update4" AFTER UPDATE ON "polygon" WHEN OLD."fid" != NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_polygon_geom" WHERE id IN (OLD."fid", NEW."fid"); END; +CREATE TRIGGER "rtree_polygon_geom_delete" AFTER DELETE ON "polygon" WHEN old."geom" NOT NULL BEGIN DELETE FROM "rtree_polygon_geom" WHERE id = OLD."fid"; END; +CREATE TRIGGER "rtree_multipolygon_geom_insert" AFTER INSERT ON "multipolygon" WHEN (new."geom" NOT NULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_multipolygon_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_multipolygon_geom_update1" AFTER UPDATE OF "geom" ON "multipolygon" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_multipolygon_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_multipolygon_geom_update2" AFTER UPDATE OF "geom" ON "multipolygon" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multipolygon_geom" WHERE id = OLD."fid"; END; +CREATE TRIGGER "rtree_multipolygon_geom_update3" AFTER UPDATE ON "multipolygon" WHEN OLD."fid" != NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multipolygon_geom" WHERE id = OLD."fid"; INSERT OR REPLACE INTO "rtree_multipolygon_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END; +CREATE TRIGGER "rtree_multipolygon_geom_update4" AFTER UPDATE ON "multipolygon" WHEN OLD."fid" != NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multipolygon_geom" WHERE id IN (OLD."fid", NEW."fid"); END; +CREATE TRIGGER "rtree_multipolygon_geom_delete" AFTER DELETE ON "multipolygon" WHEN old."geom" NOT NULL BEGIN DELETE FROM "rtree_multipolygon_geom" WHERE id = OLD."fid"; END; +CREATE TRIGGER "trigger_insert_feature_count_point" AFTER INSERT ON "point" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count + 1 WHERE lower(table_name) = lower('point'); END; +CREATE TRIGGER "trigger_delete_feature_count_point" AFTER DELETE ON "point" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count - 1 WHERE lower(table_name) = lower('point'); END; +CREATE TRIGGER "trigger_insert_feature_count_line" AFTER INSERT ON "line" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count + 1 WHERE lower(table_name) = lower('line'); END; +CREATE TRIGGER "trigger_delete_feature_count_line" AFTER DELETE ON "line" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count - 1 WHERE lower(table_name) = lower('line'); END; +CREATE TRIGGER "trigger_insert_feature_count_multiline" AFTER INSERT ON "multiline" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count + 1 WHERE lower(table_name) = lower('multiline'); END; +CREATE TRIGGER "trigger_delete_feature_count_multiline" AFTER DELETE ON "multiline" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count - 1 WHERE lower(table_name) = lower('multiline'); END; +CREATE TRIGGER "trigger_insert_feature_count_multipoint" AFTER INSERT ON "multipoint" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count + 1 WHERE lower(table_name) = lower('multipoint'); END; +CREATE TRIGGER "trigger_delete_feature_count_multipoint" AFTER DELETE ON "multipoint" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count - 1 WHERE lower(table_name) = lower('multipoint'); END; +CREATE TRIGGER "trigger_insert_feature_count_multipolygon" AFTER INSERT ON "multipolygon" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count + 1 WHERE lower(table_name) = lower('multipolygon'); END; +CREATE TRIGGER "trigger_delete_feature_count_multipolygon" AFTER DELETE ON "multipolygon" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count - 1 WHERE lower(table_name) = lower('multipolygon'); END; +CREATE TRIGGER "trigger_insert_feature_count_polygon" AFTER INSERT ON "polygon" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count + 1 WHERE lower(table_name) = lower('polygon'); END; +CREATE TRIGGER "trigger_delete_feature_count_polygon" AFTER DELETE ON "polygon" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count - 1 WHERE lower(table_name) = lower('polygon'); END; +CREATE TRIGGER "trigger_insert_feature_count_nogeom" AFTER INSERT ON "nogeom" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count + 1 WHERE lower(table_name) = lower('nogeom'); END; +CREATE TRIGGER "trigger_delete_feature_count_nogeom" AFTER DELETE ON "nogeom" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count - 1 WHERE lower(table_name) = lower('nogeom'); END; +PRAGMA writable_schema=OFF; +COMMIT; diff --git a/netbeans-project/nbproject/project.properties b/netbeans-project/nbproject/project.properties index 887508ad74..b157430750 100644 --- a/netbeans-project/nbproject/project.properties +++ b/netbeans-project/nbproject/project.properties @@ -121,6 +121,7 @@ test.options = --add-modules jama,GeographicLib.Java,\ --add-exports org.apache.sis.referencing/org.apache.sis.referencing.internal=org.apache.sis.openoffice \ --add-exports org.apache.sis.feature/org.apache.sis.feature.privy=org.apache.sis.storage.sql \ --add-exports org.apache.sis.feature/org.apache.sis.geometry.wrapper.jts=org.apache.sis.storage.sql,org.apache.sis.portrayal.map \ + --add-exports org.apache.sis.feature/org.apache.sis.geometry.wrapper=org.apache.sis.storage.geopackage \ --add-exports org.apache.sis.storage/org.apache.sis.storage.base=org.apache.sis.portrayal.map \ --add-exports org.apache.sis.storage/org.apache.sis.storage.test=${modules.list}