Make ~= be a bounding box only operator and upgrade ST_Equals() and ST_OrderingEquals() to match the new behavior. Update regression tests to match new behavior. (#282) See also #289 for an odd quirk discovered while updating regression tests.

git-svn-id: http://svn.osgeo.org/postgis/trunk@4763 b70326c6-7e19-0410-871a-916f4a2858ee
This commit is contained in:
Paul Ramsey 2009-11-07 01:31:07 +00:00
parent 520024aff2
commit 6f547e3120
5 changed files with 78 additions and 17 deletions

View 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");

View 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
-----------------------------------------------------------------------

View 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;

View 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)

View 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