diff --git a/engine/datamanager.go b/engine/datamanager.go index 7f37daf38..c04d1ddd0 100644 --- a/engine/datamanager.go +++ b/engine/datamanager.go @@ -411,9 +411,28 @@ func (dm *DataManager) SetThresholdProfile(th *ThresholdProfile, withIndex bool) } indexer := NewFilterIndexer(dm, utils.ThresholdProfilePrefix, th.Tenant) //Verify matching Filters for every FilterID from ThresholdProfile - for _, fltrID := range th.FilterIDs { + fltrIDs := make([]string, len(th.FilterIDs)) + for i, fltrID := range th.FilterIDs { + fltrIDs[i] = fltrID + } + if len(fltrIDs) == 0 { + fltrIDs = []string{utils.META_NONE} + } + for _, fltrID := range fltrIDs { var fltr *Filter - if strings.HasPrefix(fltrID, utils.MetaPrefix) { + if fltrID == utils.META_NONE { + fltr = &Filter{ + Tenant: th.Tenant, + ID: th.ID, + Rules: []*FilterRule{ + &FilterRule{ + Type: utils.MetaDefault, + FieldName: utils.META_ANY, + Values: []string{utils.META_ANY}, + }, + }, + } + } else if strings.HasPrefix(fltrID, utils.MetaPrefix) { inFltr, err := NewInlineFilter(fltrID) if err != nil { return err @@ -497,9 +516,28 @@ func (dm *DataManager) SetStatQueueProfile(sqp *StatQueueProfile, withIndex bool return } //Verify matching Filters for every FilterID from StatQueueProfile - for _, fltrID := range sqp.FilterIDs { + fltrIDs := make([]string, len(sqp.FilterIDs)) + for i, fltrID := range sqp.FilterIDs { + fltrIDs[i] = fltrID + } + if len(fltrIDs) == 0 { + fltrIDs = []string{utils.META_NONE} + } + for _, fltrID := range fltrIDs { var fltr *Filter - if strings.HasPrefix(fltrID, utils.MetaPrefix) { + if fltrID == utils.META_NONE { + fltr = &Filter{ + Tenant: sqp.Tenant, + ID: sqp.ID, + Rules: []*FilterRule{ + &FilterRule{ + Type: utils.MetaDefault, + FieldName: utils.META_ANY, + Values: []string{utils.META_ANY}, + }, + }, + } + } else if strings.HasPrefix(fltrID, utils.MetaPrefix) { inFltr, err := NewInlineFilter(fltrID) if err != nil { return err @@ -573,7 +611,6 @@ func (dm *DataManager) SetTiming(t *utils.TPTiming) (err error) { return } return dm.CacheDataFromDB(utils.TimingsPrefix, []string{t.ID}, true) - } func (dm *DataManager) RemoveTiming(id, transactionID string) (err error) { @@ -661,9 +698,28 @@ func (dm *DataManager) SetResourceProfile(rp *ResourceProfile, withIndex bool) ( return } //Verify matching Filters for every FilterID from ResourceProfiles - for _, fltrID := range rp.FilterIDs { + fltrIDs := make([]string, len(rp.FilterIDs)) + for i, fltrID := range rp.FilterIDs { + fltrIDs[i] = fltrID + } + if len(fltrIDs) == 0 { + fltrIDs = []string{utils.META_NONE} + } + for _, fltrID := range fltrIDs { var fltr *Filter - if strings.HasPrefix(fltrID, utils.MetaPrefix) { + if fltrID == utils.META_NONE { + fltr = &Filter{ + Tenant: rp.Tenant, + ID: rp.ID, + Rules: []*FilterRule{ + &FilterRule{ + Type: utils.MetaDefault, + FieldName: utils.META_ANY, + Values: []string{utils.META_ANY}, + }, + }, + } + } else if strings.HasPrefix(fltrID, utils.MetaPrefix) { inFltr, err := NewInlineFilter(fltrID) if err != nil { return err @@ -1098,9 +1154,28 @@ func (dm *DataManager) SetSupplierProfile(supp *SupplierProfile, withIndex bool) return } //Verify matching Filters for every FilterID from SupplierProfile - for _, fltrID := range supp.FilterIDs { + fltrIDs := make([]string, len(supp.FilterIDs)) + for i, fltrID := range supp.FilterIDs { + fltrIDs[i] = fltrID + } + if len(fltrIDs) == 0 { + fltrIDs = []string{utils.META_NONE} + } + for _, fltrID := range fltrIDs { var fltr *Filter - if strings.HasPrefix(fltrID, utils.MetaPrefix) { + if fltrID == utils.META_NONE { + fltr = &Filter{ + Tenant: supp.Tenant, + ID: supp.ID, + Rules: []*FilterRule{ + &FilterRule{ + Type: utils.MetaDefault, + FieldName: utils.META_ANY, + Values: []string{utils.META_ANY}, + }, + }, + } + } else if strings.HasPrefix(fltrID, utils.MetaPrefix) { inFltr, err := NewInlineFilter(fltrID) if err != nil { return err @@ -1215,9 +1290,28 @@ func (dm *DataManager) SetAttributeProfile(ap *AttributeProfile, withIndex bool) for _, ctx := range ap.Contexts { indexer := NewFilterIndexer(dm, utils.AttributeProfilePrefix, utils.ConcatenatedKey(ap.Tenant, ctx)) //Verify matching Filters for every FilterID from AttributeProfile - for _, fltrID := range ap.FilterIDs { + fltrIDs := make([]string, len(ap.FilterIDs)) + for i, fltrID := range ap.FilterIDs { + fltrIDs[i] = fltrID + } + if len(fltrIDs) == 0 { + fltrIDs = []string{utils.META_NONE} + } + for _, fltrID := range fltrIDs { var fltr *Filter - if strings.HasPrefix(fltrID, utils.MetaPrefix) { + if fltrID == utils.META_NONE { + fltr = &Filter{ + Tenant: ap.Tenant, + ID: ap.ID, + Rules: []*FilterRule{ + &FilterRule{ + Type: utils.MetaDefault, + FieldName: utils.META_ANY, + Values: []string{utils.META_ANY}, + }, + }, + } + } else if strings.HasPrefix(fltrID, utils.MetaPrefix) { inFltr, err := NewInlineFilter(fltrID) if err != nil { return err diff --git a/engine/filterindexer_it_test.go b/engine/filterindexer_it_test.go index fc3e84ded..42a96fef4 100644 --- a/engine/filterindexer_it_test.go +++ b/engine/filterindexer_it_test.go @@ -54,6 +54,9 @@ var sTests = []func(t *testing.T){ testITIsDBEmpty, testITTestStoreFilterIndexesWithTransID, testITTestStoreFilterIndexesWithTransID2, + testITFlush, + testITIsDBEmpty, + testITTestIndexingWithEmptyFltrID, } func TestITRedisConnect(t *testing.T) { @@ -858,5 +861,51 @@ func testITTestStoreFilterIndexesWithTransID2(t *testing.T) { t.Errorf("Expecting: %+v, received: %+v", idxes, rcv) } } - +} + +func testITTestIndexingWithEmptyFltrID(t *testing.T) { + th := &ThresholdProfile{ + Tenant: "cgrates.org", + ID: "THD_Test", + ActivationInterval: &utils.ActivationInterval{}, + FilterIDs: []string{}, + Recurrent: true, + MinSleep: time.Duration(0 * time.Second), + Blocker: true, + Weight: 1.4, + ActionIDs: []string{}, + } + + if err := dataManager.SetThresholdProfile(th, true); err != nil { + t.Error(err) + } + eIdxes := map[string]utils.StringMap{ + "*default:*any:*any": utils.StringMap{ + "THD_Test": true, + }, + } + reverseIdxes := map[string]utils.StringMap{ + "THD_Test": utils.StringMap{ + "*default:*any:*any": true, + }, + } + rfi := NewFilterIndexer(onStor, utils.ThresholdProfilePrefix, th.Tenant) + if rcvIdx, err := dataManager.GetFilterIndexes( + GetDBIndexKey(rfi.itemType, rfi.dbKeySuffix, false), MetaString, + nil); err != nil { + t.Error(err) + } else { + if !reflect.DeepEqual(eIdxes, rcvIdx) { + t.Errorf("Expecting %+v, received: %+v", eIdxes, rcvIdx) + } + } + if reverseRcvIdx, err := dataManager.GetFilterReverseIndexes( + GetDBIndexKey(rfi.itemType, rfi.dbKeySuffix, true), + nil); err != nil { + t.Error(err) + } else { + if !reflect.DeepEqual(reverseIdxes, reverseRcvIdx) { + t.Errorf("Expecting %+v, received: %+v", reverseIdxes, reverseRcvIdx) + } + } } diff --git a/engine/tp_reader.go b/engine/tp_reader.go index d0928faba..50d9583e7 100755 --- a/engine/tp_reader.go +++ b/engine/tp_reader.go @@ -1634,8 +1634,28 @@ func (tpr *TpReader) LoadResourceProfilesFiltered(tag string) (err error) { return } } - for _, fltrID := range res.FilterIDs { - if strings.HasPrefix(fltrID, utils.MetaPrefix) { + fltrIDs := make([]string, len(res.FilterIDs)) + for i, fltrID := range res.FilterIDs { + fltrIDs[i] = fltrID + } + if len(fltrIDs) == 0 { + fltrIDs = []string{utils.META_NONE} + } + for _, fltrID := range fltrIDs { + if fltrID == utils.META_NONE { + tpFltr := &utils.TPFilterProfile{ + Tenant: res.Tenant, + ID: res.ID, + Filters: []*utils.TPFilter{ + &utils.TPFilter{ + Type: utils.MetaDefault, + FieldName: utils.META_ANY, + Values: []string{utils.META_ANY}, + }, + }, + } + tpr.resIndexers[tntID.Tenant].IndexTPFilter(tpFltr, res.ID) + } else if strings.HasPrefix(fltrID, utils.MetaPrefix) { inFltr, err := NewInlineFilter(fltrID) if err != nil { return err @@ -1693,8 +1713,28 @@ func (tpr *TpReader) LoadStatsFiltered(tag string) (err error) { return } } - for _, fltrID := range sq.FilterIDs { - if strings.HasPrefix(fltrID, utils.MetaPrefix) { + fltrIDs := make([]string, len(sq.FilterIDs)) + for i, fltrID := range sq.FilterIDs { + fltrIDs[i] = fltrID + } + if len(fltrIDs) == 0 { + fltrIDs = []string{utils.META_NONE} + } + for _, fltrID := range fltrIDs { + if fltrID == utils.META_NONE { + tpFltr := &utils.TPFilterProfile{ + Tenant: sq.Tenant, + ID: sq.ID, + Filters: []*utils.TPFilter{ + &utils.TPFilter{ + Type: utils.MetaDefault, + FieldName: utils.META_ANY, + Values: []string{utils.META_ANY}, + }, + }, + } + tpr.sqpIndexers[tntID.Tenant].IndexTPFilter(tpFltr, sq.ID) + } else if strings.HasPrefix(fltrID, utils.MetaPrefix) { inFltr, err := NewInlineFilter(fltrID) if err != nil { return err @@ -1752,8 +1792,28 @@ func (tpr *TpReader) LoadThresholdsFiltered(tag string) (err error) { return } } - for _, fltrID := range th.FilterIDs { - if strings.HasPrefix(fltrID, utils.MetaPrefix) { + fltrIDs := make([]string, len(th.FilterIDs)) + for i, fltrID := range th.FilterIDs { + fltrIDs[i] = fltrID + } + if len(fltrIDs) == 0 { + fltrIDs = []string{utils.META_NONE} + } + for _, fltrID := range fltrIDs { + if fltrID == utils.META_NONE { + tpFltr := &utils.TPFilterProfile{ + Tenant: th.Tenant, + ID: th.ID, + Filters: []*utils.TPFilter{ + &utils.TPFilter{ + Type: utils.MetaDefault, + FieldName: utils.META_ANY, + Values: []string{utils.META_ANY}, + }, + }, + } + tpr.thdsIndexers[tntID.Tenant].IndexTPFilter(tpFltr, th.ID) + } else if strings.HasPrefix(fltrID, utils.MetaPrefix) { inFltr, err := NewInlineFilter(fltrID) if err != nil { return err @@ -1828,8 +1888,28 @@ func (tpr *TpReader) LoadSupplierProfilesFiltered(tag string) (err error) { return } } - for _, fltrID := range sup.FilterIDs { - if strings.HasPrefix(fltrID, utils.MetaPrefix) { + fltrIDs := make([]string, len(sup.FilterIDs)) + for i, fltrID := range sup.FilterIDs { + fltrIDs[i] = fltrID + } + if len(fltrIDs) == 0 { + fltrIDs = []string{utils.META_NONE} + } + for _, fltrID := range fltrIDs { + if fltrID == utils.META_NONE { + tpFltr := &utils.TPFilterProfile{ + Tenant: sup.Tenant, + ID: sup.ID, + Filters: []*utils.TPFilter{ + &utils.TPFilter{ + Type: utils.MetaDefault, + FieldName: utils.META_ANY, + Values: []string{utils.META_ANY}, + }, + }, + } + tpr.sppIndexers[tntID.Tenant].IndexTPFilter(tpFltr, sup.ID) + } else if strings.HasPrefix(fltrID, utils.MetaPrefix) { inFltr, err := NewInlineFilter(fltrID) if err != nil { return err @@ -1889,8 +1969,28 @@ func (tpr *TpReader) LoadAttributeProfilesFiltered(tag string) (err error) { return } } - for _, fltrID := range attrP.FilterIDs { - if strings.HasPrefix(fltrID, utils.MetaPrefix) { + fltrIDs := make([]string, len(attrP.FilterIDs)) + for i, fltrID := range attrP.FilterIDs { + fltrIDs[i] = fltrID + } + if len(fltrIDs) == 0 { + fltrIDs = []string{utils.META_NONE} + } + for _, fltrID := range fltrIDs { + if fltrID == utils.META_NONE { + tpFltr := &utils.TPFilterProfile{ + Tenant: attrP.Tenant, + ID: attrP.ID, + Filters: []*utils.TPFilter{ + &utils.TPFilter{ + Type: utils.MetaDefault, + FieldName: utils.META_ANY, + Values: []string{utils.META_ANY}, + }, + }, + } + tpr.attrIndexers[tntID.Tenant].IndexTPFilter(tpFltr, attrP.ID) + } else if strings.HasPrefix(fltrID, utils.MetaPrefix) { inFltr, err := NewInlineFilter(fltrID) if err != nil { return err diff --git a/migrator/sessions_costs.go b/migrator/sessions_costs.go index 1f4f19a06..c2c2afbfd 100644 --- a/migrator/sessions_costs.go +++ b/migrator/sessions_costs.go @@ -40,7 +40,7 @@ func (m *Migrator) migrateSessionsCosts() (err error) { utils.UndefinedVersion, "version number is not defined for SessionsCosts model") } - if vrs[utils.SessionsCosts] != 2 { + if vrs[utils.SessionsCosts] < 2 { return errors.New("Wrong version. Please use ") } return nil