SELECT ARRAY_ACCUM(x.e) FROM UNNEST( $1 ) x(e) WHERE x.e <> $2;
$$ LANGUAGE SQL STABLE;
-CREATE OR REPLACE FUNCTION evergreen.rank_ou(lib INT, search_lib INT, pref_lib INT DEFAULT NULL)
-RETURNS INTEGER AS $$
- WITH search_libs AS (
- SELECT id, distance FROM actor.org_unit_descendants_distance($2)
- )
+CREATE OR REPLACE FUNCTION evergreen.rank_ou(
+ lib INT, search_lib INT, pref_lib INT DEFAULT NULL) RETURNS INTEGER AS $$
+
SELECT COALESCE(
- (SELECT -10000 FROM actor.org_unit
- WHERE $1 = $3 AND id = $3 AND $2 IN (
- SELECT id FROM actor.org_unit WHERE parent_ou IS NULL
- )
- ),
- (SELECT distance FROM search_libs WHERE id = $1),
- 10000
+
+ -- lib matches search_lib
+ (SELECT CASE WHEN $1 = $2 THEN -20000 END),
+
+ -- lib matches pref_lib
+ (SELECT CASE WHEN $1 = $3 THEN -10000 END),
+
+
+ -- pref_lib is a child of search_lib and lib is a child of pref lib.
+ -- For example, searching CONS, pref lib is SYS1,
+ -- copies at BR1 and BR2 sort to the front.
+ (SELECT distance - 5000
+ FROM actor.org_unit_descendants_distance($3)
+ WHERE id = $1 AND $3 IN (
+ SELECT id FROM actor.org_unit_descendants($2))),
+
+ -- lib is a child of search_lib
+ (SELECT distance FROM actor.org_unit_descendants_distance($2) WHERE id = $1),
+
+ -- all others pay cash
+ 1000
);
$$ LANGUAGE SQL STABLE;
--- /dev/null
+BEGIN;
+
+CREATE OR REPLACE FUNCTION evergreen.rank_ou(
+ lib INT, search_lib INT, pref_lib INT DEFAULT NULL) RETURNS INTEGER AS $$
+
+ SELECT COALESCE(
+
+ -- lib matches search_lib
+ (SELECT CASE WHEN $1 = $2 THEN -20000 END),
+
+ -- lib matches pref_lib
+ (SELECT CASE WHEN $1 = $3 THEN -10000 END),
+
+
+ -- pref_lib is a child of search_lib and lib is a child of pref lib.
+ (SELECT distance - 5000
+ FROM actor.org_unit_descendants_distance($3)
+ WHERE id = $1 AND $3 IN (
+ SELECT id FROM actor.org_unit_descendants($2))),
+
+ -- lib is a child of search_lib
+ (SELECT distance FROM actor.org_unit_descendants_distance($2) WHERE id = $1),
+
+ -- all others pay cash
+ 1000
+ );
+$$ LANGUAGE SQL STABLE;
+
+COMMIT;
+