mirror of
https://git.osgeo.org/gitea/postgis/postgis
synced 2024-10-24 00:52:40 +00:00
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:
parent
b3f984276a
commit
e2c0b9004c
2
CHANGES
2
CHANGES
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue