From: Sandro Santilli Date: Thu, 17 Jan 2013 08:05:43 +0000 (+0000) Subject: Prefer boolean predicates over overlay ops in ST_ChangeEdgeGeom X-Git-Tag: 2.1.0beta2~243 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4b439c1a9b84d2bcfd673f882e0f9dd2e0d0608d;p=postgis 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 --- 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; -- }