This commit is contained in:
TeoV
2018-11-16 11:27:55 -05:00
committed by Dan Christian Bogos
parent 8299a672c1
commit bf98dd2282
4 changed files with 33 additions and 12 deletions

View File

@@ -273,7 +273,8 @@ func (prsr *RSRParser) ParseDataProvider(dP DataProvider, separator string) (out
var outStr string
if prsr.attrValue == "" {
if outStr, err = dP.FieldAsString(
strings.Split(prsr.attrName, separator)); err != nil {
strings.Split(prsr.attrName, separator)); err != nil &&
(err != utils.ErrNotFound || prsr.filters.FilterRules() != "^$") {
return
}
}
@@ -284,7 +285,8 @@ func (prsr *RSRParser) ParseDataProviderWithInterfaces(dP DataProvider, separato
var outIface interface{}
if prsr.attrValue == "" {
if outIface, err = dP.FieldAsInterface(
strings.Split(prsr.attrName, separator)); err != nil {
strings.Split(prsr.attrName, separator)); err != nil &&
(err != utils.ErrNotFound || prsr.filters.FilterRules() != "^$") {
return
}
}

View File

@@ -207,8 +207,10 @@ func TestFieldAsString(t *testing.T) {
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+"dummy_field", true)
if _, err := cdr.FieldAsString(prsr); err != utils.ErrNotFound {
if fldVal, err := cdr.FieldAsString(prsr); err != utils.ErrNotFound {
t.Error(err)
} else if fldVal != utils.EmptyString {
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, utils.EmptyString, fldVal)
}
}

View File

@@ -516,28 +516,34 @@ func TestPassFilterMissingField(t *testing.T) {
cfg: cfg,
dm: dmFilterPass,
}
passEvent1 := map[string]interface{}{
"Category": "call",
"test": "call",
}
if pass, err := filterS.Pass("cgrates.org",
[]string{"*rsr::~Category(^$)"}, config.NewNavigableMap(passEvent1)); err != nil {
t.Errorf(err.Error())
} else if pass {
t.Errorf("Expecting: true , received: %+v", pass)
}
if pass, err := filterS.Pass("cgrates.org",
[]string{"*rsr::~Category(!^$)"}, config.NewNavigableMap(passEvent1)); err != nil {
t.Errorf(err.Error())
} else if !pass {
t.Errorf("Expecting: true , received: %+v", pass)
}
passEvent2 := map[string]interface{}{
"test": "call",
"Category": "",
}
if pass, err := filterS.Pass("cgrates.org",
[]string{"*rsr::~Category(^$)"}, config.NewNavigableMap(passEvent2)); err != nil {
t.Errorf(err.Error())
} else if pass {
} else if !pass {
t.Errorf("Expecting: true , received: %+v", pass)
}
passEvent3 := map[string]interface{}{
"Category": "call",
}
if pass, err := filterS.Pass("cgrates.org",
[]string{"*rsr::~Category(^$)"}, config.NewNavigableMap(passEvent3)); err != nil {
t.Errorf(err.Error())
} else if pass {
t.Errorf("Expecting: false , received: %+v", pass)
}
}

View File

@@ -234,6 +234,10 @@ type RSRFilter struct {
negative bool // Rule should not match
}
func (rsrFltr *RSRFilter) FilterRule() string {
return rsrFltr.filterRule
}
func (rsrFltr *RSRFilter) Pass(val string) bool {
if rsrFltr.filterRule == "" {
return !rsrFltr.negative
@@ -322,6 +326,13 @@ func ParseRSRFiltersFromSlice(fltrStrs []string) (RSRFilters, error) {
type RSRFilters []*RSRFilter
func (fltrs RSRFilters) FilterRules() (rls string) {
for _, fltr := range fltrs {
rls += fltr.FilterRule()
}
return
}
// @all: specifies whether all filters should match or at least one
func (fltrs RSRFilters) Pass(val string, allMustMatch bool) (matched bool) {
if len(fltrs) == 0 {