Indexing empty FilterIDs ( *default:*any:*any)

This commit is contained in:
TeoV
2018-02-06 13:43:27 +02:00
committed by Dan Christian Bogos
parent b6f34d8c57
commit 7d597caf3b
4 changed files with 266 additions and 23 deletions

View File

@@ -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

View File

@@ -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)
}
}
}

View File

@@ -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