diff --git a/src/hnswutils.c b/src/hnswutils.c index 766cae5..212214e 100644 --- a/src/hnswutils.c +++ b/src/hnswutils.c @@ -952,9 +952,7 @@ SelectNeighbors(char *base, List *c, int lm, int lc, FmgrInfo *procinfo, Oid col { List *r = NIL; List *w = list_copy(c); - HnswCandidate **wd; - int wdlen = 0; - int wdoff = 0; + pairingheap *wd; HnswNeighborArray *neighbors = HnswGetNeighbors(base, e2, lc); bool mustCalculate = !neighbors->closerSet; List *added = NIL; @@ -963,7 +961,7 @@ SelectNeighbors(char *base, List *c, int lm, int lc, FmgrInfo *procinfo, Oid col if (list_length(w) <= lm) return w; - wd = palloc(sizeof(HnswCandidate *) * list_length(w)); + wd = pairingheap_allocate(CompareNearestCandidates, NULL); /* Ensure order of candidates is deterministic for closer caching */ if (sortCandidates) @@ -1029,21 +1027,21 @@ SelectNeighbors(char *base, List *c, int lm, int lc, FmgrInfo *procinfo, Oid col if (e->closer) r = lappend(r, e); else - wd[wdlen++] = e; + pairingheap_add(wd, &(CreatePairingHeapNode(e)->ph_node)); } /* Cached value can only be used in future if sorted deterministically */ neighbors->closerSet = sortCandidates; /* Keep pruned connections */ - while (wdoff < wdlen && list_length(r) < lm) - r = lappend(r, wd[wdoff++]); + while (!pairingheap_is_empty(wd) && list_length(r) < lm) + r = lappend(r, ((HnswPairingHeapNode *) pairingheap_remove_first(wd))->inner); /* Return pruned for update connections */ if (pruned != NULL) { - if (wdoff < wdlen) - *pruned = wd[wdoff]; + if (!pairingheap_is_empty(wd)) + *pruned = ((HnswPairingHeapNode *) pairingheap_first(wd))->inner; else *pruned = linitial(w); }