mirror of
https://github.com/pgvector/pgvector.git
synced 2026-06-30 09:41:15 +08:00
DRY code [skip ci]
This commit is contained in:
@@ -248,6 +248,7 @@ void HnswAddHeapTid(HnswElement element, ItemPointer heaptid);
|
||||
void HnswInitNeighbors(HnswElement element, int m);
|
||||
bool HnswInsertTuple(Relation index, Datum *values, bool *isnull, ItemPointer heap_tid, Relation heapRel);
|
||||
void HnswLoadElement(HnswElement element, float *distance, Datum *q, Relation index, FmgrInfo *procinfo, Oid collation, bool loadvec);
|
||||
void HnswSetElementTuple(HnswElementTuple etup, HnswElement element);
|
||||
|
||||
/* Index access methods */
|
||||
IndexBuildResult *hnswbuild(Relation heap, Relation index, IndexInfo *indexInfo);
|
||||
|
||||
@@ -109,17 +109,8 @@ CreateElementPages(HnswBuildState * buildstate)
|
||||
e->neighborPage = neighborPage++;
|
||||
|
||||
/* Set item data */
|
||||
for (int i = 0; i < HNSW_HEAPTIDS; i++)
|
||||
{
|
||||
if (i < list_length(e->heaptids))
|
||||
element->heaptids[i] = *((ItemPointer) list_nth(e->heaptids, i));
|
||||
else
|
||||
ItemPointerSetInvalid(&element->heaptids[i]);
|
||||
}
|
||||
element->level = e->level;
|
||||
element->deleted = 0;
|
||||
HnswSetElementTuple(element, e);
|
||||
element->neighborPage = e->neighborPage;
|
||||
memcpy(&element->vec, e->vec, VECTOR_SIZE(dimensions));
|
||||
|
||||
/* Ensure free space */
|
||||
if (PageGetFreeSpace(page) < elementsz)
|
||||
|
||||
@@ -80,12 +80,7 @@ WriteNewElementPages(Relation index, HnswElement e, int m)
|
||||
|
||||
/* Prepare tuple */
|
||||
etup = palloc0(esize);
|
||||
etup->heaptids[0] = *((ItemPointer) linitial(e->heaptids));
|
||||
for (int i = 1; i < HNSW_HEAPTIDS; i++)
|
||||
ItemPointerSetInvalid(&etup->heaptids[i]);
|
||||
etup->level = e->level;
|
||||
etup->deleted = 0;
|
||||
memcpy(&etup->vec, e->vec, VECTOR_SIZE(dimensions));
|
||||
HnswSetElementTuple(etup, e);
|
||||
|
||||
/* Find a page to insert the item */
|
||||
for (;;)
|
||||
|
||||
@@ -602,6 +602,24 @@ HnswFreeElement(HnswElement element)
|
||||
pfree(element);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set element tuple, except for neighbor page
|
||||
*/
|
||||
void
|
||||
HnswSetElementTuple(HnswElementTuple etup, HnswElement element)
|
||||
{
|
||||
for (int i = 0; i < HNSW_HEAPTIDS; i++)
|
||||
{
|
||||
if (i < list_length(element->heaptids))
|
||||
etup->heaptids[i] = *((ItemPointer) list_nth(element->heaptids, i));
|
||||
else
|
||||
ItemPointerSetInvalid(&etup->heaptids[i]);
|
||||
}
|
||||
etup->level = element->level;
|
||||
etup->deleted = 0;
|
||||
memcpy(&etup->vec, element->vec, VECTOR_SIZE(element->vec->dim));
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the distance for a candidate
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user