pgLatLon
diff latlon--0.12.sql @ 53:537df4c9de92
New version 0.12 with same C file (v0009)
author | jbe |
---|---|
date | Sun Dec 10 19:45:19 2017 +0100 (2017-12-10) |
parents | latlon--0.11.sql@133626ff7cb2 |
children | 253218d6662d |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/latlon--0.12.sql Sun Dec 10 19:45:19 2017 +0100 1.3 @@ -0,0 +1,1717 @@ 1.4 + 1.5 +---------------------------------------- 1.6 +-- forward declarations (shell types) -- 1.7 +---------------------------------------- 1.8 + 1.9 +CREATE TYPE ekey_point; 1.10 +CREATE TYPE ekey_area; 1.11 +CREATE TYPE epoint; 1.12 +CREATE TYPE epoint_with_sample_count; 1.13 +CREATE TYPE ebox; 1.14 +CREATE TYPE ecircle; 1.15 +CREATE TYPE ecluster; 1.16 + 1.17 + 1.18 +------------------------------------------------------------ 1.19 +-- dummy input/output functions for dummy index key types -- 1.20 +------------------------------------------------------------ 1.21 + 1.22 +CREATE FUNCTION ekey_point_in_dummy(cstring) 1.23 + RETURNS ekey_point 1.24 + LANGUAGE C IMMUTABLE STRICT 1.25 + AS '$libdir/latlon-v0009', 'pgl_notimpl'; 1.26 + 1.27 +CREATE FUNCTION ekey_point_out_dummy(ekey_point) 1.28 + RETURNS cstring 1.29 + LANGUAGE C IMMUTABLE STRICT 1.30 + AS '$libdir/latlon-v0009', 'pgl_notimpl'; 1.31 + 1.32 +CREATE FUNCTION ekey_area_in_dummy(cstring) 1.33 + RETURNS ekey_area 1.34 + LANGUAGE C IMMUTABLE STRICT 1.35 + AS '$libdir/latlon-v0009', 'pgl_notimpl'; 1.36 + 1.37 +CREATE FUNCTION ekey_area_out_dummy(ekey_area) 1.38 + RETURNS cstring 1.39 + LANGUAGE C IMMUTABLE STRICT 1.40 + AS '$libdir/latlon-v0009', 'pgl_notimpl'; 1.41 + 1.42 + 1.43 +-------------------------- 1.44 +-- text input functions -- 1.45 +-------------------------- 1.46 + 1.47 +CREATE FUNCTION epoint_in(cstring) 1.48 + RETURNS epoint 1.49 + LANGUAGE C IMMUTABLE STRICT 1.50 + AS '$libdir/latlon-v0009', 'pgl_epoint_in'; 1.51 + 1.52 +CREATE FUNCTION epoint_with_sample_count_in(cstring) 1.53 + RETURNS epoint_with_sample_count 1.54 + LANGUAGE C IMMUTABLE STRICT 1.55 + AS '$libdir/latlon-v0009', 'pgl_epoint_with_sample_count_in'; 1.56 + 1.57 +CREATE FUNCTION ebox_in(cstring) 1.58 + RETURNS ebox 1.59 + LANGUAGE C IMMUTABLE STRICT 1.60 + AS '$libdir/latlon-v0009', 'pgl_ebox_in'; 1.61 + 1.62 +CREATE FUNCTION ecircle_in(cstring) 1.63 + RETURNS ecircle 1.64 + LANGUAGE C IMMUTABLE STRICT 1.65 + AS '$libdir/latlon-v0009', 'pgl_ecircle_in'; 1.66 + 1.67 +CREATE FUNCTION ecluster_in(cstring) 1.68 + RETURNS ecluster 1.69 + LANGUAGE C IMMUTABLE STRICT 1.70 + AS '$libdir/latlon-v0009', 'pgl_ecluster_in'; 1.71 + 1.72 + 1.73 +--------------------------- 1.74 +-- text output functions -- 1.75 +--------------------------- 1.76 + 1.77 +CREATE FUNCTION epoint_out(epoint) 1.78 + RETURNS cstring 1.79 + LANGUAGE C IMMUTABLE STRICT 1.80 + AS '$libdir/latlon-v0009', 'pgl_epoint_out'; 1.81 + 1.82 +CREATE FUNCTION epoint_with_sample_count_out(epoint_with_sample_count) 1.83 + RETURNS cstring 1.84 + LANGUAGE C IMMUTABLE STRICT 1.85 + AS '$libdir/latlon-v0009', 'pgl_epoint_with_sample_count_out'; 1.86 + 1.87 +CREATE FUNCTION ebox_out(ebox) 1.88 + RETURNS cstring 1.89 + LANGUAGE C IMMUTABLE STRICT 1.90 + AS '$libdir/latlon-v0009', 'pgl_ebox_out'; 1.91 + 1.92 +CREATE FUNCTION ecircle_out(ecircle) 1.93 + RETURNS cstring 1.94 + LANGUAGE C IMMUTABLE STRICT 1.95 + AS '$libdir/latlon-v0009', 'pgl_ecircle_out'; 1.96 + 1.97 +CREATE FUNCTION ecluster_out(ecluster) 1.98 + RETURNS cstring 1.99 + LANGUAGE C IMMUTABLE STRICT 1.100 + AS '$libdir/latlon-v0009', 'pgl_ecluster_out'; 1.101 + 1.102 + 1.103 +-------------------------- 1.104 +-- binary I/O functions -- 1.105 +-------------------------- 1.106 + 1.107 +CREATE FUNCTION epoint_recv(internal) 1.108 + RETURNS epoint 1.109 + LANGUAGE C IMMUTABLE STRICT 1.110 + AS '$libdir/latlon-v0009', 'pgl_epoint_recv'; 1.111 + 1.112 +CREATE FUNCTION ebox_recv(internal) 1.113 + RETURNS ebox 1.114 + LANGUAGE C IMMUTABLE STRICT 1.115 + AS '$libdir/latlon-v0009', 'pgl_ebox_recv'; 1.116 + 1.117 +CREATE FUNCTION ecircle_recv(internal) 1.118 + RETURNS ecircle 1.119 + LANGUAGE C IMMUTABLE STRICT 1.120 + AS '$libdir/latlon-v0009', 'pgl_ecircle_recv'; 1.121 + 1.122 +CREATE FUNCTION epoint_send(epoint) 1.123 + RETURNS bytea 1.124 + LANGUAGE C IMMUTABLE STRICT 1.125 + AS '$libdir/latlon-v0009', 'pgl_epoint_send'; 1.126 + 1.127 +CREATE FUNCTION ebox_send(ebox) 1.128 + RETURNS bytea 1.129 + LANGUAGE C IMMUTABLE STRICT 1.130 + AS '$libdir/latlon-v0009', 'pgl_ebox_send'; 1.131 + 1.132 +CREATE FUNCTION ecircle_send(ecircle) 1.133 + RETURNS bytea 1.134 + LANGUAGE C IMMUTABLE STRICT 1.135 + AS '$libdir/latlon-v0009', 'pgl_ecircle_send'; 1.136 + 1.137 + 1.138 +----------------------------------------------- 1.139 +-- type definitions of dummy index key types -- 1.140 +----------------------------------------------- 1.141 + 1.142 +CREATE TYPE ekey_point ( 1.143 + internallength = 8, 1.144 + input = ekey_point_in_dummy, 1.145 + output = ekey_point_out_dummy, 1.146 + alignment = char ); 1.147 + 1.148 +CREATE TYPE ekey_area ( 1.149 + internallength = 9, 1.150 + input = ekey_area_in_dummy, 1.151 + output = ekey_area_out_dummy, 1.152 + alignment = char ); 1.153 + 1.154 + 1.155 +------------------------------------------ 1.156 +-- definitions of geographic data types -- 1.157 +------------------------------------------ 1.158 + 1.159 +CREATE TYPE epoint ( 1.160 + internallength = 16, 1.161 + input = epoint_in, 1.162 + output = epoint_out, 1.163 + receive = epoint_recv, 1.164 + send = epoint_send, 1.165 + alignment = double ); 1.166 + 1.167 +CREATE TYPE epoint_with_sample_count ( 1.168 + internallength = 20, 1.169 + input = epoint_with_sample_count_in, 1.170 + output = epoint_with_sample_count_out, 1.171 + alignment = double ); 1.172 + 1.173 +CREATE TYPE ebox ( 1.174 + internallength = 32, 1.175 + input = ebox_in, 1.176 + output = ebox_out, 1.177 + receive = ebox_recv, 1.178 + send = ebox_send, 1.179 + alignment = double ); 1.180 + 1.181 +CREATE TYPE ecircle ( 1.182 + internallength = 24, 1.183 + input = ecircle_in, 1.184 + output = ecircle_out, 1.185 + receive = ecircle_recv, 1.186 + send = ecircle_send, 1.187 + alignment = double ); 1.188 + 1.189 +CREATE TYPE ecluster ( 1.190 + internallength = VARIABLE, 1.191 + input = ecluster_in, 1.192 + output = ecluster_out, 1.193 + alignment = double, 1.194 + storage = external ); 1.195 + 1.196 + 1.197 +-------------------- 1.198 +-- B-tree support -- 1.199 +-------------------- 1.200 + 1.201 +-- begin of B-tree support for epoint 1.202 + 1.203 +CREATE FUNCTION epoint_btree_lt(epoint, epoint) 1.204 + RETURNS boolean 1.205 + LANGUAGE C IMMUTABLE STRICT 1.206 + AS '$libdir/latlon-v0009', 'pgl_btree_epoint_lt'; 1.207 + 1.208 +CREATE FUNCTION epoint_btree_le(epoint, epoint) 1.209 + RETURNS boolean 1.210 + LANGUAGE C IMMUTABLE STRICT 1.211 + AS '$libdir/latlon-v0009', 'pgl_btree_epoint_le'; 1.212 + 1.213 +CREATE FUNCTION epoint_btree_eq(epoint, epoint) 1.214 + RETURNS boolean 1.215 + LANGUAGE C IMMUTABLE STRICT 1.216 + AS '$libdir/latlon-v0009', 'pgl_btree_epoint_eq'; 1.217 + 1.218 +CREATE FUNCTION epoint_btree_ne(epoint, epoint) 1.219 + RETURNS boolean 1.220 + LANGUAGE C IMMUTABLE STRICT 1.221 + AS '$libdir/latlon-v0009', 'pgl_btree_epoint_ne'; 1.222 + 1.223 +CREATE FUNCTION epoint_btree_ge(epoint, epoint) 1.224 + RETURNS boolean 1.225 + LANGUAGE C IMMUTABLE STRICT 1.226 + AS '$libdir/latlon-v0009', 'pgl_btree_epoint_ge'; 1.227 + 1.228 +CREATE FUNCTION epoint_btree_gt(epoint, epoint) 1.229 + RETURNS boolean 1.230 + LANGUAGE C IMMUTABLE STRICT 1.231 + AS '$libdir/latlon-v0009', 'pgl_btree_epoint_gt'; 1.232 + 1.233 +CREATE OPERATOR <<< ( 1.234 + leftarg = epoint, 1.235 + rightarg = epoint, 1.236 + procedure = epoint_btree_lt, 1.237 + commutator = >>>, 1.238 + negator = >>>=, 1.239 + restrict = scalarltsel, 1.240 + join = scalarltjoinsel 1.241 +); 1.242 + 1.243 +CREATE OPERATOR <<<= ( 1.244 + leftarg = epoint, 1.245 + rightarg = epoint, 1.246 + procedure = epoint_btree_le, 1.247 + commutator = >>>=, 1.248 + negator = >>>, 1.249 + restrict = scalarltsel, 1.250 + join = scalarltjoinsel 1.251 +); 1.252 + 1.253 +CREATE OPERATOR = ( 1.254 + leftarg = epoint, 1.255 + rightarg = epoint, 1.256 + procedure = epoint_btree_eq, 1.257 + commutator = =, 1.258 + negator = <>, 1.259 + restrict = eqsel, 1.260 + join = eqjoinsel, 1.261 + merges 1.262 +); 1.263 + 1.264 +CREATE OPERATOR <> ( 1.265 + leftarg = epoint, 1.266 + rightarg = epoint, 1.267 + procedure = epoint_btree_eq, 1.268 + commutator = <>, 1.269 + negator = =, 1.270 + restrict = neqsel, 1.271 + join = neqjoinsel 1.272 +); 1.273 + 1.274 +CREATE OPERATOR >>>= ( 1.275 + leftarg = epoint, 1.276 + rightarg = epoint, 1.277 + procedure = epoint_btree_ge, 1.278 + commutator = <<<=, 1.279 + negator = <<<, 1.280 + restrict = scalargtsel, 1.281 + join = scalargtjoinsel 1.282 +); 1.283 + 1.284 +CREATE OPERATOR >>> ( 1.285 + leftarg = epoint, 1.286 + rightarg = epoint, 1.287 + procedure = epoint_btree_gt, 1.288 + commutator = <<<, 1.289 + negator = <<<=, 1.290 + restrict = scalargtsel, 1.291 + join = scalargtjoinsel 1.292 +); 1.293 + 1.294 +CREATE FUNCTION epoint_btree_cmp(epoint, epoint) 1.295 + RETURNS int4 1.296 + LANGUAGE C IMMUTABLE STRICT 1.297 + AS '$libdir/latlon-v0009', 'pgl_btree_epoint_cmp'; 1.298 + 1.299 +CREATE OPERATOR CLASS epoint_btree_ops 1.300 + DEFAULT FOR TYPE epoint USING btree AS 1.301 + OPERATOR 1 <<< , 1.302 + OPERATOR 2 <<<= , 1.303 + OPERATOR 3 = , 1.304 + OPERATOR 4 >>>= , 1.305 + OPERATOR 5 >>> , 1.306 + FUNCTION 1 epoint_btree_cmp(epoint, epoint); 1.307 + 1.308 +-- end of B-tree support for epoint 1.309 + 1.310 +-- begin of B-tree support for ebox 1.311 + 1.312 +CREATE FUNCTION ebox_btree_lt(ebox, ebox) 1.313 + RETURNS boolean 1.314 + LANGUAGE C IMMUTABLE STRICT 1.315 + AS '$libdir/latlon-v0009', 'pgl_btree_ebox_lt'; 1.316 + 1.317 +CREATE FUNCTION ebox_btree_le(ebox, ebox) 1.318 + RETURNS boolean 1.319 + LANGUAGE C IMMUTABLE STRICT 1.320 + AS '$libdir/latlon-v0009', 'pgl_btree_ebox_le'; 1.321 + 1.322 +CREATE FUNCTION ebox_btree_eq(ebox, ebox) 1.323 + RETURNS boolean 1.324 + LANGUAGE C IMMUTABLE STRICT 1.325 + AS '$libdir/latlon-v0009', 'pgl_btree_ebox_eq'; 1.326 + 1.327 +CREATE FUNCTION ebox_btree_ne(ebox, ebox) 1.328 + RETURNS boolean 1.329 + LANGUAGE C IMMUTABLE STRICT 1.330 + AS '$libdir/latlon-v0009', 'pgl_btree_ebox_ne'; 1.331 + 1.332 +CREATE FUNCTION ebox_btree_ge(ebox, ebox) 1.333 + RETURNS boolean 1.334 + LANGUAGE C IMMUTABLE STRICT 1.335 + AS '$libdir/latlon-v0009', 'pgl_btree_ebox_ge'; 1.336 + 1.337 +CREATE FUNCTION ebox_btree_gt(ebox, ebox) 1.338 + RETURNS boolean 1.339 + LANGUAGE C IMMUTABLE STRICT 1.340 + AS '$libdir/latlon-v0009', 'pgl_btree_ebox_gt'; 1.341 + 1.342 +CREATE OPERATOR <<< ( 1.343 + leftarg = ebox, 1.344 + rightarg = ebox, 1.345 + procedure = ebox_btree_lt, 1.346 + commutator = >>>, 1.347 + negator = >>>=, 1.348 + restrict = scalarltsel, 1.349 + join = scalarltjoinsel 1.350 +); 1.351 + 1.352 +CREATE OPERATOR <<<= ( 1.353 + leftarg = ebox, 1.354 + rightarg = ebox, 1.355 + procedure = ebox_btree_le, 1.356 + commutator = >>>=, 1.357 + negator = >>>, 1.358 + restrict = scalarltsel, 1.359 + join = scalarltjoinsel 1.360 +); 1.361 + 1.362 +CREATE OPERATOR = ( 1.363 + leftarg = ebox, 1.364 + rightarg = ebox, 1.365 + procedure = ebox_btree_eq, 1.366 + commutator = =, 1.367 + negator = <>, 1.368 + restrict = eqsel, 1.369 + join = eqjoinsel, 1.370 + merges 1.371 +); 1.372 + 1.373 +CREATE OPERATOR <> ( 1.374 + leftarg = ebox, 1.375 + rightarg = ebox, 1.376 + procedure = ebox_btree_eq, 1.377 + commutator = <>, 1.378 + negator = =, 1.379 + restrict = neqsel, 1.380 + join = neqjoinsel 1.381 +); 1.382 + 1.383 +CREATE OPERATOR >>>= ( 1.384 + leftarg = ebox, 1.385 + rightarg = ebox, 1.386 + procedure = ebox_btree_ge, 1.387 + commutator = <<<=, 1.388 + negator = <<<, 1.389 + restrict = scalargtsel, 1.390 + join = scalargtjoinsel 1.391 +); 1.392 + 1.393 +CREATE OPERATOR >>> ( 1.394 + leftarg = ebox, 1.395 + rightarg = ebox, 1.396 + procedure = ebox_btree_gt, 1.397 + commutator = <<<, 1.398 + negator = <<<=, 1.399 + restrict = scalargtsel, 1.400 + join = scalargtjoinsel 1.401 +); 1.402 + 1.403 +CREATE FUNCTION ebox_btree_cmp(ebox, ebox) 1.404 + RETURNS int4 1.405 + LANGUAGE C IMMUTABLE STRICT 1.406 + AS '$libdir/latlon-v0009', 'pgl_btree_ebox_cmp'; 1.407 + 1.408 +CREATE OPERATOR CLASS ebox_btree_ops 1.409 + DEFAULT FOR TYPE ebox USING btree AS 1.410 + OPERATOR 1 <<< , 1.411 + OPERATOR 2 <<<= , 1.412 + OPERATOR 3 = , 1.413 + OPERATOR 4 >>>= , 1.414 + OPERATOR 5 >>> , 1.415 + FUNCTION 1 ebox_btree_cmp(ebox, ebox); 1.416 + 1.417 +-- end of B-tree support for ebox 1.418 + 1.419 +-- begin of B-tree support for ecircle 1.420 + 1.421 +CREATE FUNCTION ecircle_btree_lt(ecircle, ecircle) 1.422 + RETURNS boolean 1.423 + LANGUAGE C IMMUTABLE STRICT 1.424 + AS '$libdir/latlon-v0009', 'pgl_btree_ecircle_lt'; 1.425 + 1.426 +CREATE FUNCTION ecircle_btree_le(ecircle, ecircle) 1.427 + RETURNS boolean 1.428 + LANGUAGE C IMMUTABLE STRICT 1.429 + AS '$libdir/latlon-v0009', 'pgl_btree_ecircle_le'; 1.430 + 1.431 +CREATE FUNCTION ecircle_btree_eq(ecircle, ecircle) 1.432 + RETURNS boolean 1.433 + LANGUAGE C IMMUTABLE STRICT 1.434 + AS '$libdir/latlon-v0009', 'pgl_btree_ecircle_eq'; 1.435 + 1.436 +CREATE FUNCTION ecircle_btree_ne(ecircle, ecircle) 1.437 + RETURNS boolean 1.438 + LANGUAGE C IMMUTABLE STRICT 1.439 + AS '$libdir/latlon-v0009', 'pgl_btree_ecircle_ne'; 1.440 + 1.441 +CREATE FUNCTION ecircle_btree_ge(ecircle, ecircle) 1.442 + RETURNS boolean 1.443 + LANGUAGE C IMMUTABLE STRICT 1.444 + AS '$libdir/latlon-v0009', 'pgl_btree_ecircle_ge'; 1.445 + 1.446 +CREATE FUNCTION ecircle_btree_gt(ecircle, ecircle) 1.447 + RETURNS boolean 1.448 + LANGUAGE C IMMUTABLE STRICT 1.449 + AS '$libdir/latlon-v0009', 'pgl_btree_ecircle_gt'; 1.450 + 1.451 +CREATE OPERATOR <<< ( 1.452 + leftarg = ecircle, 1.453 + rightarg = ecircle, 1.454 + procedure = ecircle_btree_lt, 1.455 + commutator = >>>, 1.456 + negator = >>>=, 1.457 + restrict = scalarltsel, 1.458 + join = scalarltjoinsel 1.459 +); 1.460 + 1.461 +CREATE OPERATOR <<<= ( 1.462 + leftarg = ecircle, 1.463 + rightarg = ecircle, 1.464 + procedure = ecircle_btree_le, 1.465 + commutator = >>>=, 1.466 + negator = >>>, 1.467 + restrict = scalarltsel, 1.468 + join = scalarltjoinsel 1.469 +); 1.470 + 1.471 +CREATE OPERATOR = ( 1.472 + leftarg = ecircle, 1.473 + rightarg = ecircle, 1.474 + procedure = ecircle_btree_eq, 1.475 + commutator = =, 1.476 + negator = <>, 1.477 + restrict = eqsel, 1.478 + join = eqjoinsel, 1.479 + merges 1.480 +); 1.481 + 1.482 +CREATE OPERATOR <> ( 1.483 + leftarg = ecircle, 1.484 + rightarg = ecircle, 1.485 + procedure = ecircle_btree_eq, 1.486 + commutator = <>, 1.487 + negator = =, 1.488 + restrict = neqsel, 1.489 + join = neqjoinsel 1.490 +); 1.491 + 1.492 +CREATE OPERATOR >>>= ( 1.493 + leftarg = ecircle, 1.494 + rightarg = ecircle, 1.495 + procedure = ecircle_btree_ge, 1.496 + commutator = <<<=, 1.497 + negator = <<<, 1.498 + restrict = scalargtsel, 1.499 + join = scalargtjoinsel 1.500 +); 1.501 + 1.502 +CREATE OPERATOR >>> ( 1.503 + leftarg = ecircle, 1.504 + rightarg = ecircle, 1.505 + procedure = ecircle_btree_gt, 1.506 + commutator = <<<, 1.507 + negator = <<<=, 1.508 + restrict = scalargtsel, 1.509 + join = scalargtjoinsel 1.510 +); 1.511 + 1.512 +CREATE FUNCTION ecircle_btree_cmp(ecircle, ecircle) 1.513 + RETURNS int4 1.514 + LANGUAGE C IMMUTABLE STRICT 1.515 + AS '$libdir/latlon-v0009', 'pgl_btree_ecircle_cmp'; 1.516 + 1.517 +CREATE OPERATOR CLASS ecircle_btree_ops 1.518 + DEFAULT FOR TYPE ecircle USING btree AS 1.519 + OPERATOR 1 <<< , 1.520 + OPERATOR 2 <<<= , 1.521 + OPERATOR 3 = , 1.522 + OPERATOR 4 >>>= , 1.523 + OPERATOR 5 >>> , 1.524 + FUNCTION 1 ecircle_btree_cmp(ecircle, ecircle); 1.525 + 1.526 +-- end of B-tree support for ecircle 1.527 + 1.528 + 1.529 +---------------- 1.530 +-- type casts -- 1.531 +---------------- 1.532 + 1.533 +CREATE FUNCTION cast_epoint_to_ebox(epoint) 1.534 + RETURNS ebox 1.535 + LANGUAGE C IMMUTABLE STRICT 1.536 + AS '$libdir/latlon-v0009', 'pgl_epoint_to_ebox'; 1.537 + 1.538 +CREATE CAST (epoint AS ebox) WITH FUNCTION cast_epoint_to_ebox(epoint); 1.539 + 1.540 +CREATE FUNCTION cast_epoint_to_ecircle(epoint) 1.541 + RETURNS ecircle 1.542 + LANGUAGE C IMMUTABLE STRICT 1.543 + AS '$libdir/latlon-v0009', 'pgl_epoint_to_ecircle'; 1.544 + 1.545 +CREATE CAST (epoint AS ecircle) WITH FUNCTION cast_epoint_to_ecircle(epoint); 1.546 + 1.547 +CREATE FUNCTION cast_epoint_to_ecluster(epoint) 1.548 + RETURNS ecluster 1.549 + LANGUAGE C IMMUTABLE STRICT 1.550 + AS '$libdir/latlon-v0009', 'pgl_epoint_to_ecluster'; 1.551 + 1.552 +CREATE CAST (epoint AS ecluster) WITH FUNCTION cast_epoint_to_ecluster(epoint); 1.553 + 1.554 +CREATE FUNCTION cast_ebox_to_ecluster(ebox) 1.555 + RETURNS ecluster 1.556 + LANGUAGE C IMMUTABLE STRICT 1.557 + AS '$libdir/latlon-v0009', 'pgl_ebox_to_ecluster'; 1.558 + 1.559 +CREATE CAST (ebox AS ecluster) WITH FUNCTION cast_ebox_to_ecluster(ebox); 1.560 + 1.561 + 1.562 +--------------------------- 1.563 +-- constructor functions -- 1.564 +--------------------------- 1.565 + 1.566 +CREATE FUNCTION epoint(float8, float8) 1.567 + RETURNS epoint 1.568 + LANGUAGE C IMMUTABLE STRICT 1.569 + AS '$libdir/latlon-v0009', 'pgl_create_epoint'; 1.570 + 1.571 +CREATE FUNCTION epoint_latlon(float8, float8) 1.572 + RETURNS epoint 1.573 + LANGUAGE SQL IMMUTABLE STRICT AS $$ 1.574 + SELECT epoint($1, $2) 1.575 + $$; 1.576 + 1.577 +CREATE FUNCTION epoint_lonlat(float8, float8) 1.578 + RETURNS epoint 1.579 + LANGUAGE SQL IMMUTABLE STRICT AS $$ 1.580 + SELECT epoint($2, $1) 1.581 + $$; 1.582 + 1.583 +CREATE FUNCTION epoint_with_sample_count(epoint, int4) 1.584 + RETURNS epoint_with_sample_count 1.585 + LANGUAGE C IMMUTABLE STRICT 1.586 + AS '$libdir/latlon-v0009', 'pgl_create_epoint_with_sample_count'; 1.587 + 1.588 +CREATE FUNCTION empty_ebox() 1.589 + RETURNS ebox 1.590 + LANGUAGE C IMMUTABLE STRICT 1.591 + AS '$libdir/latlon-v0009', 'pgl_create_empty_ebox'; 1.592 + 1.593 +CREATE FUNCTION ebox(float8, float8, float8, float8) 1.594 + RETURNS ebox 1.595 + LANGUAGE C IMMUTABLE STRICT 1.596 + AS '$libdir/latlon-v0009', 'pgl_create_ebox'; 1.597 + 1.598 +CREATE FUNCTION ebox(epoint, epoint) 1.599 + RETURNS ebox 1.600 + LANGUAGE C IMMUTABLE STRICT 1.601 + AS '$libdir/latlon-v0009', 'pgl_create_ebox_from_epoints'; 1.602 + 1.603 +CREATE FUNCTION ecircle(float8, float8, float8) 1.604 + RETURNS ecircle 1.605 + LANGUAGE C IMMUTABLE STRICT 1.606 + AS '$libdir/latlon-v0009', 'pgl_create_ecircle'; 1.607 + 1.608 +CREATE FUNCTION ecircle(epoint, float8) 1.609 + RETURNS ecircle 1.610 + LANGUAGE C IMMUTABLE STRICT 1.611 + AS '$libdir/latlon-v0009', 'pgl_create_ecircle_from_epoint'; 1.612 + 1.613 +CREATE FUNCTION ecluster_concat(ecluster[]) 1.614 + RETURNS ecluster 1.615 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.616 + SELECT array_to_string($1, ' ')::ecluster 1.617 + $$; 1.618 + 1.619 +CREATE FUNCTION ecluster_concat(ecluster, ecluster) 1.620 + RETURNS ecluster 1.621 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.622 + SELECT ($1::text || ' ' || $2::text)::ecluster 1.623 + $$; 1.624 + 1.625 +CREATE FUNCTION ecluster_create_multipoint(epoint[]) 1.626 + RETURNS ecluster 1.627 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.628 + SELECT 1.629 + array_to_string(array_agg('point (' || unnest || ')'), ' ')::ecluster 1.630 + FROM unnest($1) 1.631 + $$; 1.632 + 1.633 +CREATE FUNCTION ecluster_create_path(epoint[]) 1.634 + RETURNS ecluster 1.635 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.636 + SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE 1.637 + ('path (' || array_to_string($1, ' ') || ')')::ecluster 1.638 + END 1.639 + FROM array_to_string($1, ' ') AS "str" 1.640 + $$; 1.641 + 1.642 +CREATE FUNCTION ecluster_create_outline(epoint[]) 1.643 + RETURNS ecluster 1.644 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.645 + SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE 1.646 + ('outline (' || array_to_string($1, ' ') || ')')::ecluster 1.647 + END 1.648 + FROM array_to_string($1, ' ') AS "str" 1.649 + $$; 1.650 + 1.651 +CREATE FUNCTION ecluster_create_polygon(epoint[]) 1.652 + RETURNS ecluster 1.653 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.654 + SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE 1.655 + ('polygon (' || array_to_string($1, ' ') || ')')::ecluster 1.656 + END 1.657 + FROM array_to_string($1, ' ') AS "str" 1.658 + $$; 1.659 + 1.660 + 1.661 +---------------------- 1.662 +-- getter functions -- 1.663 +---------------------- 1.664 + 1.665 +CREATE FUNCTION latitude(epoint) 1.666 + RETURNS float8 1.667 + LANGUAGE C IMMUTABLE STRICT 1.668 + AS '$libdir/latlon-v0009', 'pgl_epoint_lat'; 1.669 + 1.670 +CREATE FUNCTION longitude(epoint) 1.671 + RETURNS float8 1.672 + LANGUAGE C IMMUTABLE STRICT 1.673 + AS '$libdir/latlon-v0009', 'pgl_epoint_lon'; 1.674 + 1.675 +CREATE FUNCTION min_latitude(ebox) 1.676 + RETURNS float8 1.677 + LANGUAGE C IMMUTABLE STRICT 1.678 + AS '$libdir/latlon-v0009', 'pgl_ebox_lat_min'; 1.679 + 1.680 +CREATE FUNCTION max_latitude(ebox) 1.681 + RETURNS float8 1.682 + LANGUAGE C IMMUTABLE STRICT 1.683 + AS '$libdir/latlon-v0009', 'pgl_ebox_lat_max'; 1.684 + 1.685 +CREATE FUNCTION min_longitude(ebox) 1.686 + RETURNS float8 1.687 + LANGUAGE C IMMUTABLE STRICT 1.688 + AS '$libdir/latlon-v0009', 'pgl_ebox_lon_min'; 1.689 + 1.690 +CREATE FUNCTION max_longitude(ebox) 1.691 + RETURNS float8 1.692 + LANGUAGE C IMMUTABLE STRICT 1.693 + AS '$libdir/latlon-v0009', 'pgl_ebox_lon_max'; 1.694 + 1.695 +CREATE FUNCTION center(ecircle) 1.696 + RETURNS epoint 1.697 + LANGUAGE C IMMUTABLE STRICT 1.698 + AS '$libdir/latlon-v0009', 'pgl_ecircle_center'; 1.699 + 1.700 +CREATE FUNCTION radius(ecircle) 1.701 + RETURNS float8 1.702 + LANGUAGE C IMMUTABLE STRICT 1.703 + AS '$libdir/latlon-v0009', 'pgl_ecircle_radius'; 1.704 + 1.705 +CREATE FUNCTION ecluster_extract_points(ecluster) 1.706 + RETURNS SETOF epoint 1.707 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.708 + SELECT "match"[2]::epoint 1.709 + FROM regexp_matches($1::text, e'(^| )point \\(([^)]+)\\)', 'g') AS "match" 1.710 + $$; 1.711 + 1.712 +CREATE FUNCTION ecluster_extract_paths(ecluster) 1.713 + RETURNS SETOF epoint[] 1.714 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.715 + SELECT ( 1.716 + SELECT array_agg("m2"[1]::epoint) 1.717 + FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2" 1.718 + ) 1.719 + FROM regexp_matches($1::text, e'(^| )path \\(([^)]+)\\)', 'g') AS "m1" 1.720 + $$; 1.721 + 1.722 +CREATE FUNCTION ecluster_extract_outlines(ecluster) 1.723 + RETURNS SETOF epoint[] 1.724 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.725 + SELECT ( 1.726 + SELECT array_agg("m2"[1]::epoint) 1.727 + FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2" 1.728 + ) 1.729 + FROM regexp_matches($1::text, e'(^| )outline \\(([^)]+)\\)', 'g') AS "m1" 1.730 + $$; 1.731 + 1.732 +CREATE FUNCTION ecluster_extract_polygons(ecluster) 1.733 + RETURNS SETOF epoint[] 1.734 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.735 + SELECT ( 1.736 + SELECT array_agg("m2"[1]::epoint) 1.737 + FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2" 1.738 + ) 1.739 + FROM regexp_matches($1::text, e'(^| )polygon \\(([^)]+)\\)', 'g') AS "m1" 1.740 + $$; 1.741 + 1.742 + 1.743 +--------------- 1.744 +-- operators -- 1.745 +--------------- 1.746 + 1.747 +CREATE FUNCTION epoint_ebox_overlap_proc(epoint, ebox) 1.748 + RETURNS boolean 1.749 + LANGUAGE C IMMUTABLE STRICT 1.750 + AS '$libdir/latlon-v0009', 'pgl_epoint_ebox_overlap'; 1.751 + 1.752 +CREATE FUNCTION epoint_ecircle_overlap_proc(epoint, ecircle) 1.753 + RETURNS boolean 1.754 + LANGUAGE C IMMUTABLE STRICT 1.755 + AS '$libdir/latlon-v0009', 'pgl_epoint_ecircle_overlap'; 1.756 + 1.757 +CREATE FUNCTION epoint_ecluster_overlap_proc(epoint, ecluster) 1.758 + RETURNS boolean 1.759 + LANGUAGE C IMMUTABLE STRICT 1.760 + AS '$libdir/latlon-v0009', 'pgl_epoint_ecluster_overlap'; 1.761 + 1.762 +CREATE FUNCTION epoint_ecluster_may_overlap_proc(epoint, ecluster) 1.763 + RETURNS boolean 1.764 + LANGUAGE C IMMUTABLE STRICT 1.765 + AS '$libdir/latlon-v0009', 'pgl_epoint_ecluster_may_overlap'; 1.766 + 1.767 +CREATE FUNCTION ebox_overlap_proc(ebox, ebox) 1.768 + RETURNS boolean 1.769 + LANGUAGE C IMMUTABLE STRICT 1.770 + AS '$libdir/latlon-v0009', 'pgl_ebox_overlap'; 1.771 + 1.772 +CREATE FUNCTION ebox_ecircle_may_overlap_proc(ebox, ecircle) 1.773 + RETURNS boolean 1.774 + LANGUAGE C IMMUTABLE STRICT 1.775 + AS '$libdir/latlon-v0009', 'pgl_ebox_ecircle_may_overlap'; 1.776 + 1.777 +CREATE FUNCTION ebox_ecluster_may_overlap_proc(ebox, ecluster) 1.778 + RETURNS boolean 1.779 + LANGUAGE C IMMUTABLE STRICT 1.780 + AS '$libdir/latlon-v0009', 'pgl_ebox_ecluster_may_overlap'; 1.781 + 1.782 +CREATE FUNCTION ecircle_overlap_proc(ecircle, ecircle) 1.783 + RETURNS boolean 1.784 + LANGUAGE C IMMUTABLE STRICT 1.785 + AS '$libdir/latlon-v0009', 'pgl_ecircle_overlap'; 1.786 + 1.787 +CREATE FUNCTION ecircle_ecluster_overlap_proc(ecircle, ecluster) 1.788 + RETURNS boolean 1.789 + LANGUAGE C IMMUTABLE STRICT 1.790 + AS '$libdir/latlon-v0009', 'pgl_ecircle_ecluster_overlap'; 1.791 + 1.792 +CREATE FUNCTION ecircle_ecluster_may_overlap_proc(ecircle, ecluster) 1.793 + RETURNS boolean 1.794 + LANGUAGE C IMMUTABLE STRICT 1.795 + AS '$libdir/latlon-v0009', 'pgl_ecircle_ecluster_may_overlap'; 1.796 + 1.797 +CREATE FUNCTION ecluster_overlap_proc(ecluster, ecluster) 1.798 + RETURNS boolean 1.799 + LANGUAGE C IMMUTABLE STRICT 1.800 + AS '$libdir/latlon-v0009', 'pgl_ecluster_overlap'; 1.801 + 1.802 +CREATE FUNCTION ecluster_may_overlap_proc(ecluster, ecluster) 1.803 + RETURNS boolean 1.804 + LANGUAGE C IMMUTABLE STRICT 1.805 + AS '$libdir/latlon-v0009', 'pgl_ecluster_may_overlap'; 1.806 + 1.807 +CREATE FUNCTION ecluster_contains_proc(ecluster, ecluster) 1.808 + RETURNS boolean 1.809 + LANGUAGE C IMMUTABLE STRICT 1.810 + AS '$libdir/latlon-v0009', 'pgl_ecluster_contains'; 1.811 + 1.812 +CREATE FUNCTION epoint_distance_proc(epoint, epoint) 1.813 + RETURNS float8 1.814 + LANGUAGE C IMMUTABLE STRICT 1.815 + AS '$libdir/latlon-v0009', 'pgl_epoint_distance'; 1.816 + 1.817 +CREATE FUNCTION epoint_ecircle_distance_proc(epoint, ecircle) 1.818 + RETURNS float8 1.819 + LANGUAGE C IMMUTABLE STRICT 1.820 + AS '$libdir/latlon-v0009', 'pgl_epoint_ecircle_distance'; 1.821 + 1.822 +CREATE FUNCTION epoint_ecluster_distance_proc(epoint, ecluster) 1.823 + RETURNS float8 1.824 + LANGUAGE C IMMUTABLE STRICT 1.825 + AS '$libdir/latlon-v0009', 'pgl_epoint_ecluster_distance'; 1.826 + 1.827 +CREATE FUNCTION ecircle_distance_proc(ecircle, ecircle) 1.828 + RETURNS float8 1.829 + LANGUAGE C IMMUTABLE STRICT 1.830 + AS '$libdir/latlon-v0009', 'pgl_ecircle_distance'; 1.831 + 1.832 +CREATE FUNCTION ecircle_ecluster_distance_proc(ecircle, ecluster) 1.833 + RETURNS float8 1.834 + LANGUAGE C IMMUTABLE STRICT 1.835 + AS '$libdir/latlon-v0009', 'pgl_ecircle_ecluster_distance'; 1.836 + 1.837 +CREATE FUNCTION ecluster_distance_proc(ecluster, ecluster) 1.838 + RETURNS float8 1.839 + LANGUAGE C IMMUTABLE STRICT 1.840 + AS '$libdir/latlon-v0009', 'pgl_ecluster_distance'; 1.841 + 1.842 +CREATE FUNCTION fair_distance_operator_proc(ecluster, epoint_with_sample_count) 1.843 + RETURNS float8 1.844 + LANGUAGE C IMMUTABLE STRICT 1.845 + AS '$libdir/latlon-v0009', 'pgl_ecluster_epoint_sc_fair_distance'; 1.846 + 1.847 +CREATE OPERATOR && ( 1.848 + leftarg = epoint, 1.849 + rightarg = ebox, 1.850 + procedure = epoint_ebox_overlap_proc, 1.851 + commutator = &&, 1.852 + restrict = areasel, 1.853 + join = areajoinsel 1.854 +); 1.855 + 1.856 +CREATE FUNCTION epoint_ebox_overlap_commutator(ebox, epoint) 1.857 + RETURNS boolean 1.858 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1'; 1.859 + 1.860 +CREATE OPERATOR && ( 1.861 + leftarg = ebox, 1.862 + rightarg = epoint, 1.863 + procedure = epoint_ebox_overlap_commutator, 1.864 + commutator = &&, 1.865 + restrict = areasel, 1.866 + join = areajoinsel 1.867 +); 1.868 + 1.869 +CREATE OPERATOR && ( 1.870 + leftarg = epoint, 1.871 + rightarg = ecircle, 1.872 + procedure = epoint_ecircle_overlap_proc, 1.873 + commutator = &&, 1.874 + restrict = areasel, 1.875 + join = areajoinsel 1.876 +); 1.877 + 1.878 +CREATE FUNCTION epoint_ecircle_overlap_commutator(ecircle, epoint) 1.879 + RETURNS boolean 1.880 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1'; 1.881 + 1.882 +CREATE OPERATOR && ( 1.883 + leftarg = ecircle, 1.884 + rightarg = epoint, 1.885 + procedure = epoint_ecircle_overlap_commutator, 1.886 + commutator = &&, 1.887 + restrict = areasel, 1.888 + join = areajoinsel 1.889 +); 1.890 + 1.891 +CREATE OPERATOR && ( 1.892 + leftarg = epoint, 1.893 + rightarg = ecluster, 1.894 + procedure = epoint_ecluster_overlap_proc, 1.895 + commutator = &&, 1.896 + restrict = areasel, 1.897 + join = areajoinsel 1.898 +); 1.899 + 1.900 +CREATE FUNCTION epoint_ecluster_overlap_commutator(ecluster, epoint) 1.901 + RETURNS boolean 1.902 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1'; 1.903 + 1.904 +CREATE OPERATOR && ( 1.905 + leftarg = ecluster, 1.906 + rightarg = epoint, 1.907 + procedure = epoint_ecluster_overlap_commutator, 1.908 + commutator = &&, 1.909 + restrict = areasel, 1.910 + join = areajoinsel 1.911 +); 1.912 + 1.913 +CREATE OPERATOR && ( 1.914 + leftarg = ebox, 1.915 + rightarg = ebox, 1.916 + procedure = ebox_overlap_proc, 1.917 + commutator = &&, 1.918 + restrict = areasel, 1.919 + join = areajoinsel 1.920 +); 1.921 + 1.922 +CREATE OPERATOR && ( 1.923 + leftarg = ecircle, 1.924 + rightarg = ecircle, 1.925 + procedure = ecircle_overlap_proc, 1.926 + commutator = &&, 1.927 + restrict = areasel, 1.928 + join = areajoinsel 1.929 +); 1.930 + 1.931 +CREATE OPERATOR && ( 1.932 + leftarg = ecircle, 1.933 + rightarg = ecluster, 1.934 + procedure = ecircle_ecluster_overlap_proc, 1.935 + commutator = &&, 1.936 + restrict = areasel, 1.937 + join = areajoinsel 1.938 +); 1.939 + 1.940 +CREATE FUNCTION ecircle_ecluster_overlap_commutator(ecluster, ecircle) 1.941 + RETURNS boolean 1.942 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1'; 1.943 + 1.944 +CREATE OPERATOR && ( 1.945 + leftarg = ecluster, 1.946 + rightarg = ecircle, 1.947 + procedure = ecircle_ecluster_overlap_commutator, 1.948 + commutator = &&, 1.949 + restrict = areasel, 1.950 + join = areajoinsel 1.951 +); 1.952 + 1.953 +CREATE OPERATOR && ( 1.954 + leftarg = ecluster, 1.955 + rightarg = ecluster, 1.956 + procedure = ecluster_overlap_proc, 1.957 + commutator = &&, 1.958 + restrict = areasel, 1.959 + join = areajoinsel 1.960 +); 1.961 + 1.962 +CREATE FUNCTION ebox_ecircle_overlap_castwrap(ebox, ecircle) 1.963 + RETURNS boolean 1.964 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster && $2'; 1.965 + 1.966 +CREATE OPERATOR && ( 1.967 + leftarg = ebox, 1.968 + rightarg = ecircle, 1.969 + procedure = ebox_ecircle_overlap_castwrap, 1.970 + commutator = &&, 1.971 + restrict = areasel, 1.972 + join = areajoinsel 1.973 +); 1.974 + 1.975 +CREATE FUNCTION ebox_ecircle_overlap_castwrap(ecircle, ebox) 1.976 + RETURNS boolean 1.977 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 && $2::ecluster'; 1.978 + 1.979 +CREATE OPERATOR && ( 1.980 + leftarg = ecircle, 1.981 + rightarg = ebox, 1.982 + procedure = ebox_ecircle_overlap_castwrap, 1.983 + commutator = &&, 1.984 + restrict = areasel, 1.985 + join = areajoinsel 1.986 +); 1.987 + 1.988 +CREATE FUNCTION ebox_ecluster_overlap_castwrap(ebox, ecluster) 1.989 + RETURNS boolean 1.990 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster && $2'; 1.991 + 1.992 +CREATE OPERATOR && ( 1.993 + leftarg = ebox, 1.994 + rightarg = ecluster, 1.995 + procedure = ebox_ecluster_overlap_castwrap, 1.996 + commutator = &&, 1.997 + restrict = areasel, 1.998 + join = areajoinsel 1.999 +); 1.1000 + 1.1001 +CREATE FUNCTION ebox_ecluster_overlap_castwrap(ecluster, ebox) 1.1002 + RETURNS boolean 1.1003 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 && $2::ecluster'; 1.1004 + 1.1005 +CREATE OPERATOR && ( 1.1006 + leftarg = ecluster, 1.1007 + rightarg = ebox, 1.1008 + procedure = ebox_ecluster_overlap_castwrap, 1.1009 + commutator = &&, 1.1010 + restrict = areasel, 1.1011 + join = areajoinsel 1.1012 +); 1.1013 + 1.1014 +CREATE OPERATOR &&+ ( 1.1015 + leftarg = epoint, 1.1016 + rightarg = ecluster, 1.1017 + procedure = epoint_ecluster_may_overlap_proc, 1.1018 + commutator = &&+, 1.1019 + restrict = areasel, 1.1020 + join = areajoinsel 1.1021 +); 1.1022 + 1.1023 +CREATE FUNCTION epoint_ecluster_may_overlap_commutator(ecluster, epoint) 1.1024 + RETURNS boolean 1.1025 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1'; 1.1026 + 1.1027 +CREATE OPERATOR &&+ ( 1.1028 + leftarg = ecluster, 1.1029 + rightarg = epoint, 1.1030 + procedure = epoint_ecluster_may_overlap_commutator, 1.1031 + commutator = &&+, 1.1032 + restrict = areasel, 1.1033 + join = areajoinsel 1.1034 +); 1.1035 + 1.1036 +CREATE OPERATOR &&+ ( 1.1037 + leftarg = ebox, 1.1038 + rightarg = ecircle, 1.1039 + procedure = ebox_ecircle_may_overlap_proc, 1.1040 + commutator = &&+, 1.1041 + restrict = areasel, 1.1042 + join = areajoinsel 1.1043 +); 1.1044 + 1.1045 +CREATE FUNCTION ebox_ecircle_may_overlap_commutator(ecircle, ebox) 1.1046 + RETURNS boolean 1.1047 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1'; 1.1048 + 1.1049 +CREATE OPERATOR &&+ ( 1.1050 + leftarg = ecircle, 1.1051 + rightarg = ebox, 1.1052 + procedure = ebox_ecircle_may_overlap_commutator, 1.1053 + commutator = &&+, 1.1054 + restrict = areasel, 1.1055 + join = areajoinsel 1.1056 +); 1.1057 + 1.1058 +CREATE OPERATOR &&+ ( 1.1059 + leftarg = ebox, 1.1060 + rightarg = ecluster, 1.1061 + procedure = ebox_ecluster_may_overlap_proc, 1.1062 + commutator = &&+, 1.1063 + restrict = areasel, 1.1064 + join = areajoinsel 1.1065 +); 1.1066 + 1.1067 +CREATE FUNCTION ebox_ecluster_may_overlap_commutator(ecluster, ebox) 1.1068 + RETURNS boolean 1.1069 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1'; 1.1070 + 1.1071 +CREATE OPERATOR &&+ ( 1.1072 + leftarg = ecluster, 1.1073 + rightarg = ebox, 1.1074 + procedure = ebox_ecluster_may_overlap_commutator, 1.1075 + commutator = &&+, 1.1076 + restrict = areasel, 1.1077 + join = areajoinsel 1.1078 +); 1.1079 + 1.1080 +CREATE OPERATOR &&+ ( 1.1081 + leftarg = ecircle, 1.1082 + rightarg = ecluster, 1.1083 + procedure = ecircle_ecluster_may_overlap_proc, 1.1084 + commutator = &&+, 1.1085 + restrict = areasel, 1.1086 + join = areajoinsel 1.1087 +); 1.1088 + 1.1089 +CREATE FUNCTION ecircle_ecluster_may_overlap_commutator(ecluster, ecircle) 1.1090 + RETURNS boolean 1.1091 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1'; 1.1092 + 1.1093 +CREATE OPERATOR &&+ ( 1.1094 + leftarg = ecluster, 1.1095 + rightarg = ecircle, 1.1096 + procedure = ecircle_ecluster_may_overlap_commutator, 1.1097 + commutator = &&+, 1.1098 + restrict = areasel, 1.1099 + join = areajoinsel 1.1100 +); 1.1101 + 1.1102 +CREATE OPERATOR &&+ ( 1.1103 + leftarg = ecluster, 1.1104 + rightarg = ecluster, 1.1105 + procedure = ecluster_may_overlap_proc, 1.1106 + commutator = &&+, 1.1107 + restrict = areasel, 1.1108 + join = areajoinsel 1.1109 +); 1.1110 + 1.1111 +CREATE OPERATOR @> ( 1.1112 + leftarg = ebox, 1.1113 + rightarg = epoint, 1.1114 + procedure = epoint_ebox_overlap_commutator, 1.1115 + commutator = <@, 1.1116 + restrict = areasel, 1.1117 + join = areajoinsel 1.1118 +); 1.1119 + 1.1120 +CREATE OPERATOR <@ ( 1.1121 + leftarg = epoint, 1.1122 + rightarg = ebox, 1.1123 + procedure = epoint_ebox_overlap_proc, 1.1124 + commutator = @>, 1.1125 + restrict = areasel, 1.1126 + join = areajoinsel 1.1127 +); 1.1128 + 1.1129 +CREATE OPERATOR @> ( 1.1130 + leftarg = ecluster, 1.1131 + rightarg = epoint, 1.1132 + procedure = epoint_ecluster_overlap_commutator, 1.1133 + commutator = <@, 1.1134 + restrict = areasel, 1.1135 + join = areajoinsel 1.1136 +); 1.1137 + 1.1138 +CREATE OPERATOR <@ ( 1.1139 + leftarg = epoint, 1.1140 + rightarg = ecluster, 1.1141 + procedure = epoint_ecluster_overlap_proc, 1.1142 + commutator = <@, 1.1143 + restrict = areasel, 1.1144 + join = areajoinsel 1.1145 +); 1.1146 + 1.1147 +CREATE OPERATOR @> ( 1.1148 + leftarg = ecluster, 1.1149 + rightarg = ecluster, 1.1150 + procedure = ecluster_contains_proc, 1.1151 + commutator = <@, 1.1152 + restrict = areasel, 1.1153 + join = areajoinsel 1.1154 +); 1.1155 + 1.1156 +CREATE FUNCTION ecluster_contains_commutator(ecluster, ecluster) 1.1157 + RETURNS boolean 1.1158 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 @> $1'; 1.1159 + 1.1160 +CREATE OPERATOR <@ ( 1.1161 + leftarg = ecluster, 1.1162 + rightarg = ecluster, 1.1163 + procedure = ecluster_contains_commutator, 1.1164 + commutator = @>, 1.1165 + restrict = areasel, 1.1166 + join = areajoinsel 1.1167 +); 1.1168 + 1.1169 +CREATE FUNCTION ebox_contains_castwrap(ebox, ebox) 1.1170 + RETURNS boolean 1.1171 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster @> $2::ecluster'; 1.1172 + 1.1173 +CREATE OPERATOR @> ( 1.1174 + leftarg = ebox, 1.1175 + rightarg = ebox, 1.1176 + procedure = ebox_contains_castwrap, 1.1177 + commutator = <@, 1.1178 + restrict = areasel, 1.1179 + join = areajoinsel 1.1180 +); 1.1181 + 1.1182 +CREATE FUNCTION ebox_contains_swapped_castwrap(ebox, ebox) 1.1183 + RETURNS boolean 1.1184 + LANGUAGE sql IMMUTABLE AS 'SELECT $2::ecluster @> $1::ecluster'; 1.1185 + 1.1186 +CREATE OPERATOR <@ ( 1.1187 + leftarg = ebox, 1.1188 + rightarg = ebox, 1.1189 + procedure = ebox_contains_swapped_castwrap, 1.1190 + commutator = @>, 1.1191 + restrict = areasel, 1.1192 + join = areajoinsel 1.1193 +); 1.1194 + 1.1195 +CREATE FUNCTION ebox_ecluster_contains_castwrap(ebox, ecluster) 1.1196 + RETURNS boolean 1.1197 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster @> $2'; 1.1198 + 1.1199 +CREATE OPERATOR @> ( 1.1200 + leftarg = ebox, 1.1201 + rightarg = ecluster, 1.1202 + procedure = ebox_ecluster_contains_castwrap, 1.1203 + commutator = <@, 1.1204 + restrict = areasel, 1.1205 + join = areajoinsel 1.1206 +); 1.1207 + 1.1208 +CREATE FUNCTION ebox_ecluster_contains_castwrap(ecluster, ebox) 1.1209 + RETURNS boolean 1.1210 + LANGUAGE sql IMMUTABLE AS 'SELECT $2::ecluster @> $1'; 1.1211 + 1.1212 +CREATE OPERATOR <@ ( 1.1213 + leftarg = ecluster, 1.1214 + rightarg = ebox, 1.1215 + procedure = ebox_ecluster_contains_castwrap, 1.1216 + commutator = @>, 1.1217 + restrict = areasel, 1.1218 + join = areajoinsel 1.1219 +); 1.1220 + 1.1221 +CREATE FUNCTION ecluster_ebox_contains_castwrap(ecluster, ebox) 1.1222 + RETURNS boolean 1.1223 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 @> $2::ecluster'; 1.1224 + 1.1225 +CREATE OPERATOR @> ( 1.1226 + leftarg = ecluster, 1.1227 + rightarg = ebox, 1.1228 + procedure = ecluster_ebox_contains_castwrap, 1.1229 + commutator = <@, 1.1230 + restrict = areasel, 1.1231 + join = areajoinsel 1.1232 +); 1.1233 + 1.1234 +CREATE FUNCTION ecluster_ebox_contains_castwrap(ebox, ecluster) 1.1235 + RETURNS boolean 1.1236 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 @> $1::ecluster'; 1.1237 + 1.1238 +CREATE OPERATOR <@ ( 1.1239 + leftarg = ebox, 1.1240 + rightarg = ecluster, 1.1241 + procedure = ecluster_ebox_contains_castwrap, 1.1242 + commutator = @>, 1.1243 + restrict = areasel, 1.1244 + join = areajoinsel 1.1245 +); 1.1246 + 1.1247 +CREATE OPERATOR <-> ( 1.1248 + leftarg = epoint, 1.1249 + rightarg = epoint, 1.1250 + procedure = epoint_distance_proc, 1.1251 + commutator = <-> 1.1252 +); 1.1253 + 1.1254 +CREATE OPERATOR <-> ( 1.1255 + leftarg = epoint, 1.1256 + rightarg = ecircle, 1.1257 + procedure = epoint_ecircle_distance_proc, 1.1258 + commutator = <-> 1.1259 +); 1.1260 + 1.1261 +CREATE FUNCTION epoint_ecircle_distance_commutator(ecircle, epoint) 1.1262 + RETURNS float8 1.1263 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1'; 1.1264 + 1.1265 +CREATE OPERATOR <-> ( 1.1266 + leftarg = ecircle, 1.1267 + rightarg = epoint, 1.1268 + procedure = epoint_ecircle_distance_commutator, 1.1269 + commutator = <-> 1.1270 +); 1.1271 + 1.1272 +CREATE OPERATOR <-> ( 1.1273 + leftarg = epoint, 1.1274 + rightarg = ecluster, 1.1275 + procedure = epoint_ecluster_distance_proc, 1.1276 + commutator = <-> 1.1277 +); 1.1278 + 1.1279 +CREATE FUNCTION epoint_ecluster_distance_commutator(ecluster, epoint) 1.1280 + RETURNS float8 1.1281 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1'; 1.1282 + 1.1283 +CREATE OPERATOR <-> ( 1.1284 + leftarg = ecluster, 1.1285 + rightarg = epoint, 1.1286 + procedure = epoint_ecluster_distance_commutator, 1.1287 + commutator = <-> 1.1288 +); 1.1289 + 1.1290 +CREATE OPERATOR <-> ( 1.1291 + leftarg = ecircle, 1.1292 + rightarg = ecircle, 1.1293 + procedure = ecircle_distance_proc, 1.1294 + commutator = <-> 1.1295 +); 1.1296 + 1.1297 +CREATE OPERATOR <-> ( 1.1298 + leftarg = ecircle, 1.1299 + rightarg = ecluster, 1.1300 + procedure = ecircle_ecluster_distance_proc, 1.1301 + commutator = <-> 1.1302 +); 1.1303 + 1.1304 +CREATE FUNCTION ecircle_ecluster_distance_commutator(ecluster, ecircle) 1.1305 + RETURNS float8 1.1306 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1'; 1.1307 + 1.1308 +CREATE OPERATOR <-> ( 1.1309 + leftarg = ecluster, 1.1310 + rightarg = ecircle, 1.1311 + procedure = ecircle_ecluster_distance_commutator, 1.1312 + commutator = <-> 1.1313 +); 1.1314 + 1.1315 +CREATE OPERATOR <-> ( 1.1316 + leftarg = ecluster, 1.1317 + rightarg = ecluster, 1.1318 + procedure = ecluster_distance_proc, 1.1319 + commutator = <-> 1.1320 +); 1.1321 + 1.1322 +CREATE FUNCTION epoint_ebox_distance_castwrap(epoint, ebox) 1.1323 + RETURNS float8 1.1324 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster'; 1.1325 + 1.1326 +CREATE OPERATOR <-> ( 1.1327 + leftarg = epoint, 1.1328 + rightarg = ebox, 1.1329 + procedure = epoint_ebox_distance_castwrap, 1.1330 + commutator = <-> 1.1331 +); 1.1332 + 1.1333 +CREATE FUNCTION epoint_ebox_distance_castwrap(ebox, epoint) 1.1334 + RETURNS float8 1.1335 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2'; 1.1336 + 1.1337 +CREATE OPERATOR <-> ( 1.1338 + leftarg = ebox, 1.1339 + rightarg = epoint, 1.1340 + procedure = epoint_ebox_distance_castwrap, 1.1341 + commutator = <-> 1.1342 +); 1.1343 + 1.1344 +CREATE FUNCTION ebox_distance_castwrap(ebox, ebox) 1.1345 + RETURNS float8 1.1346 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2::ecluster'; 1.1347 + 1.1348 +CREATE OPERATOR <-> ( 1.1349 + leftarg = ebox, 1.1350 + rightarg = ebox, 1.1351 + procedure = ebox_distance_castwrap, 1.1352 + commutator = <-> 1.1353 +); 1.1354 + 1.1355 +CREATE FUNCTION ebox_ecircle_distance_castwrap(ebox, ecircle) 1.1356 + RETURNS float8 1.1357 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2'; 1.1358 + 1.1359 +CREATE OPERATOR <-> ( 1.1360 + leftarg = ebox, 1.1361 + rightarg = ecircle, 1.1362 + procedure = ebox_ecircle_distance_castwrap, 1.1363 + commutator = <-> 1.1364 +); 1.1365 + 1.1366 +CREATE FUNCTION ebox_ecircle_distance_castwrap(ecircle, ebox) 1.1367 + RETURNS float8 1.1368 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster'; 1.1369 + 1.1370 +CREATE OPERATOR <-> ( 1.1371 + leftarg = ecircle, 1.1372 + rightarg = ebox, 1.1373 + procedure = ebox_ecircle_distance_castwrap, 1.1374 + commutator = <-> 1.1375 +); 1.1376 + 1.1377 +CREATE FUNCTION ebox_ecluster_distance_castwrap(ebox, ecluster) 1.1378 + RETURNS float8 1.1379 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2'; 1.1380 + 1.1381 +CREATE OPERATOR <-> ( 1.1382 + leftarg = ebox, 1.1383 + rightarg = ecluster, 1.1384 + procedure = ebox_ecluster_distance_castwrap, 1.1385 + commutator = <-> 1.1386 +); 1.1387 + 1.1388 +CREATE FUNCTION ebox_ecluster_distance_castwrap(ecluster, ebox) 1.1389 + RETURNS float8 1.1390 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster'; 1.1391 + 1.1392 +CREATE OPERATOR <-> ( 1.1393 + leftarg = ecluster, 1.1394 + rightarg = ebox, 1.1395 + procedure = ebox_ecluster_distance_castwrap, 1.1396 + commutator = <-> 1.1397 +); 1.1398 + 1.1399 +CREATE OPERATOR <=> ( 1.1400 + leftarg = ecluster, 1.1401 + rightarg = epoint_with_sample_count, 1.1402 + procedure = fair_distance_operator_proc 1.1403 +); 1.1404 + 1.1405 + 1.1406 +---------------- 1.1407 +-- GiST index -- 1.1408 +---------------- 1.1409 + 1.1410 +CREATE FUNCTION pgl_gist_consistent(internal, internal, smallint, oid, internal) 1.1411 + RETURNS boolean 1.1412 + LANGUAGE C STRICT 1.1413 + AS '$libdir/latlon-v0009', 'pgl_gist_consistent'; 1.1414 + 1.1415 +CREATE FUNCTION pgl_gist_union(internal, internal) 1.1416 + RETURNS internal 1.1417 + LANGUAGE C STRICT 1.1418 + AS '$libdir/latlon-v0009', 'pgl_gist_union'; 1.1419 + 1.1420 +CREATE FUNCTION pgl_gist_compress_epoint(internal) 1.1421 + RETURNS internal 1.1422 + LANGUAGE C STRICT 1.1423 + AS '$libdir/latlon-v0009', 'pgl_gist_compress_epoint'; 1.1424 + 1.1425 +CREATE FUNCTION pgl_gist_compress_ecircle(internal) 1.1426 + RETURNS internal 1.1427 + LANGUAGE C STRICT 1.1428 + AS '$libdir/latlon-v0009', 'pgl_gist_compress_ecircle'; 1.1429 + 1.1430 +CREATE FUNCTION pgl_gist_compress_ecluster(internal) 1.1431 + RETURNS internal 1.1432 + LANGUAGE C STRICT 1.1433 + AS '$libdir/latlon-v0009', 'pgl_gist_compress_ecluster'; 1.1434 + 1.1435 +CREATE FUNCTION pgl_gist_decompress(internal) 1.1436 + RETURNS internal 1.1437 + LANGUAGE C STRICT 1.1438 + AS '$libdir/latlon-v0009', 'pgl_gist_decompress'; 1.1439 + 1.1440 +CREATE FUNCTION pgl_gist_penalty(internal, internal, internal) 1.1441 + RETURNS internal 1.1442 + LANGUAGE C STRICT 1.1443 + AS '$libdir/latlon-v0009', 'pgl_gist_penalty'; 1.1444 + 1.1445 +CREATE FUNCTION pgl_gist_picksplit(internal, internal) 1.1446 + RETURNS internal 1.1447 + LANGUAGE C STRICT 1.1448 + AS '$libdir/latlon-v0009', 'pgl_gist_picksplit'; 1.1449 + 1.1450 +CREATE FUNCTION pgl_gist_same(internal, internal, internal) 1.1451 + RETURNS internal 1.1452 + LANGUAGE C STRICT 1.1453 + AS '$libdir/latlon-v0009', 'pgl_gist_same'; 1.1454 + 1.1455 +CREATE FUNCTION pgl_gist_distance(internal, internal, smallint, oid) 1.1456 + RETURNS internal 1.1457 + LANGUAGE C STRICT 1.1458 + AS '$libdir/latlon-v0009', 'pgl_gist_distance'; 1.1459 + 1.1460 +CREATE OPERATOR CLASS epoint_ops 1.1461 + DEFAULT FOR TYPE epoint USING gist AS 1.1462 + OPERATOR 11 = , 1.1463 + OPERATOR 22 && (epoint, ebox), 1.1464 + OPERATOR 222 <@ (epoint, ebox), 1.1465 + OPERATOR 23 && (epoint, ecircle), 1.1466 + OPERATOR 24 && (epoint, ecluster), 1.1467 + OPERATOR 124 &&+ (epoint, ecluster), 1.1468 + OPERATOR 224 <@ (epoint, ecluster), 1.1469 + OPERATOR 31 <-> (epoint, epoint) FOR ORDER BY float_ops, 1.1470 + OPERATOR 32 <-> (epoint, ebox) FOR ORDER BY float_ops, 1.1471 + OPERATOR 33 <-> (epoint, ecircle) FOR ORDER BY float_ops, 1.1472 + OPERATOR 34 <-> (epoint, ecluster) FOR ORDER BY float_ops, 1.1473 + FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal), 1.1474 + FUNCTION 2 pgl_gist_union(internal, internal), 1.1475 + FUNCTION 3 pgl_gist_compress_epoint(internal), 1.1476 + FUNCTION 4 pgl_gist_decompress(internal), 1.1477 + FUNCTION 5 pgl_gist_penalty(internal, internal, internal), 1.1478 + FUNCTION 6 pgl_gist_picksplit(internal, internal), 1.1479 + FUNCTION 7 pgl_gist_same(internal, internal, internal), 1.1480 + FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid), 1.1481 + STORAGE ekey_point; 1.1482 + 1.1483 +CREATE OPERATOR CLASS ecircle_ops 1.1484 + DEFAULT FOR TYPE ecircle USING gist AS 1.1485 + OPERATOR 13 = , 1.1486 + OPERATOR 21 && (ecircle, epoint), 1.1487 + OPERATOR 22 && (ecircle, ebox), 1.1488 + OPERATOR 122 &&+ (ecircle, ebox), 1.1489 + OPERATOR 23 && (ecircle, ecircle), 1.1490 + OPERATOR 24 && (ecircle, ecluster), 1.1491 + OPERATOR 124 &&+ (ecircle, ecluster), 1.1492 + OPERATOR 31 <-> (ecircle, epoint) FOR ORDER BY float_ops, 1.1493 + OPERATOR 32 <-> (ecircle, ebox) FOR ORDER BY float_ops, 1.1494 + OPERATOR 33 <-> (ecircle, ecircle) FOR ORDER BY float_ops, 1.1495 + OPERATOR 34 <-> (ecircle, ecluster) FOR ORDER BY float_ops, 1.1496 + FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal), 1.1497 + FUNCTION 2 pgl_gist_union(internal, internal), 1.1498 + FUNCTION 3 pgl_gist_compress_ecircle(internal), 1.1499 + FUNCTION 4 pgl_gist_decompress(internal), 1.1500 + FUNCTION 5 pgl_gist_penalty(internal, internal, internal), 1.1501 + FUNCTION 6 pgl_gist_picksplit(internal, internal), 1.1502 + FUNCTION 7 pgl_gist_same(internal, internal, internal), 1.1503 + FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid), 1.1504 + STORAGE ekey_area; 1.1505 + 1.1506 +CREATE OPERATOR CLASS ecluster_ops 1.1507 + DEFAULT FOR TYPE ecluster USING gist AS 1.1508 + OPERATOR 21 && (ecluster, epoint), 1.1509 + OPERATOR 121 &&+ (ecluster, epoint), 1.1510 + OPERATOR 221 @> (ecluster, epoint), 1.1511 + OPERATOR 22 && (ecluster, ebox), 1.1512 + OPERATOR 122 &&+ (ecluster, ebox), 1.1513 + OPERATOR 222 @> (ecluster, ebox), 1.1514 + OPERATOR 322 <@ (ecluster, ebox), 1.1515 + OPERATOR 23 && (ecluster, ecircle), 1.1516 + OPERATOR 123 &&+ (ecluster, ecircle), 1.1517 + OPERATOR 24 && (ecluster, ecluster), 1.1518 + OPERATOR 124 &&+ (ecluster, ecluster), 1.1519 + OPERATOR 224 @> (ecluster, ecluster), 1.1520 + OPERATOR 324 <@ (ecluster, ecluster), 1.1521 + OPERATOR 31 <-> (ecluster, epoint) FOR ORDER BY float_ops, 1.1522 + OPERATOR 32 <-> (ecluster, ebox) FOR ORDER BY float_ops, 1.1523 + OPERATOR 33 <-> (ecluster, ecircle) FOR ORDER BY float_ops, 1.1524 + OPERATOR 34 <-> (ecluster, ecluster) FOR ORDER BY float_ops, 1.1525 + OPERATOR 131 <=> (ecluster, epoint_with_sample_count) FOR ORDER BY float_ops, 1.1526 + FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal), 1.1527 + FUNCTION 2 pgl_gist_union(internal, internal), 1.1528 + FUNCTION 3 pgl_gist_compress_ecluster(internal), 1.1529 + FUNCTION 4 pgl_gist_decompress(internal), 1.1530 + FUNCTION 5 pgl_gist_penalty(internal, internal, internal), 1.1531 + FUNCTION 6 pgl_gist_picksplit(internal, internal), 1.1532 + FUNCTION 7 pgl_gist_same(internal, internal, internal), 1.1533 + FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid), 1.1534 + STORAGE ekey_area; 1.1535 + 1.1536 + 1.1537 +--------------------- 1.1538 +-- alias functions -- 1.1539 +--------------------- 1.1540 + 1.1541 +CREATE FUNCTION distance(epoint, epoint) 1.1542 + RETURNS float8 1.1543 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2'; 1.1544 + 1.1545 +CREATE FUNCTION distance(ecluster, epoint) 1.1546 + RETURNS float8 1.1547 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2'; 1.1548 + 1.1549 +CREATE FUNCTION distance_within(epoint, epoint, float8) 1.1550 + RETURNS boolean 1.1551 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 && ecircle($2, $3)'; 1.1552 + 1.1553 +CREATE FUNCTION distance_within(ecluster, epoint, float8) 1.1554 + RETURNS boolean 1.1555 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 && ecircle($2, $3)'; 1.1556 + 1.1557 +CREATE FUNCTION fair_distance(ecluster, epoint, int4 = 10000) 1.1558 + RETURNS float8 1.1559 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 <=> epoint_with_sample_count($2, $3)'; 1.1560 + 1.1561 + 1.1562 +-------------------------------- 1.1563 +-- other data storage formats -- 1.1564 +-------------------------------- 1.1565 + 1.1566 +CREATE FUNCTION coords_to_epoint(float8, float8, text = 'epoint') 1.1567 + RETURNS epoint 1.1568 + LANGUAGE plpgsql IMMUTABLE STRICT AS $$ 1.1569 + DECLARE 1.1570 + "result" epoint; 1.1571 + BEGIN 1.1572 + IF $3 = 'epoint_lonlat' THEN 1.1573 + -- avoid dynamic command execution for better performance 1.1574 + RETURN epoint($2, $1); 1.1575 + END IF; 1.1576 + IF $3 = 'epoint' OR $3 = 'epoint_latlon' THEN 1.1577 + -- avoid dynamic command execution for better performance 1.1578 + RETURN epoint($1, $2); 1.1579 + END IF; 1.1580 + EXECUTE 'SELECT ' || $3 || '($1, $2)' INTO STRICT "result" USING $1, $2; 1.1581 + RETURN "result"; 1.1582 + END; 1.1583 + $$; 1.1584 + 1.1585 +CREATE FUNCTION GeoJSON_LinearRing_vertices(jsonb, text = 'epoint_lonlat') 1.1586 + RETURNS SETOF jsonb 1.1587 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.1588 + SELECT "result" FROM 1.1589 + ( SELECT jsonb_array_length($1) - 1 ) AS "lastindex_row" ("lastindex") 1.1590 + CROSS JOIN LATERAL jsonb_array_elements( 1.1591 + CASE WHEN 1.1592 + coords_to_epoint( 1.1593 + ($1->0->>0)::float8, 1.1594 + ($1->0->>1)::float8, 1.1595 + $2 1.1596 + ) = coords_to_epoint( 1.1597 + ($1->"lastindex"->>0)::float8, 1.1598 + ($1->"lastindex"->>1)::float8, 1.1599 + $2 1.1600 + ) 1.1601 + THEN 1.1602 + $1 - "lastindex" 1.1603 + ELSE 1.1604 + $1 1.1605 + END 1.1606 + ) AS "result_row" ("result") 1.1607 + $$; 1.1608 + 1.1609 +CREATE FUNCTION GeoJSON_to_epoint(jsonb, text = 'epoint_lonlat') 1.1610 + RETURNS epoint 1.1611 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.1612 + SELECT CASE 1.1613 + WHEN $1->>'type' = 'Point' THEN 1.1614 + coords_to_epoint( 1.1615 + ($1->'coordinates'->>0)::float8, 1.1616 + ($1->'coordinates'->>1)::float8, 1.1617 + $2 1.1618 + ) 1.1619 + WHEN $1->>'type' = 'Feature' THEN 1.1620 + GeoJSON_to_epoint($1->'geometry', $2) 1.1621 + ELSE 1.1622 + NULL 1.1623 + END 1.1624 + $$; 1.1625 + 1.1626 +CREATE FUNCTION GeoJSON_to_ecluster(jsonb, text = 'epoint_lonlat') 1.1627 + RETURNS ecluster 1.1628 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.1629 + SELECT CASE $1->>'type' 1.1630 + WHEN 'Point' THEN 1.1631 + coords_to_epoint( 1.1632 + ($1->'coordinates'->>0)::float8, 1.1633 + ($1->'coordinates'->>1)::float8, 1.1634 + $2 1.1635 + )::ecluster 1.1636 + WHEN 'MultiPoint' THEN 1.1637 + ( SELECT ecluster_create_multipoint(array_agg( 1.1638 + coords_to_epoint( 1.1639 + ("coord"->>0)::float8, 1.1640 + ("coord"->>1)::float8, 1.1641 + $2 1.1642 + ) 1.1643 + )) 1.1644 + FROM jsonb_array_elements($1->'coordinates') AS "coord" 1.1645 + ) 1.1646 + WHEN 'LineString' THEN 1.1647 + ( SELECT ecluster_create_path(array_agg( 1.1648 + coords_to_epoint( 1.1649 + ("coord"->>0)::float8, 1.1650 + ("coord"->>1)::float8, 1.1651 + $2 1.1652 + ) 1.1653 + )) 1.1654 + FROM jsonb_array_elements($1->'coordinates') AS "coord" 1.1655 + ) 1.1656 + WHEN 'MultiLineString' THEN 1.1657 + ( SELECT ecluster_concat(array_agg( 1.1658 + ( SELECT ecluster_create_path(array_agg( 1.1659 + coords_to_epoint( 1.1660 + ("coord"->>0)::float8, 1.1661 + ("coord"->>1)::float8, 1.1662 + $2 1.1663 + ) 1.1664 + )) 1.1665 + FROM jsonb_array_elements("coord_array") AS "coord" 1.1666 + ) 1.1667 + )) 1.1668 + FROM jsonb_array_elements($1->'coordinates') AS "coord_array" 1.1669 + ) 1.1670 + WHEN 'Polygon' THEN 1.1671 + ( SELECT ecluster_concat(array_agg( 1.1672 + ( SELECT ecluster_create_polygon(array_agg( 1.1673 + coords_to_epoint( 1.1674 + ("coord"->>0)::float8, 1.1675 + ("coord"->>1)::float8, 1.1676 + $2 1.1677 + ) 1.1678 + )) 1.1679 + FROM GeoJSON_LinearRing_vertices("coord_array", $2) AS "coord" 1.1680 + ) 1.1681 + )) 1.1682 + FROM jsonb_array_elements($1->'coordinates') AS "coord_array" 1.1683 + ) 1.1684 + WHEN 'MultiPolygon' THEN 1.1685 + ( SELECT ecluster_concat(array_agg( 1.1686 + ( SELECT ecluster_concat(array_agg( 1.1687 + ( SELECT ecluster_create_polygon(array_agg( 1.1688 + coords_to_epoint( 1.1689 + ("coord"->>0)::float8, 1.1690 + ("coord"->>1)::float8, 1.1691 + $2 1.1692 + ) 1.1693 + )) 1.1694 + FROM GeoJSON_LinearRing_vertices("coord_array", $2) AS "coord" 1.1695 + ) 1.1696 + )) 1.1697 + FROM jsonb_array_elements("coord_array_array") AS "coord_array" 1.1698 + ) 1.1699 + )) 1.1700 + FROM jsonb_array_elements($1->'coordinates') AS "coord_array_array" 1.1701 + ) 1.1702 + WHEN 'GeometryCollection' THEN 1.1703 + ( SELECT ecluster_concat(array_agg( 1.1704 + GeoJSON_to_ecluster("geometry", $2) 1.1705 + )) 1.1706 + FROM jsonb_array_elements($1->'geometries') AS "geometry" 1.1707 + ) 1.1708 + WHEN 'Feature' THEN 1.1709 + GeoJSON_to_ecluster($1->'geometry', $2) 1.1710 + WHEN 'FeatureCollection' THEN 1.1711 + ( SELECT ecluster_concat(array_agg( 1.1712 + GeoJSON_to_ecluster("feature", $2) 1.1713 + )) 1.1714 + FROM jsonb_array_elements($1->'features') AS "feature" 1.1715 + ) 1.1716 + ELSE 1.1717 + NULL 1.1718 + END 1.1719 + $$; 1.1720 +