implement batched index retrieval in filter matching

improvement only for prefix/suffix matching for now
This commit is contained in:
ionutboangiu
2025-09-22 20:55:55 +03:00
committed by Dan Christian Bogos
parent 52aa161331
commit 2078c93758

View File

@@ -102,18 +102,25 @@ func MatchingItemIDsForEvent(ev utils.MapStorage, stringFldIDs, prefixFldIDs, su
} else if filterIndexTypes[i] == utils.MetaSuffix {
fldVals = utils.SplitSuffix(fldVal) // all suffix till first digit
}
idxKeys := make([]string, 0, len(fldVals))
for _, val := range fldVals {
var dbIndexes map[string]utils.StringSet // list of items matched in DB
key := utils.ConcatenatedKey(filterIndexTypes[i], fldName, val)
if dbIndexes, err = dm.GetIndexes(cacheID, itemIDPrefix, true, true, key); err != nil {
if err == utils.ErrNotFound {
err = nil
continue
}
return
idxKeys = append(idxKeys,
utils.ConcatenatedKey(filterIndexTypes[i], fldName, val))
}
var indexes map[string]utils.StringSet
if indexes, err = dm.GetIndexes(cacheID, itemIDPrefix, true, true, idxKeys...); err != nil {
if err == utils.ErrNotFound {
err = nil
continue
}
return
}
for _, key := range idxKeys {
if itemIDs, exists := indexes[key]; exists {
dbItemIDs = itemIDs
break // longest prefix wins
}
dbItemIDs = dbIndexes[key]
break // we got at least one answer back, longest prefix wins
}
for itemID := range dbItemIDs {
if _, hasIt := itemIDs[itemID]; !hasIt { // Add it to list if not already there