diff --git a/apier/v1/filter_indexes.go b/apier/v1/filter_indexes.go index 2385e32e4..706a19130 100644 --- a/apier/v1/filter_indexes.go +++ b/apier/v1/filter_indexes.go @@ -110,6 +110,8 @@ func (api *APIerSv1) GetFilterIndexes(arg AttrGetFilterIndexes, reply *[]string) } arg.ItemType = utils.AttributeProfilePrefix key = utils.ConcatenatedKey(arg.Tenant, arg.Context) + case utils.CacheReverseFilterIndexes: + arg.ItemType = utils.ReverseFilterIndexes } if indexes, err = api.DataManager.GetFilterIndexes( utils.PrefixToIndexCache[arg.ItemType], key, "", nil); err != nil { diff --git a/engine/datamanager.go b/engine/datamanager.go index 002b8543a..5415e4f33 100644 --- a/engine/datamanager.go +++ b/engine/datamanager.go @@ -2195,6 +2195,10 @@ func (dm *DataManager) RemoveChargerProfile(tenant, id string, tenant).RemoveItemFromIndex(tenant, id, oldCpp.FilterIDs); err != nil { return } + if err = removeReverseFilterIndexForFilter(dm, utils.CacheChargerFilterIndexes, utils.EmptyString, + oldCpp.Tenant, oldCpp.ID, oldCpp.FilterIDs); err != nil { + return + } } if config.CgrConfig().DataDbCfg().Items[utils.MetaChargerProfiles].Replicate { var reply string diff --git a/engine/libindex.go b/engine/libindex.go index 5edf0a1eb..d801b6466 100644 --- a/engine/libindex.go +++ b/engine/libindex.go @@ -19,7 +19,6 @@ along with this program. If not, see package engine import ( - "fmt" "strings" "github.com/cgrates/cgrates/config" @@ -48,7 +47,6 @@ func addReverseFilterIndexForFilter(dm *DataManager, idxItmType, ctx, tnt, var indexes map[string]utils.StringMap if indexes, err = dm.GetFilterIndexes(utils.PrefixToIndexCache[utils.ReverseFilterIndexes], tntFltrID, utils.EmptyString, nil); err != nil { - utils.Logger.Crit(fmt.Sprintf("err: %v", err)) if err != utils.ErrNotFound { guardian.Guardian.UnguardIDs(refID) return @@ -95,14 +93,14 @@ func removeReverseFilterIndexForFilter(dm *DataManager, idxItmType, ctx, tnt, it err = nil continue // already removed } - delete(indexes[idxItmType], itemID) // delete index from map - indexerKey := tnt + indexerKey := utils.ConcatenatedKey(tnt, fltrID) if ctx != utils.EmptyString { indexerKey = utils.ConcatenatedKey(tnt, ctx) } fltrIndexer := NewFilterIndexer(dm, utils.ReverseFilterIndexes, indexerKey) + fltrIndexer.indexes = indexes if err = fltrIndexer.StoreIndexes(true, utils.NonTransactional); err != nil { guardian.Guardian.UnguardIDs(refID) return diff --git a/general_tests/filter_indexes_cases_it_test.go b/general_tests/filter_indexes_cases_it_test.go index 473418a21..4780679b6 100644 --- a/general_tests/filter_indexes_cases_it_test.go +++ b/general_tests/filter_indexes_cases_it_test.go @@ -111,7 +111,10 @@ var ( testFilterIndexesCasesComputeChargersIndexes, testFilterIndexesCasesGetChargerIndexesChanged, - testFilterIndexesCasesGetReverseFilterIndexes, + testFilterIndexesCasesGetReverseFilterIndexes, // for chargers + testFilterIndexesCasesRemoveChargerProfile, + testFilterIndexesCasesGetIndexesAfterRemove, + testFilterIndexesCasesGetReverseIndexesAfterRemove, testFilterIndexesCasesStopEngine, } @@ -659,16 +662,12 @@ func testFilterIndexesCasesGetChargerIndexesChanged(t *testing.T) { func testFilterIndexesCasesGetReverseFilterIndexes(t *testing.T) { arg := &v1.AttrGetFilterIndexes{ - Tenant: "cgrates.org", + Tenant: "cgrates.org:FLTR_Charger", ItemType: utils.CacheReverseFilterIndexes, } expectedIndexes := []string{ - /* "*string:~*req.Account:12345:ChrgerIndexable", - "*string:~*req.Account:12345:ChrgerIndexable222", - "*prefix:~*req.SetupTime:2022:ChrgerIndexable", - "*string:~*req.Destination:1443:ChrgerIndexable", - "*string:~*req.RequestType:*none:ChrgerIndexable", - "*string:~*req.RequestType:*none:ChrgerIndexable222", */ + "*charger_filter_indexes:ChrgerIndexable", + "*charger_filter_indexes:ChrgerIndexable222", } sort.Strings(expectedIndexes) var reply []string @@ -677,6 +676,110 @@ func testFilterIndexesCasesGetReverseFilterIndexes(t *testing.T) { } else if sort.Strings(reply); !reflect.DeepEqual(expectedIndexes, reply) { t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(expectedIndexes), utils.ToJSON(reply)) } + + arg = &v1.AttrGetFilterIndexes{ + Tenant: "cgrates.org:FLTR_Charger4564", + ItemType: utils.CacheReverseFilterIndexes, + } + expectedIndexes = []string{ + "*charger_filter_indexes:ChrgerIndexable", + "*charger_filter_indexes:ChrgerIndexable222", + } + sort.Strings(expectedIndexes) + if err := fIdxCasesRPC.Call(utils.APIerSv1GetFilterIndexes, arg, &reply); err != nil { + t.Error(err) + } else if sort.Strings(reply); !reflect.DeepEqual(expectedIndexes, reply) { + t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(expectedIndexes), utils.ToJSON(reply)) + } + + arg = &v1.AttrGetFilterIndexes{ + Tenant: "cgrates.org:FLTR_Charger12312", + ItemType: utils.CacheReverseFilterIndexes, + } + expectedIndexes = []string{ + "*charger_filter_indexes:ChrgerIndexable", + } + sort.Strings(expectedIndexes) + if err := fIdxCasesRPC.Call(utils.APIerSv1GetFilterIndexes, arg, &reply); err != nil { + t.Error(err) + } else if sort.Strings(reply); !reflect.DeepEqual(expectedIndexes, reply) { + t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(expectedIndexes), utils.ToJSON(reply)) + } +} + +func testFilterIndexesCasesRemoveChargerProfile(t *testing.T) { + var resp string + if err := fIdxCasesRPC.Call(utils.APIerSv1RemoveChargerProfile, + &utils.TenantID{Tenant: "cgrates.org", ID: "ChrgerIndexable222"}, &resp); err != nil { + t.Error(err) + } else if resp != utils.OK { + t.Error("Unexpected reply returned", resp) + } +} + +func testFilterIndexesCasesGetIndexesAfterRemove(t *testing.T) { + arg := &v1.AttrGetFilterIndexes{ + Tenant: "cgrates.org", + ItemType: utils.MetaChargers, + } + expectedIndexes := []string{ + "*string:~*req.Account:12345:ChrgerIndexable", + "*prefix:~*req.SetupTime:2022:ChrgerIndexable", + "*string:~*req.Destination:1443:ChrgerIndexable", + "*string:~*req.RequestType:*none:ChrgerIndexable", + } + sort.Strings(expectedIndexes) + var reply []string + if err := fIdxCasesRPC.Call(utils.APIerSv1GetFilterIndexes, arg, &reply); err != nil { + t.Error(err) + } else if sort.Strings(reply); !reflect.DeepEqual(expectedIndexes, reply) { + t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(expectedIndexes), utils.ToJSON(reply)) + } +} + +func testFilterIndexesCasesGetReverseIndexesAfterRemove(t *testing.T) { + arg := &v1.AttrGetFilterIndexes{ + Tenant: "cgrates.org:FLTR_Charger", + ItemType: utils.CacheReverseFilterIndexes, + } + expectedIndexes := []string{ + "*charger_filter_indexes:ChrgerIndexable", + } + sort.Strings(expectedIndexes) + var reply []string + if err := fIdxCasesRPC.Call(utils.APIerSv1GetFilterIndexes, arg, &reply); err != nil { + t.Error(err) + } else if sort.Strings(reply); !reflect.DeepEqual(expectedIndexes, reply) { + t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(expectedIndexes), utils.ToJSON(reply)) + } + + arg = &v1.AttrGetFilterIndexes{ + Tenant: "cgrates.org:FLTR_Charger4564", + ItemType: utils.CacheReverseFilterIndexes, + } + expectedIndexes = []string{ + "*charger_filter_indexes:ChrgerIndexable", + } + sort.Strings(expectedIndexes) + if err := fIdxCasesRPC.Call(utils.APIerSv1GetFilterIndexes, arg, &reply); err != nil { + t.Error(err) + } else if sort.Strings(reply); !reflect.DeepEqual(expectedIndexes, reply) { + t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(expectedIndexes), utils.ToJSON(reply)) + } + + arg = &v1.AttrGetFilterIndexes{ + Tenant: "cgrates.org:FLTR_Charger12312", + ItemType: utils.CacheReverseFilterIndexes, + } + expectedIndexes = []string{ + "*charger_filter_indexes:ChrgerIndexable", + } + sort.Strings(expectedIndexes) + if err := fIdxCasesRPC.Call(utils.APIerSv1GetFilterIndexes, arg, &reply); err != nil { + t.Error(err) + } else if sort.Strings(reply); !reflect.DeepEqual(expectedIndexes, reply) { + t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(expectedIndexes), utils.ToJSON(reply)) + } } func testFilterIndexesCasesStopEngine(t *testing.T) {