8000 Moved HnswLoadNeighbors to hnswinsert.c [skip ci] · postgrespro/pgvector@0b6214a · GitHub
[go: up one dir, main page]

Skip to content

Commit 0b6214a

Browse files
committed
Moved HnswLoadNeighbors to hnswinsert.c [skip ci]
1 parent f2afd11 commit 0b6214a

File tree

3 files changed

+63
-64
lines changed

3 files changed

+63
-64
lines changed

src/hnsw.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,6 @@ void HnswLoadElementFromTuple(HnswElement element, HnswElementTuple etup, bool
393393
void HnswLoadElement(HnswElement element, double *distance, Datum *q, Relation index, FmgrInfo *procinfo, Oid collation, bool loadVec, double *maxDistance);
394394
void HnswSetElementTuple(char *base, HnswElementTuple etup, HnswElement element);
395395
void HnswUpdateConnection(char *base, HnswElement element, HnswCandidate * hc, int lm, int lc, int *updateIdx, Relation index, FmgrInfo *procinfo, Oid collation);
396-
void HnswLoadNeighbors(HnswElement element, Relation index, int m);
397396
void HnswInitLockTranche(void);
398397
const HnswTypeInfo *HnswGetTypeInfo(Relation index);
399398
PGDLLEXPORT void HnswParallelBuildMain(dsm_segment *seg, shm_toc *toc);

src/hnswinsert.c

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,69 @@ AddElementOnDisk(Relation index, HnswElement e, int m, BlockNumber insertPage, B
334334
*updatedInsertPage = newInsertPage;
335335
}
336336

337+
/*
338+
* Load neighbors from page
339+
*/
340+
static void
341+
LoadNeighborsFromPage(HnswElement element, Relation index, Page page, int m)
342+
{
343+
char *base = NULL;
344+
345+
HnswNeighborTuple ntup = (HnswNeighborTuple) PageGetItem(page, PageGetItemId(page, element->neighborOffno));
346+
int neighborCount = (element->level + 2) * m;
347+
348+
Assert(HnswIsNeighborTuple(ntup));
349+
350+
HnswInitNeighbors(base, element, m, NULL);
351+
352+
/* Ensure expected neighbors */
353+
if (ntup->count != neighborCount)
354+
return;
355+
356+
for (int i = 0; i < neighborCount; i++)
357+
{
358+
HnswElement e;
359+
int level;
360+
HnswCandidate *hc;
361+
ItemPointer indextid;
362+
HnswNeighborArray *neighbors;
363+
364+
indextid = &ntup->indextids[i];
365+
366+
if (!ItemPointerIsValid(indextid))
367+
continue;
368+
369+
e = HnswInitElementFromBlock(ItemPointerGetBlockNumber(indextid), ItemPointerGetOffsetNumber(indextid));
370+
371+
/* Calculate level based on offset */
372+
level = element->level - i / m;
373+
if (level < 0)
374+
level = 0;
375+
376+
neighbors = HnswGetNeighbors(base, element, level);
377+
hc = &neighbors->items[neighbors->length++];
378+
HnswPtrStore(base, hc->element, e);
379+
}
380+
}
381+
382+
/*
383+
* Load neighbors
384+
*/
385+
static void
386+
HnswLoadNeighbors(HnswElement element, Relation index, int m)
387+
{
388+
Buffer buf;
389+
Page page;
390+
391+
buf = ReadBuffer(index, element->neighborPage);
392+
LockBuffer(buf, BUFFER_LOCK_SHARE);
393+
page = BufferGetPage(buf);
394+
395+
LoadNeighborsFromPage(element, index, page, m);
396+
397+
UnlockReleaseBuffer(buf);
398+
}
399+
337400
/*
338401
* Check if connection already exists
339402
*/

src/hnswutils.c

Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -449,69 +449,6 @@ HnswSetNeighborTuple(char *base, HnswNeighborTuple ntup, HnswElement e, int m)
449449
ntup->count = idx;
450450
}
451451

452-
/*
453-
* Load neighbors from page
454-
*/
455-
static void
456-
LoadNeighborsFromPage(HnswElement element, Relation index, Page page, int m)
457-
{
458-
char *base = NULL;
459-
460-
HnswNeighborTuple ntup = (HnswNeighborTuple) PageGetItem(page, PageGetItemId(page, element->neighborOffno));
461-
int neighborCount = (element->level + 2) * m;
462-
463-
Assert(HnswIsNeighborTuple(ntup));
464-
465-
HnswInitNeighbors(base, element, m, NULL);
466-
467-
/* Ensure expected neighbors */
468-
if (ntup->count != neighborCount)
469-
return;
470-
471-
for (int i = 0; i < neighborCount; i++)
472-
{
473-
HnswElement e;
474-
int level;
475-
HnswCandidate *hc;
476-
ItemPointer indextid;
477-
HnswNeighborArray *neighbors;
478-
479-
indextid = &ntup->indextids[i];
480-
481-
if (!ItemPointerIsValid(indextid))
482-
continue;
483-
484-
e = HnswInitElementFromBlock(ItemPointerGetBlockNumber(indextid), ItemPointerGetOffsetNumber(indextid));
485-
486-
/* Calculate level based on offset */
487-
level = element->level - i / m;
488-
if (level < 0)
489-
level = 0;
490-
491-
neighbors = HnswGetNeighbors(base, element, level);
492-
hc = &neighbors->items[neighbors->length++];
493-
HnswPtrStore(base, hc->element, e);
494-
}
495-
}
496-
497-
/*
498-
* Load neighbors
499-
*/
500-
void
501-
HnswLoadNeighbors(HnswElement element, Relation index, int m)
502-
{
503-
Buffer buf;
504-
Page page;
505-
506-
buf = ReadBuffer(index, element->neighborPage);
507-
LockBuffer(buf, BUFFER_LOCK_SHARE);
508-
page = BufferGetPage(buf);
509-
510-
LoadNeighborsFromPage(element, index, page, m);
511-
512-
UnlockReleaseBuffer(buf);
513-
}
514-
515452
/*
516453
* Load an element from a tuple
517454
*/

0 commit comments

Comments
 (0)
0