From 4b439c1a9b84d2bcfd673f882e0f9dd2e0d0608d Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Thu, 17 Jan 2013 08:05:43 +0000 Subject: [PATCH] Prefer boolean predicates over overlay ops in ST_ChangeEdgeGeom Further reduces robustness issues and squeezes another bit of performance. git-svn-id: http://svn.osgeo.org/postgis/trunk@10987 b70326c6-7e19-0410-871a-916f4a2858ee --- topology/sql/sqlmm.sql.in.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/topology/sql/sqlmm.sql.in.c b/topology/sql/sqlmm.sql.in.c index 06d35ba07..4451dc030 100644 --- a/topology/sql/sqlmm.sql.in.c +++ b/topology/sql/sqlmm.sql.in.c @@ -2752,13 +2752,22 @@ BEGIN RAISE DEBUG 'New-ring (poly): %', ST_AsText(rng_info.r2); #endif - tmp1 := ST_CollectionExtract(ST_Intersection(rng_info.nodes, rng_info.r1), 1); - range := ST_CollectionExtract(ST_Intersection(rng_info.nodes, rng_info.r2), 1); - IF ST_IsEmpty(tmp1) != ST_IsEmpty(range) OR NOT ST_Equals(tmp1, range) - THEN + FOR rec IN WITH + nodes AS ( SELECT * FROM ST_Dump(rng_info.nodes) ), + inr1 AS ( SELECT path[1] FROM nodes WHERE ST_Contains(rng_info.r1, geom) ), + inr2 AS ( SELECT path[1] FROM nodes WHERE ST_Contains(rng_info.r2, geom) ) + ( SELECT * FROM inr1 + EXCEPT + SELECT * FROM inr2 + ) UNION + ( SELECT * FROM inr2 + EXCEPT + SELECT * FROM inr1 + ) + LOOP RAISE EXCEPTION 'Edge motion collision at %', - ST_AsText(ST_GeometryN(ST_Union(tmp1, range), 1)); - END IF; + ST_AsText(ST_GeometryN(rng_info.nodes, rec.path)); + END LOOP; END IF; -- } -- 2.50.1