pgLatLon

annotate latlon--0.4.sql @ 16:e319679cefbd

Added more operators for clusters (including polygons); Bugfix regarding missing entries in ecluster_ops operator class (index was not used for nearest-neighbor searches)
author jbe
date Fri Sep 09 19:22:30 2016 +0200 (2016-09-09)
parents 95f185a648a4
children
rev   line source
jbe@0 1
jbe@0 2 ----------------------------------------
jbe@0 3 -- forward declarations (shell types) --
jbe@0 4 ----------------------------------------
jbe@0 5
jbe@0 6 CREATE TYPE epoint;
jbe@0 7 CREATE TYPE ebox;
jbe@0 8 CREATE TYPE ecircle;
jbe@0 9 CREATE TYPE ecluster;
jbe@0 10
jbe@0 11
jbe@0 12 ------------------------------------------------------------
jbe@0 13 -- dummy input/output functions for dummy index key types --
jbe@0 14 ------------------------------------------------------------
jbe@0 15
jbe@0 16 CREATE FUNCTION ekey_point_in_dummy(cstring)
jbe@0 17 RETURNS ekey_point
jbe@0 18 LANGUAGE C IMMUTABLE STRICT
jbe@15 19 AS '$libdir/latlon-v0004', 'pgl_notimpl';
jbe@0 20
jbe@0 21 CREATE FUNCTION ekey_point_out_dummy(ekey_point)
jbe@0 22 RETURNS cstring
jbe@0 23 LANGUAGE C IMMUTABLE STRICT
jbe@15 24 AS '$libdir/latlon-v0004', 'pgl_notimpl';
jbe@0 25
jbe@0 26 CREATE FUNCTION ekey_area_in_dummy(cstring)
jbe@0 27 RETURNS ekey_area
jbe@0 28 LANGUAGE C IMMUTABLE STRICT
jbe@15 29 AS '$libdir/latlon-v0004', 'pgl_notimpl';
jbe@0 30
jbe@0 31 CREATE FUNCTION ekey_area_out_dummy(ekey_area)
jbe@0 32 RETURNS cstring
jbe@0 33 LANGUAGE C IMMUTABLE STRICT
jbe@15 34 AS '$libdir/latlon-v0004', 'pgl_notimpl';
jbe@0 35
jbe@0 36
jbe@0 37 --------------------------
jbe@0 38 -- text input functions --
jbe@0 39 --------------------------
jbe@0 40
jbe@0 41 CREATE FUNCTION epoint_in(cstring)
jbe@0 42 RETURNS epoint
jbe@0 43 LANGUAGE C IMMUTABLE STRICT
jbe@15 44 AS '$libdir/latlon-v0004', 'pgl_epoint_in';
jbe@0 45
jbe@0 46 CREATE FUNCTION ebox_in(cstring)
jbe@0 47 RETURNS ebox
jbe@0 48 LANGUAGE C IMMUTABLE STRICT
jbe@15 49 AS '$libdir/latlon-v0004', 'pgl_ebox_in';
jbe@0 50
jbe@0 51 CREATE FUNCTION ecircle_in(cstring)
jbe@0 52 RETURNS ecircle
jbe@0 53 LANGUAGE C IMMUTABLE STRICT
jbe@15 54 AS '$libdir/latlon-v0004', 'pgl_ecircle_in';
jbe@0 55
jbe@0 56 CREATE FUNCTION ecluster_in(cstring)
jbe@0 57 RETURNS ecluster
jbe@0 58 LANGUAGE C IMMUTABLE STRICT
jbe@15 59 AS '$libdir/latlon-v0004', 'pgl_ecluster_in';
jbe@0 60
jbe@0 61
jbe@0 62 ---------------------------
jbe@0 63 -- text output functions --
jbe@0 64 ---------------------------
jbe@0 65
jbe@0 66 CREATE FUNCTION epoint_out(epoint)
jbe@0 67 RETURNS cstring
jbe@0 68 LANGUAGE C IMMUTABLE STRICT
jbe@15 69 AS '$libdir/latlon-v0004', 'pgl_epoint_out';
jbe@0 70
jbe@0 71 CREATE FUNCTION ebox_out(ebox)
jbe@0 72 RETURNS cstring
jbe@0 73 LANGUAGE C IMMUTABLE STRICT
jbe@15 74 AS '$libdir/latlon-v0004', 'pgl_ebox_out';
jbe@0 75
jbe@0 76 CREATE FUNCTION ecircle_out(ecircle)
jbe@0 77 RETURNS cstring
jbe@0 78 LANGUAGE C IMMUTABLE STRICT
jbe@15 79 AS '$libdir/latlon-v0004', 'pgl_ecircle_out';
jbe@0 80
jbe@0 81 CREATE FUNCTION ecluster_out(ecluster)
jbe@0 82 RETURNS cstring
jbe@0 83 LANGUAGE C IMMUTABLE STRICT
jbe@15 84 AS '$libdir/latlon-v0004', 'pgl_ecluster_out';
jbe@0 85
jbe@0 86
jbe@0 87 --------------------------
jbe@0 88 -- binary I/O functions --
jbe@0 89 --------------------------
jbe@0 90
jbe@0 91 CREATE FUNCTION epoint_recv(internal)
jbe@0 92 RETURNS epoint
jbe@0 93 LANGUAGE C IMMUTABLE STRICT
jbe@15 94 AS '$libdir/latlon-v0004', 'pgl_epoint_recv';
jbe@0 95
jbe@0 96 CREATE FUNCTION ebox_recv(internal)
jbe@0 97 RETURNS ebox
jbe@0 98 LANGUAGE C IMMUTABLE STRICT
jbe@15 99 AS '$libdir/latlon-v0004', 'pgl_ebox_recv';
jbe@0 100
jbe@0 101 CREATE FUNCTION ecircle_recv(internal)
jbe@0 102 RETURNS ecircle
jbe@0 103 LANGUAGE C IMMUTABLE STRICT
jbe@15 104 AS '$libdir/latlon-v0004', 'pgl_ecircle_recv';
jbe@0 105
jbe@0 106 CREATE FUNCTION epoint_send(epoint)
jbe@0 107 RETURNS bytea
jbe@0 108 LANGUAGE C IMMUTABLE STRICT
jbe@15 109 AS '$libdir/latlon-v0004', 'pgl_epoint_send';
jbe@0 110
jbe@0 111 CREATE FUNCTION ebox_send(ebox)
jbe@0 112 RETURNS bytea
jbe@0 113 LANGUAGE C IMMUTABLE STRICT
jbe@15 114 AS '$libdir/latlon-v0004', 'pgl_ebox_send';
jbe@0 115
jbe@0 116 CREATE FUNCTION ecircle_send(ecircle)
jbe@0 117 RETURNS bytea
jbe@0 118 LANGUAGE C IMMUTABLE STRICT
jbe@15 119 AS '$libdir/latlon-v0004', 'pgl_ecircle_send';
jbe@0 120
jbe@0 121
jbe@0 122 -----------------------------------------------
jbe@0 123 -- type definitions of dummy index key types --
jbe@0 124 -----------------------------------------------
jbe@0 125
jbe@0 126 CREATE TYPE ekey_point (
jbe@0 127 internallength = 8,
jbe@0 128 input = ekey_point_in_dummy,
jbe@0 129 output = ekey_point_out_dummy,
jbe@0 130 alignment = char );
jbe@0 131
jbe@0 132 CREATE TYPE ekey_area (
jbe@0 133 internallength = 9,
jbe@0 134 input = ekey_area_in_dummy,
jbe@0 135 output = ekey_area_out_dummy,
jbe@0 136 alignment = char );
jbe@0 137
jbe@0 138
jbe@0 139 ------------------------------------------
jbe@0 140 -- definitions of geographic data types --
jbe@0 141 ------------------------------------------
jbe@0 142
jbe@0 143 CREATE TYPE epoint (
jbe@0 144 internallength = 16,
jbe@0 145 input = epoint_in,
jbe@0 146 output = epoint_out,
jbe@0 147 receive = epoint_recv,
jbe@0 148 send = epoint_send,
jbe@0 149 alignment = double );
jbe@0 150
jbe@0 151 CREATE TYPE ebox (
jbe@0 152 internallength = 32,
jbe@0 153 input = ebox_in,
jbe@0 154 output = ebox_out,
jbe@0 155 receive = ebox_recv,
jbe@0 156 send = ebox_send,
jbe@0 157 alignment = double );
jbe@0 158
jbe@0 159 CREATE TYPE ecircle (
jbe@0 160 internallength = 24,
jbe@0 161 input = ecircle_in,
jbe@0 162 output = ecircle_out,
jbe@0 163 receive = ecircle_recv,
jbe@0 164 send = ecircle_send,
jbe@0 165 alignment = double );
jbe@0 166
jbe@0 167 CREATE TYPE ecluster (
jbe@0 168 internallength = VARIABLE,
jbe@0 169 input = ecluster_in,
jbe@0 170 output = ecluster_out,
jbe@0 171 alignment = double,
jbe@0 172 storage = external );
jbe@0 173
jbe@0 174
jbe@0 175 --------------------
jbe@0 176 -- B-tree support --
jbe@0 177 --------------------
jbe@0 178
jbe@0 179 -- begin of B-tree support for epoint
jbe@0 180
jbe@0 181 CREATE FUNCTION epoint_btree_lt(epoint, epoint)
jbe@0 182 RETURNS boolean
jbe@0 183 LANGUAGE C IMMUTABLE STRICT
jbe@15 184 AS '$libdir/latlon-v0004', 'pgl_btree_epoint_lt';
jbe@0 185
jbe@0 186 CREATE FUNCTION epoint_btree_le(epoint, epoint)
jbe@0 187 RETURNS boolean
jbe@0 188 LANGUAGE C IMMUTABLE STRICT
jbe@15 189 AS '$libdir/latlon-v0004', 'pgl_btree_epoint_le';
jbe@0 190
jbe@0 191 CREATE FUNCTION epoint_btree_eq(epoint, epoint)
jbe@0 192 RETURNS boolean
jbe@0 193 LANGUAGE C IMMUTABLE STRICT
jbe@15 194 AS '$libdir/latlon-v0004', 'pgl_btree_epoint_eq';
jbe@0 195
jbe@0 196 CREATE FUNCTION epoint_btree_ne(epoint, epoint)
jbe@0 197 RETURNS boolean
jbe@0 198 LANGUAGE C IMMUTABLE STRICT
jbe@15 199 AS '$libdir/latlon-v0004', 'pgl_btree_epoint_ne';
jbe@0 200
jbe@0 201 CREATE FUNCTION epoint_btree_ge(epoint, epoint)
jbe@0 202 RETURNS boolean
jbe@0 203 LANGUAGE C IMMUTABLE STRICT
jbe@15 204 AS '$libdir/latlon-v0004', 'pgl_btree_epoint_ge';
jbe@0 205
jbe@0 206 CREATE FUNCTION epoint_btree_gt(epoint, epoint)
jbe@0 207 RETURNS boolean
jbe@0 208 LANGUAGE C IMMUTABLE STRICT
jbe@15 209 AS '$libdir/latlon-v0004', 'pgl_btree_epoint_gt';
jbe@0 210
jbe@0 211 CREATE OPERATOR <<< (
jbe@0 212 leftarg = epoint,
jbe@0 213 rightarg = epoint,
jbe@0 214 procedure = epoint_btree_lt,
jbe@0 215 commutator = >>>,
jbe@0 216 negator = >>>=,
jbe@0 217 restrict = scalarltsel,
jbe@0 218 join = scalarltjoinsel
jbe@0 219 );
jbe@0 220
jbe@0 221 CREATE OPERATOR <<<= (
jbe@0 222 leftarg = epoint,
jbe@0 223 rightarg = epoint,
jbe@0 224 procedure = epoint_btree_le,
jbe@0 225 commutator = >>>=,
jbe@0 226 negator = >>>,
jbe@0 227 restrict = scalarltsel,
jbe@0 228 join = scalarltjoinsel
jbe@0 229 );
jbe@0 230
jbe@0 231 CREATE OPERATOR = (
jbe@0 232 leftarg = epoint,
jbe@0 233 rightarg = epoint,
jbe@0 234 procedure = epoint_btree_eq,
jbe@0 235 commutator = =,
jbe@0 236 negator = <>,
jbe@0 237 restrict = eqsel,
jbe@0 238 join = eqjoinsel,
jbe@0 239 merges
jbe@0 240 );
jbe@0 241
jbe@0 242 CREATE OPERATOR <> (
jbe@0 243 leftarg = epoint,
jbe@0 244 rightarg = epoint,
jbe@0 245 procedure = epoint_btree_eq,
jbe@0 246 commutator = <>,
jbe@0 247 negator = =,
jbe@0 248 restrict = neqsel,
jbe@0 249 join = neqjoinsel
jbe@0 250 );
jbe@0 251
jbe@0 252 CREATE OPERATOR >>>= (
jbe@0 253 leftarg = epoint,
jbe@0 254 rightarg = epoint,
jbe@0 255 procedure = epoint_btree_ge,
jbe@0 256 commutator = <<<=,
jbe@0 257 negator = <<<,
jbe@0 258 restrict = scalargtsel,
jbe@0 259 join = scalargtjoinsel
jbe@0 260 );
jbe@0 261
jbe@0 262 CREATE OPERATOR >>> (
jbe@0 263 leftarg = epoint,
jbe@0 264 rightarg = epoint,
jbe@0 265 procedure = epoint_btree_gt,
jbe@0 266 commutator = <<<,
jbe@0 267 negator = <<<=,
jbe@0 268 restrict = scalargtsel,
jbe@0 269 join = scalargtjoinsel
jbe@0 270 );
jbe@0 271
jbe@0 272 CREATE FUNCTION epoint_btree_cmp(epoint, epoint)
jbe@0 273 RETURNS int4
jbe@0 274 LANGUAGE C IMMUTABLE STRICT
jbe@15 275 AS '$libdir/latlon-v0004', 'pgl_btree_epoint_cmp';
jbe@0 276
jbe@0 277 CREATE OPERATOR CLASS epoint_btree_ops
jbe@0 278 DEFAULT FOR TYPE epoint USING btree AS
jbe@0 279 OPERATOR 1 <<< ,
jbe@0 280 OPERATOR 2 <<<= ,
jbe@0 281 OPERATOR 3 = ,
jbe@0 282 OPERATOR 4 >>>= ,
jbe@0 283 OPERATOR 5 >>> ,
jbe@0 284 FUNCTION 1 epoint_btree_cmp(epoint, epoint);
jbe@0 285
jbe@0 286 -- end of B-tree support for epoint
jbe@0 287
jbe@0 288 -- begin of B-tree support for ebox
jbe@0 289
jbe@0 290 CREATE FUNCTION ebox_btree_lt(ebox, ebox)
jbe@0 291 RETURNS boolean
jbe@0 292 LANGUAGE C IMMUTABLE STRICT
jbe@15 293 AS '$libdir/latlon-v0004', 'pgl_btree_ebox_lt';
jbe@0 294
jbe@0 295 CREATE FUNCTION ebox_btree_le(ebox, ebox)
jbe@0 296 RETURNS boolean
jbe@0 297 LANGUAGE C IMMUTABLE STRICT
jbe@15 298 AS '$libdir/latlon-v0004', 'pgl_btree_ebox_le';
jbe@0 299
jbe@0 300 CREATE FUNCTION ebox_btree_eq(ebox, ebox)
jbe@0 301 RETURNS boolean
jbe@0 302 LANGUAGE C IMMUTABLE STRICT
jbe@15 303 AS '$libdir/latlon-v0004', 'pgl_btree_ebox_eq';
jbe@0 304
jbe@0 305 CREATE FUNCTION ebox_btree_ne(ebox, ebox)
jbe@0 306 RETURNS boolean
jbe@0 307 LANGUAGE C IMMUTABLE STRICT
jbe@15 308 AS '$libdir/latlon-v0004', 'pgl_btree_ebox_ne';
jbe@0 309
jbe@0 310 CREATE FUNCTION ebox_btree_ge(ebox, ebox)
jbe@0 311 RETURNS boolean
jbe@0 312 LANGUAGE C IMMUTABLE STRICT
jbe@15 313 AS '$libdir/latlon-v0004', 'pgl_btree_ebox_ge';
jbe@0 314
jbe@0 315 CREATE FUNCTION ebox_btree_gt(ebox, ebox)
jbe@0 316 RETURNS boolean
jbe@0 317 LANGUAGE C IMMUTABLE STRICT
jbe@15 318 AS '$libdir/latlon-v0004', 'pgl_btree_ebox_gt';
jbe@0 319
jbe@0 320 CREATE OPERATOR <<< (
jbe@0 321 leftarg = ebox,
jbe@0 322 rightarg = ebox,
jbe@0 323 procedure = ebox_btree_lt,
jbe@0 324 commutator = >>>,
jbe@0 325 negator = >>>=,
jbe@0 326 restrict = scalarltsel,
jbe@0 327 join = scalarltjoinsel
jbe@0 328 );
jbe@0 329
jbe@0 330 CREATE OPERATOR <<<= (
jbe@0 331 leftarg = ebox,
jbe@0 332 rightarg = ebox,
jbe@0 333 procedure = ebox_btree_le,
jbe@0 334 commutator = >>>=,
jbe@0 335 negator = >>>,
jbe@0 336 restrict = scalarltsel,
jbe@0 337 join = scalarltjoinsel
jbe@0 338 );
jbe@0 339
jbe@0 340 CREATE OPERATOR = (
jbe@0 341 leftarg = ebox,
jbe@0 342 rightarg = ebox,
jbe@0 343 procedure = ebox_btree_eq,
jbe@0 344 commutator = =,
jbe@0 345 negator = <>,
jbe@0 346 restrict = eqsel,
jbe@0 347 join = eqjoinsel,
jbe@0 348 merges
jbe@0 349 );
jbe@0 350
jbe@0 351 CREATE OPERATOR <> (
jbe@0 352 leftarg = ebox,
jbe@0 353 rightarg = ebox,
jbe@0 354 procedure = ebox_btree_eq,
jbe@0 355 commutator = <>,
jbe@0 356 negator = =,
jbe@0 357 restrict = neqsel,
jbe@0 358 join = neqjoinsel
jbe@0 359 );
jbe@0 360
jbe@0 361 CREATE OPERATOR >>>= (
jbe@0 362 leftarg = ebox,
jbe@0 363 rightarg = ebox,
jbe@0 364 procedure = ebox_btree_ge,
jbe@0 365 commutator = <<<=,
jbe@0 366 negator = <<<,
jbe@0 367 restrict = scalargtsel,
jbe@0 368 join = scalargtjoinsel
jbe@0 369 );
jbe@0 370
jbe@0 371 CREATE OPERATOR >>> (
jbe@0 372 leftarg = ebox,
jbe@0 373 rightarg = ebox,
jbe@0 374 procedure = ebox_btree_gt,
jbe@0 375 commutator = <<<,
jbe@0 376 negator = <<<=,
jbe@0 377 restrict = scalargtsel,
jbe@0 378 join = scalargtjoinsel
jbe@0 379 );
jbe@0 380
jbe@0 381 CREATE FUNCTION ebox_btree_cmp(ebox, ebox)
jbe@0 382 RETURNS int4
jbe@0 383 LANGUAGE C IMMUTABLE STRICT
jbe@15 384 AS '$libdir/latlon-v0004', 'pgl_btree_ebox_cmp';
jbe@0 385
jbe@0 386 CREATE OPERATOR CLASS ebox_btree_ops
jbe@0 387 DEFAULT FOR TYPE ebox USING btree AS
jbe@0 388 OPERATOR 1 <<< ,
jbe@0 389 OPERATOR 2 <<<= ,
jbe@0 390 OPERATOR 3 = ,
jbe@0 391 OPERATOR 4 >>>= ,
jbe@0 392 OPERATOR 5 >>> ,
jbe@0 393 FUNCTION 1 ebox_btree_cmp(ebox, ebox);
jbe@0 394
jbe@0 395 -- end of B-tree support for ebox
jbe@0 396
jbe@0 397 -- begin of B-tree support for ecircle
jbe@0 398
jbe@0 399 CREATE FUNCTION ecircle_btree_lt(ecircle, ecircle)
jbe@0 400 RETURNS boolean
jbe@0 401 LANGUAGE C IMMUTABLE STRICT
jbe@15 402 AS '$libdir/latlon-v0004', 'pgl_btree_ecircle_lt';
jbe@0 403
jbe@0 404 CREATE FUNCTION ecircle_btree_le(ecircle, ecircle)
jbe@0 405 RETURNS boolean
jbe@0 406 LANGUAGE C IMMUTABLE STRICT
jbe@15 407 AS '$libdir/latlon-v0004', 'pgl_btree_ecircle_le';
jbe@0 408
jbe@0 409 CREATE FUNCTION ecircle_btree_eq(ecircle, ecircle)
jbe@0 410 RETURNS boolean
jbe@0 411 LANGUAGE C IMMUTABLE STRICT
jbe@15 412 AS '$libdir/latlon-v0004', 'pgl_btree_ecircle_eq';
jbe@0 413
jbe@0 414 CREATE FUNCTION ecircle_btree_ne(ecircle, ecircle)
jbe@0 415 RETURNS boolean
jbe@0 416 LANGUAGE C IMMUTABLE STRICT
jbe@15 417 AS '$libdir/latlon-v0004', 'pgl_btree_ecircle_ne';
jbe@0 418
jbe@0 419 CREATE FUNCTION ecircle_btree_ge(ecircle, ecircle)
jbe@0 420 RETURNS boolean
jbe@0 421 LANGUAGE C IMMUTABLE STRICT
jbe@15 422 AS '$libdir/latlon-v0004', 'pgl_btree_ecircle_ge';
jbe@0 423
jbe@0 424 CREATE FUNCTION ecircle_btree_gt(ecircle, ecircle)
jbe@0 425 RETURNS boolean
jbe@0 426 LANGUAGE C IMMUTABLE STRICT
jbe@15 427 AS '$libdir/latlon-v0004', 'pgl_btree_ecircle_gt';
jbe@0 428
jbe@0 429 CREATE OPERATOR <<< (
jbe@0 430 leftarg = ecircle,
jbe@0 431 rightarg = ecircle,
jbe@0 432 procedure = ecircle_btree_lt,
jbe@0 433 commutator = >>>,
jbe@0 434 negator = >>>=,
jbe@0 435 restrict = scalarltsel,
jbe@0 436 join = scalarltjoinsel
jbe@0 437 );
jbe@0 438
jbe@0 439 CREATE OPERATOR <<<= (
jbe@0 440 leftarg = ecircle,
jbe@0 441 rightarg = ecircle,
jbe@0 442 procedure = ecircle_btree_le,
jbe@0 443 commutator = >>>=,
jbe@0 444 negator = >>>,
jbe@0 445 restrict = scalarltsel,
jbe@0 446 join = scalarltjoinsel
jbe@0 447 );
jbe@0 448
jbe@0 449 CREATE OPERATOR = (
jbe@0 450 leftarg = ecircle,
jbe@0 451 rightarg = ecircle,
jbe@0 452 procedure = ecircle_btree_eq,
jbe@0 453 commutator = =,
jbe@0 454 negator = <>,
jbe@0 455 restrict = eqsel,
jbe@0 456 join = eqjoinsel,
jbe@0 457 merges
jbe@0 458 );
jbe@0 459
jbe@0 460 CREATE OPERATOR <> (
jbe@0 461 leftarg = ecircle,
jbe@0 462 rightarg = ecircle,
jbe@0 463 procedure = ecircle_btree_eq,
jbe@0 464 commutator = <>,
jbe@0 465 negator = =,
jbe@0 466 restrict = neqsel,
jbe@0 467 join = neqjoinsel
jbe@0 468 );
jbe@0 469
jbe@0 470 CREATE OPERATOR >>>= (
jbe@0 471 leftarg = ecircle,
jbe@0 472 rightarg = ecircle,
jbe@0 473 procedure = ecircle_btree_ge,
jbe@0 474 commutator = <<<=,
jbe@0 475 negator = <<<,
jbe@0 476 restrict = scalargtsel,
jbe@0 477 join = scalargtjoinsel
jbe@0 478 );
jbe@0 479
jbe@0 480 CREATE OPERATOR >>> (
jbe@0 481 leftarg = ecircle,
jbe@0 482 rightarg = ecircle,
jbe@0 483 procedure = ecircle_btree_gt,
jbe@0 484 commutator = <<<,
jbe@0 485 negator = <<<=,
jbe@0 486 restrict = scalargtsel,
jbe@0 487 join = scalargtjoinsel
jbe@0 488 );
jbe@0 489
jbe@0 490 CREATE FUNCTION ecircle_btree_cmp(ecircle, ecircle)
jbe@0 491 RETURNS int4
jbe@0 492 LANGUAGE C IMMUTABLE STRICT
jbe@15 493 AS '$libdir/latlon-v0004', 'pgl_btree_ecircle_cmp';
jbe@0 494
jbe@0 495 CREATE OPERATOR CLASS ecircle_btree_ops
jbe@0 496 DEFAULT FOR TYPE ecircle USING btree AS
jbe@0 497 OPERATOR 1 <<< ,
jbe@0 498 OPERATOR 2 <<<= ,
jbe@0 499 OPERATOR 3 = ,
jbe@0 500 OPERATOR 4 >>>= ,
jbe@0 501 OPERATOR 5 >>> ,
jbe@0 502 FUNCTION 1 ecircle_btree_cmp(ecircle, ecircle);
jbe@0 503
jbe@0 504 -- end of B-tree support for ecircle
jbe@0 505
jbe@0 506
jbe@0 507 ----------------
jbe@0 508 -- type casts --
jbe@0 509 ----------------
jbe@0 510
jbe@0 511 CREATE FUNCTION cast_epoint_to_ebox(epoint)
jbe@0 512 RETURNS ebox
jbe@0 513 LANGUAGE C IMMUTABLE STRICT
jbe@15 514 AS '$libdir/latlon-v0004', 'pgl_epoint_to_ebox';
jbe@0 515
jbe@0 516 CREATE CAST (epoint AS ebox) WITH FUNCTION cast_epoint_to_ebox(epoint);
jbe@0 517
jbe@0 518 CREATE FUNCTION cast_epoint_to_ecircle(epoint)
jbe@0 519 RETURNS ecircle
jbe@0 520 LANGUAGE C IMMUTABLE STRICT
jbe@15 521 AS '$libdir/latlon-v0004', 'pgl_epoint_to_ecircle';
jbe@0 522
jbe@0 523 CREATE CAST (epoint AS ecircle) WITH FUNCTION cast_epoint_to_ecircle(epoint);
jbe@0 524
jbe@0 525 CREATE FUNCTION cast_epoint_to_ecluster(epoint)
jbe@0 526 RETURNS ecluster
jbe@0 527 LANGUAGE C IMMUTABLE STRICT
jbe@15 528 AS '$libdir/latlon-v0004', 'pgl_epoint_to_ecluster';
jbe@0 529
jbe@0 530 CREATE CAST (epoint AS ecluster) WITH FUNCTION cast_epoint_to_ecluster(epoint);
jbe@0 531
jbe@0 532 CREATE FUNCTION cast_ebox_to_ecluster(ebox)
jbe@0 533 RETURNS ecluster
jbe@0 534 LANGUAGE C IMMUTABLE STRICT
jbe@15 535 AS '$libdir/latlon-v0004', 'pgl_ebox_to_ecluster';
jbe@0 536
jbe@0 537 CREATE CAST (ebox AS ecluster) WITH FUNCTION cast_ebox_to_ecluster(ebox);
jbe@0 538
jbe@0 539
jbe@0 540 ---------------------------
jbe@0 541 -- constructor functions --
jbe@0 542 ---------------------------
jbe@0 543
jbe@0 544 CREATE FUNCTION epoint(float8, float8)
jbe@0 545 RETURNS epoint
jbe@0 546 LANGUAGE C IMMUTABLE STRICT
jbe@15 547 AS '$libdir/latlon-v0004', 'pgl_create_epoint';
jbe@0 548
jbe@0 549 CREATE FUNCTION epoint_latlon(float8, float8)
jbe@0 550 RETURNS epoint
jbe@0 551 LANGUAGE SQL IMMUTABLE STRICT AS $$
jbe@0 552 SELECT epoint($1, $2)
jbe@0 553 $$;
jbe@0 554
jbe@0 555 CREATE FUNCTION epoint_lonlat(float8, float8)
jbe@0 556 RETURNS epoint
jbe@0 557 LANGUAGE SQL IMMUTABLE STRICT AS $$
jbe@0 558 SELECT epoint($2, $1)
jbe@0 559 $$;
jbe@0 560
jbe@0 561 CREATE FUNCTION empty_ebox()
jbe@0 562 RETURNS ebox
jbe@0 563 LANGUAGE C IMMUTABLE STRICT
jbe@15 564 AS '$libdir/latlon-v0004', 'pgl_create_empty_ebox';
jbe@0 565
jbe@0 566 CREATE FUNCTION ebox(float8, float8, float8, float8)
jbe@0 567 RETURNS ebox
jbe@0 568 LANGUAGE C IMMUTABLE STRICT
jbe@15 569 AS '$libdir/latlon-v0004', 'pgl_create_ebox';
jbe@0 570
jbe@0 571 CREATE FUNCTION ebox(epoint, epoint)
jbe@0 572 RETURNS ebox
jbe@0 573 LANGUAGE C IMMUTABLE STRICT
jbe@15 574 AS '$libdir/latlon-v0004', 'pgl_create_ebox_from_epoints';
jbe@0 575
jbe@0 576 CREATE FUNCTION ecircle(float8, float8, float8)
jbe@0 577 RETURNS ecircle
jbe@0 578 LANGUAGE C IMMUTABLE STRICT
jbe@15 579 AS '$libdir/latlon-v0004', 'pgl_create_ecircle';
jbe@0 580
jbe@0 581 CREATE FUNCTION ecircle(epoint, float8)
jbe@0 582 RETURNS ecircle
jbe@0 583 LANGUAGE C IMMUTABLE STRICT
jbe@15 584 AS '$libdir/latlon-v0004', 'pgl_create_ecircle_from_epoint';
jbe@0 585
jbe@0 586 CREATE FUNCTION ecluster_concat(ecluster[])
jbe@0 587 RETURNS ecluster
jbe@0 588 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 589 SELECT array_to_string($1, ' ')::ecluster
jbe@0 590 $$;
jbe@0 591
jbe@0 592 CREATE FUNCTION ecluster_concat(ecluster, ecluster)
jbe@0 593 RETURNS ecluster
jbe@0 594 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 595 SELECT ($1::text || ' ' || $2::text)::ecluster
jbe@0 596 $$;
jbe@0 597
jbe@0 598 CREATE FUNCTION ecluster_create_multipoint(epoint[])
jbe@0 599 RETURNS ecluster
jbe@0 600 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 601 SELECT
jbe@0 602 array_to_string(array_agg('point (' || unnest || ')'), ' ')::ecluster
jbe@0 603 FROM unnest($1)
jbe@0 604 $$;
jbe@0 605
jbe@0 606 CREATE FUNCTION ecluster_create_path(epoint[])
jbe@0 607 RETURNS ecluster
jbe@0 608 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 609 SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE
jbe@0 610 ('path (' || array_to_string($1, ' ') || ')')::ecluster
jbe@0 611 END
jbe@0 612 FROM array_to_string($1, ' ') AS "str"
jbe@0 613 $$;
jbe@0 614
jbe@0 615 CREATE FUNCTION ecluster_create_outline(epoint[])
jbe@0 616 RETURNS ecluster
jbe@0 617 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 618 SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE
jbe@0 619 ('outline (' || array_to_string($1, ' ') || ')')::ecluster
jbe@0 620 END
jbe@0 621 FROM array_to_string($1, ' ') AS "str"
jbe@0 622 $$;
jbe@0 623
jbe@0 624 CREATE FUNCTION ecluster_create_polygon(epoint[])
jbe@0 625 RETURNS ecluster
jbe@0 626 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 627 SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE
jbe@0 628 ('polygon (' || array_to_string($1, ' ') || ')')::ecluster
jbe@0 629 END
jbe@0 630 FROM array_to_string($1, ' ') AS "str"
jbe@0 631 $$;
jbe@0 632
jbe@0 633
jbe@0 634 ----------------------
jbe@0 635 -- getter functions --
jbe@0 636 ----------------------
jbe@0 637
jbe@0 638 CREATE FUNCTION latitude(epoint)
jbe@0 639 RETURNS float8
jbe@0 640 LANGUAGE C IMMUTABLE STRICT
jbe@15 641 AS '$libdir/latlon-v0004', 'pgl_epoint_lat';
jbe@0 642
jbe@0 643 CREATE FUNCTION longitude(epoint)
jbe@0 644 RETURNS float8
jbe@0 645 LANGUAGE C IMMUTABLE STRICT
jbe@15 646 AS '$libdir/latlon-v0004', 'pgl_epoint_lon';
jbe@0 647
jbe@0 648 CREATE FUNCTION min_latitude(ebox)
jbe@0 649 RETURNS float8
jbe@0 650 LANGUAGE C IMMUTABLE STRICT
jbe@15 651 AS '$libdir/latlon-v0004', 'pgl_ebox_lat_min';
jbe@0 652
jbe@0 653 CREATE FUNCTION max_latitude(ebox)
jbe@0 654 RETURNS float8
jbe@0 655 LANGUAGE C IMMUTABLE STRICT
jbe@15 656 AS '$libdir/latlon-v0004', 'pgl_ebox_lat_max';
jbe@0 657
jbe@0 658 CREATE FUNCTION min_longitude(ebox)
jbe@0 659 RETURNS float8
jbe@0 660 LANGUAGE C IMMUTABLE STRICT
jbe@15 661 AS '$libdir/latlon-v0004', 'pgl_ebox_lon_min';
jbe@0 662
jbe@0 663 CREATE FUNCTION max_longitude(ebox)
jbe@0 664 RETURNS float8
jbe@0 665 LANGUAGE C IMMUTABLE STRICT
jbe@15 666 AS '$libdir/latlon-v0004', 'pgl_ebox_lon_max';
jbe@0 667
jbe@0 668 CREATE FUNCTION center(ecircle)
jbe@0 669 RETURNS epoint
jbe@0 670 LANGUAGE C IMMUTABLE STRICT
jbe@15 671 AS '$libdir/latlon-v0004', 'pgl_ecircle_center';
jbe@0 672
jbe@0 673 CREATE FUNCTION radius(ecircle)
jbe@0 674 RETURNS float8
jbe@0 675 LANGUAGE C IMMUTABLE STRICT
jbe@15 676 AS '$libdir/latlon-v0004', 'pgl_ecircle_radius';
jbe@0 677
jbe@0 678 CREATE FUNCTION ecluster_extract_points(ecluster)
jbe@0 679 RETURNS SETOF epoint
jbe@0 680 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 681 SELECT "match"[2]::epoint
jbe@0 682 FROM regexp_matches($1::text, e'(^| )point \\(([^)]+)\\)', 'g') AS "match"
jbe@0 683 $$;
jbe@0 684
jbe@0 685 CREATE FUNCTION ecluster_extract_paths(ecluster)
jbe@0 686 RETURNS SETOF epoint[]
jbe@0 687 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 688 SELECT (
jbe@0 689 SELECT array_agg("m2"[1]::epoint)
jbe@0 690 FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
jbe@0 691 )
jbe@0 692 FROM regexp_matches($1::text, e'(^| )path \\(([^)]+)\\)', 'g') AS "m1"
jbe@0 693 $$;
jbe@0 694
jbe@0 695 CREATE FUNCTION ecluster_extract_outlines(ecluster)
jbe@0 696 RETURNS SETOF epoint[]
jbe@0 697 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 698 SELECT (
jbe@0 699 SELECT array_agg("m2"[1]::epoint)
jbe@0 700 FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
jbe@0 701 )
jbe@0 702 FROM regexp_matches($1::text, e'(^| )outline \\(([^)]+)\\)', 'g') AS "m1"
jbe@0 703 $$;
jbe@0 704
jbe@0 705 CREATE FUNCTION ecluster_extract_polygons(ecluster)
jbe@0 706 RETURNS SETOF epoint[]
jbe@0 707 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 708 SELECT (
jbe@0 709 SELECT array_agg("m2"[1]::epoint)
jbe@0 710 FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
jbe@0 711 )
jbe@0 712 FROM regexp_matches($1::text, e'(^| )polygon \\(([^)]+)\\)', 'g') AS "m1"
jbe@0 713 $$;
jbe@0 714
jbe@0 715
jbe@0 716 ---------------
jbe@0 717 -- operators --
jbe@0 718 ---------------
jbe@0 719
jbe@0 720 CREATE FUNCTION epoint_ebox_overlap_proc(epoint, ebox)
jbe@0 721 RETURNS boolean
jbe@0 722 LANGUAGE C IMMUTABLE STRICT
jbe@15 723 AS '$libdir/latlon-v0004', 'pgl_epoint_ebox_overlap';
jbe@0 724
jbe@0 725 CREATE FUNCTION epoint_ecircle_overlap_proc(epoint, ecircle)
jbe@0 726 RETURNS boolean
jbe@0 727 LANGUAGE C IMMUTABLE STRICT
jbe@15 728 AS '$libdir/latlon-v0004', 'pgl_epoint_ecircle_overlap';
jbe@0 729
jbe@0 730 CREATE FUNCTION epoint_ecluster_overlap_proc(epoint, ecluster)
jbe@0 731 RETURNS boolean
jbe@0 732 LANGUAGE C IMMUTABLE STRICT
jbe@15 733 AS '$libdir/latlon-v0004', 'pgl_epoint_ecluster_overlap';
jbe@0 734
jbe@10 735 CREATE FUNCTION epoint_ecluster_may_overlap_proc(epoint, ecluster)
jbe@10 736 RETURNS boolean
jbe@10 737 LANGUAGE C IMMUTABLE STRICT
jbe@15 738 AS '$libdir/latlon-v0004', 'pgl_epoint_ecluster_may_overlap';
jbe@10 739
jbe@0 740 CREATE FUNCTION ebox_overlap_proc(ebox, ebox)
jbe@0 741 RETURNS boolean
jbe@0 742 LANGUAGE C IMMUTABLE STRICT
jbe@15 743 AS '$libdir/latlon-v0004', 'pgl_ebox_overlap';
jbe@0 744
jbe@10 745 CREATE FUNCTION ebox_ecircle_may_overlap_proc(ebox, ecircle)
jbe@10 746 RETURNS boolean
jbe@10 747 LANGUAGE C IMMUTABLE STRICT
jbe@15 748 AS '$libdir/latlon-v0004', 'pgl_ebox_ecircle_may_overlap';
jbe@10 749
jbe@10 750 CREATE FUNCTION ebox_ecluster_may_overlap_proc(ebox, ecluster)
jbe@10 751 RETURNS boolean
jbe@10 752 LANGUAGE C IMMUTABLE STRICT
jbe@15 753 AS '$libdir/latlon-v0004', 'pgl_ebox_ecluster_may_overlap';
jbe@10 754
jbe@0 755 CREATE FUNCTION ecircle_overlap_proc(ecircle, ecircle)
jbe@0 756 RETURNS boolean
jbe@0 757 LANGUAGE C IMMUTABLE STRICT
jbe@15 758 AS '$libdir/latlon-v0004', 'pgl_ecircle_overlap';
jbe@0 759
jbe@0 760 CREATE FUNCTION ecircle_ecluster_overlap_proc(ecircle, ecluster)
jbe@0 761 RETURNS boolean
jbe@0 762 LANGUAGE C IMMUTABLE STRICT
jbe@15 763 AS '$libdir/latlon-v0004', 'pgl_ecircle_ecluster_overlap';
jbe@0 764
jbe@10 765 CREATE FUNCTION ecircle_ecluster_may_overlap_proc(ecircle, ecluster)
jbe@10 766 RETURNS boolean
jbe@10 767 LANGUAGE C IMMUTABLE STRICT
jbe@15 768 AS '$libdir/latlon-v0004', 'pgl_ecircle_ecluster_may_overlap';
jbe@10 769
jbe@16 770 CREATE FUNCTION ecluster_overlap_proc(ecluster, ecluster)
jbe@16 771 RETURNS boolean
jbe@16 772 LANGUAGE C IMMUTABLE STRICT
jbe@16 773 AS '$libdir/latlon-v0004', 'pgl_ecluster_overlap';
jbe@16 774
jbe@10 775 CREATE FUNCTION ecluster_may_overlap_proc(ecluster, ecluster)
jbe@10 776 RETURNS boolean
jbe@10 777 LANGUAGE C IMMUTABLE STRICT
jbe@15 778 AS '$libdir/latlon-v0004', 'pgl_ecluster_may_overlap';
jbe@10 779
jbe@16 780 CREATE FUNCTION ecluster_contains_proc(ecluster, ecluster)
jbe@16 781 RETURNS boolean
jbe@16 782 LANGUAGE C IMMUTABLE STRICT
jbe@16 783 AS '$libdir/latlon-v0004', 'pgl_ecluster_contains';
jbe@16 784
jbe@0 785 CREATE FUNCTION epoint_distance_proc(epoint, epoint)
jbe@0 786 RETURNS float8
jbe@0 787 LANGUAGE C IMMUTABLE STRICT
jbe@15 788 AS '$libdir/latlon-v0004', 'pgl_epoint_distance';
jbe@0 789
jbe@0 790 CREATE FUNCTION epoint_ecircle_distance_proc(epoint, ecircle)
jbe@0 791 RETURNS float8
jbe@0 792 LANGUAGE C IMMUTABLE STRICT
jbe@15 793 AS '$libdir/latlon-v0004', 'pgl_epoint_ecircle_distance';
jbe@0 794
jbe@0 795 CREATE FUNCTION epoint_ecluster_distance_proc(epoint, ecluster)
jbe@0 796 RETURNS float8
jbe@0 797 LANGUAGE C IMMUTABLE STRICT
jbe@15 798 AS '$libdir/latlon-v0004', 'pgl_epoint_ecluster_distance';
jbe@0 799
jbe@0 800 CREATE FUNCTION ecircle_distance_proc(ecircle, ecircle)
jbe@0 801 RETURNS float8
jbe@0 802 LANGUAGE C IMMUTABLE STRICT
jbe@15 803 AS '$libdir/latlon-v0004', 'pgl_ecircle_distance';
jbe@0 804
jbe@0 805 CREATE FUNCTION ecircle_ecluster_distance_proc(ecircle, ecluster)
jbe@0 806 RETURNS float8
jbe@0 807 LANGUAGE C IMMUTABLE STRICT
jbe@15 808 AS '$libdir/latlon-v0004', 'pgl_ecircle_ecluster_distance';
jbe@0 809
jbe@16 810 CREATE FUNCTION ecluster_distance_proc(ecluster, ecluster)
jbe@16 811 RETURNS float8
jbe@16 812 LANGUAGE C IMMUTABLE STRICT
jbe@16 813 AS '$libdir/latlon-v0004', 'pgl_ecluster_distance';
jbe@16 814
jbe@0 815 CREATE OPERATOR && (
jbe@0 816 leftarg = epoint,
jbe@0 817 rightarg = ebox,
jbe@0 818 procedure = epoint_ebox_overlap_proc,
jbe@0 819 commutator = &&,
jbe@0 820 restrict = areasel,
jbe@0 821 join = areajoinsel
jbe@0 822 );
jbe@0 823
jbe@0 824 CREATE FUNCTION epoint_ebox_overlap_commutator(ebox, epoint)
jbe@0 825 RETURNS boolean
jbe@0 826 LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
jbe@0 827
jbe@0 828 CREATE OPERATOR && (
jbe@0 829 leftarg = ebox,
jbe@0 830 rightarg = epoint,
jbe@0 831 procedure = epoint_ebox_overlap_commutator,
jbe@0 832 commutator = &&,
jbe@0 833 restrict = areasel,
jbe@0 834 join = areajoinsel
jbe@0 835 );
jbe@0 836
jbe@0 837 CREATE OPERATOR && (
jbe@0 838 leftarg = epoint,
jbe@0 839 rightarg = ecircle,
jbe@0 840 procedure = epoint_ecircle_overlap_proc,
jbe@0 841 commutator = &&,
jbe@0 842 restrict = areasel,
jbe@0 843 join = areajoinsel
jbe@0 844 );
jbe@0 845
jbe@0 846 CREATE FUNCTION epoint_ecircle_overlap_commutator(ecircle, epoint)
jbe@0 847 RETURNS boolean
jbe@0 848 LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
jbe@0 849
jbe@0 850 CREATE OPERATOR && (
jbe@0 851 leftarg = ecircle,
jbe@0 852 rightarg = epoint,
jbe@0 853 procedure = epoint_ecircle_overlap_commutator,
jbe@0 854 commutator = &&,
jbe@0 855 restrict = areasel,
jbe@0 856 join = areajoinsel
jbe@0 857 );
jbe@0 858
jbe@0 859 CREATE OPERATOR && (
jbe@0 860 leftarg = epoint,
jbe@0 861 rightarg = ecluster,
jbe@0 862 procedure = epoint_ecluster_overlap_proc,
jbe@0 863 commutator = &&,
jbe@0 864 restrict = areasel,
jbe@0 865 join = areajoinsel
jbe@0 866 );
jbe@0 867
jbe@0 868 CREATE FUNCTION epoint_ecluster_overlap_commutator(ecluster, epoint)
jbe@0 869 RETURNS boolean
jbe@0 870 LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
jbe@0 871
jbe@0 872 CREATE OPERATOR && (
jbe@0 873 leftarg = ecluster,
jbe@0 874 rightarg = epoint,
jbe@0 875 procedure = epoint_ecluster_overlap_commutator,
jbe@0 876 commutator = &&,
jbe@0 877 restrict = areasel,
jbe@0 878 join = areajoinsel
jbe@0 879 );
jbe@0 880
jbe@0 881 CREATE OPERATOR && (
jbe@0 882 leftarg = ebox,
jbe@0 883 rightarg = ebox,
jbe@0 884 procedure = ebox_overlap_proc,
jbe@0 885 commutator = &&,
jbe@0 886 restrict = areasel,
jbe@0 887 join = areajoinsel
jbe@0 888 );
jbe@0 889
jbe@0 890 CREATE OPERATOR && (
jbe@0 891 leftarg = ecircle,
jbe@0 892 rightarg = ecircle,
jbe@0 893 procedure = ecircle_overlap_proc,
jbe@0 894 commutator = &&,
jbe@0 895 restrict = areasel,
jbe@0 896 join = areajoinsel
jbe@0 897 );
jbe@0 898
jbe@0 899 CREATE OPERATOR && (
jbe@0 900 leftarg = ecircle,
jbe@0 901 rightarg = ecluster,
jbe@0 902 procedure = ecircle_ecluster_overlap_proc,
jbe@0 903 commutator = &&,
jbe@0 904 restrict = areasel,
jbe@0 905 join = areajoinsel
jbe@0 906 );
jbe@0 907
jbe@0 908 CREATE FUNCTION ecircle_ecluster_overlap_commutator(ecluster, ecircle)
jbe@0 909 RETURNS boolean
jbe@0 910 LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
jbe@0 911
jbe@0 912 CREATE OPERATOR && (
jbe@0 913 leftarg = ecluster,
jbe@0 914 rightarg = ecircle,
jbe@0 915 procedure = ecircle_ecluster_overlap_commutator,
jbe@0 916 commutator = &&,
jbe@0 917 restrict = areasel,
jbe@0 918 join = areajoinsel
jbe@0 919 );
jbe@0 920
jbe@16 921 CREATE OPERATOR && (
jbe@16 922 leftarg = ecluster,
jbe@16 923 rightarg = ecluster,
jbe@16 924 procedure = ecluster_overlap_proc,
jbe@16 925 commutator = &&,
jbe@16 926 restrict = areasel,
jbe@16 927 join = areajoinsel
jbe@16 928 );
jbe@16 929
jbe@16 930 CREATE FUNCTION ebox_ecircle_overlap_castwrap(ebox, ecircle)
jbe@16 931 RETURNS boolean
jbe@16 932 LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster && $2';
jbe@16 933
jbe@16 934 CREATE OPERATOR && (
jbe@16 935 leftarg = ebox,
jbe@16 936 rightarg = ecircle,
jbe@16 937 procedure = ebox_ecircle_overlap_castwrap,
jbe@16 938 commutator = &&,
jbe@16 939 restrict = areasel,
jbe@16 940 join = areajoinsel
jbe@16 941 );
jbe@16 942
jbe@16 943 CREATE FUNCTION ebox_ecircle_overlap_castwrap(ecircle, ebox)
jbe@16 944 RETURNS boolean
jbe@16 945 LANGUAGE sql IMMUTABLE AS 'SELECT $1 && $2::ecluster';
jbe@16 946
jbe@16 947 CREATE OPERATOR && (
jbe@16 948 leftarg = ecircle,
jbe@16 949 rightarg = ebox,
jbe@16 950 procedure = ebox_ecircle_overlap_castwrap,
jbe@16 951 commutator = &&,
jbe@16 952 restrict = areasel,
jbe@16 953 join = areajoinsel
jbe@16 954 );
jbe@16 955
jbe@16 956 CREATE FUNCTION ebox_ecluster_overlap_castwrap(ebox, ecluster)
jbe@16 957 RETURNS boolean
jbe@16 958 LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster && $2';
jbe@16 959
jbe@16 960 CREATE OPERATOR && (
jbe@16 961 leftarg = ebox,
jbe@16 962 rightarg = ecluster,
jbe@16 963 procedure = ebox_ecluster_overlap_castwrap,
jbe@16 964 commutator = &&,
jbe@16 965 restrict = areasel,
jbe@16 966 join = areajoinsel
jbe@16 967 );
jbe@16 968
jbe@16 969 CREATE FUNCTION ebox_ecluster_overlap_castwrap(ecluster, ebox)
jbe@16 970 RETURNS boolean
jbe@16 971 LANGUAGE sql IMMUTABLE AS 'SELECT $1 && $2::ecluster';
jbe@16 972
jbe@16 973 CREATE OPERATOR && (
jbe@16 974 leftarg = ecluster,
jbe@16 975 rightarg = ebox,
jbe@16 976 procedure = ebox_ecluster_overlap_castwrap,
jbe@16 977 commutator = &&,
jbe@16 978 restrict = areasel,
jbe@16 979 join = areajoinsel
jbe@16 980 );
jbe@16 981
jbe@10 982 CREATE OPERATOR &&+ (
jbe@10 983 leftarg = epoint,
jbe@10 984 rightarg = ecluster,
jbe@10 985 procedure = epoint_ecluster_may_overlap_proc,
jbe@10 986 commutator = &&+,
jbe@10 987 restrict = areasel,
jbe@10 988 join = areajoinsel
jbe@10 989 );
jbe@10 990
jbe@10 991 CREATE FUNCTION epoint_ecluster_may_overlap_commutator(ecluster, epoint)
jbe@10 992 RETURNS boolean
jbe@10 993 LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1';
jbe@10 994
jbe@10 995 CREATE OPERATOR &&+ (
jbe@10 996 leftarg = ecluster,
jbe@10 997 rightarg = epoint,
jbe@10 998 procedure = epoint_ecluster_may_overlap_commutator,
jbe@10 999 commutator = &&+,
jbe@10 1000 restrict = areasel,
jbe@10 1001 join = areajoinsel
jbe@10 1002 );
jbe@10 1003
jbe@10 1004 CREATE OPERATOR &&+ (
jbe@10 1005 leftarg = ebox,
jbe@10 1006 rightarg = ecircle,
jbe@10 1007 procedure = ebox_ecircle_may_overlap_proc,
jbe@10 1008 commutator = &&+,
jbe@10 1009 restrict = areasel,
jbe@10 1010 join = areajoinsel
jbe@10 1011 );
jbe@10 1012
jbe@10 1013 CREATE FUNCTION ebox_ecircle_may_overlap_commutator(ecircle, ebox)
jbe@10 1014 RETURNS boolean
jbe@10 1015 LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1';
jbe@10 1016
jbe@10 1017 CREATE OPERATOR &&+ (
jbe@10 1018 leftarg = ecircle,
jbe@10 1019 rightarg = ebox,
jbe@10 1020 procedure = ebox_ecircle_may_overlap_commutator,
jbe@10 1021 commutator = &&+,
jbe@10 1022 restrict = areasel,
jbe@10 1023 join = areajoinsel
jbe@10 1024 );
jbe@10 1025
jbe@10 1026 CREATE OPERATOR &&+ (
jbe@10 1027 leftarg = ebox,
jbe@10 1028 rightarg = ecluster,
jbe@10 1029 procedure = ebox_ecluster_may_overlap_proc,
jbe@10 1030 commutator = &&+,
jbe@10 1031 restrict = areasel,
jbe@10 1032 join = areajoinsel
jbe@10 1033 );
jbe@10 1034
jbe@10 1035 CREATE FUNCTION ebox_ecluster_may_overlap_commutator(ecluster, ebox)
jbe@10 1036 RETURNS boolean
jbe@10 1037 LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1';
jbe@10 1038
jbe@10 1039 CREATE OPERATOR &&+ (
jbe@10 1040 leftarg = ecluster,
jbe@10 1041 rightarg = ebox,
jbe@10 1042 procedure = ebox_ecluster_may_overlap_commutator,
jbe@10 1043 commutator = &&+,
jbe@10 1044 restrict = areasel,
jbe@10 1045 join = areajoinsel
jbe@10 1046 );
jbe@10 1047
jbe@10 1048 CREATE OPERATOR &&+ (
jbe@10 1049 leftarg = ecircle,
jbe@10 1050 rightarg = ecluster,
jbe@10 1051 procedure = ecircle_ecluster_may_overlap_proc,
jbe@10 1052 commutator = &&+,
jbe@10 1053 restrict = areasel,
jbe@10 1054 join = areajoinsel
jbe@10 1055 );
jbe@10 1056
jbe@10 1057 CREATE FUNCTION ecircle_ecluster_may_overlap_commutator(ecluster, ecircle)
jbe@10 1058 RETURNS boolean
jbe@10 1059 LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1';
jbe@10 1060
jbe@10 1061 CREATE OPERATOR &&+ (
jbe@10 1062 leftarg = ecluster,
jbe@10 1063 rightarg = ecircle,
jbe@10 1064 procedure = ecircle_ecluster_may_overlap_commutator,
jbe@10 1065 commutator = &&+,
jbe@10 1066 restrict = areasel,
jbe@10 1067 join = areajoinsel
jbe@10 1068 );
jbe@10 1069
jbe@10 1070 CREATE OPERATOR &&+ (
jbe@10 1071 leftarg = ecluster,
jbe@10 1072 rightarg = ecluster,
jbe@10 1073 procedure = ecluster_may_overlap_proc,
jbe@10 1074 commutator = &&+,
jbe@10 1075 restrict = areasel,
jbe@10 1076 join = areajoinsel
jbe@10 1077 );
jbe@10 1078
jbe@16 1079 CREATE OPERATOR @> (
jbe@16 1080 leftarg = ebox,
jbe@16 1081 rightarg = epoint,
jbe@16 1082 procedure = epoint_ebox_overlap_commutator,
jbe@16 1083 commutator = <@,
jbe@16 1084 restrict = areasel,
jbe@16 1085 join = areajoinsel
jbe@16 1086 );
jbe@16 1087
jbe@16 1088 CREATE OPERATOR <@ (
jbe@16 1089 leftarg = epoint,
jbe@16 1090 rightarg = ebox,
jbe@16 1091 procedure = epoint_ebox_overlap_proc,
jbe@16 1092 commutator = @>,
jbe@16 1093 restrict = areasel,
jbe@16 1094 join = areajoinsel
jbe@16 1095 );
jbe@16 1096
jbe@16 1097 CREATE OPERATOR @> (
jbe@16 1098 leftarg = ecluster,
jbe@16 1099 rightarg = epoint,
jbe@16 1100 procedure = epoint_ecluster_overlap_commutator,
jbe@16 1101 commutator = <@,
jbe@16 1102 restrict = areasel,
jbe@16 1103 join = areajoinsel
jbe@16 1104 );
jbe@16 1105
jbe@16 1106 CREATE OPERATOR <@ (
jbe@16 1107 leftarg = epoint,
jbe@16 1108 rightarg = ecluster,
jbe@16 1109 procedure = epoint_ecluster_overlap_proc,
jbe@16 1110 commutator = <@,
jbe@16 1111 restrict = areasel,
jbe@16 1112 join = areajoinsel
jbe@16 1113 );
jbe@16 1114
jbe@16 1115 CREATE OPERATOR @> (
jbe@16 1116 leftarg = ecluster,
jbe@16 1117 rightarg = ecluster,
jbe@16 1118 procedure = ecluster_contains_proc,
jbe@16 1119 commutator = <@,
jbe@16 1120 restrict = areasel,
jbe@16 1121 join = areajoinsel
jbe@16 1122 );
jbe@16 1123
jbe@16 1124 CREATE FUNCTION ecluster_contains_commutator(ecluster, ecluster)
jbe@16 1125 RETURNS boolean
jbe@16 1126 LANGUAGE sql IMMUTABLE AS 'SELECT $2 @> $1';
jbe@16 1127
jbe@16 1128 CREATE OPERATOR <@ (
jbe@16 1129 leftarg = ecluster,
jbe@16 1130 rightarg = ecluster,
jbe@16 1131 procedure = ecluster_contains_commutator,
jbe@16 1132 commutator = @>,
jbe@16 1133 restrict = areasel,
jbe@16 1134 join = areajoinsel
jbe@16 1135 );
jbe@16 1136
jbe@16 1137 CREATE FUNCTION ebox_ecluster_contains_castwrap(ebox, ecluster)
jbe@16 1138 RETURNS boolean
jbe@16 1139 LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster @> $2';
jbe@16 1140
jbe@16 1141 CREATE OPERATOR @> (
jbe@16 1142 leftarg = ebox,
jbe@16 1143 rightarg = ecluster,
jbe@16 1144 procedure = ebox_ecluster_contains_castwrap,
jbe@16 1145 commutator = <@,
jbe@16 1146 restrict = areasel,
jbe@16 1147 join = areajoinsel
jbe@16 1148 );
jbe@16 1149
jbe@16 1150 CREATE FUNCTION ebox_ecluster_contains_castwrap(ecluster, ebox)
jbe@16 1151 RETURNS boolean
jbe@16 1152 LANGUAGE sql IMMUTABLE AS 'SELECT $2::ecluster @> $1';
jbe@16 1153
jbe@16 1154 CREATE OPERATOR <@ (
jbe@16 1155 leftarg = ecluster,
jbe@16 1156 rightarg = ebox,
jbe@16 1157 procedure = ebox_ecluster_contains_castwrap,
jbe@16 1158 commutator = @>,
jbe@16 1159 restrict = areasel,
jbe@16 1160 join = areajoinsel
jbe@16 1161 );
jbe@16 1162
jbe@16 1163 CREATE FUNCTION ecluster_ebox_contains_castwrap(ecluster, ebox)
jbe@16 1164 RETURNS boolean
jbe@16 1165 LANGUAGE sql IMMUTABLE AS 'SELECT $1 @> $2::ecluster';
jbe@16 1166
jbe@16 1167 CREATE OPERATOR @> (
jbe@16 1168 leftarg = ecluster,
jbe@16 1169 rightarg = ebox,
jbe@16 1170 procedure = ecluster_ebox_contains_castwrap,
jbe@16 1171 commutator = <@,
jbe@16 1172 restrict = areasel,
jbe@16 1173 join = areajoinsel
jbe@16 1174 );
jbe@16 1175
jbe@16 1176 CREATE FUNCTION ecluster_ebox_contains_castwrap(ebox, ecluster)
jbe@16 1177 RETURNS boolean
jbe@16 1178 LANGUAGE sql IMMUTABLE AS 'SELECT $2 @> $1::ecluster';
jbe@16 1179
jbe@16 1180 CREATE OPERATOR <@ (
jbe@16 1181 leftarg = ebox,
jbe@16 1182 rightarg = ecluster,
jbe@16 1183 procedure = ecluster_ebox_contains_castwrap,
jbe@16 1184 commutator = @>,
jbe@16 1185 restrict = areasel,
jbe@16 1186 join = areajoinsel
jbe@16 1187 );
jbe@16 1188
jbe@0 1189 CREATE OPERATOR <-> (
jbe@0 1190 leftarg = epoint,
jbe@0 1191 rightarg = epoint,
jbe@0 1192 procedure = epoint_distance_proc,
jbe@0 1193 commutator = <->
jbe@0 1194 );
jbe@0 1195
jbe@0 1196 CREATE OPERATOR <-> (
jbe@0 1197 leftarg = epoint,
jbe@0 1198 rightarg = ecircle,
jbe@0 1199 procedure = epoint_ecircle_distance_proc,
jbe@0 1200 commutator = <->
jbe@0 1201 );
jbe@0 1202
jbe@0 1203 CREATE FUNCTION epoint_ecircle_distance_commutator(ecircle, epoint)
jbe@0 1204 RETURNS float8
jbe@0 1205 LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
jbe@0 1206
jbe@0 1207 CREATE OPERATOR <-> (
jbe@0 1208 leftarg = ecircle,
jbe@0 1209 rightarg = epoint,
jbe@0 1210 procedure = epoint_ecircle_distance_commutator,
jbe@0 1211 commutator = <->
jbe@0 1212 );
jbe@0 1213
jbe@0 1214 CREATE OPERATOR <-> (
jbe@0 1215 leftarg = epoint,
jbe@0 1216 rightarg = ecluster,
jbe@0 1217 procedure = epoint_ecluster_distance_proc,
jbe@0 1218 commutator = <->
jbe@0 1219 );
jbe@0 1220
jbe@0 1221 CREATE FUNCTION epoint_ecluster_distance_commutator(ecluster, epoint)
jbe@0 1222 RETURNS float8
jbe@0 1223 LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
jbe@0 1224
jbe@0 1225 CREATE OPERATOR <-> (
jbe@0 1226 leftarg = ecluster,
jbe@0 1227 rightarg = epoint,
jbe@0 1228 procedure = epoint_ecluster_distance_commutator,
jbe@0 1229 commutator = <->
jbe@0 1230 );
jbe@0 1231
jbe@0 1232 CREATE OPERATOR <-> (
jbe@0 1233 leftarg = ecircle,
jbe@0 1234 rightarg = ecircle,
jbe@0 1235 procedure = ecircle_distance_proc,
jbe@0 1236 commutator = <->
jbe@0 1237 );
jbe@0 1238
jbe@0 1239 CREATE OPERATOR <-> (
jbe@0 1240 leftarg = ecircle,
jbe@0 1241 rightarg = ecluster,
jbe@0 1242 procedure = ecircle_ecluster_distance_proc,
jbe@0 1243 commutator = <->
jbe@0 1244 );
jbe@0 1245
jbe@0 1246 CREATE FUNCTION ecircle_ecluster_distance_commutator(ecluster, ecircle)
jbe@0 1247 RETURNS float8
jbe@0 1248 LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
jbe@0 1249
jbe@0 1250 CREATE OPERATOR <-> (
jbe@0 1251 leftarg = ecluster,
jbe@0 1252 rightarg = ecircle,
jbe@0 1253 procedure = ecircle_ecluster_distance_commutator,
jbe@0 1254 commutator = <->
jbe@0 1255 );
jbe@0 1256
jbe@16 1257 CREATE OPERATOR <-> (
jbe@16 1258 leftarg = ecluster,
jbe@16 1259 rightarg = ecluster,
jbe@16 1260 procedure = ecluster_distance_proc,
jbe@16 1261 commutator = <->
jbe@16 1262 );
jbe@16 1263
jbe@16 1264 CREATE FUNCTION epoint_ebox_distance_castwrap(epoint, ebox)
jbe@16 1265 RETURNS float8
jbe@16 1266 LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster';
jbe@16 1267
jbe@16 1268 CREATE OPERATOR <-> (
jbe@16 1269 leftarg = epoint,
jbe@16 1270 rightarg = ebox,
jbe@16 1271 procedure = epoint_ebox_distance_castwrap,
jbe@16 1272 commutator = <->
jbe@16 1273 );
jbe@16 1274
jbe@16 1275 CREATE FUNCTION epoint_ebox_distance_castwrap(ebox, epoint)
jbe@16 1276 RETURNS float8
jbe@16 1277 LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2';
jbe@16 1278
jbe@16 1279 CREATE OPERATOR <-> (
jbe@16 1280 leftarg = ebox,
jbe@16 1281 rightarg = epoint,
jbe@16 1282 procedure = epoint_ebox_distance_castwrap,
jbe@16 1283 commutator = <->
jbe@16 1284 );
jbe@16 1285
jbe@16 1286 CREATE FUNCTION ebox_distance_castwrap(ebox, ebox)
jbe@16 1287 RETURNS float8
jbe@16 1288 LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2::ecluster';
jbe@16 1289
jbe@16 1290 CREATE OPERATOR <-> (
jbe@16 1291 leftarg = ebox,
jbe@16 1292 rightarg = ebox,
jbe@16 1293 procedure = ebox_distance_castwrap,
jbe@16 1294 commutator = <->
jbe@16 1295 );
jbe@16 1296
jbe@16 1297 CREATE FUNCTION ebox_ecircle_distance_castwrap(ebox, ecircle)
jbe@16 1298 RETURNS float8
jbe@16 1299 LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2';
jbe@16 1300
jbe@16 1301 CREATE OPERATOR <-> (
jbe@16 1302 leftarg = ebox,
jbe@16 1303 rightarg = ecircle,
jbe@16 1304 procedure = ebox_ecircle_distance_castwrap,
jbe@16 1305 commutator = <->
jbe@16 1306 );
jbe@16 1307
jbe@16 1308 CREATE FUNCTION ebox_ecircle_distance_castwrap(ecircle, ebox)
jbe@16 1309 RETURNS float8
jbe@16 1310 LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster';
jbe@16 1311
jbe@16 1312 CREATE OPERATOR <-> (
jbe@16 1313 leftarg = ecircle,
jbe@16 1314 rightarg = ebox,
jbe@16 1315 procedure = ebox_ecircle_distance_castwrap,
jbe@16 1316 commutator = <->
jbe@16 1317 );
jbe@16 1318
jbe@16 1319 CREATE FUNCTION ebox_ecluster_distance_castwrap(ebox, ecluster)
jbe@16 1320 RETURNS float8
jbe@16 1321 LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2';
jbe@16 1322
jbe@16 1323 CREATE OPERATOR <-> (
jbe@16 1324 leftarg = ebox,
jbe@16 1325 rightarg = ecluster,
jbe@16 1326 procedure = ebox_ecluster_distance_castwrap,
jbe@16 1327 commutator = <->
jbe@16 1328 );
jbe@16 1329
jbe@16 1330 CREATE FUNCTION ebox_ecluster_distance_castwrap(ecluster, ebox)
jbe@16 1331 RETURNS float8
jbe@16 1332 LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster';
jbe@16 1333
jbe@16 1334 CREATE OPERATOR <-> (
jbe@16 1335 leftarg = ecluster,
jbe@16 1336 rightarg = ebox,
jbe@16 1337 procedure = ebox_ecluster_distance_castwrap,
jbe@16 1338 commutator = <->
jbe@16 1339 );
jbe@16 1340
jbe@0 1341
jbe@0 1342 ----------------
jbe@0 1343 -- GiST index --
jbe@0 1344 ----------------
jbe@0 1345
jbe@0 1346 CREATE FUNCTION pgl_gist_consistent(internal, internal, smallint, oid, internal)
jbe@0 1347 RETURNS boolean
jbe@0 1348 LANGUAGE C STRICT
jbe@15 1349 AS '$libdir/latlon-v0004', 'pgl_gist_consistent';
jbe@0 1350
jbe@0 1351 CREATE FUNCTION pgl_gist_union(internal, internal)
jbe@0 1352 RETURNS internal
jbe@0 1353 LANGUAGE C STRICT
jbe@15 1354 AS '$libdir/latlon-v0004', 'pgl_gist_union';
jbe@0 1355
jbe@0 1356 CREATE FUNCTION pgl_gist_compress_epoint(internal)
jbe@0 1357 RETURNS internal
jbe@0 1358 LANGUAGE C STRICT
jbe@15 1359 AS '$libdir/latlon-v0004', 'pgl_gist_compress_epoint';
jbe@0 1360
jbe@0 1361 CREATE FUNCTION pgl_gist_compress_ecircle(internal)
jbe@0 1362 RETURNS internal
jbe@0 1363 LANGUAGE C STRICT
jbe@15 1364 AS '$libdir/latlon-v0004', 'pgl_gist_compress_ecircle';
jbe@0 1365
jbe@0 1366 CREATE FUNCTION pgl_gist_compress_ecluster(internal)
jbe@0 1367 RETURNS internal
jbe@0 1368 LANGUAGE C STRICT
jbe@15 1369 AS '$libdir/latlon-v0004', 'pgl_gist_compress_ecluster';
jbe@0 1370
jbe@0 1371 CREATE FUNCTION pgl_gist_decompress(internal)
jbe@0 1372 RETURNS internal
jbe@0 1373 LANGUAGE C STRICT
jbe@15 1374 AS '$libdir/latlon-v0004', 'pgl_gist_decompress';
jbe@0 1375
jbe@0 1376 CREATE FUNCTION pgl_gist_penalty(internal, internal, internal)
jbe@0 1377 RETURNS internal
jbe@0 1378 LANGUAGE C STRICT
jbe@15 1379 AS '$libdir/latlon-v0004', 'pgl_gist_penalty';
jbe@0 1380
jbe@0 1381 CREATE FUNCTION pgl_gist_picksplit(internal, internal)
jbe@0 1382 RETURNS internal
jbe@0 1383 LANGUAGE C STRICT
jbe@15 1384 AS '$libdir/latlon-v0004', 'pgl_gist_picksplit';
jbe@0 1385
jbe@0 1386 CREATE FUNCTION pgl_gist_same(internal, internal, internal)
jbe@0 1387 RETURNS internal
jbe@0 1388 LANGUAGE C STRICT
jbe@15 1389 AS '$libdir/latlon-v0004', 'pgl_gist_same';
jbe@0 1390
jbe@0 1391 CREATE FUNCTION pgl_gist_distance(internal, internal, smallint, oid)
jbe@0 1392 RETURNS internal
jbe@0 1393 LANGUAGE C STRICT
jbe@15 1394 AS '$libdir/latlon-v0004', 'pgl_gist_distance';
jbe@0 1395
jbe@0 1396 CREATE OPERATOR CLASS epoint_ops
jbe@0 1397 DEFAULT FOR TYPE epoint USING gist AS
jbe@10 1398 OPERATOR 11 = ,
jbe@10 1399 OPERATOR 22 && (epoint, ebox),
jbe@16 1400 OPERATOR 222 <@ (epoint, ebox),
jbe@10 1401 OPERATOR 23 && (epoint, ecircle),
jbe@10 1402 OPERATOR 24 && (epoint, ecluster),
jbe@10 1403 OPERATOR 124 &&+ (epoint, ecluster),
jbe@16 1404 OPERATOR 224 <@ (epoint, ecluster),
jbe@10 1405 OPERATOR 31 <-> (epoint, epoint) FOR ORDER BY float_ops,
jbe@16 1406 OPERATOR 32 <-> (epoint, ebox) FOR ORDER BY float_ops,
jbe@10 1407 OPERATOR 33 <-> (epoint, ecircle) FOR ORDER BY float_ops,
jbe@10 1408 OPERATOR 34 <-> (epoint, ecluster) FOR ORDER BY float_ops,
jbe@0 1409 FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
jbe@0 1410 FUNCTION 2 pgl_gist_union(internal, internal),
jbe@0 1411 FUNCTION 3 pgl_gist_compress_epoint(internal),
jbe@0 1412 FUNCTION 4 pgl_gist_decompress(internal),
jbe@0 1413 FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
jbe@0 1414 FUNCTION 6 pgl_gist_picksplit(internal, internal),
jbe@0 1415 FUNCTION 7 pgl_gist_same(internal, internal, internal),
jbe@0 1416 FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
jbe@0 1417 STORAGE ekey_point;
jbe@0 1418
jbe@0 1419 CREATE OPERATOR CLASS ecircle_ops
jbe@0 1420 DEFAULT FOR TYPE ecircle USING gist AS
jbe@10 1421 OPERATOR 13 = ,
jbe@10 1422 OPERATOR 21 && (ecircle, epoint),
jbe@16 1423 OPERATOR 22 && (ecircle, ebox),
jbe@10 1424 OPERATOR 122 &&+ (ecircle, ebox),
jbe@10 1425 OPERATOR 23 && (ecircle, ecircle),
jbe@10 1426 OPERATOR 24 && (ecircle, ecluster),
jbe@10 1427 OPERATOR 124 &&+ (ecircle, ecluster),
jbe@10 1428 OPERATOR 31 <-> (ecircle, epoint) FOR ORDER BY float_ops,
jbe@16 1429 OPERATOR 32 <-> (ecircle, ebox) FOR ORDER BY float_ops,
jbe@10 1430 OPERATOR 33 <-> (ecircle, ecircle) FOR ORDER BY float_ops,
jbe@10 1431 OPERATOR 34 <-> (ecircle, ecluster) FOR ORDER BY float_ops,
jbe@0 1432 FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
jbe@0 1433 FUNCTION 2 pgl_gist_union(internal, internal),
jbe@0 1434 FUNCTION 3 pgl_gist_compress_ecircle(internal),
jbe@0 1435 FUNCTION 4 pgl_gist_decompress(internal),
jbe@0 1436 FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
jbe@0 1437 FUNCTION 6 pgl_gist_picksplit(internal, internal),
jbe@0 1438 FUNCTION 7 pgl_gist_same(internal, internal, internal),
jbe@0 1439 FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
jbe@0 1440 STORAGE ekey_area;
jbe@0 1441
jbe@0 1442 CREATE OPERATOR CLASS ecluster_ops
jbe@0 1443 DEFAULT FOR TYPE ecluster USING gist AS
jbe@10 1444 OPERATOR 21 && (ecluster, epoint),
jbe@10 1445 OPERATOR 121 &&+ (ecluster, epoint),
jbe@16 1446 OPERATOR 221 @> (ecluster, epoint),
jbe@16 1447 OPERATOR 22 && (ecluster, ebox),
jbe@10 1448 OPERATOR 122 &&+ (ecluster, ebox),
jbe@16 1449 OPERATOR 222 @> (ecluster, ebox),
jbe@16 1450 OPERATOR 322 <@ (ecluster, ebox),
jbe@10 1451 OPERATOR 23 && (ecluster, ecircle),
jbe@10 1452 OPERATOR 123 &&+ (ecluster, ecircle),
jbe@16 1453 OPERATOR 24 && (ecluster, ecluster),
jbe@10 1454 OPERATOR 124 &&+ (ecluster, ecluster),
jbe@16 1455 OPERATOR 224 @> (ecluster, ecluster),
jbe@16 1456 OPERATOR 324 <@ (ecluster, ecluster),
jbe@16 1457 OPERATOR 31 <-> (ecluster, epoint) FOR ORDER BY float_ops,
jbe@16 1458 OPERATOR 32 <-> (ecluster, ebox) FOR ORDER BY float_ops,
jbe@16 1459 OPERATOR 33 <-> (ecluster, ecircle) FOR ORDER BY float_ops,
jbe@16 1460 OPERATOR 34 <-> (ecluster, ecluster) FOR ORDER BY float_ops,
jbe@0 1461 FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
jbe@0 1462 FUNCTION 2 pgl_gist_union(internal, internal),
jbe@0 1463 FUNCTION 3 pgl_gist_compress_ecluster(internal),
jbe@0 1464 FUNCTION 4 pgl_gist_decompress(internal),
jbe@0 1465 FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
jbe@0 1466 FUNCTION 6 pgl_gist_picksplit(internal, internal),
jbe@0 1467 FUNCTION 7 pgl_gist_same(internal, internal, internal),
jbe@0 1468 FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
jbe@0 1469 STORAGE ekey_area;
jbe@0 1470
jbe@0 1471
jbe@0 1472 ---------------------
jbe@0 1473 -- alias functions --
jbe@0 1474 ---------------------
jbe@0 1475
jbe@0 1476 CREATE FUNCTION distance(epoint, epoint)
jbe@0 1477 RETURNS float8
jbe@0 1478 LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2';
jbe@0 1479
jbe@0 1480 CREATE FUNCTION distance(ecluster, epoint)
jbe@0 1481 RETURNS float8
jbe@0 1482 LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2';
jbe@0 1483
jbe@0 1484 CREATE FUNCTION distance_within(epoint, epoint, float8)
jbe@0 1485 RETURNS boolean
jbe@0 1486 LANGUAGE sql IMMUTABLE AS 'SELECT $1 && ecircle($2, $3)';
jbe@0 1487
jbe@0 1488 CREATE FUNCTION distance_within(ecluster, epoint, float8)
jbe@0 1489 RETURNS boolean
jbe@0 1490 LANGUAGE sql IMMUTABLE AS 'SELECT $1 && ecircle($2, $3)';
jbe@0 1491
jbe@0 1492
jbe@0 1493 --------------------------------
jbe@0 1494 -- other data storage formats --
jbe@0 1495 --------------------------------
jbe@0 1496
jbe@0 1497 CREATE FUNCTION coords_to_epoint(float8, float8, text = 'epoint_lonlat')
jbe@0 1498 RETURNS epoint
jbe@0 1499 LANGUAGE plpgsql IMMUTABLE STRICT AS $$
jbe@0 1500 DECLARE
jbe@0 1501 "result" epoint;
jbe@0 1502 BEGIN
jbe@0 1503 IF $3 = 'epoint_lonlat' THEN
jbe@0 1504 -- avoid dynamic command execution for better performance
jbe@0 1505 RETURN epoint($2, $1);
jbe@0 1506 END IF;
jbe@0 1507 IF $3 = 'epoint' OR $3 = 'epoint_latlon' THEN
jbe@0 1508 -- avoid dynamic command execution for better performance
jbe@0 1509 RETURN epoint($1, $2);
jbe@0 1510 END IF;
jbe@0 1511 EXECUTE 'SELECT ' || $3 || '($1, $2)' INTO STRICT "result" USING $1, $2;
jbe@0 1512 RETURN "result";
jbe@0 1513 END;
jbe@0 1514 $$;
jbe@0 1515
jbe@0 1516 CREATE FUNCTION GeoJSON_to_epoint(jsonb, text = 'epoint_lonlat')
jbe@0 1517 RETURNS epoint
jbe@0 1518 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 1519 SELECT CASE
jbe@0 1520 WHEN $1->>'type' = 'Point' THEN
jbe@0 1521 coords_to_epoint(
jbe@0 1522 ($1->'coordinates'->>1)::float8,
jbe@0 1523 ($1->'coordinates'->>0)::float8,
jbe@0 1524 $2
jbe@0 1525 )
jbe@0 1526 WHEN $1->>'type' = 'Feature' THEN
jbe@0 1527 GeoJSON_to_epoint($1->'geometry', $2)
jbe@0 1528 ELSE
jbe@0 1529 NULL
jbe@0 1530 END
jbe@0 1531 $$;
jbe@0 1532
jbe@0 1533 CREATE FUNCTION GeoJSON_to_ecluster(jsonb, text = 'epoint_lonlat')
jbe@0 1534 RETURNS ecluster
jbe@0 1535 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 1536 SELECT CASE $1->>'type'
jbe@0 1537 WHEN 'Point' THEN
jbe@0 1538 coords_to_epoint(
jbe@0 1539 ($1->'coordinates'->>1)::float8,
jbe@0 1540 ($1->'coordinates'->>0)::float8,
jbe@0 1541 $2
jbe@0 1542 )::ecluster
jbe@0 1543 WHEN 'MultiPoint' THEN
jbe@0 1544 ( SELECT ecluster_create_multipoint(array_agg(
jbe@0 1545 coords_to_epoint(
jbe@0 1546 ("coord"->>1)::float8,
jbe@0 1547 ("coord"->>0)::float8,
jbe@0 1548 $2
jbe@0 1549 )
jbe@0 1550 ))
jbe@0 1551 FROM jsonb_array_elements($1->'coordinates') AS "coord"
jbe@0 1552 )
jbe@0 1553 WHEN 'LineString' THEN
jbe@0 1554 ( SELECT ecluster_create_path(array_agg(
jbe@0 1555 coords_to_epoint(
jbe@0 1556 ("coord"->>1)::float8,
jbe@0 1557 ("coord"->>0)::float8,
jbe@0 1558 $2
jbe@0 1559 )
jbe@0 1560 ))
jbe@0 1561 FROM jsonb_array_elements($1->'coordinates') AS "coord"
jbe@0 1562 )
jbe@0 1563 WHEN 'MultiLineString' THEN
jbe@0 1564 ( SELECT ecluster_concat(array_agg(
jbe@0 1565 ( SELECT ecluster_create_path(array_agg(
jbe@0 1566 coords_to_epoint(
jbe@0 1567 ("coord"->>1)::float8,
jbe@0 1568 ("coord"->>0)::float8,
jbe@0 1569 $2
jbe@0 1570 )
jbe@0 1571 ))
jbe@0 1572 FROM jsonb_array_elements("coord_array") AS "coord"
jbe@0 1573 )
jbe@0 1574 ))
jbe@0 1575 FROM jsonb_array_elements($1->'coordinates') AS "coord_array"
jbe@0 1576 )
jbe@0 1577 WHEN 'Polygon' THEN
jbe@0 1578 ( SELECT ecluster_concat(array_agg(
jbe@0 1579 ( SELECT ecluster_create_polygon(array_agg(
jbe@0 1580 coords_to_epoint(
jbe@0 1581 ("coord"->>1)::float8,
jbe@0 1582 ("coord"->>0)::float8,
jbe@0 1583 $2
jbe@0 1584 )
jbe@0 1585 ))
jbe@0 1586 FROM jsonb_array_elements("coord_array") AS "coord"
jbe@0 1587 )
jbe@0 1588 ))
jbe@0 1589 FROM jsonb_array_elements($1->'coordinates') AS "coord_array"
jbe@0 1590 )
jbe@0 1591 WHEN 'MultiPolygon' THEN
jbe@0 1592 ( SELECT ecluster_concat(array_agg(
jbe@0 1593 ( SELECT ecluster_concat(array_agg(
jbe@0 1594 ( SELECT ecluster_create_polygon(array_agg(
jbe@0 1595 coords_to_epoint(
jbe@0 1596 ("coord"->>1)::float8,
jbe@0 1597 ("coord"->>0)::float8,
jbe@0 1598 $2
jbe@0 1599 )
jbe@0 1600 ))
jbe@0 1601 FROM jsonb_array_elements("coord_array") AS "coord"
jbe@0 1602 )
jbe@0 1603 ))
jbe@0 1604 FROM jsonb_array_elements("coord_array_array") AS "coord_array"
jbe@0 1605 )
jbe@0 1606 ))
jbe@0 1607 FROM jsonb_array_elements($1->'coordinates') AS "coord_array_array"
jbe@0 1608 )
jbe@0 1609 WHEN 'Feature' THEN
jbe@0 1610 GeoJSON_to_ecluster($1->'geometry', $2)
jbe@0 1611 WHEN 'FeatureCollection' THEN
jbe@0 1612 ( SELECT ecluster_concat(array_agg(
jbe@0 1613 GeoJSON_to_ecluster("feature", $2)
jbe@0 1614 ))
jbe@0 1615 FROM jsonb_array_elements($1->'features') AS "feature"
jbe@0 1616 )
jbe@0 1617 ELSE
jbe@0 1618 NULL
jbe@0 1619 END
jbe@0 1620 $$;
jbe@0 1621

Impressum / About Us