nostrdb/filter: use binary search for large contact list filters

This is much more efficient than linear scans

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin
2024-01-03 17:02:42 -08:00
committed by Daniel D’Aquino
parent e5e6735129
commit 6cd7b945ca

View File

@@ -845,17 +845,18 @@ int ndb_filter_matches(struct ndb_filter *filter, struct ndb_note *note)
goto cont;
}
break;
// TODO: add filter hashtable for large id lists
case NDB_FILTER_IDS:
for (j = 0; j < els->count; j++) {
if (!memcmp(els->elements[j].id, note->id, 32))
goto cont;
unsigned char *id = note->id;
if (bsearch(&id, &els->elements[0], els->count,
sizeof(els->elements[0].id), compare_ids)) {
goto cont;
}
break;
case NDB_FILTER_AUTHORS:
for (j = 0; j < els->count; j++) {
if (!memcmp(els->elements[j].id, note->pubkey, 32))
goto cont;
unsigned char *pubkey = note->pubkey;
if (bsearch(&pubkey, &els->elements[0], els->count,
sizeof(els->elements[0].id), compare_ids)) {
goto cont;
}
break;
case NDB_FILTER_GENERIC: