diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2019-04-21 21:51:43 +0200 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2019-04-22 15:49:31 +0200 |
| commit | e63f206d994658995505ce322d644fba0b807d5b (patch) | |
| tree | d66d9a82904ca534d77de1204fe70a27ac1f6d4d /data | |
| parent | ebf77064c0ffb0082e4ddf97ae9c5c3cbe3c0411 (diff) | |
| download | PROJ-e63f206d994658995505ce322d644fba0b807d5b.tar.gz PROJ-e63f206d994658995505ce322d644fba0b807d5b.zip | |
Database: make conversion & helmert_transformation updatable views
- Transform conversion as a view, and when inserting into it, actually
insert into 3 tables: conversion_table, conversion_method and conversion_param,
so that method and parameter names are not repeated each time.
- Similarly for helmert_tranformation, insert into helmert_transformation_tabl
and coordinate_operation_method.
This reduces the db size from 6 344 704 bytes to 5 853 184 bytes, without
significant slowdown for queries.
Diffstat (limited to 'data')
| -rw-r--r-- | data/sql/commit.sql | 2 | ||||
| -rw-r--r-- | data/sql/conversion_triggers.sql | 4 | ||||
| -rw-r--r-- | data/sql/ignf.sql | 8 | ||||
| -rw-r--r-- | data/sql/proj_db_table_defs.sql | 432 |
4 files changed, 414 insertions, 32 deletions
diff --git a/data/sql/commit.sql b/data/sql/commit.sql index 7aa91e8e..eb49828a 100644 --- a/data/sql/commit.sql +++ b/data/sql/commit.sql @@ -4,7 +4,7 @@ CREATE INDEX geodetic_crs_datum_idx ON geodetic_crs(datum_auth_name, datum_code) CREATE INDEX geodetic_datum_ellipsoid_idx ON geodetic_datum(ellipsoid_auth_name, ellipsoid_code); CREATE INDEX supersession_idx ON supersession(superseded_table_name, superseded_auth_name, superseded_code); CREATE INDEX deprecation_idx ON deprecation(table_name, deprecated_auth_name, deprecated_code); -CREATE INDEX helmert_transformation_idx ON helmert_transformation(source_crs_auth_name, source_crs_code, target_crs_auth_name, target_crs_code); +CREATE INDEX helmert_transformation_idx ON helmert_transformation_table(source_crs_auth_name, source_crs_code, target_crs_auth_name, target_crs_code); CREATE INDEX grid_transformation_idx ON grid_transformation(source_crs_auth_name, source_crs_code, target_crs_auth_name, target_crs_code); CREATE INDEX other_transformation_idx ON other_transformation(source_crs_auth_name, source_crs_code, target_crs_auth_name, target_crs_code); CREATE INDEX concatenated_operation_idx ON concatenated_operation(source_crs_auth_name, source_crs_code, target_crs_auth_name, target_crs_code); diff --git a/data/sql/conversion_triggers.sql b/data/sql/conversion_triggers.sql index 86eb1afd..001a8174 100644 --- a/data/sql/conversion_triggers.sql +++ b/data/sql/conversion_triggers.sql @@ -1,8 +1,8 @@ --- This file has been generated by scripts/build_db.py. DO NOT EDIT ! CREATE TRIGGER conversion_method_check_insert_trigger -BEFORE INSERT ON conversion -FOR EACH ROW BEGIN +INSTEAD OF INSERT ON conversion +BEGIN SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Lambert Conic Conformal (2SP)') WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '9802' AND (NEW.method_name != 'Lambert Conic Conformal (2SP)' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8821' OR NEW.param1_name != 'Latitude of false origin' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8822' OR NEW.param2_name != 'Longitude of false origin' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8823' OR NEW.param3_name != 'Latitude of 1st standard parallel' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'angle' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8824' OR NEW.param4_name != 'Latitude of 2nd standard parallel' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'angle' OR NEW.param5_auth_name != 'EPSG' OR NEW.param5_code != '8826' OR NEW.param5_name != 'Easting at false origin' OR NEW.param5_value IS NULL OR NEW.param5_uom_auth_name IS NULL OR NEW.param5_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param5_uom_auth_name AND code = NEW.param5_uom_code) != 'length' OR NEW.param6_auth_name != 'EPSG' OR NEW.param6_code != '8827' OR NEW.param6_name != 'Northing at false origin' OR NEW.param6_value IS NULL OR NEW.param6_uom_auth_name IS NULL OR NEW.param6_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param6_uom_auth_name AND code = NEW.param6_uom_code) != 'length' OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL); diff --git a/data/sql/ignf.sql b/data/sql/ignf.sql index b92962da..7bb3cffb 100644 --- a/data/sql/ignf.sql +++ b/data/sql/ignf.sql @@ -1946,8 +1946,8 @@ INSERT INTO "conversion" VALUES('IGNF','PRC010411','LAMBERT IV CORSE',NULL,NULL, INSERT INTO "conversion" VALUES('IGNF','PRC013412','LAMBERT IV CARTO',NULL,NULL,'EPSG','1262','EPSG','9801','Lambert Conic Conformal (1SP)','EPSG','8801','Latitude of natural origin',46.85,'EPSG','9105','EPSG','8802','Longitude of natural origin',0.0,'EPSG','9105','EPSG','8805','Scale factor at natural origin',0.99994471,'EPSG','9201','EPSG','8806','False easting',234.358,'EPSG','9001','EPSG','8807','False northing',4185861.369,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC0307212','UTM SUD FUSEAU 7',NULL,NULL,'EPSG','1886','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-141.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',10000000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC0358195','UTM SUD FUSEAU 58',NULL,NULL,'EPSG','1886','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',165.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',10000000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); -INSERT INTO "conversion" VALUES('IGNF','PRC0508542','GAUSS LABORDE REUNION',NULL,NULL,'EPSG','1262',NULL,NULL,'Gauss Schreiber Transverse Mercator','EPSG','8801','Latitude of natural origin',-21.1166666667,'EPSG','9102','EPSG','8802','Longitude of natural origin',55.5333333333,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',160000.0,'EPSG','9001','EPSG','8807','False northing',50000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); -INSERT INTO "conversion" VALUES('IGNF','PRC0508546','GAUSS LABORDE REUNION',NULL,NULL,'EPSG','1262',NULL,NULL,'Gauss Schreiber Transverse Mercator','EPSG','8801','Latitude of natural origin',-21.1166666667,'EPSG','9102','EPSG','8802','Longitude of natural origin',55.5333333333,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',160000.0,'EPSG','9001','EPSG','8807','False northing',50000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('IGNF','PRC0508542','GAUSS LABORDE REUNION',NULL,NULL,'EPSG','1262','PROJ','gstm','Gauss Schreiber Transverse Mercator','EPSG','8801','Latitude of natural origin',-21.1166666667,'EPSG','9102','EPSG','8802','Longitude of natural origin',55.5333333333,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',160000.0,'EPSG','9001','EPSG','8807','False northing',50000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('IGNF','PRC0508546','GAUSS LABORDE REUNION',NULL,NULL,'EPSG','1262','PROJ','gstm','Gauss Schreiber Transverse Mercator','EPSG','8801','Latitude of natural origin',-21.1166666667,'EPSG','9102','EPSG','8802','Longitude of natural origin',55.5333333333,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',160000.0,'EPSG','9001','EPSG','8807','False northing',50000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC9811430','EQUIRECTANGULAIRE POLYNESIE',NULL,NULL,'EPSG','1262','EPSG','1028','Equidistant Cylindrical','EPSG','8823','Latitude of 1st standard parallel',-15.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',0.0,'EPSG','9102','EPSG','8806','False easting',0.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC0306215','UTM SUD FUSEAU 6',NULL,NULL,'EPSG','1886','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-147.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',10000000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC0306218','UTM SUD FUSEAU 6',NULL,NULL,'EPSG','1886','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-147.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',10000000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); @@ -1955,7 +1955,7 @@ INSERT INTO "conversion" VALUES('IGNF','PRC0306311','UTM SUD FUSEAU 6',NULL,NULL INSERT INTO "conversion" VALUES('IGNF','PRC0306314','UTM SUD FUSEAU 6',NULL,NULL,'EPSG','1886','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-147.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',10000000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC0306317','UTM SUD FUSEAU 6',NULL,NULL,'EPSG','1886','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-147.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',10000000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC0301588','UTM SUD FUSEAU 1',NULL,NULL,'EPSG','1886','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',10000000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); -INSERT INTO "conversion" VALUES('IGNF','PRC0508114','GAUSS LABORDE REUNION',NULL,NULL,'EPSG','1262',NULL,NULL,'Gauss Schreiber Transverse Mercator','EPSG','8801','Latitude of natural origin',-21.1166666667,'EPSG','9102','EPSG','8802','Longitude of natural origin',55.5333333333,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',160000.0,'EPSG','9001','EPSG','8807','False northing',50000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('IGNF','PRC0508114','GAUSS LABORDE REUNION',NULL,NULL,'EPSG','1262','PROJ','gstm','Gauss Schreiber Transverse Mercator','EPSG','8801','Latitude of natural origin',-21.1166666667,'EPSG','9102','EPSG','8802','Longitude of natural origin',55.5333333333,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',160000.0,'EPSG','9001','EPSG','8807','False northing',50000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC9806431','EQUIRECTANGULAIRE LA REUNION',NULL,NULL,'EPSG','1262','EPSG','1028','Equidistant Cylindrical','EPSG','8823','Latitude of 1st standard parallel',-21.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',0.0,'EPSG','9102','EPSG','8806','False easting',0.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC0220527','UTM NORD FUSEAU 20',NULL,NULL,'EPSG','1886','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-63.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC8142383','CC42 (CONIQUE CONFORME ZONE 1)',NULL,NULL,'EPSG','1262','EPSG','9802','Lambert Conic Conformal (2SP)','EPSG','8821','Latitude of false origin',42.0,'EPSG','9102','EPSG','8822','Longitude of false origin',3.0,'EPSG','9102','EPSG','8823','Latitude of 1st standard parallel',41.25,'EPSG','9102','EPSG','8824','Latitude of 2nd standard parallel',42.75,'EPSG','9102','EPSG','8826','Easting at false origin',1700000.0,'EPSG','9001','EPSG','8827','Northing at false origin',1200000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,0); @@ -2018,7 +2018,7 @@ INSERT INTO "conversion" VALUES('IGNF','PRC0230345','UTM NORD FUSEAU 30',NULL,NU INSERT INTO "conversion" VALUES('IGNF','PRC0231346','UTM NORD FUSEAU 31',NULL,NULL,'EPSG','1886','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',3.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC0232348','UTM NORD FUSEAU 32',NULL,NULL,'EPSG','1886','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',9.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC0301545','UTM SUD FUSEAU 1',NULL,NULL,'EPSG','1886','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',10000000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); -INSERT INTO "conversion" VALUES('IGNF','PRC7001567','MILLER GEOPORTAIL',NULL,NULL,'EPSG','1262',NULL,NULL,'PROJ mill',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('IGNF','PRC7001567','MILLER GEOPORTAIL',NULL,NULL,'EPSG','1262','PROJ','mill','PROJ mill',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC0230353','UTM NORD FUSEAU 30',NULL,NULL,'EPSG','1886','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-3.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC0231354','UTM NORD FUSEAU 31',NULL,NULL,'EPSG','1886','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',3.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "conversion" VALUES('IGNF','PRC0232355','UTM NORD FUSEAU 32',NULL,NULL,'EPSG','1886','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',9.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); diff --git a/data/sql/proj_db_table_defs.sql b/data/sql/proj_db_table_defs.sql index b7dcad89..926c7ce9 100644 --- a/data/sql/proj_db_table_defs.sql +++ b/data/sql/proj_db_table_defs.sql @@ -261,8 +261,23 @@ FOR EACH ROW BEGIN WHERE (SELECT dimension FROM coordinate_system WHERE coordinate_system.auth_name = NEW.coordinate_system_auth_name AND coordinate_system.code = NEW.coordinate_system_code) != 1; END; +CREATE TABLE conversion_method( + auth_name TEXT NOT NULL CHECK (length(auth_name) >= 1), + code TEXT NOT NULL CHECK (length(code) >= 1), + name TEXT NOT NULL CHECK (length(name) >= 2), + + CONSTRAINT pk_conversion_method PRIMARY KEY (auth_name, code) +); -CREATE TABLE conversion( +CREATE TABLE conversion_param( + auth_name TEXT NOT NULL CHECK (length(auth_name) >= 1), + code TEXT NOT NULL CHECK (length(code) >= 1), + name TEXT NOT NULL CHECK (length(name) >= 2), + + CONSTRAINT pk_conversion_param PRIMARY KEY (auth_name, code) +); + +CREATE TABLE conversion_table( auth_name TEXT NOT NULL CHECK (length(auth_name) >= 1), code TEXT NOT NULL CHECK (length(code) >= 1), name TEXT NOT NULL CHECK (length(name) >= 2), @@ -275,53 +290,53 @@ CREATE TABLE conversion( method_auth_name TEXT CHECK (method_auth_name IS NULL OR length(method_auth_name) >= 1), method_code TEXT CHECK (method_code IS NULL OR length(method_code) >= 1), - method_name NOT NULL CHECK (length(method_name) >= 2), + -- method_name TEXT, param1_auth_name TEXT, param1_code TEXT, - param1_name TEXT, + -- param1_name TEXT, param1_value FLOAT, param1_uom_auth_name TEXT, param1_uom_code TEXT, param2_auth_name TEXT, param2_code TEXT, - param2_name TEXT, + --param2_name TEXT, param2_value FLOAT, param2_uom_auth_name TEXT, param2_uom_code TEXT, param3_auth_name TEXT, param3_code TEXT, - param3_name TEXT, + --param3_name TEXT, param3_value FLOAT, param3_uom_auth_name TEXT, param3_uom_code TEXT, param4_auth_name TEXT, param4_code TEXT, - param4_name TEXT, + --param4_name TEXT, param4_value FLOAT, param4_uom_auth_name TEXT, param4_uom_code TEXT, param5_auth_name TEXT, param5_code TEXT, - param5_name TEXT, + --param5_name TEXT, param5_value FLOAT, param5_uom_auth_name TEXT, param5_uom_code TEXT, param6_auth_name TEXT, param6_code TEXT, - param6_name TEXT, + --param6_name TEXT, param6_value FLOAT, param6_uom_auth_name TEXT, param6_uom_code TEXT, param7_auth_name TEXT, param7_code TEXT, - param7_name TEXT, + --param7_name TEXT, param7_value FLOAT, param7_uom_auth_name TEXT, param7_uom_code TEXT, @@ -330,6 +345,7 @@ CREATE TABLE conversion( CONSTRAINT pk_conversion PRIMARY KEY (auth_name, code), CONSTRAINT fk_conversion_area FOREIGN KEY (area_of_use_auth_name, area_of_use_code) REFERENCES area(auth_name, code), + CONSTRAINT fk_conversion_method FOREIGN KEY (method_auth_name, method_code) REFERENCES conversion_method(auth_name, code), --CONSTRAINT fk_conversion_coordinate_operation FOREIGN KEY (auth_name, code) REFERENCES coordinate_operation(auth_name, code), CONSTRAINT fk_conversion_param1_uom FOREIGN KEY (param1_uom_auth_name, param1_uom_code) REFERENCES unit_of_measure(auth_name, code), CONSTRAINT fk_conversion_param2_uom FOREIGN KEY (param2_uom_auth_name, param2_uom_code) REFERENCES unit_of_measure(auth_name, code), @@ -340,15 +356,89 @@ CREATE TABLE conversion( CONSTRAINT fk_conversion_param7_uom FOREIGN KEY (param7_uom_auth_name, param7_uom_code) REFERENCES unit_of_measure(auth_name, code) ); -CREATE TRIGGER conversion_insert_trigger -BEFORE INSERT ON conversion -FOR EACH ROW BEGIN +CREATE VIEW conversion AS SELECT + c.auth_name, + c.code, + c.name, + + c.description, + c.scope, + + c.area_of_use_auth_name, + c.area_of_use_code, + + c.method_auth_name, + c.method_code, + m.name AS method_name, + + c.param1_auth_name, + c.param1_code, + param1.name AS param1_name, + c.param1_value, + c.param1_uom_auth_name, + c.param1_uom_code, + + c.param2_auth_name, + c.param2_code, + param2.name AS param2_name, + c.param2_value, + c.param2_uom_auth_name, + c.param2_uom_code, + + c.param3_auth_name, + c.param3_code, + param3.name AS param3_name, + c.param3_value, + c.param3_uom_auth_name, + c.param3_uom_code, + + c.param4_auth_name, + c.param4_code, + param4.name AS param4_name, + c.param4_value, + c.param4_uom_auth_name, + c.param4_uom_code, + + c.param5_auth_name, + c.param5_code, + param5.name AS param5_name, + c.param5_value, + c.param5_uom_auth_name, + c.param5_uom_code, + + c.param6_auth_name, + c.param6_code, + param6.name AS param6_name, + c.param6_value, + c.param6_uom_auth_name, + c.param6_uom_code, + + c.param7_auth_name, + c.param7_code, + param7.name AS param7_name, + c.param7_value, + c.param7_uom_auth_name, + c.param7_uom_code, + + c.deprecated + + FROM conversion_table c + LEFT JOIN conversion_method m ON c.method_auth_name = m.auth_name AND c.method_code = m.code + LEFT JOIN conversion_param param1 ON c.param1_auth_name = param1.auth_name AND c.param1_code = param1.code + LEFT JOIN conversion_param param2 ON c.param2_auth_name = param2.auth_name AND c.param2_code = param2.code + LEFT JOIN conversion_param param3 ON c.param3_auth_name = param3.auth_name AND c.param3_code = param3.code + LEFT JOIN conversion_param param4 ON c.param4_auth_name = param4.auth_name AND c.param4_code = param4.code + LEFT JOIN conversion_param param5 ON c.param5_auth_name = param5.auth_name AND c.param5_code = param5.code + LEFT JOIN conversion_param param6 ON c.param6_auth_name = param6.auth_name AND c.param6_code = param6.code + LEFT JOIN conversion_param param7 ON c.param7_auth_name = param7.auth_name AND c.param7_code = param7.code +; - SELECT RAISE(ABORT, 'insert on conversion violates constraint: (auth_name, code) must not already exist in coordinate_operation_with_conversion_view') - WHERE EXISTS (SELECT 1 FROM coordinate_operation_with_conversion_view covwv WHERE covwv.auth_name = NEW.auth_name AND covwv.code = NEW.code); +CREATE TRIGGER conversion_method_insert_trigger +BEFORE INSERT ON conversion_method +BEGIN SELECT RAISE(ABORT, 'insert on conversion violates constraint: method should be known') - WHERE ((CASE WHEN NEW.method_auth_name is NULL THEN '' ELSE NEW.method_auth_name END) || '_' || (CASE WHEN NEW.method_code is NULL THEN '' ELSE NEW.method_code END) || '_' || NEW.method_name) NOT IN ( + WHERE (NEW.auth_name || '_' || NEW.code || '_' || NEW.name) NOT IN ( 'EPSG_1024_Popular Visualisation Pseudo Mercator', 'EPSG_1027_Lambert Azimuthal Equal Area (Spherical)', 'EPSG_1028_Equidistant Cylindrical', @@ -403,8 +493,151 @@ FOR EACH ROW BEGIN 'EPSG_9843_Axis Order Reversal (2D)', 'EPSG_9844_Axis Order Reversal (Geographic3D horizontal)', 'EPSG_9827_Bonne', - '__Gauss Schreiber Transverse Mercator', - '__PROJ mill'); + 'PROJ_gstm_Gauss Schreiber Transverse Mercator', + 'PROJ_mill_PROJ mill'); +END; + +CREATE TRIGGER conversion_table_insert_trigger +BEFORE INSERT ON conversion_table +BEGIN + SELECT RAISE(ABORT, 'insert on conversion_table violates constraint: (auth_name, code) must not already exist in coordinate_operation_with_conversion_view') + WHERE EXISTS (SELECT 1 FROM coordinate_operation_with_conversion_view covwv WHERE covwv.auth_name = NEW.auth_name AND covwv.code = NEW.code); +END; + +CREATE TRIGGER conversion_insert_trigger_method +INSTEAD OF INSERT ON conversion + WHEN NOT EXISTS (SELECT 1 FROM conversion_method m WHERE + m.auth_name = NEW.method_auth_name AND m.code = NEW.method_code AND m.name = NEW.method_name) +BEGIN + INSERT INTO conversion_method VALUES (NEW.method_auth_name, NEW.method_code, NEW.method_name); +END; + +CREATE TRIGGER conversion_insert_trigger_param1 +INSTEAD OF INSERT ON conversion + WHEN NEW.param1_auth_name is NOT NULL AND NOT EXISTS + (SELECT 1 FROM conversion_param p WHERE p.auth_name = NEW.param1_auth_name AND p.code = NEW.param1_code AND p.name = NEW.param1_name) +BEGIN + INSERT INTO conversion_param VALUES (NEW.param1_auth_name, NEW.param1_code, NEW.param1_name); +END; + +CREATE TRIGGER conversion_insert_trigger_param2 +INSTEAD OF INSERT ON conversion + WHEN NEW.param2_auth_name is NOT NULL AND NOT EXISTS + (SELECT 1 FROM conversion_param p WHERE p.auth_name = NEW.param2_auth_name AND p.code = NEW.param2_code AND p.name = NEW.param2_name) +BEGIN + INSERT INTO conversion_param VALUES (NEW.param2_auth_name, NEW.param2_code, NEW.param2_name); +END; + +CREATE TRIGGER conversion_insert_trigger_param3 +INSTEAD OF INSERT ON conversion + WHEN NEW.param3_auth_name is NOT NULL AND NOT EXISTS + (SELECT 1 FROM conversion_param p WHERE p.auth_name = NEW.param3_auth_name AND p.code = NEW.param3_code AND p.name = NEW.param3_name) +BEGIN + INSERT INTO conversion_param VALUES (NEW.param3_auth_name, NEW.param3_code, NEW.param3_name); +END; + +CREATE TRIGGER conversion_insert_trigger_param4 +INSTEAD OF INSERT ON conversion + WHEN NEW.param4_auth_name is NOT NULL AND NOT EXISTS + (SELECT 1 FROM conversion_param p WHERE p.auth_name = NEW.param4_auth_name AND p.code = NEW.param4_code AND p.name = NEW.param4_name) +BEGIN + INSERT INTO conversion_param VALUES (NEW.param4_auth_name, NEW.param4_code, NEW.param4_name); +END; + +CREATE TRIGGER conversion_insert_trigger_param5 +INSTEAD OF INSERT ON conversion + WHEN NEW.param5_auth_name is NOT NULL AND NOT EXISTS + (SELECT 1 FROM conversion_param p WHERE p.auth_name = NEW.param5_auth_name AND p.code = NEW.param5_code AND p.name = NEW.param5_name) +BEGIN + INSERT INTO conversion_param VALUES (NEW.param5_auth_name, NEW.param5_code, NEW.param5_name); +END; + +CREATE TRIGGER conversion_insert_trigger_param6 +INSTEAD OF INSERT ON conversion + WHEN NEW.param6_auth_name is NOT NULL AND NOT EXISTS + (SELECT 1 FROM conversion_param p WHERE p.auth_name = NEW.param6_auth_name AND p.code = NEW.param6_code AND p.name = NEW.param6_name) +BEGIN + INSERT INTO conversion_param VALUES (NEW.param6_auth_name, NEW.param6_code, NEW.param6_name); +END; + +CREATE TRIGGER conversion_insert_trigger_param7 +INSTEAD OF INSERT ON conversion + WHEN NEW.param7_auth_name is NOT NULL AND NOT EXISTS + (SELECT 1 FROM conversion_param p WHERE p.auth_name = NEW.param7_auth_name AND p.code = NEW.param7_code AND p.name = NEW.param7_name) +BEGIN + INSERT INTO conversion_param VALUES (NEW.param7_auth_name, NEW.param7_code, NEW.param7_name); +END; + +CREATE TRIGGER conversion_insert_trigger_insert_into_conversion_table +INSTEAD OF INSERT ON conversion +BEGIN +INSERT INTO conversion_table VALUES +( + NEW.auth_name, + NEW.code, + NEW.name, + + NEW.description, + NEW.scope, + + NEW.area_of_use_auth_name, + NEW.area_of_use_code, + + NEW.method_auth_name, + NEW.method_code, + --NEW.method_name, + + NEW.param1_auth_name, + NEW.param1_code, + --NEW.param1_name, + NEW.param1_value, + NEW.param1_uom_auth_name, + NEW.param1_uom_code, + + NEW.param2_auth_name, + NEW.param2_code, + --NEW.param2_name, + NEW.param2_value, + NEW.param2_uom_auth_name, + NEW.param2_uom_code, + + NEW.param3_auth_name, + NEW.param3_code, + --NEW.param3_name, + NEW.param3_value, + NEW.param3_uom_auth_name, + NEW.param3_uom_code, + + NEW.param4_auth_name, + NEW.param4_code, + --NEW.param4_name, + NEW.param4_value, + NEW.param4_uom_auth_name, + NEW.param4_uom_code, + + NEW.param5_auth_name, + NEW.param5_code, + --NEW.param5_name, + NEW.param5_value, + NEW.param5_uom_auth_name, + NEW.param5_uom_code, + + NEW.param6_auth_name, + NEW.param6_code, + --NEW.param6_name, + NEW.param6_value, + NEW.param6_uom_auth_name, + NEW.param6_uom_code, + + NEW.param7_auth_name, + NEW.param7_code, + --NEW.param7_name, + NEW.param7_value, + NEW.param7_uom_auth_name, + NEW.param7_uom_code, + + NEW.deprecated +); END; CREATE TABLE projected_crs( @@ -426,7 +659,7 @@ CREATE TABLE projected_crs( CONSTRAINT pk_projected_crs PRIMARY KEY (auth_name, code), CONSTRAINT fk_projected_crs_coordinate_system FOREIGN KEY (coordinate_system_auth_name, coordinate_system_code) REFERENCES coordinate_system(auth_name, code), CONSTRAINT fk_projected_crs_geodetic_crs FOREIGN KEY (geodetic_crs_auth_name, geodetic_crs_code) REFERENCES geodetic_crs(auth_name, code), - CONSTRAINT fk_projected_crs_conversion FOREIGN KEY (conversion_auth_name, conversion_code) REFERENCES conversion(auth_name, code), + CONSTRAINT fk_projected_crs_conversion FOREIGN KEY (conversion_auth_name, conversion_code) REFERENCES conversion_table(auth_name, code), CONSTRAINT fk_projected_crs_area FOREIGN KEY (area_of_use_auth_name, area_of_use_code) REFERENCES area(auth_name, code) ); @@ -443,8 +676,8 @@ FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on projected_crs violates constraint: geodetic_crs must be defined when text_definition is NULL') WHERE (NEW.geodetic_crs_auth_name IS NULL OR NEW.geodetic_crs_code IS NULL) AND NEW.text_definition IS NULL; - SELECT RAISE(ABORT, 'insert on projected_crs violates constraint: conversion must be defined when text_definition is NULL') - WHERE (NEW.conversion_auth_name IS NULL OR NEW.conversion_code IS NULL) AND NEW.text_definition IS NULL; + SELECT RAISE(ABORT, 'insert on projected_crs violates constraint: conversion must exist when text_definition is NULL') + WHERE NOT EXISTS(SELECT 1 FROM conversion WHERE conversion.auth_name = NEW.conversion_auth_name AND conversion.code = NEW.conversion_code) AND NEW.text_definition IS NULL; SELECT RAISE(ABORT, 'insert on projected_crs violates constraint: coordinate_system must NOT be defined when text_definition is NOT NULL') WHERE (NOT(NEW.coordinate_system_auth_name IS NULL OR NEW.coordinate_system_code IS NULL)) AND NEW.text_definition IS NOT NULL; @@ -501,7 +734,15 @@ FOR EACH ROW BEGIN WHERE (SELECT type FROM crs_view WHERE crs_view.auth_name = NEW.vertical_crs_auth_name AND crs_view.code = NEW.vertical_crs_code) NOT IN ('vertical'); END; -CREATE TABLE helmert_transformation( +CREATE TABLE coordinate_operation_method( + auth_name TEXT NOT NULL CHECK (length(auth_name) >= 1), + code TEXT NOT NULL CHECK (length(code) >= 1), + name TEXT NOT NULL CHECK (length(name) >= 2), + + CONSTRAINT pk_coordinate_operation_method PRIMARY KEY (auth_name, code) +); + +CREATE TABLE helmert_transformation_table( auth_name TEXT NOT NULL CHECK (length(auth_name) >= 1), code TEXT NOT NULL CHECK (length(code) >= 1), name TEXT NOT NULL CHECK (length(name) >= 2), @@ -511,7 +752,7 @@ CREATE TABLE helmert_transformation( method_auth_name TEXT NOT NULL CHECK (length(method_auth_name) >= 1), method_code TEXT NOT NULL CHECK (length(method_code) >= 1), - method_name NOT NULL CHECK (length(method_name) >= 2), + --method_name NOT NULL CHECK (length(method_name) >= 2), source_crs_auth_name TEXT NOT NULL, source_crs_code TEXT NOT NULL, @@ -566,6 +807,7 @@ CREATE TABLE helmert_transformation( CONSTRAINT fk_helmert_transformation_source_crs FOREIGN KEY (source_crs_auth_name, source_crs_code) REFERENCES geodetic_crs(auth_name, code), CONSTRAINT fk_helmert_transformation_target_crs FOREIGN KEY (target_crs_auth_name, target_crs_code) REFERENCES geodetic_crs(auth_name, code), CONSTRAINT fk_helmert_transformation_area FOREIGN KEY (area_of_use_auth_name, area_of_use_code) REFERENCES area(auth_name, code), + CONSTRAINT fk_helmert_transformation_method FOREIGN KEY (method_auth_name, method_code) REFERENCES coordinate_operation_method(auth_name, code), --CONSTRAINT fk_helmert_transformation_coordinate_operation FOREIGN KEY (auth_name, code) REFERENCES coordinate_operation(auth_name, code), CONSTRAINT fk_helmert_translation_uom FOREIGN KEY (translation_uom_auth_name, translation_uom_code) REFERENCES unit_of_measure(auth_name, code), CONSTRAINT fk_helmert_rotation_uom FOREIGN KEY (rotation_uom_auth_name, rotation_uom_code) REFERENCES unit_of_measure(auth_name, code), @@ -577,8 +819,148 @@ CREATE TABLE helmert_transformation( CONSTRAINT fk_helmert_pivot_uom FOREIGN KEY (pivot_uom_auth_name, pivot_uom_code) REFERENCES unit_of_measure(auth_name, code) ); +CREATE VIEW helmert_transformation AS SELECT + h.auth_name, + h.code, + h.name, + + h.description, + h.scope, + + h.method_auth_name, + h.method_code, + m.name AS method_name, + + h.source_crs_auth_name, + h.source_crs_code, + h.target_crs_auth_name, + h.target_crs_code, + + h.area_of_use_auth_name, + h.area_of_use_code, + + h.accuracy, + + h.tx, + h.ty, + h.tz, + h.translation_uom_auth_name, + h.translation_uom_code, + h.rx, + h.ry, + h.rz, + h.rotation_uom_auth_name, + h.rotation_uom_code, + h.scale_difference, + h.scale_difference_uom_auth_name, + h.scale_difference_uom_code, + h.rate_tx, + h.rate_ty, + h.rate_tz, + h.rate_translation_uom_auth_name, + h.rate_translation_uom_code, + h.rate_rx, + h.rate_ry, + h.rate_rz, + h.rate_rotation_uom_auth_name, + h.rate_rotation_uom_code, + h.rate_scale_difference, + h.rate_scale_difference_uom_auth_name, + h.rate_scale_difference_uom_code, + h.epoch, + h.epoch_uom_auth_name, + h.epoch_uom_code, + h.px, + h.py, + h.pz, + h.pivot_uom_auth_name, + h.pivot_uom_code, + + h.operation_version, + + h.deprecated + + FROM helmert_transformation_table h + LEFT JOIN coordinate_operation_method m ON h.method_auth_name = m.auth_name AND h.method_code = m.code +; + +CREATE TRIGGER helmert_transformation_insert_trigger_method +INSTEAD OF INSERT ON helmert_transformation + WHEN NOT EXISTS (SELECT 1 FROM coordinate_operation_method m WHERE + m.auth_name = NEW.method_auth_name AND m.code = NEW.method_code AND m.name = NEW.method_name) +BEGIN + INSERT INTO coordinate_operation_method VALUES (NEW.method_auth_name, NEW.method_code, NEW.method_name); +END; + +CREATE TRIGGER helmert_transformation_insert_trigger_into_helmert_transformation_table +INSTEAD OF INSERT ON helmert_transformation +BEGIN +INSERT INTO helmert_transformation_table VALUES +( + NEW.auth_name, + NEW.code, + NEW.name, + + NEW.description, + NEW.scope, + + NEW.method_auth_name, + NEW.method_code, + -- method_name + + NEW.source_crs_auth_name, + NEW.source_crs_code, + NEW.target_crs_auth_name, + NEW.target_crs_code, + + NEW.area_of_use_auth_name, + NEW.area_of_use_code, + + NEW.accuracy, + + NEW.tx, + NEW.ty, + NEW.tz, + NEW.translation_uom_auth_name, + NEW.translation_uom_code, + NEW.rx, + NEW.ry, + NEW.rz, + NEW.rotation_uom_auth_name, + NEW.rotation_uom_code, + NEW.scale_difference, + NEW.scale_difference_uom_auth_name, + NEW.scale_difference_uom_code, + NEW.rate_tx, + NEW.rate_ty, + NEW.rate_tz, + NEW.rate_translation_uom_auth_name, + NEW.rate_translation_uom_code, + NEW.rate_rx, + NEW.rate_ry, + NEW.rate_rz, + NEW.rate_rotation_uom_auth_name, + NEW.rate_rotation_uom_code, + NEW.rate_scale_difference, + NEW.rate_scale_difference_uom_auth_name, + NEW.rate_scale_difference_uom_code, + NEW.epoch, + NEW.epoch_uom_auth_name, + NEW.epoch_uom_code, + NEW.px, + NEW.py, + NEW.pz, + NEW.pivot_uom_auth_name, + NEW.pivot_uom_code, + + NEW.operation_version, + + NEW.deprecated +); +END; + CREATE TRIGGER helmert_transformation_insert_trigger -BEFORE INSERT ON helmert_transformation +BEFORE INSERT ON helmert_transformation_table FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: (auth_name, code) must not already exist in coordinate_operation_with_conversion_view') WHERE EXISTS (SELECT 1 FROM coordinate_operation_with_conversion_view covwv WHERE covwv.auth_name = NEW.auth_name AND covwv.code = NEW.code); @@ -1011,7 +1393,7 @@ CREATE VIEW coordinate_operation_view AS CREATE VIEW coordinate_operation_with_conversion_view AS SELECT auth_name, code, table_name AS type FROM coordinate_operation_view UNION ALL - SELECT auth_name, code, 'conversion' FROM conversion; + SELECT auth_name, code, 'conversion' FROM conversion_table; CREATE VIEW crs_view AS SELECT 'geodetic_crs' AS table_name, auth_name, code, name, type, @@ -1054,7 +1436,7 @@ CREATE VIEW object_view AS UNION ALL SELECT table_name, auth_name, code, name, type, area_of_use_auth_name, area_of_use_code, deprecated FROM crs_view UNION ALL - SELECT 'conversion', auth_name, code, name, NULL, area_of_use_auth_name, area_of_use_code, deprecated FROM conversion + SELECT 'conversion', auth_name, code, name, NULL, area_of_use_auth_name, area_of_use_code, deprecated FROM conversion_table UNION ALL SELECT table_name, auth_name, code, name, NULL, area_of_use_auth_name, area_of_use_code, deprecated FROM coordinate_operation_view ; |
