Fixed rtree indexing (ported from pgsql rtree fix)

git-svn-id: http://svn.osgeo.org/postgis/trunk@1769 b70326c6-7e19-0410-871a-916f4a2858ee
This commit is contained in:
Sandro Santilli 2005-06-24 12:36:31 +00:00
parent b3f984276a
commit e2c0b9004c
2 changed files with 53 additions and 39 deletions

View file

@ -15,6 +15,8 @@ PostGIS 1.1.0CVS
- Fault tolerant btree ops - Fault tolerant btree ops
- NEW -I (index) switch in shp2pgsql - NEW -I (index) switch in shp2pgsql
- Memory Leak fix in pg_error - Memory Leak fix in pg_error
- Rtree index fix. See:
http://archives.postgresql.org/pgsql-hackers/2005-06/msg01108.php
PostGIS 1.0.1 PostGIS 1.0.1
2005/05/24 2005/05/24

View file

@ -592,10 +592,6 @@ Datum LWGEOM_gist_consistent(PG_FUNCTION_ARGS)
bool result; bool result;
BOX2DFLOAT4 box; BOX2DFLOAT4 box;
/*
* if entry is not leaf, use rtree_internal_consistent,
* else use rtree_leaf_consistent
*/
#ifdef PGIS_DEBUG_CALLS #ifdef PGIS_DEBUG_CALLS
elog(NOTICE,"GIST: LWGEOM_gist_consistent called"); elog(NOTICE,"GIST: LWGEOM_gist_consistent called");
#endif #endif
@ -614,10 +610,16 @@ Datum LWGEOM_gist_consistent(PG_FUNCTION_ARGS)
getbox2d_p(query+4, &box); getbox2d_p(query+4, &box);
if (GIST_LEAF(entry)) /*
result = lwgeom_rtree_leaf_consistent((BOX2DFLOAT4 *) * Since the operators are marked lossy anyway, we can just use
DatumGetPointer(entry->key), &box, strategy ); * rtree_internal_consistent even at leaf nodes. (This works
else * 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( result = lwgeom_rtree_internal_consistent(
(BOX2DFLOAT4 *) DatumGetPointer(entry->key), (BOX2DFLOAT4 *) DatumGetPointer(entry->key),
&box, strategy ); &box, strategy );
@ -639,11 +641,13 @@ lwgeom_rtree_internal_consistent(BOX2DFLOAT4 *key, BOX2DFLOAT4 *query,
#endif #endif
switch(strategy) { switch(strategy) {
case RTLeftStrategyNumber: case RTLeftStrategyNumber:
case RTOverLeftStrategyNumber: retval = !DatumGetBool( DirectFunctionCall2( BOX2D_overright, PointerGetDatum(key), PointerGetDatum(query) ) );
retval = DatumGetBool( DirectFunctionCall2( BOX2D_overleft, PointerGetDatum(key), PointerGetDatum(query) ) ); break;
break; case RTOverLeftStrategyNumber:
case RTOverlapStrategyNumber: //optimized for speed retval = !DatumGetBool( DirectFunctionCall2( BOX2D_right, PointerGetDatum(key), PointerGetDatum(query) ) );
break;
case RTOverlapStrategyNumber: //optimized for speed
retval = (((key->xmax>= query->xmax) && retval = (((key->xmax>= query->xmax) &&
(key->xmin <= 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, 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); query->xmin,query->ymin,query->xmax,query->ymax, (int) retval);
#endif
counter_intern++; counter_intern++;
return(retval); #endif
break;
case RTOverRightStrategyNumber: return(retval);
case RTRightStrategyNumber: break;
retval = DatumGetBool( DirectFunctionCall2( BOX2D_overright, PointerGetDatum(key), PointerGetDatum(query) ) );
break; case RTOverRightStrategyNumber:
case RTOverBelowStrategyNumber: retval = !DatumGetBool( DirectFunctionCall2( BOX2D_left, PointerGetDatum(key), PointerGetDatum(query) ) );
case RTBelowStrategyNumber: break;
retval = DatumGetBool( DirectFunctionCall2( BOX2D_overbelow, PointerGetDatum(key), PointerGetDatum(query) ) ); case RTRightStrategyNumber:
break; retval = !DatumGetBool( DirectFunctionCall2( BOX2D_overleft, PointerGetDatum(key), PointerGetDatum(query) ) );
case RTAboveStrategyNumber: break;
case RTOverAboveStrategyNumber: case RTOverBelowStrategyNumber:
retval = DatumGetBool( DirectFunctionCall2( BOX2D_overabove, PointerGetDatum(key), PointerGetDatum(query) ) ); retval = !DatumGetBool( DirectFunctionCall2( BOX2D_above, PointerGetDatum(key), PointerGetDatum(query) ) );
break; break;
case RTSameStrategyNumber: case RTBelowStrategyNumber:
case RTContainsStrategyNumber: retval = !DatumGetBool( DirectFunctionCall2( BOX2D_above, PointerGetDatum(key), PointerGetDatum(query) ) );
retval = DatumGetBool( DirectFunctionCall2( BOX2D_contain, PointerGetDatum(key), PointerGetDatum(query) ) ); break;
break; case RTAboveStrategyNumber:
case RTContainedByStrategyNumber: retval = !DatumGetBool( DirectFunctionCall2( BOX2D_overbelow, PointerGetDatum(key), PointerGetDatum(query) ) );
retval = DatumGetBool( DirectFunctionCall2( BOX2D_overlap, PointerGetDatum(key), PointerGetDatum(query) ) ); break;
break; case RTOverAboveStrategyNumber:
default: retval = !DatumGetBool( DirectFunctionCall2( BOX2D_below, PointerGetDatum(key), PointerGetDatum(query) ) );
retval = FALSE; break;
} case RTSameStrategyNumber:
return(retval); 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);
} }