mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-14 00:26:55 +08:00
Moved HnswLoadNeighbors to hnswinsert.c [skip ci]
This commit is contained in:
@@ -393,7 +393,6 @@ void HnswLoadElementFromTuple(HnswElement element, HnswElementTuple etup, bool
|
|||||||
void HnswLoadElement(HnswElement element, double *distance, Datum *q, Relation index, FmgrInfo *procinfo, Oid collation, bool loadVec, double *maxDistance);
|
void HnswLoadElement(HnswElement element, double *distance, Datum *q, Relation index, FmgrInfo *procinfo, Oid collation, bool loadVec, double *maxDistance);
|
||||||
void HnswSetElementTuple(char *base, HnswElementTuple etup, HnswElement element);
|
void HnswSetElementTuple(char *base, HnswElementTuple etup, HnswElement element);
|
||||||
void HnswUpdateConnection(char *base, HnswElement element, HnswCandidate * hc, int lm, int lc, int *updateIdx, Relation index, FmgrInfo *procinfo, Oid collation);
|
void HnswUpdateConnection(char *base, HnswElement element, HnswCandidate * hc, int lm, int lc, int *updateIdx, Relation index, FmgrInfo *procinfo, Oid collation);
|
||||||
void HnswLoadNeighbors(HnswElement element, Relation index, int m);
|
|
||||||
void HnswInitLockTranche(void);
|
void HnswInitLockTranche(void);
|
||||||
const HnswTypeInfo *HnswGetTypeInfo(Relation index);
|
const HnswTypeInfo *HnswGetTypeInfo(Relation index);
|
||||||
PGDLLEXPORT void HnswParallelBuildMain(dsm_segment *seg, shm_toc *toc);
|
PGDLLEXPORT void HnswParallelBuildMain(dsm_segment *seg, shm_toc *toc);
|
||||||
|
|||||||
@@ -334,6 +334,69 @@ AddElementOnDisk(Relation index, HnswElement e, int m, BlockNumber insertPage, B
|
|||||||
*updatedInsertPage = newInsertPage;
|
*updatedInsertPage = newInsertPage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Load neighbors from page
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
LoadNeighborsFromPage(HnswElement element, Relation index, Page page, int m)
|
||||||
|
{
|
||||||
|
char *base = NULL;
|
||||||
|
|
||||||
|
HnswNeighborTuple ntup = (HnswNeighborTuple) PageGetItem(page, PageGetItemId(page, element->neighborOffno));
|
||||||
|
int neighborCount = (element->level + 2) * m;
|
||||||
|
|
||||||
|
Assert(HnswIsNeighborTuple(ntup));
|
||||||
|
|
||||||
|
HnswInitNeighbors(base, element, m, NULL);
|
||||||
|
|
||||||
|
/* Ensure expected neighbors */
|
||||||
|
if (ntup->count != neighborCount)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (int i = 0; i < neighborCount; i++)
|
||||||
|
{
|
||||||
|
HnswElement e;
|
||||||
|
int level;
|
||||||
|
HnswCandidate *hc;
|
||||||
|
ItemPointer indextid;
|
||||||
|
HnswNeighborArray *neighbors;
|
||||||
|
|
||||||
|
indextid = &ntup->indextids[i];
|
||||||
|
|
||||||
|
if (!ItemPointerIsValid(indextid))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
e = HnswInitElementFromBlock(ItemPointerGetBlockNumber(indextid), ItemPointerGetOffsetNumber(indextid));
|
||||||
|
|
||||||
|
/* Calculate level based on offset */
|
||||||
|
level = element->level - i / m;
|
||||||
|
if (level < 0)
|
||||||
|
level = 0;
|
||||||
|
|
||||||
|
neighbors = HnswGetNeighbors(base, element, level);
|
||||||
|
hc = &neighbors->items[neighbors->length++];
|
||||||
|
HnswPtrStore(base, hc->element, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Load neighbors
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
HnswLoadNeighbors(HnswElement element, Relation index, int m)
|
||||||
|
{
|
||||||
|
Buffer buf;
|
||||||
|
Page page;
|
||||||
|
|
||||||
|
buf = ReadBuffer(index, element->neighborPage);
|
||||||
|
LockBuffer(buf, BUFFER_LOCK_SHARE);
|
||||||
|
page = BufferGetPage(buf);
|
||||||
|
|
||||||
|
LoadNeighborsFromPage(element, index, page, m);
|
||||||
|
|
||||||
|
UnlockReleaseBuffer(buf);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if connection already exists
|
* Check if connection already exists
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -449,69 +449,6 @@ HnswSetNeighborTuple(char *base, HnswNeighborTuple ntup, HnswElement e, int m)
|
|||||||
ntup->count = idx;
|
ntup->count = idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Load neighbors from page
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
LoadNeighborsFromPage(HnswElement element, Relation index, Page page, int m)
|
|
||||||
{
|
|
||||||
char *base = NULL;
|
|
||||||
|
|
||||||
HnswNeighborTuple ntup = (HnswNeighborTuple) PageGetItem(page, PageGetItemId(page, element->neighborOffno));
|
|
||||||
int neighborCount = (element->level + 2) * m;
|
|
||||||
|
|
||||||
Assert(HnswIsNeighborTuple(ntup));
|
|
||||||
|
|
||||||
HnswInitNeighbors(base, element, m, NULL);
|
|
||||||
|
|
||||||
/* Ensure expected neighbors */
|
|
||||||
if (ntup->count != neighborCount)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (int i = 0; i < neighborCount; i++)
|
|
||||||
{
|
|
||||||
HnswElement e;
|
|
||||||
int level;
|
|
||||||
HnswCandidate *hc;
|
|
||||||
ItemPointer indextid;
|
|
||||||
HnswNeighborArray *neighbors;
|
|
||||||
|
|
||||||
indextid = &ntup->indextids[i];
|
|
||||||
|
|
||||||
if (!ItemPointerIsValid(indextid))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
e = HnswInitElementFromBlock(ItemPointerGetBlockNumber(indextid), ItemPointerGetOffsetNumber(indextid));
|
|
||||||
|
|
||||||
/* Calculate level based on offset */
|
|
||||||
level = element->level - i / m;
|
|
||||||
if (level < 0)
|
|
||||||
level = 0;
|
|
||||||
|
|
||||||
neighbors = HnswGetNeighbors(base, element, level);
|
|
||||||
hc = &neighbors->items[neighbors->length++];
|
|
||||||
HnswPtrStore(base, hc->element, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Load neighbors
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
HnswLoadNeighbors(HnswElement element, Relation index, int m)
|
|
||||||
{
|
|
||||||
Buffer buf;
|
|
||||||
Page page;
|
|
||||||
|
|
||||||
buf = ReadBuffer(index, element->neighborPage);
|
|
||||||
LockBuffer(buf, BUFFER_LOCK_SHARE);
|
|
||||||
page = BufferGetPage(buf);
|
|
||||||
|
|
||||||
LoadNeighborsFromPage(element, index, page, m);
|
|
||||||
|
|
||||||
UnlockReleaseBuffer(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Load an element from a tuple
|
* Load an element from a tuple
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user