New version of actor.org_unit_ancestors
authorThomas Berezansky <tsbere@mvlc.org>
Thu, 11 Aug 2011 13:35:18 +0000 (09:35 -0400)
committerMike Rylander <mrylander@gmail.com>
Tue, 23 Aug 2011 18:29:17 +0000 (14:29 -0400)
Preserves order through joins

Basically actor.org_unit_ancestors_distance with a join to get the
entire org units, rather than just IDs and a distance.

Signed-off-by: Thomas Berezansky <tsbere@mvlc.org>
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/sql/Pg/020.schema.functions.sql

index 5653ded..ff8751e 100644 (file)
@@ -235,17 +235,14 @@ CREATE OR REPLACE FUNCTION actor.org_unit_descendants_distance( INT ) RETURNS TA
 $$ LANGUAGE SQL STABLE ROWS 1;
 
 CREATE OR REPLACE FUNCTION actor.org_unit_ancestors( INT ) RETURNS SETOF actor.org_unit AS $$
-    WITH RECURSIVE anscestor_depth AS (
-        SELECT  ou.id,
-                ou.parent_ou
-          FROM  actor.org_unit ou
-          WHERE ou.id = $1
-            UNION ALL
-        SELECT  ou.id,
-                ou.parent_ou
-          FROM  actor.org_unit ou
-                JOIN anscestor_depth ot ON (ot.parent_ou = ou.id)
-    ) SELECT ou.* FROM actor.org_unit ou JOIN anscestor_depth USING (id);
+    WITH RECURSIVE org_unit_ancestors_distance(id, distance) AS (
+            SELECT $1, 0
+        UNION
+            SELECT ou.parent_ou, ouad.distance+1
+            FROM actor.org_unit ou JOIN org_unit_ancestors_distance ouad ON (ou.id = ouad.id)
+            WHERE ou.parent_ou IS NOT NULL
+    )
+    SELECT ou.* FROM actor.org_unit ou JOIN org_unit_ancestors_distance ouad USING (id) ORDER BY ouad.distance;
 $$ LANGUAGE SQL ROWS 1;
 
 CREATE OR REPLACE FUNCTION actor.org_unit_ancestor_at_depth ( INT,INT ) RETURNS actor.org_unit AS $$