From ef8ca3f8b3323db19baa2b062851c81bf2ece7ed Mon Sep 17 00:00:00 2001 From: TeoV Date: Wed, 15 Apr 2020 15:20:55 +0300 Subject: [PATCH] Populate *ddc out of StatS --- engine/action.go | 35 +++++++++++++++++++++++++---------- engine/actions_test.go | 18 ++++++++++++++---- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/engine/action.go b/engine/action.go index 1fc0c2283..e52ae594f 100644 --- a/engine/action.go +++ b/engine/action.go @@ -524,7 +524,7 @@ func setddestinations(ub *Account, a *Action, acs Actions, extraData interface{} for _, bchain := range ub.BalanceMap { for _, b := range bchain { for destID := range b.DestinationIDs { - if strings.HasPrefix(destID, "*ddc") { + if strings.HasPrefix(destID, utils.MetaDDC) { ddcDestID = destID break } @@ -538,15 +538,30 @@ func setddestinations(ub *Account, a *Action, acs Actions, extraData interface{} } } if ddcDestID != "" { - // make slice from prefixes - // Review here prefixes - // prefixes := make([]string, len(sq.Metrics)) - // i := 0 - // for p := range sq.Metrics { - // prefixes[i] = p - // i++ - // } - newDest := &Destination{Id: ddcDestID} + destinations := utils.NewStringSet(nil) + for _, statID := range strings.Split(a.ExtraParameters, utils.INFIELD_SEP) { + if statID == utils.EmptyString { + continue + } + var sts *StatQueue + if sts, err = dm.GetStatQueue(config.CgrConfig().GeneralCfg().DefaultTenant, statID, + true, false, utils.NonTransactional); err != nil { + return + } + ddcIface, has := sts.SQMetrics[utils.MetaDDC] + if !has { + continue + } + ddcMetric := ddcIface.(*StatDDC) + + // make slice from prefixes + // Review here prefixes + for p := range ddcMetric.FieldValues { + destinations.Add(p) + } + } + + newDest := &Destination{Id: ddcDestID, Prefixes: destinations.AsSlice()} oldDest, err := dm.GetDestination(ddcDestID, false, utils.NonTransactional) if err != nil { return err diff --git a/engine/actions_test.go b/engine/actions_test.go index c8aa7407e..7b676b041 100644 --- a/engine/actions_test.go +++ b/engine/actions_test.go @@ -1478,8 +1478,6 @@ func TestTopupActionLoaded(t *testing.T) { } } -/* -Need to be reviewed with extra data instead of cdrstats func TestActionSetDDestination(t *testing.T) { acc := &Account{BalanceMap: map[string]Balances{ utils.MONETARY: Balances{&Balance{DestinationIDs: utils.NewStringMap("*ddc_test")}}}} @@ -1500,7 +1498,20 @@ func TestActionSetDDestination(t *testing.T) { if !found || len(x1.([]string)) != 1 { t.Error("Error cacheing destination: ", x1) } - setddestinations(acc, &CDRStatsQueueTriggered{Metrics: map[string]float64{"333": 1, "666": 1}}, nil, nil) + + if err := dm.SetStatQueue(&StatQueue{Tenant: "cgrates.org", ID: "StatDestination", + SQMetrics: map[string]StatMetric{ + utils.MetaDDC: &StatDDC{FieldValues: map[string]map[string]struct{}{ + "333": {"Ev1": struct{}{}}, + "666": {"Ev2": struct{}{}}, + }}, + }}); err != nil { + t.Error(err) + } + + if err := setddestinations(acc, &Action{ExtraParameters: "StatDestination"}, nil, nil); err != nil { + t.Error(err) + } d, err := dm.GetDestination("*ddc_test", false, utils.NonTransactional) if err != nil || d.Id != origD.Id || @@ -1530,7 +1541,6 @@ func TestActionSetDDestination(t *testing.T) { t.Error("Error cacheing destination: ", x1) } } -*/ func TestActionTransactionFuncType(t *testing.T) { err := dm.SetAccount(&Account{