Mercurial > gemma
diff schema/isrs.sql @ 569:ad07846b09d1
Add function to construct isrs from text
In passing moved all related functionality to its own set of files.
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Wed, 05 Sep 2018 11:05:58 +0200 |
parents | |
children | 61af85a432bf |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/schema/isrs.sql Wed Sep 05 11:05:58 2018 +0200 @@ -0,0 +1,56 @@ +-- +-- Types and functions for ISRS location codes +-- + +BEGIN; + +-- +-- Types +-- + +-- Composite type: UN/LOCODE, fairway section, object reference, hectometre. +-- See RIS-Index Encoding Guide +CREATE TYPE isrs AS ( + country_code char(2), -- ISO 3166 country code + -- could be validated against countries table. + locode char(3), -- without the country code: + -- http://www.unece.org/cefact/locode/welcome.html + fairway_section char(5), + object_reference char(5), + hectometre int -- should be constrained to five digits +); + +CREATE TYPE isrsrange AS RANGE ( + subtype = isrs +); + +-- +-- Functions +-- + +CREATE OR REPLACE FUNCTION isrs_fromText( + isrs_text varchar + ) + RETURNS isrs +AS $$ +DECLARE + isrs_len CONSTANT int = 20; +BEGIN + IF char_length(isrs_text) <> isrs_len + THEN + RAISE 'ISRS location code must be % characters long', isrs_len + USING ERRCODE = 'invalid_parameter_value'; + ELSE + RETURN CAST(( + substring(isrs_text from 1 for 2), + substring(isrs_text from 3 for 3), + substring(isrs_text from 6 for 5), + substring(isrs_text from 10 for 5), + CAST(substring(isrs_text from 16 for 5) AS int)) + AS isrs); + END IF; +END; +$$ + LANGUAGE plpgsql; + +COMMIT;