]> granicus.if.org Git - postgis/commitdiff
Prefer boolean predicates over overlay ops in ST_ChangeEdgeGeom
authorSandro Santilli <strk@keybit.net>
Thu, 17 Jan 2013 08:05:43 +0000 (08:05 +0000)
committerSandro Santilli <strk@keybit.net>
Thu, 17 Jan 2013 08:05:43 +0000 (08:05 +0000)
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

index 06d35ba0722ab280d9aaf22b5fc1d6070f3b8324..4451dc03025c04dabb30aa8a9923f532550c0c25 100644 (file)
@@ -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; -- }