From 2078c93758da3b1f56fad53d75a18ff03a0e490c Mon Sep 17 00:00:00 2001 From: ionutboangiu Date: Mon, 22 Sep 2025 20:55:55 +0300 Subject: [PATCH] implement batched index retrieval in filter matching improvement only for prefix/suffix matching for now --- engine/filterhelpers.go | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/engine/filterhelpers.go b/engine/filterhelpers.go index fac23a23c..6c7e6783e 100644 --- a/engine/filterhelpers.go +++ b/engine/filterhelpers.go @@ -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