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

View file

@ -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);
}