Added nil check when creating EventCost DataProvider. Fixes #2764

This commit is contained in:
Trial97
2021-03-23 13:26:13 +02:00
committed by Dan Christian Bogos
parent bc08d94fae
commit d58e231beb
4 changed files with 32 additions and 27 deletions

View File

@@ -154,10 +154,7 @@ func (cdr *CDR) FormatCost(shiftDecimals, roundDecimals int) string {
// FieldAsString is 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.ParseDataProviderWithInterfaces(
utils.MapStorage{
utils.MetaReq: cdr.AsMapStringIface(),
utils.MetaEC: cdr.CostDetails,
}, utils.NestingSep)
cdr.AsMapStorage(), utils.NestingSep)
if err != nil {
return
}
@@ -167,10 +164,7 @@ func (cdr *CDR) FieldAsString(rsrPrs *config.RSRParser) (parsed string, err erro
// FieldsAsString concatenates values of multiple fields defined in template, used eg in CDR templates
func (cdr *CDR) FieldsAsString(rsrFlds config.RSRParsers) string {
outVal, err := rsrFlds.ParseDataProviderWithInterfaces(
utils.MapStorage{
utils.MetaReq: cdr.AsMapStringIface(),
utils.MetaEC: cdr.CostDetails,
}, utils.NestingSep)
cdr.AsMapStorage(), utils.NestingSep)
if err != nil {
return ""
}
@@ -216,6 +210,16 @@ func (cdr *CDR) Clone() *CDR {
return cln
}
func (cdr *CDR) AsMapStorage() (mp utils.MapStorage) {
mp = utils.MapStorage{
utils.MetaReq: cdr.AsMapStringIface(),
}
if cdr.CostDetails != nil {
mp[utils.MetaEC] = cdr.CostDetails
}
return
}
func (cdr *CDR) AsMapStringIface() (mp map[string]interface{}) {
mp = make(map[string]interface{})
for fld, val := range cdr.ExtraFields {
@@ -294,10 +298,7 @@ func (cdr *CDR) combimedCdrFieldVal(cfgCdrFld *config.FCTemplate, groupCDRs []*C
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, utils.MapStorage{
utils.MetaReq: grpCDR.AsMapStringIface(),
utils.MetaEC: grpCDR.CostDetails,
}); err != nil {
if pass, err := filterS.Pass(grpCDR.Tenant, cfgCdrFld.Filters, grpCDR.AsMapStorage()); err != nil {
return utils.EmptyString, err
} else if !pass {
continue
@@ -407,10 +408,7 @@ func (cdr *CDR) formatField(cfgFld *config.FCTemplate, httpSkipTLSCheck bool,
// ExportRecord is a []string to keep it compatible with encoding/csv Writer
func (cdr *CDR) AsExportRecord(exportFields []*config.FCTemplate,
httpSkipTLSCheck bool, groupedCDRs []*CDR, filterS *FilterS) (expRecord []string, err error) {
nM := utils.MapStorage{
utils.MetaReq: cdr.AsMapStringIface(),
utils.MetaEC: cdr.CostDetails,
}
nM := cdr.AsMapStorage()
for _, cfgFld := range exportFields {
if !strings.HasPrefix(cfgFld.Path, utils.MetaExp+utils.NestingSep) {
continue
@@ -437,10 +435,7 @@ func (cdr *CDR) AsExportRecord(exportFields []*config.FCTemplate,
func (cdr *CDR) AsExportMap(exportFields []*config.FCTemplate, httpSkipTLSCheck bool,
groupedCDRs []*CDR, filterS *FilterS) (expMap map[string]string, err error) {
expMap = make(map[string]string)
nM := utils.MapStorage{
utils.MetaReq: cdr.AsMapStringIface(),
utils.MetaEC: cdr.CostDetails,
}
nM := cdr.AsMapStorage()
for _, cfgFld := range exportFields {
if !strings.HasPrefix(cfgFld.Path, utils.MetaExp+utils.NestingSep) {
continue

View File

@@ -390,10 +390,7 @@ func (cdre *CDRExporter) processCDRs() (err error) {
continue
}
if len(cdre.exportTemplate.Filters) != 0 {
cgrDp := utils.MapStorage{
utils.MetaReq: cdr.AsMapStringIface(),
utils.MetaEC: cdr.CostDetails,
}
cgrDp := cdr.AsMapStorage()
if pass, err := cdre.filterS.Pass(cdre.exportTemplate.Tenant,
cdre.exportTemplate.Filters, cgrDp); err != nil || !pass {
continue // Not passes filters, ignore this CDR

View File

@@ -901,9 +901,6 @@ func (ec *EventCost) Trim(atUsage time.Duration) (srplusEC *EventCost, err error
// FieldAsInterface func to implement DataProvider
func (ec *EventCost) FieldAsInterface(fldPath []string) (val interface{}, err error) {
if len(fldPath) == 0 {
return nil, utils.ErrNotFound
}
if val, err = ec.cache.FieldAsInterface(fldPath); err != nil {
if err != utils.ErrNotFound { // item found in cache
return

View File

@@ -3050,3 +3050,19 @@ func TestECAsDataProvider2(t *testing.T) {
t.Errorf("Unexpected error:%v", err)
}
}
func TestECFieldAsInterfaceNilEventCost(t *testing.T) {
dft, _ := config.NewDefaultCGRConfig()
cdr, err := NewMapEvent(map[string]interface{}{}).AsCDR(dft, "cgrates.org", "UTC")
if err != nil {
t.Fatal(err)
}
nM := cdr.AsMapStorage()
if _, err := nM.FieldAsInterface([]string{"*ec", "Charges[0]", "Increments[0]", "Accounting", "Balance", "ID"}); err == nil || err.Error() != utils.ErrNotFound.Error() {
t.Fatalf("Expected error:%s, received: %v", utils.ErrNotFound.Error(), err)
}
if _, err := nM.FieldAsInterface([]string{"*req", "CostDetails", "Charges[0]", "Increments[0]", "Accounting", "Balance", "ID"}); err == nil || err.Error() != utils.ErrNotFound.Error() {
t.Fatalf("Expected error:%s, received: %v", utils.ErrNotFound.Error(), err)
}
}