Mercurial > gemma
comparison schema/isrs.sql @ 3566:4c585b5d4fe8
Introduce hectometer based order for ranges of ISRS location codes
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Fri, 31 May 2019 20:06:27 +0200 |
parents | 5b3d778db00c |
children | d9ac1c56bfe0 |
comparison
equal
deleted
inserted
replaced
3565:f6d67697f158 | 3566:4c585b5d4fe8 |
---|---|
45 | 45 |
46 CREATE DOMAIN isrs AS isrs_base | 46 CREATE DOMAIN isrs AS isrs_base |
47 CHECK (is_country((VALUE).country_code)) | 47 CHECK (is_country((VALUE).country_code)) |
48 CHECK ((VALUE).hectometre BETWEEN 0 AND 99999); | 48 CHECK ((VALUE).hectometre BETWEEN 0 AND 99999); |
49 | 49 |
50 CREATE FUNCTION isrs_cmp(a isrs, b isrs) RETURNS int | |
51 AS $$ | |
52 /* TODO: handle non-matching combinations of country_codes and | |
53 fairway_sections. Otherwise, this will give unexpected results if | |
54 both hectometre values do not refer to the same river. */ | |
55 SELECT (a).hectometre - (b).hectometre | |
56 $$ LANGUAGE sql | |
57 IMMUTABLE PARALLEL SAFE; | |
58 | |
59 CREATE FUNCTION isrslt(a isrs, b isrs) RETURNS boolean | |
60 AS $$ | |
61 SELECT isrs_cmp(a, b) < 0 | |
62 $$ LANGUAGE sql | |
63 IMMUTABLE PARALLEL SAFE; | |
64 | |
65 CREATE FUNCTION isrsle(a isrs, b isrs) RETURNS boolean | |
66 AS $$ | |
67 SELECT isrs_cmp(a, b) <= 0 | |
68 $$ LANGUAGE sql | |
69 IMMUTABLE PARALLEL SAFE; | |
70 | |
71 CREATE FUNCTION isrseq(a isrs, b isrs) RETURNS boolean | |
72 AS $$ | |
73 SELECT isrs_cmp(a, b) = 0 | |
74 $$ LANGUAGE sql | |
75 IMMUTABLE PARALLEL SAFE; | |
76 | |
77 CREATE FUNCTION isrsge(a isrs, b isrs) RETURNS boolean | |
78 AS $$ | |
79 SELECT isrs_cmp(a, b) >= 0 | |
80 $$ LANGUAGE sql | |
81 IMMUTABLE PARALLEL SAFE; | |
82 | |
83 CREATE FUNCTION isrsgt(a isrs, b isrs) RETURNS boolean | |
84 AS $$ | |
85 SELECT isrs_cmp(a, b) > 0 | |
86 $$ LANGUAGE sql | |
87 IMMUTABLE PARALLEL SAFE; | |
88 | |
89 CREATE OPERATOR <~ ( | |
90 leftarg = isrs, | |
91 rightarg = isrs, | |
92 function = isrslt | |
93 ); | |
94 | |
95 CREATE OPERATOR <~= ( | |
96 leftarg = isrs, | |
97 rightarg = isrs, | |
98 function = isrsle | |
99 ); | |
100 | |
101 CREATE OPERATOR ~= ( | |
102 leftarg = isrs, | |
103 rightarg = isrs, | |
104 function = isrseq, | |
105 commutator = ~= | |
106 ); | |
107 | |
108 CREATE OPERATOR >~= ( | |
109 leftarg = isrs, | |
110 rightarg = isrs, | |
111 function = isrsge, | |
112 commutator = <~=, | |
113 negator = <~ | |
114 ); | |
115 | |
116 CREATE OPERATOR >~ ( | |
117 leftarg = isrs, | |
118 rightarg = isrs, | |
119 function = isrsgt, | |
120 commutator = <~, | |
121 negator = <~= | |
122 ); | |
123 | |
124 CREATE OPERATOR CLASS isrs_ops FOR TYPE isrs USING btree AS | |
125 OPERATOR 1 <~, | |
126 OPERATOR 2 <~=, | |
127 OPERATOR 3 ~=, | |
128 OPERATOR 4 >~=, | |
129 OPERATOR 5 >~, | |
130 FUNCTION 1 isrs_cmp; | |
131 | |
132 CREATE FUNCTION isrs_diff(a isrs, b isrs) RETURNS double precision | |
133 AS $$ | |
134 SELECT CAST(isrs_cmp(a, b) AS double precision) | |
135 $$ LANGUAGE sql | |
136 IMMUTABLE PARALLEL SAFE; | |
137 | |
50 CREATE TYPE isrsrange AS RANGE ( | 138 CREATE TYPE isrsrange AS RANGE ( |
51 subtype = isrs | 139 subtype = isrs, |
140 subtype_opclass = isrs_ops, | |
141 subtype_diff = isrs_diff | |
52 ); | 142 ); |
143 | |
53 | 144 |
54 -- | 145 -- |
55 -- Functions | 146 -- Functions |
56 -- | 147 -- |
57 | 148 |