diff --git a/engine/cdr.go b/engine/cdr.go index 847cd7b82..64bdce714 100644 --- a/engine/cdr.go +++ b/engine/cdr.go @@ -305,12 +305,14 @@ func (cdr *CDR) String() string { // combimedCdrFieldVal groups together CDRs with same CGRID and combines their values matching filter field ID func (cdr *CDR) combimedCdrFieldVal(cfgCdrFld *config.FCTemplate, groupCDRs []*CDR, filterS *FilterS) (string, error) { var combimedVal string // Will result as combination of the field values, filters must match - + cmbReqMp := cdr.AsMapStorage()[utils.MetaReq] for _, grpCDR := range groupCDRs { if cdr.CGRID != grpCDR.CGRID { continue // We only care about cdrs with same primary cdr behind } - if pass, err := filterS.Pass(grpCDR.Tenant, cfgCdrFld.Filters, grpCDR.AsMapStorage()); err != nil { + fltrMp := grpCDR.AsMapStorage() + fltrMp[utils.MetaCmedReq] = cmbReqMp // so we can relate in filters + if pass, err := filterS.Pass(grpCDR.Tenant, cfgCdrFld.Filters, fltrMp); err != nil { return utils.EmptyString, err } else if !pass { continue diff --git a/engine/cdr_test.go b/engine/cdr_test.go index 99bf80bfd..6a7aef181 100644 --- a/engine/cdr_test.go +++ b/engine/cdr_test.go @@ -1454,7 +1454,7 @@ func TestCDRcombimedCdrFieldVal(t *testing.T) { tpFld := &config.FCTemplate{ Tag: "TestCombiMed", Type: utils.META_COMBIMED, - Filters: []string{"*string:~*req.RunID:testRun1"}, + Filters: []string{"*string:~*cmedreq.RunID:*default", "*string:~*req.RunID:testRun1"}, Value: config.NewRSRParsersMustCompile("~*req.Cost", true, utils.INFIELD_SEP), } cfg, err := config.NewDefaultCGRConfig() @@ -1468,6 +1468,23 @@ func TestCDRcombimedCdrFieldVal(t *testing.T) { t.Errorf("Expected : %+v, received: %+v", "1.22", out) } + tpFld = &config.FCTemplate{ + Tag: "TestCombiMedFail", + Type: utils.META_COMBIMED, + Filters: []string{"*string:~*cmedreq.RunID:*notdefault", "*string:~*req.RunID:testRun1"}, + Value: config.NewRSRParsersMustCompile("~*req.Cost", true, utils.INFIELD_SEP), + } + cfg, err = config.NewDefaultCGRConfig() + if err != nil { + t.Errorf("Error: %+v", err) + } + + if out, err := cdr.combimedCdrFieldVal(tpFld, groupCDRs, &FilterS{cfg: cfg}); err != nil { + t.Error(err) + } else if out != utils.EmptyString { + t.Errorf("Expected : %+v, received: %+v", utils.EmptyString, out) + } + } func TestUsageAsCDR(t *testing.T) { diff --git a/engine/filters.go b/engine/filters.go index 2671cdb39..0115135c4 100644 --- a/engine/filters.go +++ b/engine/filters.go @@ -487,7 +487,8 @@ func (fS *FilterS) getFieldNameDataProvider(initialDP utils.DataProvider, strings.HasPrefix(fieldName, utils.DynamicDataPrefix+utils.MetaRep), strings.HasPrefix(fieldName, utils.DynamicDataPrefix+utils.MetaCGRAReq), strings.HasPrefix(fieldName, utils.DynamicDataPrefix+utils.MetaAct), - strings.HasPrefix(fieldName, utils.DynamicDataPrefix+utils.MetaEC): + strings.HasPrefix(fieldName, utils.DynamicDataPrefix+utils.MetaEC), + strings.HasPrefix(fieldName, utils.DynamicDataPrefix+utils.MetaCmedReq): dp = initialDP // don't need to take out the prefix because the navigable map have ~*req prefix case fieldName == utils.EmptyString: diff --git a/utils/consts.go b/utils/consts.go index 5d030a374..fdf17c1e7 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -560,6 +560,7 @@ const ( MetaHdr = "*hdr" MetaTrl = "*trl" MetaTmp = "*tmp" + MetaCmedReq = "*cmedreq" // used with combinedMediation CGROriginHost = "cgr_originhost" MetaInitiate = "*initiate" MetaFD = "*fd"