mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-12 23:56:55 +08:00
DRY HNSW vacuum code
This commit is contained in:
@@ -272,6 +272,7 @@ void HnswAddHeapTid(HnswElement element, ItemPointer heaptid);
|
|||||||
void HnswInitNeighbors(HnswElement element, int m);
|
void HnswInitNeighbors(HnswElement element, int m);
|
||||||
bool HnswInsertTuple(Relation index, Datum *values, bool *isnull, ItemPointer heap_tid, Relation heapRel);
|
bool HnswInsertTuple(Relation index, Datum *values, bool *isnull, ItemPointer heap_tid, Relation heapRel);
|
||||||
void HnswUpdateNeighborPages(Relation index, FmgrInfo *procinfo, Oid collation, HnswElement e, int m, bool checkExisting);
|
void HnswUpdateNeighborPages(Relation index, FmgrInfo *procinfo, Oid collation, HnswElement e, int m, bool checkExisting);
|
||||||
|
void HnswLoadElementFromTuple(HnswElement element, HnswElementTuple etup, bool loadHeaptids, bool loadVec);
|
||||||
void HnswLoadElement(HnswElement element, float *distance, Datum *q, Relation index, FmgrInfo *procinfo, Oid collation, bool loadVec);
|
void HnswLoadElement(HnswElement element, float *distance, Datum *q, Relation index, FmgrInfo *procinfo, Oid collation, bool loadVec);
|
||||||
void HnswSetElementTuple(HnswElementTuple etup, HnswElement element);
|
void HnswSetElementTuple(HnswElementTuple etup, HnswElement element);
|
||||||
void HnswUpdateConnection(HnswElement element, HnswCandidate * hc, int m, int lc, int *updateIdx, Relation index, FmgrInfo *procinfo, Oid collation);
|
void HnswUpdateConnection(HnswElement element, HnswCandidate * hc, int m, int lc, int *updateIdx, Relation index, FmgrInfo *procinfo, Oid collation);
|
||||||
|
|||||||
@@ -395,6 +395,37 @@ HnswLoadNeighbors(HnswElement element, Relation index)
|
|||||||
UnlockReleaseBuffer(buf);
|
UnlockReleaseBuffer(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Load an element from a tuple
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
HnswLoadElementFromTuple(HnswElement element, HnswElementTuple etup, bool loadHeaptids, bool loadVec)
|
||||||
|
{
|
||||||
|
element->level = etup->level;
|
||||||
|
element->deleted = etup->deleted;
|
||||||
|
element->neighborPage = ItemPointerGetBlockNumber(&etup->neighbortid);
|
||||||
|
element->neighborOffno = ItemPointerGetOffsetNumber(&etup->neighbortid);
|
||||||
|
element->heaptids = NIL;
|
||||||
|
|
||||||
|
if (loadHeaptids)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < HNSW_HEAPTIDS; i++)
|
||||||
|
{
|
||||||
|
/* Can stop at first invalid */
|
||||||
|
if (!ItemPointerIsValid(&etup->heaptids[i]))
|
||||||
|
break;
|
||||||
|
|
||||||
|
HnswAddHeapTid(element, &etup->heaptids[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loadVec)
|
||||||
|
{
|
||||||
|
element->vec = palloc(VECTOR_SIZE(etup->vec.dim));
|
||||||
|
memcpy(element->vec, &etup->vec, VECTOR_SIZE(etup->vec.dim));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Load an element and optionally get its distance from q
|
* Load an element and optionally get its distance from q
|
||||||
*/
|
*/
|
||||||
@@ -415,25 +446,7 @@ HnswLoadElement(HnswElement element, float *distance, Datum *q, Relation index,
|
|||||||
Assert(HnswIsElementTuple(etup));
|
Assert(HnswIsElementTuple(etup));
|
||||||
|
|
||||||
/* Load element */
|
/* Load element */
|
||||||
element->heaptids = NIL;
|
HnswLoadElementFromTuple(element, etup, true, loadVec);
|
||||||
for (int i = 0; i < HNSW_HEAPTIDS; i++)
|
|
||||||
{
|
|
||||||
/* Can stop at first invalid */
|
|
||||||
if (!ItemPointerIsValid(&etup->heaptids[i]))
|
|
||||||
break;
|
|
||||||
|
|
||||||
HnswAddHeapTid(element, &etup->heaptids[i]);
|
|
||||||
}
|
|
||||||
element->level = etup->level;
|
|
||||||
element->neighborPage = ItemPointerGetBlockNumber(&etup->neighbortid);
|
|
||||||
element->neighborOffno = ItemPointerGetOffsetNumber(&etup->neighbortid);
|
|
||||||
element->deleted = etup->deleted;
|
|
||||||
|
|
||||||
if (loadVec)
|
|
||||||
{
|
|
||||||
element->vec = palloc(VECTOR_SIZE(etup->vec.dim));
|
|
||||||
memcpy(element->vec, &etup->vec, VECTOR_SIZE(etup->vec.dim));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Calculate distance */
|
/* Calculate distance */
|
||||||
if (distance != NULL)
|
if (distance != NULL)
|
||||||
|
|||||||
@@ -348,14 +348,8 @@ RepairGraph(HnswVacuumState * vacuumstate)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Create an element */
|
/* Create an element */
|
||||||
element = palloc(sizeof(HnswElementData));
|
element = HnswInitElementFromBlock(blkno, offno);
|
||||||
element->neighborPage = ItemPointerGetBlockNumber(&etup->neighbortid);
|
HnswLoadElementFromTuple(element, etup, false, true);
|
||||||
element->neighborOffno = ItemPointerGetOffsetNumber(&etup->neighbortid);
|
|
||||||
element->level = etup->level;
|
|
||||||
element->blkno = blkno;
|
|
||||||
element->offno = offno;
|
|
||||||
element->vec = palloc(VECTOR_SIZE(etup->vec.dim));
|
|
||||||
memcpy(element->vec, &etup->vec, VECTOR_SIZE(etup->vec.dim));
|
|
||||||
|
|
||||||
elements = lappend(elements, element);
|
elements = lappend(elements, element);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user