pgLatLon

diff 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
line diff
     1.1 --- a/latlon--0.4.sql	Sat Sep 03 16:00:22 2016 +0200
     1.2 +++ b/latlon--0.4.sql	Fri Sep 09 19:22:30 2016 +0200
     1.3 @@ -767,11 +767,21 @@
     1.4    LANGUAGE C IMMUTABLE STRICT
     1.5    AS '$libdir/latlon-v0004', 'pgl_ecircle_ecluster_may_overlap';
     1.6  
     1.7 +CREATE FUNCTION ecluster_overlap_proc(ecluster, ecluster)
     1.8 +  RETURNS boolean
     1.9 +  LANGUAGE C IMMUTABLE STRICT
    1.10 +  AS '$libdir/latlon-v0004', 'pgl_ecluster_overlap';
    1.11 +
    1.12  CREATE FUNCTION ecluster_may_overlap_proc(ecluster, ecluster)
    1.13    RETURNS boolean
    1.14    LANGUAGE C IMMUTABLE STRICT
    1.15    AS '$libdir/latlon-v0004', 'pgl_ecluster_may_overlap';
    1.16  
    1.17 +CREATE FUNCTION ecluster_contains_proc(ecluster, ecluster)
    1.18 +  RETURNS boolean
    1.19 +  LANGUAGE C IMMUTABLE STRICT
    1.20 +  AS '$libdir/latlon-v0004', 'pgl_ecluster_contains';
    1.21 +
    1.22  CREATE FUNCTION epoint_distance_proc(epoint, epoint)
    1.23    RETURNS float8
    1.24    LANGUAGE C IMMUTABLE STRICT
    1.25 @@ -797,6 +807,11 @@
    1.26    LANGUAGE C IMMUTABLE STRICT
    1.27    AS '$libdir/latlon-v0004', 'pgl_ecircle_ecluster_distance';
    1.28  
    1.29 +CREATE FUNCTION ecluster_distance_proc(ecluster, ecluster)
    1.30 +  RETURNS float8
    1.31 +  LANGUAGE C IMMUTABLE STRICT
    1.32 +  AS '$libdir/latlon-v0004', 'pgl_ecluster_distance';
    1.33 +
    1.34  CREATE OPERATOR && (
    1.35    leftarg = epoint,
    1.36    rightarg = ebox,
    1.37 @@ -903,6 +918,67 @@
    1.38    join = areajoinsel
    1.39  );
    1.40  
    1.41 +CREATE OPERATOR && (
    1.42 +  leftarg = ecluster,
    1.43 +  rightarg = ecluster,
    1.44 +  procedure = ecluster_overlap_proc,
    1.45 +  commutator = &&,
    1.46 +  restrict = areasel,
    1.47 +  join = areajoinsel
    1.48 +);
    1.49 +
    1.50 +CREATE FUNCTION ebox_ecircle_overlap_castwrap(ebox, ecircle)
    1.51 +  RETURNS boolean
    1.52 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster && $2';
    1.53 +
    1.54 +CREATE OPERATOR && (
    1.55 +  leftarg = ebox,
    1.56 +  rightarg = ecircle,
    1.57 +  procedure = ebox_ecircle_overlap_castwrap,
    1.58 +  commutator = &&,
    1.59 +  restrict = areasel,
    1.60 +  join = areajoinsel
    1.61 +);
    1.62 +
    1.63 +CREATE FUNCTION ebox_ecircle_overlap_castwrap(ecircle, ebox)
    1.64 +  RETURNS boolean
    1.65 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 && $2::ecluster';
    1.66 +
    1.67 +CREATE OPERATOR && (
    1.68 +  leftarg = ecircle,
    1.69 +  rightarg = ebox,
    1.70 +  procedure = ebox_ecircle_overlap_castwrap,
    1.71 +  commutator = &&,
    1.72 +  restrict = areasel,
    1.73 +  join = areajoinsel
    1.74 +);
    1.75 +
    1.76 +CREATE FUNCTION ebox_ecluster_overlap_castwrap(ebox, ecluster)
    1.77 +  RETURNS boolean
    1.78 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster && $2';
    1.79 +
    1.80 +CREATE OPERATOR && (
    1.81 +  leftarg = ebox,
    1.82 +  rightarg = ecluster,
    1.83 +  procedure = ebox_ecluster_overlap_castwrap,
    1.84 +  commutator = &&,
    1.85 +  restrict = areasel,
    1.86 +  join = areajoinsel
    1.87 +);
    1.88 +
    1.89 +CREATE FUNCTION ebox_ecluster_overlap_castwrap(ecluster, ebox)
    1.90 +  RETURNS boolean
    1.91 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 && $2::ecluster';
    1.92 +
    1.93 +CREATE OPERATOR && (
    1.94 +  leftarg = ecluster,
    1.95 +  rightarg = ebox,
    1.96 +  procedure = ebox_ecluster_overlap_castwrap,
    1.97 +  commutator = &&,
    1.98 +  restrict = areasel,
    1.99 +  join = areajoinsel
   1.100 +);
   1.101 +
   1.102  CREATE OPERATOR &&+ (
   1.103    leftarg = epoint,
   1.104    rightarg = ecluster,
   1.105 @@ -1000,6 +1076,116 @@
   1.106    join = areajoinsel
   1.107  );
   1.108  
   1.109 +CREATE OPERATOR @> (
   1.110 +  leftarg = ebox,
   1.111 +  rightarg = epoint,
   1.112 +  procedure = epoint_ebox_overlap_commutator,
   1.113 +  commutator = <@,
   1.114 +  restrict = areasel,
   1.115 +  join = areajoinsel
   1.116 +);
   1.117 +
   1.118 +CREATE OPERATOR <@ (
   1.119 +  leftarg = epoint,
   1.120 +  rightarg = ebox,
   1.121 +  procedure = epoint_ebox_overlap_proc,
   1.122 +  commutator = @>,
   1.123 +  restrict = areasel,
   1.124 +  join = areajoinsel
   1.125 +);
   1.126 +
   1.127 +CREATE OPERATOR @> (
   1.128 +  leftarg = ecluster,
   1.129 +  rightarg = epoint,
   1.130 +  procedure = epoint_ecluster_overlap_commutator,
   1.131 +  commutator = <@,
   1.132 +  restrict = areasel,
   1.133 +  join = areajoinsel
   1.134 +);
   1.135 +
   1.136 +CREATE OPERATOR <@ (
   1.137 +  leftarg = epoint,
   1.138 +  rightarg = ecluster,
   1.139 +  procedure = epoint_ecluster_overlap_proc,
   1.140 +  commutator = <@,
   1.141 +  restrict = areasel,
   1.142 +  join = areajoinsel
   1.143 +);
   1.144 +
   1.145 +CREATE OPERATOR @> (
   1.146 +  leftarg = ecluster,
   1.147 +  rightarg = ecluster,
   1.148 +  procedure = ecluster_contains_proc,
   1.149 +  commutator = <@,
   1.150 +  restrict = areasel,
   1.151 +  join = areajoinsel
   1.152 +);
   1.153 +
   1.154 +CREATE FUNCTION ecluster_contains_commutator(ecluster, ecluster)
   1.155 +  RETURNS boolean
   1.156 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 @> $1';
   1.157 +
   1.158 +CREATE OPERATOR <@ (
   1.159 +  leftarg = ecluster,
   1.160 +  rightarg = ecluster,
   1.161 +  procedure = ecluster_contains_commutator,
   1.162 +  commutator = @>,
   1.163 +  restrict = areasel,
   1.164 +  join = areajoinsel
   1.165 +);
   1.166 +
   1.167 +CREATE FUNCTION ebox_ecluster_contains_castwrap(ebox, ecluster)
   1.168 +  RETURNS boolean
   1.169 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster @> $2';
   1.170 +
   1.171 +CREATE OPERATOR @> (
   1.172 +  leftarg = ebox,
   1.173 +  rightarg = ecluster,
   1.174 +  procedure = ebox_ecluster_contains_castwrap,
   1.175 +  commutator = <@,
   1.176 +  restrict = areasel,
   1.177 +  join = areajoinsel
   1.178 +);
   1.179 +
   1.180 +CREATE FUNCTION ebox_ecluster_contains_castwrap(ecluster, ebox)
   1.181 +  RETURNS boolean
   1.182 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2::ecluster @> $1';
   1.183 +
   1.184 +CREATE OPERATOR <@ (
   1.185 +  leftarg = ecluster,
   1.186 +  rightarg = ebox,
   1.187 +  procedure = ebox_ecluster_contains_castwrap,
   1.188 +  commutator = @>,
   1.189 +  restrict = areasel,
   1.190 +  join = areajoinsel
   1.191 +);
   1.192 +
   1.193 +CREATE FUNCTION ecluster_ebox_contains_castwrap(ecluster, ebox)
   1.194 +  RETURNS boolean
   1.195 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 @> $2::ecluster';
   1.196 +
   1.197 +CREATE OPERATOR @> (
   1.198 +  leftarg = ecluster,
   1.199 +  rightarg = ebox,
   1.200 +  procedure = ecluster_ebox_contains_castwrap,
   1.201 +  commutator = <@,
   1.202 +  restrict = areasel,
   1.203 +  join = areajoinsel
   1.204 +);
   1.205 +
   1.206 +CREATE FUNCTION ecluster_ebox_contains_castwrap(ebox, ecluster)
   1.207 +  RETURNS boolean
   1.208 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 @> $1::ecluster';
   1.209 +
   1.210 +CREATE OPERATOR <@ (
   1.211 +  leftarg = ebox,
   1.212 +  rightarg = ecluster,
   1.213 +  procedure = ecluster_ebox_contains_castwrap,
   1.214 +  commutator = @>,
   1.215 +  restrict = areasel,
   1.216 +  join = areajoinsel
   1.217 +);
   1.218 +
   1.219  CREATE OPERATOR <-> (
   1.220    leftarg = epoint,
   1.221    rightarg = epoint,
   1.222 @@ -1068,6 +1254,90 @@
   1.223    commutator = <->
   1.224  );
   1.225  
   1.226 +CREATE OPERATOR <-> (
   1.227 +  leftarg = ecluster,
   1.228 +  rightarg = ecluster,
   1.229 +  procedure = ecluster_distance_proc,
   1.230 +  commutator = <->
   1.231 +);
   1.232 +
   1.233 +CREATE FUNCTION epoint_ebox_distance_castwrap(epoint, ebox)
   1.234 +  RETURNS float8
   1.235 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster';
   1.236 +
   1.237 +CREATE OPERATOR <-> (
   1.238 +  leftarg = epoint,
   1.239 +  rightarg = ebox,
   1.240 +  procedure = epoint_ebox_distance_castwrap,
   1.241 +  commutator = <->
   1.242 +);
   1.243 +
   1.244 +CREATE FUNCTION epoint_ebox_distance_castwrap(ebox, epoint)
   1.245 +  RETURNS float8
   1.246 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2';
   1.247 +
   1.248 +CREATE OPERATOR <-> (
   1.249 +  leftarg = ebox,
   1.250 +  rightarg = epoint,
   1.251 +  procedure = epoint_ebox_distance_castwrap,
   1.252 +  commutator = <->
   1.253 +);
   1.254 +
   1.255 +CREATE FUNCTION ebox_distance_castwrap(ebox, ebox)
   1.256 +  RETURNS float8
   1.257 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2::ecluster';
   1.258 +
   1.259 +CREATE OPERATOR <-> (
   1.260 +  leftarg = ebox,
   1.261 +  rightarg = ebox,
   1.262 +  procedure = ebox_distance_castwrap,
   1.263 +  commutator = <->
   1.264 +);
   1.265 +
   1.266 +CREATE FUNCTION ebox_ecircle_distance_castwrap(ebox, ecircle)
   1.267 +  RETURNS float8
   1.268 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2';
   1.269 +
   1.270 +CREATE OPERATOR <-> (
   1.271 +  leftarg = ebox,
   1.272 +  rightarg = ecircle,
   1.273 +  procedure = ebox_ecircle_distance_castwrap,
   1.274 +  commutator = <->
   1.275 +);
   1.276 +
   1.277 +CREATE FUNCTION ebox_ecircle_distance_castwrap(ecircle, ebox)
   1.278 +  RETURNS float8
   1.279 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster';
   1.280 +
   1.281 +CREATE OPERATOR <-> (
   1.282 +  leftarg = ecircle,
   1.283 +  rightarg = ebox,
   1.284 +  procedure = ebox_ecircle_distance_castwrap,
   1.285 +  commutator = <->
   1.286 +);
   1.287 +
   1.288 +CREATE FUNCTION ebox_ecluster_distance_castwrap(ebox, ecluster)
   1.289 +  RETURNS float8
   1.290 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2';
   1.291 +
   1.292 +CREATE OPERATOR <-> (
   1.293 +  leftarg = ebox,
   1.294 +  rightarg = ecluster,
   1.295 +  procedure = ebox_ecluster_distance_castwrap,
   1.296 +  commutator = <->
   1.297 +);
   1.298 +
   1.299 +CREATE FUNCTION ebox_ecluster_distance_castwrap(ecluster, ebox)
   1.300 +  RETURNS float8
   1.301 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster';
   1.302 +
   1.303 +CREATE OPERATOR <-> (
   1.304 +  leftarg = ecluster,
   1.305 +  rightarg = ebox,
   1.306 +  procedure = ebox_ecluster_distance_castwrap,
   1.307 +  commutator = <->
   1.308 +);
   1.309 +
   1.310  
   1.311  ----------------
   1.312  -- GiST index --
   1.313 @@ -1127,10 +1397,13 @@
   1.314    DEFAULT FOR TYPE epoint USING gist AS
   1.315    OPERATOR  11 = ,
   1.316    OPERATOR  22 &&  (epoint, ebox),
   1.317 +  OPERATOR 222 <@  (epoint, ebox),
   1.318    OPERATOR  23 &&  (epoint, ecircle),
   1.319    OPERATOR  24 &&  (epoint, ecluster),
   1.320    OPERATOR 124 &&+ (epoint, ecluster),
   1.321 +  OPERATOR 224 <@  (epoint, ecluster),
   1.322    OPERATOR  31 <-> (epoint, epoint) FOR ORDER BY float_ops,
   1.323 +  OPERATOR  32 <-> (epoint, ebox) FOR ORDER BY float_ops,
   1.324    OPERATOR  33 <-> (epoint, ecircle) FOR ORDER BY float_ops,
   1.325    OPERATOR  34 <-> (epoint, ecluster) FOR ORDER BY float_ops,
   1.326    FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
   1.327 @@ -1147,11 +1420,13 @@
   1.328    DEFAULT FOR TYPE ecircle USING gist AS
   1.329    OPERATOR  13 = ,
   1.330    OPERATOR  21 &&  (ecircle, epoint),
   1.331 +  OPERATOR  22 &&  (ecircle, ebox),
   1.332    OPERATOR 122 &&+ (ecircle, ebox),
   1.333    OPERATOR  23 &&  (ecircle, ecircle),
   1.334    OPERATOR  24 &&  (ecircle, ecluster),
   1.335    OPERATOR 124 &&+ (ecircle, ecluster),
   1.336    OPERATOR  31 <-> (ecircle, epoint) FOR ORDER BY float_ops,
   1.337 +  OPERATOR  32 <-> (ecircle, ebox) FOR ORDER BY float_ops,
   1.338    OPERATOR  33 <-> (ecircle, ecircle) FOR ORDER BY float_ops,
   1.339    OPERATOR  34 <-> (ecircle, ecluster) FOR ORDER BY float_ops,
   1.340    FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
   1.341 @@ -1168,10 +1443,21 @@
   1.342    DEFAULT FOR TYPE ecluster USING gist AS
   1.343    OPERATOR  21 &&  (ecluster, epoint),
   1.344    OPERATOR 121 &&+ (ecluster, epoint),
   1.345 +  OPERATOR 221 @>  (ecluster, epoint),
   1.346 +  OPERATOR  22 &&  (ecluster, ebox),
   1.347    OPERATOR 122 &&+ (ecluster, ebox),
   1.348 +  OPERATOR 222 @>  (ecluster, ebox),
   1.349 +  OPERATOR 322 <@  (ecluster, ebox),
   1.350    OPERATOR  23 &&  (ecluster, ecircle),
   1.351    OPERATOR 123 &&+ (ecluster, ecircle),
   1.352 +  OPERATOR  24 &&  (ecluster, ecluster),
   1.353    OPERATOR 124 &&+ (ecluster, ecluster),
   1.354 +  OPERATOR 224 @>  (ecluster, ecluster),
   1.355 +  OPERATOR 324 <@  (ecluster, ecluster),
   1.356 +  OPERATOR  31 <-> (ecluster, epoint) FOR ORDER BY float_ops,
   1.357 +  OPERATOR  32 <-> (ecluster, ebox) FOR ORDER BY float_ops,
   1.358 +  OPERATOR  33 <-> (ecluster, ecircle) FOR ORDER BY float_ops,
   1.359 +  OPERATOR  34 <-> (ecluster, ecluster) FOR ORDER BY float_ops,
   1.360    FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
   1.361    FUNCTION 2 pgl_gist_union(internal, internal),
   1.362    FUNCTION 3 pgl_gist_compress_ecluster(internal),

Impressum / About Us