Changeset: c0d01a28a89d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c0d01a28a89d
Modified Files:
        sql/test/sciql/Tests/teleios_noa_bsm.sql
Branch: SciQL-2
Log Message:

teleios_noa_bsm.sql: fine-tuning connect_neighbors():

replace INSERT INTO of SELECT ... UNION ALL ...
by multiple INSERT INTO SELECT ...


diffs (99 lines):

diff --git a/sql/test/sciql/Tests/teleios_noa_bsm.sql 
b/sql/test/sciql/Tests/teleios_noa_bsm.sql
--- a/sql/test/sciql/Tests/teleios_noa_bsm.sql
+++ b/sql/test/sciql/Tests/teleios_noa_bsm.sql
@@ -244,6 +244,7 @@ UPDATE fire SET f = NULL WHERE f IN (
 CREATE FUNCTION connect_neighbors()
 RETURNS TABLE (i1 INT, i2 INT)
 BEGIN
+  DECLARE TABLE bridgesXXL (x SMALLINT, y SMALLINT, i INT, a INT);
   DECLARE TABLE bridges (x SMALLINT, y SMALLINT, i INT, a INT);
   DECLARE TABLE trans (i INT, a INT, x INT);
   DECLARE iter_0 INT, iter_1 INT;
@@ -255,42 +256,53 @@ BEGIN
     SET iter_0 = iter_0 + 1;
 
     -- find neighboring fire clumps
-    DELETE FROM bridges;
-    INSERT INTO bridges (
-      SELECT t1.x, t1.y, i, a
-      FROM (
-        -- 3x3 window is too small and 5x5 is too large; hence,
-        -- we need to union the four possible 4x4 windows ...
-        SELECT x, y, MIN(f) AS i, MAX(f) AS a
-        FROM fire
-        GROUP BY fire[x-2:x+2][y-2:y+2]
-        HAVING f IS NULL AND MIN(f) <> MAX(f)
-        UNION ALL
-        SELECT x, y, MIN(f) AS i, MAX(f) AS a
-        FROM fire
-        GROUP BY fire[x-1:x+3][y-2:y+2]
-        HAVING f IS NULL AND MIN(f) <> MAX(f)
-        UNION ALL
-        SELECT x, y, MIN(f) AS i, MAX(f) AS a
-        FROM fire
-        GROUP BY fire[x-2:x+2][y-1:y+3]
-        HAVING f IS NULL AND MIN(f) <> MAX(f)
-        UNION ALL
-        SELECT x, y, MIN(f) AS i, MAX(f) AS a
-        FROM fire
-        GROUP BY fire[x-1:x+3][y-1:y+3]
-        HAVING f IS NULL AND MIN(f) <> MAX(f)
-      ) AS t1 JOIN (
-        -- avoid (some) incorrect cases
-        SELECT x, y
-        FROM fire
-        GROUP BY fire[x-1:x+2][y-1:y+2]
-        HAVING f IS NULL AND SUM(f) IS NOT NULL
-      ) AS t2
-      ON t1.x = t2.x AND t1.y = t2.y
+    DELETE FROM bridgesXXL;
+    -- 3x3 window is too small and 5x5 is too large; hence,
+    -- we need to union the four possible 4x4 windows ...
+    INSERT INTO bridgesXXL (
+      SELECT x, y, MIN(f) AS i, MAX(f) AS a
+      FROM fire
+      GROUP BY fire[x-2:x+2][y-2:y+2]
+      HAVING f IS NULL AND MIN(f) <> MAX(f)
+    );
+    INSERT INTO bridgesXXL (
+      SELECT x, y, MIN(f) AS i, MAX(f) AS a
+      FROM fire
+      GROUP BY fire[x-1:x+3][y-2:y+2]
+      HAVING f IS NULL AND MIN(f) <> MAX(f)
+    );
+    INSERT INTO bridgesXXL (
+      SELECT x, y, MIN(f) AS i, MAX(f) AS a
+      FROM fire
+      GROUP BY fire[x-2:x+2][y-1:y+3]
+      HAVING f IS NULL AND MIN(f) <> MAX(f)
+    );
+    INSERT INTO bridgesXXL (
+      SELECT x, y, MIN(f) AS i, MAX(f) AS a
+      FROM fire
+      GROUP BY fire[x-1:x+3][y-1:y+3]
+      HAVING f IS NULL AND MIN(f) <> MAX(f)
     );
 
-    SELECT COUNT(*) INTO merge_more FROM bridges;
+    SELECT COUNT(*) INTO merge_more FROM bridgesXXL;
+    IF merge_more > 0 THEN
+      -- avoid (some) incorrect cases
+      DELETE from bridges;
+      INSERT INTO bridges (
+        SELECT t1.x, t1.y, t1.i, t1.a
+        FROM bridgesXXL AS t1
+        JOIN (
+          SELECT x, y
+          FROM fire
+          GROUP BY fire[x-1:x+2][y-1:y+2]
+          HAVING f IS NULL AND SUM(f) IS NOT NULL
+        ) AS t2
+        ON t1.x = t2.x AND t1.y = t2.y
+      );
+      DELETE from bridgesXXL;
+      SELECT COUNT(*) INTO merge_more FROM bridges;
+    END IF;
+
     IF merge_more > 0 THEN
 
       -- create "bridges"
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to