1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-13 07:41:39 +03:00

Add support for <-> (box, point) operator to GiST box_ops

Index-based calculation of this operator is exact.  So, signature of
gist_bbox_distance() function is changes so that caller is responsible for
setting *recheck flag.

Discussion: https://postgr.es/m/f71ba19d-d989-63b6-f04a-abf02ad9345d%40postgrespro.ru
Author: Nikita Glukhov
Reviewed-by: Tom Lane, Alexander Korotkov
This commit is contained in:
Alexander Korotkov
2019-07-14 14:56:18 +03:00
parent 6254c55f81
commit c085e1c1cb
7 changed files with 133 additions and 17 deletions

View File

@ -1464,26 +1464,12 @@ gist_point_distance(PG_FUNCTION_ARGS)
PG_RETURN_FLOAT8(distance);
}
/*
* The inexact GiST distance method for geometric types that store bounding
* boxes.
*
* Compute lossy distance from point to index entries. The result is inexact
* because index entries are bounding boxes, not the exact shapes of the
* indexed geometric types. We use distance from point to MBR of index entry.
* This is a lower bound estimate of distance from point to indexed geometric
* type.
*/
static float8
gist_bbox_distance(GISTENTRY *entry, Datum query,
StrategyNumber strategy, bool *recheck)
gist_bbox_distance(GISTENTRY *entry, Datum query, StrategyNumber strategy)
{
float8 distance;
StrategyNumber strategyGroup = strategy / GeoStrategyNumberOffset;
/* Bounding box distance is always inexact. */
*recheck = true;
switch (strategyGroup)
{
case PointStrategyNumberGroup:
@ -1499,6 +1485,32 @@ gist_bbox_distance(GISTENTRY *entry, Datum query,
return distance;
}
Datum
gist_box_distance(PG_FUNCTION_ARGS)
{
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
Datum query = PG_GETARG_DATUM(1);
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
/* Oid subtype = PG_GETARG_OID(3); */
/* bool *recheck = (bool *) PG_GETARG_POINTER(4); */
float8 distance;
distance = gist_bbox_distance(entry, query, strategy);
PG_RETURN_FLOAT8(distance);
}
/*
* The inexact GiST distance methods for geometric types that store bounding
* boxes.
*
* Compute lossy distance from point to index entries. The result is inexact
* because index entries are bounding boxes, not the exact shapes of the
* indexed geometric types. We use distance from point to MBR of index entry.
* This is a lower bound estimate of distance from point to indexed geometric
* type.
*/
Datum
gist_circle_distance(PG_FUNCTION_ARGS)
{
@ -1510,7 +1522,8 @@ gist_circle_distance(PG_FUNCTION_ARGS)
bool *recheck = (bool *) PG_GETARG_POINTER(4);
float8 distance;
distance = gist_bbox_distance(entry, query, strategy, recheck);
distance = gist_bbox_distance(entry, query, strategy);
*recheck = true;
PG_RETURN_FLOAT8(distance);
}
@ -1526,7 +1539,8 @@ gist_poly_distance(PG_FUNCTION_ARGS)
bool *recheck = (bool *) PG_GETARG_POINTER(4);
float8 distance;
distance = gist_bbox_distance(entry, query, strategy, recheck);
distance = gist_bbox_distance(entry, query, strategy);
*recheck = true;
PG_RETURN_FLOAT8(distance);
}