From e2c0b9004c2b6fbfc5b13380e80421b5d365625f Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 24 Jun 2005 12:36:31 +0000 Subject: [PATCH] Fixed rtree indexing (ported from pgsql rtree fix) git-svn-id: http://svn.osgeo.org/postgis/trunk@1769 b70326c6-7e19-0410-871a-916f4a2858ee --- CHANGES | 2 + lwgeom/lwgeom_gist.c | 90 +++++++++++++++++++++++++------------------- 2 files changed, 53 insertions(+), 39 deletions(-) diff --git a/CHANGES b/CHANGES index a04aef8a5..872c886ad 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,8 @@ PostGIS 1.1.0CVS - Fault tolerant btree ops - NEW -I (index) switch in shp2pgsql - Memory Leak fix in pg_error + - Rtree index fix. See: + http://archives.postgresql.org/pgsql-hackers/2005-06/msg01108.php PostGIS 1.0.1 2005/05/24 diff --git a/lwgeom/lwgeom_gist.c b/lwgeom/lwgeom_gist.c index 98a0ae84d..0878c8d3f 100644 --- a/lwgeom/lwgeom_gist.c +++ b/lwgeom/lwgeom_gist.c @@ -592,10 +592,6 @@ Datum LWGEOM_gist_consistent(PG_FUNCTION_ARGS) bool result; BOX2DFLOAT4 box; - /* - * if entry is not leaf, use rtree_internal_consistent, - * else use rtree_leaf_consistent - */ #ifdef PGIS_DEBUG_CALLS elog(NOTICE,"GIST: LWGEOM_gist_consistent called"); #endif @@ -614,10 +610,16 @@ Datum LWGEOM_gist_consistent(PG_FUNCTION_ARGS) getbox2d_p(query+4, &box); - if (GIST_LEAF(entry)) - result = lwgeom_rtree_leaf_consistent((BOX2DFLOAT4 *) - DatumGetPointer(entry->key), &box, strategy ); - else + /* + * Since the operators are marked lossy anyway, we can just use + * rtree_internal_consistent even at leaf nodes. (This works + * in part because the index entries are bounding Boxes not polygons.) + */ + + //if (GIST_LEAF(entry)) + // result = lwgeom_rtree_leaf_consistent((BOX2DFLOAT4 *) + // DatumGetPointer(entry->key), &box, strategy ); + //else result = lwgeom_rtree_internal_consistent( (BOX2DFLOAT4 *) DatumGetPointer(entry->key), &box, strategy ); @@ -639,11 +641,13 @@ lwgeom_rtree_internal_consistent(BOX2DFLOAT4 *key, BOX2DFLOAT4 *query, #endif switch(strategy) { - case RTLeftStrategyNumber: - case RTOverLeftStrategyNumber: - retval = DatumGetBool( DirectFunctionCall2( BOX2D_overleft, PointerGetDatum(key), PointerGetDatum(query) ) ); - break; - case RTOverlapStrategyNumber: //optimized for speed + case RTLeftStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_overright, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTOverLeftStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_right, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTOverlapStrategyNumber: //optimized for speed retval = (((key->xmax>= query->xmax) && (key->xmin <= query->xmax)) || @@ -670,33 +674,41 @@ lwgeom_rtree_internal_consistent(BOX2DFLOAT4 *key, BOX2DFLOAT4 *query, elog(NOTICE,"%i:(int)<%.8g %.8g,%.8g %.8g>&&<%.8g %.8g,%.8g %.8g> %i",counter_intern,key->xmin,key->ymin,key->xmax,key->ymax, query->xmin,query->ymin,query->xmax,query->ymax, (int) retval); -#endif counter_intern++; - return(retval); - break; - case RTOverRightStrategyNumber: - case RTRightStrategyNumber: - retval = DatumGetBool( DirectFunctionCall2( BOX2D_overright, PointerGetDatum(key), PointerGetDatum(query) ) ); - break; - case RTOverBelowStrategyNumber: - case RTBelowStrategyNumber: - retval = DatumGetBool( DirectFunctionCall2( BOX2D_overbelow, PointerGetDatum(key), PointerGetDatum(query) ) ); - break; - case RTAboveStrategyNumber: - case RTOverAboveStrategyNumber: - retval = DatumGetBool( DirectFunctionCall2( BOX2D_overabove, PointerGetDatum(key), PointerGetDatum(query) ) ); - break; - case RTSameStrategyNumber: - case RTContainsStrategyNumber: - retval = DatumGetBool( DirectFunctionCall2( BOX2D_contain, PointerGetDatum(key), PointerGetDatum(query) ) ); - break; - case RTContainedByStrategyNumber: - retval = DatumGetBool( DirectFunctionCall2( BOX2D_overlap, PointerGetDatum(key), PointerGetDatum(query) ) ); - break; - default: - retval = FALSE; - } - return(retval); +#endif + + return(retval); + break; + + case RTOverRightStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_left, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTRightStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_overleft, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTOverBelowStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_above, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTBelowStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_above, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTAboveStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_overbelow, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTOverAboveStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_below, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTSameStrategyNumber: + case RTContainsStrategyNumber: + retval = DatumGetBool( DirectFunctionCall2( BOX2D_contain, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTContainedByStrategyNumber: + retval = DatumGetBool( DirectFunctionCall2( BOX2D_overlap, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + default: + retval = FALSE; + } + return(retval); }