]> granicus.if.org Git - postgis/commitdiff
Make ~= be a bounding box only operator and upgrade ST_Equals() and ST_OrderingEquals...
authorPaul Ramsey <pramsey@cleverelephant.ca>
Sat, 7 Nov 2009 01:31:07 +0000 (01:31 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Sat, 7 Nov 2009 01:31:07 +0000 (01:31 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@4763 b70326c6-7e19-0410-871a-916f4a2858ee

postgis/lwgeom_gist.c
postgis/postgis.sql.in.c
postgis/sqlmm.sql.in.c
regress/regress.sql
regress/regress_expected

index 4f965a8c214b824f1e14d33e839c0a7e93979c08..fb39ac160a6019de5b287ea4b4bd5ed5094b5279 100644 (file)
@@ -37,6 +37,7 @@ Datum LWGEOM_below(PG_FUNCTION_ARGS);
 Datum LWGEOM_above(PG_FUNCTION_ARGS);
 Datum LWGEOM_overabove(PG_FUNCTION_ARGS);
 Datum LWGEOM_contained(PG_FUNCTION_ARGS);
+Datum LWGEOM_samebox(PG_FUNCTION_ARGS);
 Datum LWGEOM_contain(PG_FUNCTION_ARGS);
 Datum LWGEOM_gist_compress(PG_FUNCTION_ARGS);
 Datum LWGEOM_gist_consistent(PG_FUNCTION_ARGS);
@@ -374,6 +375,34 @@ Datum LWGEOM_overabove(PG_FUNCTION_ARGS)
        PG_RETURN_BOOL(result);
 }
 
+PG_FUNCTION_INFO_V1(LWGEOM_samebox);
+Datum LWGEOM_samebox(PG_FUNCTION_ARGS)
+{
+       PG_LWGEOM *lwgeom1 = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+       PG_LWGEOM *lwgeom2 = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+       bool result;
+       BOX2DFLOAT4 box1;
+       BOX2DFLOAT4 box2;
+
+       POSTGIS_DEBUG(2, "GIST: LWGEOM_samebox --entry");
+
+       errorIfSRIDMismatch(pglwgeom_getSRID(lwgeom1), pglwgeom_getSRID(lwgeom2));
+
+       if ( ! (getbox2d_p(SERIALIZED_FORM(lwgeom1), &box1) && getbox2d_p(SERIALIZED_FORM(lwgeom2), &box2)) )
+       {
+               PG_FREE_IF_COPY(lwgeom1, 0);
+               PG_FREE_IF_COPY(lwgeom2, 1);
+               PG_RETURN_BOOL(FALSE);
+       }
+
+       result = DatumGetBool(DirectFunctionCall2(BOX2D_same,
+                                                 PointerGetDatum(&box1), PointerGetDatum(&box2)));
+
+       PG_FREE_IF_COPY(lwgeom1, 0);
+       PG_FREE_IF_COPY(lwgeom2, 1);
+
+       PG_RETURN_BOOL(result);
+}
 
 PG_FUNCTION_INFO_V1(LWGEOM_contained);
 Datum LWGEOM_contained(PG_FUNCTION_ARGS)
@@ -563,11 +592,6 @@ Datum LWGEOM_gist_consistent(PG_FUNCTION_ARGS)
           can make things twice as slow. */
        *recheck = false;
        
-       /* Our ~= operator (strategy 6) requires a re-check in order to 
-          function according to the documentation and past behavior. 
-          We will temporarily enable that behavior here. */
-       if ( strategy == 6 )
-               *recheck = true;
 #endif
 
        POSTGIS_DEBUG(2, "GIST: LWGEOM_gist_consistent called");
index 286240a6ac8884513baf66c2a27bd46c1ad47e15..4af44663c3dc202da0b1b3fa7caea8ad8cdf97c1 100644 (file)
@@ -644,9 +644,9 @@ CREATE OR REPLACE FUNCTION geometry_overlap(geometry, geometry)
        AS 'MODULE_PATHNAME', 'LWGEOM_overlap'
        LANGUAGE 'C' IMMUTABLE STRICT;
 
-CREATE OR REPLACE FUNCTION geometry_same(geometry, geometry)
+CREATE OR REPLACE FUNCTION geometry_samebox(geometry, geometry)
        RETURNS bool
-       AS 'MODULE_PATHNAME', 'LWGEOM_same'
+       AS 'MODULE_PATHNAME', 'LWGEOM_samebox'
        LANGUAGE 'C' IMMUTABLE STRICT;
 
 
@@ -705,7 +705,7 @@ CREATE OPERATOR |>> (
 );
 
 CREATE OPERATOR ~= (
-       LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_same,
+       LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_samebox,
        COMMUTATOR = '~=',
        RESTRICT = eqsel, JOIN = eqjoinsel
 );
@@ -4217,13 +4217,19 @@ CREATE OR REPLACE FUNCTION Equals(geometry,geometry)
        AS 'MODULE_PATHNAME','geomequals'
        LANGUAGE 'C' IMMUTABLE STRICT;
 
--- PostGIS equivalent function: Equals(geometry,geometry)
-CREATE OR REPLACE FUNCTION ST_Equals(geometry,geometry)
+-- Availability: 1.5.0
+CREATE OR REPLACE FUNCTION _ST_Equals(geometry,geometry)
        RETURNS boolean
        AS 'MODULE_PATHNAME','geomequals'
        LANGUAGE 'C' IMMUTABLE STRICT
        COST 100;
 
+-- Availability: 1.2.1
+CREATE OR REPLACE FUNCTION ST_Equals(geometry,geometry)
+       RETURNS boolean
+       AS 'SELECT $1 ~= $2 AND _ST_Equals($1,$2)'
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
 
 #if HAVE_LIBXML2
 -----------------------------------------------------------------------
index 51d2049b34bb7607e311cb213eb3e0fa50f9b699..2008fe6da35dda58ab129b55688505474c48d1ac 100644 (file)
@@ -148,11 +148,18 @@ CREATE OR REPLACE FUNCTION ST_CoordDim(geometry)
 -- ST_X(geometry) - already defined.
 -- ST_Y(geometry) - already defined.
 
--- PostGIS equivalent function: ~= 
+-- Availability: 1.5.0
+CREATE OR REPLACE FUNCTION _ST_OrderingEquals(geometry, geometry)
+       RETURNS boolean
+       AS 'MODULE_PATHNAME', 'LWGEOM_same'
+       LANGUAGE 'C' IMMUTABLE STRICT
+       COST 100;
+
+-- Availability: 1.3.0
 CREATE OR REPLACE FUNCTION ST_OrderingEquals(geometry, geometry)
        RETURNS boolean
        AS $$ 
-       SELECT $1 && $2 AND $1 ~= $2
+       SELECT $1 ~= $2 AND _ST_OrderingEquals($1, $2)
        $$      
        LANGUAGE 'SQL' IMMUTABLE STRICT; 
 
index 9b21c1c33429c1b939a528c9405ca174c198a874..b70ba1eb2e2de9c92ef4e4fd557154d70bfbb9e2 100644 (file)
@@ -95,21 +95,33 @@ select '64',ST_asewkt('MULTIPOINT(1 1, 2 2'::GEOMETRY);
 --- is_same() testing
 
 select '65','POINT(1 1)'::GEOMETRY ~= 'POINT(1 1)'::GEOMETRY as bool;
+select '65a',st_orderingequals('POINT(1 1)'::GEOMETRY,'POINT(1 1)'::GEOMETRY) as bool;
 select '66','POINT(1 1 0)'::GEOMETRY ~= 'POINT(1 1)'::GEOMETRY as bool;
+select '66a',st_orderingequals('POINT(1 1 0)'::GEOMETRY,'POINT(1 1)'::GEOMETRY) as bool;
 select '67','POINT(1 1 0)'::GEOMETRY ~= 'POINT(1 1 0)'::GEOMETRY as bool;
+select '67a',st_orderingequals('POINT(1 1 0)'::GEOMETRY,'POINT(1 1 0)'::GEOMETRY) as bool;
 
 select '68','MULTIPOINT(1 1,2 2)'::GEOMETRY ~= 'MULTIPOINT(1 1,2 2)'::GEOMETRY as bool;
+select '68a',st_orderingequals('MULTIPOINT(1 1,2 2)'::GEOMETRY,'MULTIPOINT(1 1,2 2)'::GEOMETRY) as bool;
 select '69','MULTIPOINT(2 2, 1 1)'::GEOMETRY ~= 'MULTIPOINT(1 1,2 2)'::GEOMETRY as bool;
+select '69a',st_orderingequals('MULTIPOINT(2 2, 1 1)'::GEOMETRY,'MULTIPOINT(1 1,2 2)'::GEOMETRY) as bool;
 
 select '70','GEOMETRYCOLLECTION(POINT( 1 2 3),POINT(4 5 6))'::GEOMETRY ~= 'GEOMETRYCOLLECTION(POINT( 4 5 6),POINT(1 2 3))'::GEOMETRY as bool;
+select '70a',st_orderingequals('GEOMETRYCOLLECTION(POINT( 1 2 3),POINT(4 5 6))'::GEOMETRY,'GEOMETRYCOLLECTION(POINT( 4 5 6),POINT(1 2 3))'::GEOMETRY) as bool;
 select '71','MULTIPOINT(4 5 6, 1 2 3)'::GEOMETRY ~= 'GEOMETRYCOLLECTION(POINT( 4 5 6),POINT(1 2 3))'::GEOMETRY as bool;
+select '71a',st_orderingequals('MULTIPOINT(4 5 6, 1 2 3)'::GEOMETRY,'GEOMETRYCOLLECTION(POINT( 4 5 6),POINT(1 2 3))'::GEOMETRY) as bool;
 select '72','MULTIPOINT(1 2 3, 4 5 6)'::GEOMETRY ~= 'GEOMETRYCOLLECTION(POINT( 4 5 6),POINT(1 2 3))'::GEOMETRY as bool;
+select '72a',st_orderingequals('MULTIPOINT(1 2 3, 4 5 6)'::GEOMETRY,'GEOMETRYCOLLECTION(POINT( 4 5 6),POINT(1 2 3))'::GEOMETRY) as bool;
 select '73','MULTIPOINT(1 2 3, 4 5 6)'::GEOMETRY ~= 'GEOMETRYCOLLECTION(MULTIPOINT(1 2 3, 4 5 6))'::GEOMETRY as bool;
+select '73a',st_orderingequals('MULTIPOINT(1 2 3, 4 5 6)'::GEOMETRY,'GEOMETRYCOLLECTION(MULTIPOINT(1 2 3, 4 5 6))'::GEOMETRY) as bool;
 
 
 select '74','LINESTRING(1 1,2 2)'::GEOMETRY ~= 'POINT(1 1)'::GEOMETRY as bool;
+select '74a',st_orderingequals('LINESTRING(1 1,2 2)'::GEOMETRY,'POINT(1 1)'::GEOMETRY) as bool;
 select '75','LINESTRING(1 1, 2 2)'::GEOMETRY ~= 'LINESTRING(2 2, 1 1)'::GEOMETRY as bool;
+select '75a',st_orderingequals('LINESTRING(1 1, 2 2)'::GEOMETRY,'LINESTRING(2 2, 1 1)'::GEOMETRY) as bool;
 select '76','LINESTRING(1 1, 2 2)'::GEOMETRY ~= 'LINESTRING(1 1, 2 2, 3 3)'::GEOMETRY as bool;
+select '76a',st_orderingequals('LINESTRING(1 1, 2 2)'::GEOMETRY,'LINESTRING(1 1, 2 2, 3 3)'::GEOMETRY) as bool;
 
 --- operator testing (testing is on the BOUNDING BOX (2d), not the actual geometries)
 
index 81d4a5a64ca2346cb2e057a88d7b827ba5ad6f99..33204a870e4c754ac7415f163be0a01e3942370e 100644 (file)
@@ -76,17 +76,29 @@ HINT:  "LINESTRING(1 1)" <-- parse error at position 15 within geometry
 ERROR:  parse error - invalid geometry
 HINT:  "MULTIPOINT(1 1, 2 2" <-- parse error at position 19 within geometry
 65|t
-66|f
+65a|t
+66|t
+66a|f
 67|t
+67a|t
 68|t
+68a|t
 69|t
+69a|t
 70|t
-71|f
-72|f
-73|f
+70a|t
+71|t
+71a|f
+72|t
+72a|f
+73|t
+73a|f
 74|f
-75|f
+74a|f
+75|t
+75a|f
 76|f
+76a|f
 77|t
 78|t
 79|f