From 8a3c2bf0eed4037c38d110f28040f4fad1c175e0 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Thu, 29 Dec 2011 18:01:08 +0000 Subject: [PATCH] Consider TopoElements of type 0 as empty, allow CreateTopoGeom calls w/out a TopoElementArray to construct empties (#1017) git-svn-id: http://svn.osgeo.org/postgis/trunk@8613 b70326c6-7e19-0410-871a-916f4a2858ee --- doc/extras_topology.xml | 8 +++++ topology/topology.sql.in.c | 60 +++++++++++++++++++++++++------------- 2 files changed, 47 insertions(+), 21 deletions(-) diff --git a/doc/extras_topology.xml b/doc/extras_topology.xml index 2fb1ec6b9..ffd851178 100644 --- a/doc/extras_topology.xml +++ b/doc/extras_topology.xml @@ -2098,6 +2098,13 @@ nodeid integer layer_id topoelementarray tg_objs + + + topogeometry CreateTopoGeom + varchar toponame + integer tg_type + integer layer_id + @@ -2108,6 +2115,7 @@ nodeid tg_type is an integer: 1:[multi]point (punctal), 2:[multi]line (lineal), 3:[multi]poly (areal), 4:collection. layer_id is the layer id in the topology.layer table. punctal layers are formed from set of nodes, lineal layers are formed from a set of edges, areal layers are formed from a set of faces, and collections can be formed from a mixture of nodes, edges, and faces. + Omitting the array of components generates an empty TopoGeometry object. Availability: 1.? diff --git a/topology/topology.sql.in.c b/topology/topology.sql.in.c index 1459524b4..8c678cff2 100644 --- a/topology/topology.sql.in.c +++ b/topology/topology.sql.in.c @@ -910,29 +910,37 @@ BEGIN LOOP obj_id = tg_objs[i][1]; obj_type = tg_objs[i][2]; - IF layerlevel = 0 THEN -- array specifies lower-level objects - IF tg_type != 4 and tg_type != obj_type THEN - RAISE EXCEPTION 'A TopoGeometry of type % cannot contain topology elements of type %', tg_type, obj_type; + + -- Elements of type 0 represent emptiness, just skip them + IF obj_type = 0 THEN + IF obj_id != 0 THEN + RAISE EXCEPTION 'Malformed empty topo element {0,%} -- id must be 0 as well', obj_id; END IF; - ELSE -- array specifies lower-level topogeometries - IF obj_type != layerchild THEN - RAISE EXCEPTION 'TopoGeom element layer do not match TopoGeom child layer'; + ELSE + IF layerlevel = 0 THEN -- array specifies lower-level objects + IF tg_type != 4 and tg_type != obj_type THEN + RAISE EXCEPTION 'A TopoGeometry of type % cannot contain topology elements of type %', tg_type, obj_type; + END IF; + ELSE -- array specifies lower-level topogeometries + IF obj_type != layerchild THEN + RAISE EXCEPTION 'TopoGeom element layer do not match TopoGeom child layer'; + END IF; + -- TODO: verify that the referred TopoGeometry really + -- exists in the relation table ? END IF; - -- TODO: verify that the referred TopoGeometry really - -- exists in the relation table ? - END IF; - --RAISE NOTICE 'obj:% type:% id:%', i, obj_type, obj_id; - - -- - -- Insert record into the Relation table - -- - EXECUTE 'INSERT INTO '||quote_ident(toponame) - || '.relation(topogeo_id, layer_id, ' - || 'element_id,element_type) ' - || ' VALUES ('||ret.id - ||','||ret.layer_id - || ',' || obj_id || ',' || obj_type || ');'; + --RAISE NOTICE 'obj:% type:% id:%', i, obj_type, obj_id; + + -- + -- Insert record into the Relation table + -- + EXECUTE 'INSERT INTO '||quote_ident(toponame) + || '.relation(topogeo_id, layer_id, ' + || 'element_id,element_type) ' + || ' VALUES ('||ret.id + ||','||ret.layer_id + || ',' || obj_id || ',' || obj_type || ');'; + END IF; i = i+1; IF i > array_upper(tg_objs, 1) THEN @@ -945,7 +953,17 @@ BEGIN END $$ LANGUAGE 'plpgsql' VOLATILE STRICT; ---} CreateTopoGeom(toponame,topogeom_type, TopoObject[]) +--} CreateTopoGeom(toponame,topogeom_type, layer_id, TopoElementArray) + +--{ +-- CreateTopoGeom(topology_name, topogeom_type, layer_id) - creates the empty topogeom +CREATE OR REPLACE FUNCTION topology.CreateTopoGeom(toponame varchar, tg_type integer, layer_id integer) + RETURNS topology.TopoGeometry +AS +$$ + SELECT topology.CreateTopoGeom($1,$2,$3,'{{0,0}}'); +$$ LANGUAGE 'sql' VOLATILE STRICT; +--} CreateTopoGeom(toponame, topogeom_type, layer_id) --{ -- GetTopologyName(topology_id) -- 2.49.0