root/trunk/sql/postgresql/shortestPath.sql

Revision 18, 0.8 KB (checked in by yabuki, 3 years ago)
Line 
1DROP FUNCTION shortestPath();
2
3CREATE FUNCTION shortestPath() RETURNS void AS '
4DECLARE
5  maxLength INT:=1;
6  oldSize INT;
7  newSize INT:=0;
8BEGIN
9  INSERT INTO paths SELECT head AS startNode,tail AS endNode,1 FROM edges;
10 
11  LOOP
12    INSERT INTO paths
13      SELECT DISTINCT p.startNode AS startNode,tail AS endNode,maxLength+1 AS length
14      FROM paths p
15      JOIN edges ON p.endNode=head
16      WHERE p.length=maxLength
17        AND p.startNode!=tail
18        AND NOT EXISTS (
19          SELECT * FROM paths q
20          WHERE q.startNode=p.startNode AND q.endNode=tail);
21    maxLength:=maxLength+1;
22    oldSize:=newSize;
23    SELECT COUNT(*) INTO newSize FROM paths;
24    IF oldSize=newSize THEN
25      EXIT;
26    END IF;
27  END LOOP;
28END;
29' LANGUAGE plpgsql;
30
31TRUNCATE TABLE paths; -- こうした方が速い
32
33SELECT shortestPath();
Note: See TracBrowser for help on using the browser.