Replace RSRField from Filters with RSRParsers

This commit is contained in:
TeoV
2018-09-19 06:15:35 -04:00
committed by DanB
parent b56e322e88
commit 52fc112d3b
9 changed files with 30 additions and 35 deletions

View File

@@ -155,7 +155,7 @@ func (cdr *CDR) FormatCost(shiftDecimals, roundDecimals int) string {
// Used to retrieve fields as string, primary fields are const labeled
func (cdr *CDR) FieldAsString(rsrPrs *config.RSRParser) (parsed string, err error) {
parsed, err = rsrPrs.ParseCDR(config.NewNavigableMap(cdr.AsMapStringIface()))
parsed, err = rsrPrs.ParseDataProviderWithInterfaces(config.NewNavigableMap(cdr.AsMapStringIface()), utils.NestingSep)
if err != nil {
return
}
@@ -164,7 +164,7 @@ func (cdr *CDR) FieldAsString(rsrPrs *config.RSRParser) (parsed string, err erro
// concatenates values of multiple fields defined in template, used eg in CDR templates
func (cdr *CDR) FieldsAsString(rsrFlds config.RSRParsers) string {
outVal, err := rsrFlds.ParseCDR(config.NewNavigableMap(cdr.AsMapStringIface()))
outVal, err := rsrFlds.ParseDataProviderWithInterfaces(config.NewNavigableMap(cdr.AsMapStringIface()), utils.NestingSep)
if err != nil {
return ""
}

View File

@@ -180,14 +180,14 @@ type FilterRule struct {
Type string // Filter type (*string, *timing, *rsr_filters, *stats, *lt, *lte, *gt, *gte)
FieldName string // Name of the field providing us the Values to check (used in case of some )
Values []string // Filter definition
rsrFields utils.RSRFields // Cache here the RSRFilter Values
rsrFields config.RSRParsers // Cache here the RSRFilter Values
statSThresholds []*RFStatSThreshold // Cached compiled RFStatsThreshold out of Values
}
// Separate method to compile RSR fields
func (rf *FilterRule) CompileValues() (err error) {
if rf.Type == MetaRSR {
if rf.rsrFields, err = utils.ParseRSRFieldsFromSlice(rf.Values); err != nil {
if rf.rsrFields, err = config.NewRSRParsersFromSlice(rf.Values, true); err != nil {
return
}
} else if rf.Type == MetaStatS {
@@ -297,19 +297,14 @@ func (fltr *FilterRule) passDestinations(dP config.DataProvider) (bool, error) {
}
func (fltr *FilterRule) passRSR(dP config.DataProvider) (bool, error) {
for _, rsrFld := range fltr.rsrFields {
fldIface, err := dP.FieldAsInterface(strings.Split(rsrFld.Id, utils.NestingSep))
if err != nil {
if err == utils.ErrNotFound {
return false, nil
}
return false, err
}
if _, err := rsrFld.Parse(fldIface); err == nil {
return true, nil
_, err := fltr.rsrFields.ParseDataProviderWithInterfaces(dP, utils.NestingSep)
if err != nil {
if err == utils.ErrNotFound || err == utils.ErrFilterNotPassingNoCaps {
return false, nil
}
return false, err
}
return false, nil
return true, nil
}
func (fltr *FilterRule) passStatS(dP config.DataProvider,

View File

@@ -90,7 +90,7 @@ func TestFilterPassRSRFields(t *testing.T) {
TimeEnd: time.Date(2013, time.October, 7, 14, 52, 12, 0, time.UTC),
DurationIndex: 132 * time.Second,
ExtraFields: map[string]string{"navigation": "off"}}
rf, err := NewFilterRule(MetaRSR, "", []string{"Tenant(~^cgr.*\\.org$)"})
rf, err := NewFilterRule(MetaRSR, "", []string{"~Tenant(~^cgr.*\\.org$)"})
if err != nil {
t.Error(err)
}
@@ -99,7 +99,7 @@ func TestFilterPassRSRFields(t *testing.T) {
} else if !passes {
t.Error("Not passing")
}
rf, err = NewFilterRule(MetaRSR, "", []string{"navigation(on)"})
rf, err = NewFilterRule(MetaRSR, "", []string{"~navigation(on)"})
if err != nil {
t.Error(err)
}
@@ -108,7 +108,7 @@ func TestFilterPassRSRFields(t *testing.T) {
} else if passes {
t.Error("Passing")
}
rf, err = NewFilterRule(MetaRSR, "", []string{"navigation(off)"})
rf, err = NewFilterRule(MetaRSR, "", []string{"~navigation(off)"})
if err != nil {
t.Error(err)
}
@@ -328,13 +328,13 @@ func TestInlineFilterPassFiltersForEvent(t *testing.T) {
"Tenant": "cgrates.org",
}
if pass, err := filterS.Pass("cgrates.org",
[]string{"*rsr::Tenant(~^cgr.*\\.org$)"}, config.NewNavigableMap(failEvent)); err != nil {
[]string{"*rsr::~Tenant(~^cgr.*\\.org$)"}, config.NewNavigableMap(failEvent)); err != nil {
t.Errorf(err.Error())
} else if pass {
t.Errorf("Expecting: %+v, received: %+v", false, pass)
}
if pass, err := filterS.Pass("cgrates.org",
[]string{"*rsr::Tenant(~^cgr.*\\.org$)"}, config.NewNavigableMap(passEvent)); err != nil {
[]string{"*rsr::~Tenant(~^cgr.*\\.org$)"}, config.NewNavigableMap(passEvent)); err != nil {
t.Errorf(err.Error())
} else if !pass {
t.Errorf("Expecting: %+v, received: %+v", true, pass)
@@ -415,7 +415,7 @@ func TestPassFiltersForEventWithEmptyFilter(t *testing.T) {
"Test": "MultipleCharacter",
}
if pass, err := filterS.Pass("cgrates.org",
[]string{"*rsr::Test(~^\\w{30,})"}, config.NewNavigableMap(ev)); err != nil {
[]string{"*rsr::~Test(~^\\w{30,})"}, config.NewNavigableMap(ev)); err != nil {
t.Errorf(err.Error())
} else if pass {
t.Errorf("Expecting: %+v, received: %+v", false, pass)
@@ -424,7 +424,7 @@ func TestPassFiltersForEventWithEmptyFilter(t *testing.T) {
"Test": "MultipleCharacter123456789MoreThan30Character",
}
if pass, err := filterS.Pass("cgrates.org",
[]string{"*rsr::Test(~^\\w{30,})"}, config.NewNavigableMap(ev)); err != nil {
[]string{"*rsr::~Test(~^\\w{30,})"}, config.NewNavigableMap(ev)); err != nil {
t.Errorf(err.Error())
} else if !pass {
t.Errorf("Expecting: %+v, received: %+v", false, pass)
@@ -436,7 +436,7 @@ func TestPassFiltersForEventWithEmptyFilter(t *testing.T) {
},
}
if pass, err := filterS.Pass("cgrates.org",
[]string{"*rsr::Test.Test2(~^\\w{30,})"}, config.NewNavigableMap(ev)); err != nil {
[]string{"*rsr::~Test.Test2(~^\\w{30,})"}, config.NewNavigableMap(ev)); err != nil {
t.Errorf(err.Error())
} else if pass {
t.Errorf("Expecting: %+v, received: %+v", false, pass)
@@ -447,7 +447,7 @@ func TestPassFiltersForEventWithEmptyFilter(t *testing.T) {
},
}
if pass, err := filterS.Pass("cgrates.org",
[]string{"*rsr::Test.Test2(~^\\w{30,})"}, config.NewNavigableMap(ev)); err != nil {
[]string{"*rsr::~Test.Test2(~^\\w{30,})"}, config.NewNavigableMap(ev)); err != nil {
t.Errorf(err.Error())
} else if !pass {
t.Errorf("Expecting: %+v, received: %+v", false, pass)