mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-11 23:26:55 +08:00
Added PrintGraph function for HNSW [skip ci]
This commit is contained in:
@@ -611,6 +611,67 @@ FreeVacuumState(HnswVacuumState * vacuumstate)
|
|||||||
MemoryContextDelete(vacuumstate->tmpCtx);
|
MemoryContextDelete(vacuumstate->tmpCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print graph
|
||||||
|
*/
|
||||||
|
#ifdef HNSW_DEBUG
|
||||||
|
static void
|
||||||
|
PrintGraph(HnswVacuumState * vacuumstate)
|
||||||
|
{
|
||||||
|
BlockNumber blkno = HNSW_HEAD_BLKNO;
|
||||||
|
Relation index = vacuumstate->index;
|
||||||
|
|
||||||
|
while (BlockNumberIsValid(blkno))
|
||||||
|
{
|
||||||
|
Buffer buf;
|
||||||
|
Page page;
|
||||||
|
OffsetNumber offno;
|
||||||
|
OffsetNumber maxoffno;
|
||||||
|
|
||||||
|
buf = ReadBuffer(index, blkno);
|
||||||
|
LockBuffer(buf, BUFFER_LOCK_SHARE);
|
||||||
|
page = BufferGetPage(buf);
|
||||||
|
maxoffno = PageGetMaxOffsetNumber(page);
|
||||||
|
|
||||||
|
for (offno = FirstOffsetNumber; offno <= maxoffno; offno = OffsetNumberNext(offno))
|
||||||
|
{
|
||||||
|
HnswElementTuple etup = (HnswElementTuple) PageGetItem(page, PageGetItemId(page, offno));
|
||||||
|
HnswElement element;
|
||||||
|
|
||||||
|
/* Skip neighbor tuples */
|
||||||
|
if (!HnswIsElementTuple(etup))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Skip deleted tuples */
|
||||||
|
if (etup->deleted)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
element = HnswInitElementFromBlock(blkno, offno);
|
||||||
|
HnswLoadElementFromTuple(element, etup, false, true);
|
||||||
|
HnswLoadNeighbors(element, index);
|
||||||
|
|
||||||
|
elog(INFO, "element (%d,%d)", element->blkno, element->offno);
|
||||||
|
|
||||||
|
for (int lc = element->level; lc >= 0; lc--)
|
||||||
|
{
|
||||||
|
HnswNeighborArray *neighbors = &element->neighbors[lc];
|
||||||
|
|
||||||
|
for (int i = 0; i < neighbors->length; i++)
|
||||||
|
{
|
||||||
|
HnswElement e = neighbors->items[i].element;
|
||||||
|
|
||||||
|
elog(INFO, "%d: (%d,%d)", lc, e->blkno, e->offno);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
blkno = HnswPageGetOpaque(page)->nextblkno;
|
||||||
|
|
||||||
|
UnlockReleaseBuffer(buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Bulk delete tuples from the index
|
* Bulk delete tuples from the index
|
||||||
*/
|
*/
|
||||||
@@ -631,6 +692,10 @@ hnswbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats,
|
|||||||
/* Pass 3: Mark as deleted */
|
/* Pass 3: Mark as deleted */
|
||||||
MarkDeleted(&vacuumstate);
|
MarkDeleted(&vacuumstate);
|
||||||
|
|
||||||
|
#ifdef HNSW_DEBUG
|
||||||
|
PrintGraph(&vacuumstate);
|
||||||
|
#endif
|
||||||
|
|
||||||
FreeVacuumState(&vacuumstate);
|
FreeVacuumState(&vacuumstate);
|
||||||
|
|
||||||
return vacuumstate.stats;
|
return vacuumstate.stats;
|
||||||
|
|||||||
Reference in New Issue
Block a user