[postgis-tickets] [SCM] PostGIS branch stable-3.3 updated. 3.3.2-3-g2bf092c40

git at osgeo.org git at osgeo.org
Wed Nov 16 16:02:53 PST 2022


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "PostGIS".

The branch, stable-3.3 has been updated
       via  2bf092c400fc84b342bf8bf1137a07f03ee421f0 (commit)
      from  ea9cb50a62a0dcda53991ab5243fddee5fc0b195 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 2bf092c400fc84b342bf8bf1137a07f03ee421f0
Author: Sandro Santilli <strk at kbt.io>
Date:   Thu Nov 17 00:59:34 2022 +0100

    Fix misleading message about doubly connected edges healing
    
    Closes #5289
    Includes regress test

diff --git a/NEWS b/NEWS
index 83a6f25a1..33cfa7610 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,9 @@
+PostGIS 3.3.3dev
+YYYY/MM/DD
+
+* Bug Fixes *
+  - #5289, Fix misleading message about doubly connected edges healing (Sandro Santilli)
+
 PostGIS 3.3.2
 2022/11/12
 This version requires PostgreSQL 11-15, GEOS 3.6 or higher, and Proj 5.2+
diff --git a/topology/sql/cleanup/RemoveUnusedPrimitives.sql.in b/topology/sql/cleanup/RemoveUnusedPrimitives.sql.in
index fba82fbdc..8f58d4008 100644
--- a/topology/sql/cleanup/RemoveUnusedPrimitives.sql.in
+++ b/topology/sql/cleanup/RemoveUnusedPrimitives.sql.in
@@ -580,7 +580,7 @@ BEGIN
       removable_nodes_of_degree_2_in_bbox AS (
         SELECT
           n.node_id,
-          array_agg(e.edge_id) edges
+          array_agg(e.edge_id ORDER BY e.edge_id) edges
         FROM
           unused_connected_nodes_in_bbox n,
           %1$I.edge e
@@ -612,15 +612,22 @@ BEGIN
           )
           GROUP BY n.node_id, r.layer_id, r.topogeo_id
           HAVING count(DISTINCT abs(r.element_id)) != 2
+      ),
+      valid_heals AS (
+        SELECT
+          node_id,
+          edges
+        FROM removable_nodes_of_degree_2_in_bbox
+        WHERE node_id NOT IN (
+          SELECT node_id FROM breaking_heals
+        )
       )
       SELECT
-        node_id,
+        array_agg(node_id) connecting_nodes,
         edges[1] edge1,
         edges[2] edge2
-      FROM removable_nodes_of_degree_2_in_bbox
-      WHERE node_id NOT IN (
-        SELECT node_id FROM breaking_heals
-      )
+      FROM valid_heals
+      GROUP BY edges
     $$,
     topo.name
   );
@@ -634,8 +641,8 @@ BEGIN
     edge1 := COALESCE( (edgeMap -> rec.edge1::text)::int, rec.edge1);
     edge2 := COALESCE( (edgeMap -> rec.edge2::text)::int, rec.edge2);
 
-    RAISE DEBUG 'Should heal edges % (now %) and % (now %) bound by node %',
-      rec.edge1, edge1, rec.edge2, edge2, rec.node_id;
+    RAISE DEBUG 'Should heal edges % (now %) and % (now %) bound by nodes %',
+      rec.edge1, edge1, rec.edge2, edge2, rec.connecting_nodes;
 
     IF edge1 = edge2 THEN
       -- Nothing to merge here, continue
@@ -646,16 +653,16 @@ BEGIN
     BEGIN
       -- TODO: replace ST_ModEdgeHeal loop with a faster direct deletion and healing
       removedNode := topology.ST_ModEdgeHeal(topo.name, edge1, edge2);
-      IF rec.node_id != removedNode THEN
+      IF NOT removedNode = ANY ( rec.connecting_nodes ) THEN
         RAISE EXCEPTION 'Healing of edges % and % was reported '
-                        'to remove node % while we expected % instead',
-                        edge1, edge2, removedNode, rec.node_id;
+                        'to remove node % while we expected any of % instead',
+                        edge1, edge2, removedNode, rec.connecting_nodes;
       END IF;
       RAISE DEBUG 'Edge % merged into %, dropping node %', edge2, edge1, removedNode;
       ok := 1;
     EXCEPTION WHEN OTHERS
     THEN
-      RAISE WARNING 'Edges % and % joined by node % could not be healed: %', edge1, edge2, rec.node_id, SQLERRM;
+      RAISE WARNING 'Edges % and % joined by node % could not be healed: %', edge1, edge2, rec.connecting_nodes, SQLERRM;
     END;
     IF ok THEN
       -- edge2 was now renamed to edge1, update map
diff --git a/topology/test/regress/removeunusedprimitives.sql b/topology/test/regress/removeunusedprimitives.sql
index cd966cd4d..345ba9f23 100644
--- a/topology/test/regress/removeunusedprimitives.sql
+++ b/topology/test/regress/removeunusedprimitives.sql
@@ -204,6 +204,24 @@ SELECT 't6', 'clean', topology.RemoveUnusedPrimitives('city_data');
 SELECT 't6', 'changed', * FROM features.check_changed_features();
 SELECT 't6', 'invalidity', * FROM topology.ValidateTopology('city_data');
 
+
+-- See https://trac.osgeo.org/postgis/ticket/5289
+SELECT NULL FROM (
+  SELECT toTopoGeom(
+    ST_MakeLine(
+      ST_EndPoint( ST_GeometryN(feature,1) ),
+      ST_StartPoint( ST_GeometryN(feature,1) )
+    ),
+    feature
+  ) FROM features.city_streets WHERE feature_name = 'R2'
+) foo;
+UPDATE features.city_streets SET geom = feature::geometry
+WHERE feature_name = 'R2';
+SELECT '#5289', 'clean', topology.RemoveUnusedPrimitives('city_data');
+SELECT '#5289', 'changed', * FROM features.check_changed_features();
+SELECT '#5289', 'invalidity', * FROM topology.ValidateTopology('city_data');
+
+
 -- Cleanup
 SELECT NULL FROM DropTopology('city_data');
 DROP SCHEMA features CASCADE;
diff --git a/topology/test/regress/removeunusedprimitives_expected b/topology/test/regress/removeunusedprimitives_expected
index afcbe4895..400adf603 100644
--- a/topology/test/regress/removeunusedprimitives_expected
+++ b/topology/test/regress/removeunusedprimitives_expected
@@ -7,3 +7,4 @@ t3|clean|1
 t4|clean|1
 t5|clean|2
 t6|clean|3
+#5289|clean|1

-----------------------------------------------------------------------

Summary of changes:
 NEWS                                               |  6 +++++
 topology/sql/cleanup/RemoveUnusedPrimitives.sql.in | 31 +++++++++++++---------
 topology/test/regress/removeunusedprimitives.sql   | 18 +++++++++++++
 .../test/regress/removeunusedprimitives_expected   |  1 +
 4 files changed, 44 insertions(+), 12 deletions(-)


hooks/post-receive
-- 
PostGIS


More information about the postgis-tickets mailing list