// getSessionIDsMatchingIndexes will check inside indexes if it can find sessionIDs matching all filters // matchedIndexes returns map[matchedFieldName]possibleMatchedFieldVal so we optimize further to avoid checking them func (smg *SMGeneric) getSessionIDsMatchingIndexes(fltrs map[string]string) (utils.StringMap, map[string]string) { smg.aSIMux.RLock() defer smg.aSIMux.RUnlock() sessionIDxes := smg.aSessionsIndex // Clone here and unlock sooner if getting slow matchedIndexes := make(map[string]string) var matchingSessions utils.StringMap checkNr := 0 for fltrName, fltrVal := range fltrs { checkNr += 1 if _, hasFldName := sessionIDxes[fltrName]; !hasFldName { continue } if _, hasFldVal := sessionIDxes[fltrName][fltrVal]; !hasFldVal { matchedIndexes[fltrName] = utils.META_NONE continue } matchedIndexes[fltrName] = fltrVal if checkNr == 1 { // First run will init the MatchingSessions matchingSessions = sessionIDxes[fltrName][fltrVal] continue } // Higher run, takes out non matching indexes for sessID := range sessionIDxes[fltrName][fltrVal] { if _, hasUUID := matchingSessions[sessID]; !hasUUID { delete(matchingSessions, sessID) } } } return matchingSessions.Clone(), matchedIndexes }