Convert PL/PGSQL to SQL (#1568)

This PR converts three plpgsql functions in the `transportation_name` layer to sql functions, which perform better.
pull/1562/head^2
Brian Sperlongano 2023-08-06 01:26:24 -04:00 zatwierdzone przez GitHub
rodzic 0ca096938e
commit 48a2b1af72
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
1 zmienionych plików z 22 dodań i 28 usunięć

Wyświetl plik

@ -1,52 +1,46 @@
CREATE OR REPLACE FUNCTION highway_to_val(hwy_class varchar) CREATE OR REPLACE FUNCTION highway_to_val(hwy_class varchar)
RETURNS int RETURNS int
IMMUTABLE IMMUTABLE
LANGUAGE plpgsql LANGUAGE sql
AS $$ AS $$
BEGIN SELECT CASE hwy_class
CASE hwy_class WHEN 'motorway' THEN 6
WHEN 'motorway' THEN RETURN 6; WHEN 'trunk' THEN 5
WHEN 'trunk' THEN RETURN 5; WHEN 'primary' THEN 4
WHEN 'primary' THEN RETURN 4; WHEN 'secondary' THEN 3
WHEN 'secondary' THEN RETURN 3; WHEN 'tertiary' THEN 2
WHEN 'tertiary' THEN RETURN 2; WHEN 'unclassified' THEN 1
WHEN 'unclassified' THEN RETURN 1; ELSE 0
else RETURN 0; END;
END CASE;
END;
$$; $$;
CREATE OR REPLACE FUNCTION val_to_highway(hwy_val int) CREATE OR REPLACE FUNCTION val_to_highway(hwy_val int)
RETURNS varchar RETURNS varchar
IMMUTABLE IMMUTABLE
LANGUAGE plpgsql LANGUAGE sql
AS $$ AS $$
BEGIN SELECT CASE hwy_val
CASE hwy_val WHEN 6 THEN 'motorway'
WHEN 6 THEN RETURN 'motorway'; WHEN 5 THEN 'trunk'
WHEN 5 THEN RETURN 'trunk'; WHEN 4 THEN 'primary'
WHEN 4 THEN RETURN 'primary'; WHEN 3 THEN 'secondary'
WHEN 3 THEN RETURN 'secondary'; WHEN 2 THEN 'tertiary'
WHEN 2 THEN RETURN 'tertiary'; WHEN 1 THEN 'unclassified'
WHEN 1 THEN RETURN 'unclassified'; ELSE null
else RETURN null; END;
END CASE;
END;
$$; $$;
CREATE OR REPLACE FUNCTION highest_hwy_sfunc(agg_state varchar, hwy_class varchar) CREATE OR REPLACE FUNCTION highest_hwy_sfunc(agg_state varchar, hwy_class varchar)
RETURNS varchar RETURNS varchar
IMMUTABLE IMMUTABLE
LANGUAGE plpgsql LANGUAGE sql
AS $$ AS $$
BEGIN SELECT val_to_highway(
RETURN val_to_highway(
GREATEST( GREATEST(
highway_to_val(agg_state), highway_to_val(agg_state),
highway_to_val(hwy_class) highway_to_val(hwy_class)
) )
); );
END;
$$; $$;
DROP AGGREGATE IF EXISTS highest_highway (varchar); DROP AGGREGATE IF EXISTS highest_highway (varchar);