mirror of
https://github.com/postgres/postgres.git
synced 2025-08-22 21:53:06 +03:00
Add support for nearest-neighbor (KNN) searches to SP-GiST
Currently, KNN searches were supported only by GiST. SP-GiST also capable to support them. This commit implements that support. SP-GiST scan stack is replaced with queue, which serves as stack if no ordering is specified. KNN support is provided for three SP-GIST opclasses: quad_point_ops, kd_point_ops and poly_ops (catversion is bumped). Some common parts between GiST and SP-GiST KNNs are extracted into separate functions. Discussion: https://postgr.es/m/570825e8-47d0-4732-2bf6-88d67d2d51c8%40postgrespro.ru Author: Nikita Glukhov, Alexander Korotkov based on GSoC work by Vlad Sterzhanov Review: Andrey Borodin, Alexander Korotkov
This commit is contained in:
@@ -136,7 +136,10 @@ typedef struct spgPickSplitOut
|
||||
typedef struct spgInnerConsistentIn
|
||||
{
|
||||
ScanKey scankeys; /* array of operators and comparison values */
|
||||
int nkeys; /* length of array */
|
||||
ScanKey orderbys; /* array of ordering operators and comparison
|
||||
* values */
|
||||
int nkeys; /* length of scankeys array */
|
||||
int norderbys; /* length of orderbys array */
|
||||
|
||||
Datum reconstructedValue; /* value reconstructed at parent */
|
||||
void *traversalValue; /* opclass-specific traverse value */
|
||||
@@ -159,6 +162,7 @@ typedef struct spgInnerConsistentOut
|
||||
int *levelAdds; /* increment level by this much for each */
|
||||
Datum *reconstructedValues; /* associated reconstructed values */
|
||||
void **traversalValues; /* opclass-specific traverse values */
|
||||
double **distances; /* associated distances */
|
||||
} spgInnerConsistentOut;
|
||||
|
||||
/*
|
||||
@@ -167,7 +171,10 @@ typedef struct spgInnerConsistentOut
|
||||
typedef struct spgLeafConsistentIn
|
||||
{
|
||||
ScanKey scankeys; /* array of operators and comparison values */
|
||||
int nkeys; /* length of array */
|
||||
ScanKey orderbys; /* array of ordering operators and comparison
|
||||
* values */
|
||||
int nkeys; /* length of scankeys array */
|
||||
int norderbys; /* length of orderbys array */
|
||||
|
||||
Datum reconstructedValue; /* value reconstructed at parent */
|
||||
void *traversalValue; /* opclass-specific traverse value */
|
||||
@@ -181,6 +188,8 @@ typedef struct spgLeafConsistentOut
|
||||
{
|
||||
Datum leafValue; /* reconstructed original data, if any */
|
||||
bool recheck; /* set true if operator must be rechecked */
|
||||
bool recheckDistances; /* set true if distances must be rechecked */
|
||||
double *distances; /* associated distances */
|
||||
} spgLeafConsistentOut;
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user