diff --git a/config/rsrparser.go b/config/rsrparser.go index 6022a561e..59fef056e 100644 --- a/config/rsrparser.go +++ b/config/rsrparser.go @@ -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 } } diff --git a/engine/cdr_test.go b/engine/cdr_test.go index 4f34319d4..534dc0156 100644 --- a/engine/cdr_test.go +++ b/engine/cdr_test.go @@ -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) } } diff --git a/engine/filters_test.go b/engine/filters_test.go index f5d30890c..2263a5d18 100644 --- a/engine/filters_test.go +++ b/engine/filters_test.go @@ -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) + } } diff --git a/utils/rsrfield.go b/utils/rsrfield.go index a093f36b2..a9a2630cd 100644 --- a/utils/rsrfield.go +++ b/utils/rsrfield.go @@ -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 {