diff --git a/apier/v1/filter_indexes.go b/apier/v1/filter_indexes.go index ce158ab42..07ed58715 100644 --- a/apier/v1/filter_indexes.go +++ b/apier/v1/filter_indexes.go @@ -226,7 +226,7 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexes(args *utils.ArgsComputeFilterInde fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, nil); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } } @@ -243,7 +243,7 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexes(args *utils.ArgsComputeFilterInde fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, nil); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } } @@ -260,7 +260,7 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexes(args *utils.ArgsComputeFilterInde fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, nil); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } } @@ -277,7 +277,7 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexes(args *utils.ArgsComputeFilterInde fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, nil); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } } @@ -298,7 +298,7 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexes(args *utils.ArgsComputeFilterInde } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, nil); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } } @@ -315,7 +315,7 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexes(args *utils.ArgsComputeFilterInde fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, nil); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } } @@ -335,7 +335,7 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexes(args *utils.ArgsComputeFilterInde fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, nil); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } } @@ -410,7 +410,7 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexIDs(args *utils.ArgsComputeFilterInd fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, nil); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } //StatQueueProfile Indexes @@ -425,7 +425,7 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexIDs(args *utils.ArgsComputeFilterInd fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, nil); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } //ResourceProfile Indexes @@ -440,7 +440,7 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexIDs(args *utils.ArgsComputeFilterInd fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, nil); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } //RouteProfile Indexes @@ -455,7 +455,7 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexIDs(args *utils.ArgsComputeFilterInd fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, nil); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } //AttributeProfile Indexes @@ -473,7 +473,7 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexIDs(args *utils.ArgsComputeFilterInd fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, nil); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } //ChargerProfile Indexes @@ -488,7 +488,7 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexIDs(args *utils.ArgsComputeFilterInd fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, nil); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } //DispatcherProfile Indexes @@ -506,7 +506,7 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexIDs(args *utils.ArgsComputeFilterInd fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, nil); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } *reply = utils.OK diff --git a/engine/libindex.go b/engine/libindex.go index d2a913143..3be79595b 100644 --- a/engine/libindex.go +++ b/engine/libindex.go @@ -33,7 +33,7 @@ var ( // newFilterIndex will get the index from DataManager if is not found it will create it // is used to update the mentioned index -func newFilterIndex(dm *DataManager, idxItmType, tnt, ctx, itemID string, filterIDs []string) (indexes map[string]utils.StringSet, err error) { +func newFilterIndex(dm *DataManager, idxItmType, tnt, ctx, itemID string, filterIDs []string, newFlt *Filter) (indexes map[string]utils.StringSet, err error) { tntCtx := tnt if ctx != utils.EmptyString { tntCtx = utils.ConcatenatedKey(tnt, ctx) @@ -61,7 +61,9 @@ func newFilterIndex(dm *DataManager, idxItmType, tnt, ctx, itemID string, filter // we try to get them from Cache/DataDB or if not found in this location we create them here for _, fltrID := range filterIDs { var fltr *Filter - if fltr, err = dm.GetFilter(tnt, fltrID, + if newFlt != nil && newFlt.Tenant == tnt && newFlt.ID == fltrID { + fltr = newFlt + } else if fltr, err = dm.GetFilter(tnt, fltrID, true, false, utils.NonTransactional); err != nil { if err == utils.ErrNotFound { err = fmt.Errorf("broken reference to filter: %+v for itemType: %+v and ID: %+v", @@ -121,7 +123,7 @@ func addItemToFilterIndex(dm *DataManager, idxItmType, tnt, ctx, itemID string, defer guardian.Guardian.UnguardIDs(refID) var indexes map[string]utils.StringSet - if indexes, err = newFilterIndex(dm, idxItmType, tnt, ctx, itemID, filterIDs); err != nil { + if indexes, err = newFilterIndex(dm, idxItmType, tnt, ctx, itemID, filterIDs, nil); err != nil { return } // in case we have a profile with only non indexable filters(e.g. only *gt) @@ -152,7 +154,7 @@ func removeItemFromFilterIndex(dm *DataManager, idxItmType, tnt, ctx, itemID str defer guardian.Guardian.UnguardIDs(refID) var indexes map[string]utils.StringSet - if indexes, err = newFilterIndex(dm, idxItmType, tnt, ctx, itemID, filterIDs); err != nil { + if indexes, err = newFilterIndex(dm, idxItmType, tnt, ctx, itemID, filterIDs, nil); err != nil { return } if len(indexes) == 0 { // in case we have a profile with only non indexable filters(e.g. only *gt) @@ -381,7 +383,7 @@ func splitFilterIndex(tntCtxIdxKey string) (tntCtx, idxKey string, err error) { // ComputeIndexes gets the indexes from the DB and ensure that the items are indexed // getFilters returns a list of filters IDs for the given profile id func ComputeIndexes(dm *DataManager, tnt, ctx, idxItmType string, IDs *[]string, - transactionID string, getFilters func(tnt, id, ctx string) (*[]string, error)) (processed bool, err error) { + transactionID string, getFilters func(tnt, id, ctx string) (*[]string, error), newFltr *Filter) (processed bool, err error) { var profilesIDs []string if IDs == nil { // get all items var ids []string @@ -413,7 +415,7 @@ func ComputeIndexes(dm *DataManager, tnt, ctx, idxItmType string, IDs *[]string, } var index map[string]utils.StringSet if index, err = newFilterIndex(dm, idxItmType, - tnt, ctx, id, *filterIDs); err != nil { + tnt, ctx, id, *filterIDs, newFltr); err != nil { return } // ensure that the item is in the index set @@ -607,7 +609,7 @@ func UpdateFilterIndex(dm *DataManager, oldFlt, newFlt *Filter) (err error) { fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, newFlt); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } case utils.CacheStatFilterIndexes: @@ -627,7 +629,7 @@ func UpdateFilterIndex(dm *DataManager, oldFlt, newFlt *Filter) (err error) { fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, newFlt); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } case utils.CacheResourceFilterIndexes: @@ -647,7 +649,7 @@ func UpdateFilterIndex(dm *DataManager, oldFlt, newFlt *Filter) (err error) { fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, newFlt); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } case utils.CacheRouteFilterIndexes: @@ -667,7 +669,7 @@ func UpdateFilterIndex(dm *DataManager, oldFlt, newFlt *Filter) (err error) { fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, newFlt); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } case utils.CacheChargerFilterIndexes: @@ -687,7 +689,7 @@ func UpdateFilterIndex(dm *DataManager, oldFlt, newFlt *Filter) (err error) { fltrIDs[i] = fltrID } return &fltrIDs, nil - }); err != nil && err != utils.ErrNotFound { + }, newFlt); err != nil && err != utils.ErrNotFound { return utils.APIErrorHandler(err) } case utils.CacheAttributeFilterIndexes: @@ -708,7 +710,7 @@ func UpdateFilterIndex(dm *DataManager, oldFlt, newFlt *Filter) (err error) { config.CgrConfig().GeneralCfg().LockingTimeout, idxItmType+tntCtx) var updIdx map[string]utils.StringSet if updIdx, err = newFilterIndex(dm, idxItmType, - newFlt.Tenant, ctx, itemID, ap.FilterIDs); err != nil { + newFlt.Tenant, ctx, itemID, ap.FilterIDs, newFlt); err != nil { guardian.Guardian.UnguardIDs(refID) return } @@ -741,7 +743,7 @@ func UpdateFilterIndex(dm *DataManager, oldFlt, newFlt *Filter) (err error) { config.CgrConfig().GeneralCfg().LockingTimeout, idxItmType+tntCtx) var updIdx map[string]utils.StringSet if updIdx, err = newFilterIndex(dm, idxItmType, - newFlt.Tenant, ctx, itemID, dp.FilterIDs); err != nil { + newFlt.Tenant, ctx, itemID, dp.FilterIDs, newFlt); err != nil { guardian.Guardian.UnguardIDs(refID) return }