Updated ParseField processing

This commit is contained in:
Trial97
2020-07-27 11:53:52 +03:00
committed by Dan Christian Bogos
parent 682cdb316f
commit 240ff4b671
12 changed files with 186 additions and 228 deletions

View File

@@ -373,21 +373,21 @@ func (ar *AgentRequest) ParseField(
return nil, fmt.Errorf("invalid arguments <%s> to %s",
utils.ToJSON(cfgFld.Value), utils.META_USAGE_DIFFERENCE)
}
strVal1, err := cfgFld.Value[0].ParseDataProvider(ar)
if err != nil {
return "", err
var strVal1 string
if strVal1, err = cfgFld.Value[0].ParseDataProvider(ar); err != nil {
return
}
strVal2, err := cfgFld.Value[1].ParseDataProvider(ar)
if err != nil {
return "", err
var strVal2 string
if strVal2, err = cfgFld.Value[1].ParseDataProvider(ar); err != nil {
return
}
tEnd, err := utils.ParseTimeDetectLayout(strVal1, ar.Timezone)
if err != nil {
return "", err
var tEnd time.Time
if tEnd, err = utils.ParseTimeDetectLayout(strVal1, ar.Timezone); err != nil {
return
}
tStart, err := utils.ParseTimeDetectLayout(strVal2, ar.Timezone)
if err != nil {
return "", err
var tStart time.Time
if tStart, err = utils.ParseTimeDetectLayout(strVal2, ar.Timezone); err != nil {
return
}
out = tEnd.Sub(tStart).String()
isString = true
@@ -396,76 +396,62 @@ func (ar *AgentRequest) ParseField(
return nil, fmt.Errorf("invalid arguments <%s> to %s",
utils.ToJSON(cfgFld.Value), utils.MetaCCUsage)
}
strVal1, err := cfgFld.Value[0].ParseDataProvider(ar) // ReqNr
if err != nil {
return "", err
var strVal1 string
if strVal1, err = cfgFld.Value[0].ParseDataProvider(ar); err != nil {
return
}
reqNr, err := strconv.ParseInt(strVal1, 10, 64)
if err != nil {
return "", fmt.Errorf("invalid requestNumber <%s> to %s",
var reqNr int64
if reqNr, err = strconv.ParseInt(strVal1, 10, 64); err != nil {
err = fmt.Errorf("invalid requestNumber <%s> to %s",
strVal1, utils.MetaCCUsage)
return
}
strVal2, err := cfgFld.Value[1].ParseDataProvider(ar) // TotalUsage
if err != nil {
return "", err
var strVal2 string
if strVal2, err = cfgFld.Value[1].ParseDataProvider(ar); err != nil {
return
}
usedCCTime, err := utils.ParseDurationWithNanosecs(strVal2)
if err != nil {
return "", fmt.Errorf("invalid usedCCTime <%s> to %s",
var usedCCTime time.Duration
if usedCCTime, err = utils.ParseDurationWithNanosecs(strVal2); err != nil {
err = fmt.Errorf("invalid usedCCTime <%s> to %s",
strVal2, utils.MetaCCUsage)
return
}
strVal3, err := cfgFld.Value[2].ParseDataProvider(ar) // DebitInterval
if err != nil {
return "", err
var strVal3 string
if strVal3, err = cfgFld.Value[2].ParseDataProvider(ar); err != nil {
return
}
debitItvl, err := utils.ParseDurationWithNanosecs(strVal3)
if err != nil {
return "", fmt.Errorf("invalid debitInterval <%s> to %s",
var debitItvl time.Duration
if debitItvl, err = utils.ParseDurationWithNanosecs(strVal3); err != nil {
err = fmt.Errorf("invalid debitInterval <%s> to %s",
strVal3, utils.MetaCCUsage)
return
}
mltpl := reqNr - 1 // terminate will be ignored (init request should always be 0)
if mltpl < 0 {
mltpl = 0
if reqNr--; reqNr < 0 { // terminate will be ignored (init request should always be 0)
reqNr = 0
}
return usedCCTime + time.Duration(debitItvl.Nanoseconds()*mltpl), nil
return usedCCTime + time.Duration(debitItvl.Nanoseconds()*reqNr), nil
case utils.MetaSum:
iFaceVals := make([]interface{}, len(cfgFld.Value))
for i, val := range cfgFld.Value {
strVal, err := val.ParseDataProvider(ar)
if err != nil {
return "", err
}
iFaceVals[i] = utils.StringToInterface(strVal)
var iFaceVals []interface{}
if iFaceVals, err = cfgFld.Value.GetIfaceFromValues(ar); err != nil {
return
}
out, err = utils.Sum(iFaceVals...)
case utils.MetaDifference:
iFaceVals := make([]interface{}, len(cfgFld.Value))
for i, val := range cfgFld.Value {
strVal, err := val.ParseDataProvider(ar)
if err != nil {
return "", err
}
iFaceVals[i] = utils.StringToInterface(strVal)
var iFaceVals []interface{}
if iFaceVals, err = cfgFld.Value.GetIfaceFromValues(ar); err != nil {
return
}
out, err = utils.Difference(iFaceVals...)
case utils.MetaMultiply:
iFaceVals := make([]interface{}, len(cfgFld.Value))
for i, val := range cfgFld.Value {
strVal, err := val.ParseDataProvider(ar)
if err != nil {
return "", err
}
iFaceVals[i] = utils.StringToInterface(strVal)
var iFaceVals []interface{}
if iFaceVals, err = cfgFld.Value.GetIfaceFromValues(ar); err != nil {
return
}
out, err = utils.Multiply(iFaceVals...)
case utils.MetaDivide:
iFaceVals := make([]interface{}, len(cfgFld.Value))
for i, val := range cfgFld.Value {
strVal, err := val.ParseDataProvider(ar)
if err != nil {
return "", err
}
iFaceVals[i] = utils.StringToInterface(strVal)
var iFaceVals []interface{}
if iFaceVals, err = cfgFld.Value.GetIfaceFromValues(ar); err != nil {
return
}
out, err = utils.Divide(iFaceVals...)
case utils.MetaValueExponent:
@@ -473,35 +459,36 @@ func (ar *AgentRequest) ParseField(
return nil, fmt.Errorf("invalid arguments <%s> to %s",
utils.ToJSON(cfgFld.Value), utils.MetaValueExponent)
}
strVal1, err := cfgFld.Value[0].ParseDataProvider(ar) // String Value
if err != nil {
return "", err
var strVal1 string
if strVal1, err = cfgFld.Value[0].ParseDataProvider(ar); err != nil {
return
}
val, err := strconv.ParseFloat(strVal1, 64)
if err != nil {
return "", fmt.Errorf("invalid value <%s> to %s",
var val float64
if val, err = strconv.ParseFloat(strVal1, 64); err != nil {
err = fmt.Errorf("invalid value <%s> to %s",
strVal1, utils.MetaValueExponent)
return
}
strVal2, err := cfgFld.Value[1].ParseDataProvider(ar) // String Exponent
if err != nil {
return "", err
var strVal2 string
if strVal2, err = cfgFld.Value[1].ParseDataProvider(ar); err != nil {
return
}
exp, err := strconv.Atoi(strVal2)
if err != nil {
return "", err
var exp int
if exp, err = strconv.Atoi(strVal2); err != nil {
return
}
out = strconv.FormatFloat(utils.Round(val*math.Pow10(exp),
config.CgrConfig().GeneralCfg().RoundingDecimals, utils.ROUNDING_MIDDLE), 'f', -1, 64)
case utils.MetaUnixTimestamp:
val, err := cfgFld.Value.ParseDataProvider(ar)
if err != nil {
return nil, err
var val string
if val, err = cfgFld.Value.ParseDataProvider(ar); err != nil {
return
}
t, err := utils.ParseTimeDetectLayout(val, cfgFld.Timezone)
if err != nil {
return nil, err
var t1 time.Time
if t1, err = utils.ParseTimeDetectLayout(val, cfgFld.Timezone); err != nil {
return
}
out = strconv.Itoa(int(t.Unix()))
out = strconv.Itoa(int(t1.Unix()))
}
if err != nil &&

View File

@@ -442,9 +442,9 @@ func updateDiamMsgFromNavMap(m *diam.Message, navMp *utils.OrderedNavigableMap,
if itm == nil {
continue // all attributes, not writable to diameter packet
}
newBranch := itm.Config != nil && itm.Config.NewBranch
if err = messageSetAVPsWithPath(m, itm.Path,
utils.IfaceAsString(itm.Data), newBranch, tmz); err != nil {
if err = messageSetAVPsWithPath(m,
itm.Path, utils.IfaceAsString(itm.Data),
itm.Config != nil && itm.Config.NewBranch, tmz); err != nil {
return fmt.Errorf("setting item with path: %+v got err: %s", itm.Path, err.Error())
}
}

View File

@@ -571,7 +571,6 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
map[string]interface{}{
"AttributeID": "",
"Blocker": false,
"BreakOnSuccess": false,
"CostShiftDigits": 0,
"Path": "*cgreq.ToR",
"Filters": nil,
@@ -595,7 +594,6 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
map[string]interface{}{
"AttributeID": "",
"Blocker": false,
"BreakOnSuccess": false,
"CostShiftDigits": 0,
"Path": "*cgreq.OriginID",
"Filters": nil,
@@ -619,7 +617,6 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
map[string]interface{}{
"AttributeID": "",
"Blocker": false,
"BreakOnSuccess": false,
"CostShiftDigits": 0,
"Path": "*cgreq.RequestType",
"Filters": nil,
@@ -643,7 +640,6 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
map[string]interface{}{
"AttributeID": "",
"Blocker": false,
"BreakOnSuccess": false,
"CostShiftDigits": 0,
"Path": "*cgreq.Tenant",
"Filters": nil,
@@ -667,7 +663,6 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
map[string]interface{}{
"AttributeID": "",
"Blocker": false,
"BreakOnSuccess": false,
"CostShiftDigits": 0,
"Path": "*cgreq.Category",
"Filters": nil,
@@ -691,7 +686,6 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
map[string]interface{}{
"AttributeID": "",
"Blocker": false,
"BreakOnSuccess": false,
"CostShiftDigits": 0,
"Path": "*cgreq.Account",
"Filters": nil,
@@ -715,7 +709,6 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
map[string]interface{}{
"AttributeID": "",
"Blocker": false,
"BreakOnSuccess": false,
"CostShiftDigits": 0,
"Path": "*cgreq.Subject",
"Filters": nil,
@@ -739,7 +732,6 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
map[string]interface{}{
"AttributeID": "",
"Blocker": false,
"BreakOnSuccess": false,
"CostShiftDigits": 0,
"Path": "*cgreq.Destination",
"Filters": nil,
@@ -763,7 +755,6 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
map[string]interface{}{
"AttributeID": "",
"Blocker": false,
"BreakOnSuccess": false,
"CostShiftDigits": 0,
"Path": "*cgreq.SetupTime",
"Filters": nil,
@@ -787,7 +778,6 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
map[string]interface{}{
"AttributeID": "",
"Blocker": false,
"BreakOnSuccess": false,
"CostShiftDigits": 0,
"Path": "*cgreq.AnswerTime",
"Filters": nil,
@@ -811,7 +801,6 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
map[string]interface{}{
"AttributeID": "",
"Blocker": false,
"BreakOnSuccess": false,
"CostShiftDigits": 0,
"Path": "*cgreq.Usage",
"Filters": nil,

View File

@@ -77,9 +77,6 @@ func NewFCTemplateFromFCTemplateJsonCfg(jsnCfg *FcTemplateJsonCfg, separator str
if jsnCfg.Blocker != nil {
fcTmp.Blocker = *jsnCfg.Blocker
}
if jsnCfg.Break_on_success != nil {
fcTmp.BreakOnSuccess = *jsnCfg.Break_on_success
}
fcTmp.Layout = time.RFC3339
if jsnCfg.Layout != nil {
fcTmp.Layout = *jsnCfg.Layout
@@ -114,7 +111,6 @@ type FCTemplate struct {
NewBranch bool // Used by NavigableMap when creating XMLElements
Timezone string
Blocker bool
BreakOnSuccess bool
Layout string // time format
CostShiftDigits int // Used for CDR
RoundingDecimals *int
@@ -196,7 +192,6 @@ func (fc *FCTemplate) Clone() *FCTemplate {
cln.NewBranch = fc.NewBranch
cln.Timezone = fc.Timezone
cln.Blocker = fc.Blocker
cln.BreakOnSuccess = fc.BreakOnSuccess
cln.Layout = fc.Layout
cln.CostShiftDigits = fc.CostShiftDigits
cln.RoundingDecimals = fc.RoundingDecimals
@@ -255,9 +250,6 @@ func (fc *FCTemplate) AsMapInterface(separator string) (mp map[string]interface{
if fc.Blocker != false {
mp[utils.BlockerCfg] = fc.Blocker
}
if fc.BreakOnSuccess != false {
mp[utils.BreakOnSuccessCfg] = fc.BreakOnSuccess
}
if fc.Layout != time.RFC3339 {
mp[utils.LayoutCfg] = fc.Layout
}

View File

@@ -587,7 +587,6 @@ type FcTemplateJsonCfg struct {
New_branch *bool
Timezone *string
Blocker *bool
Break_on_success *bool
Layout *string
Cost_shift_digits *int
Rounding_decimals *int

View File

@@ -161,6 +161,19 @@ func (prsrs RSRParsers) ParseDataProviderWithInterfaces(dP utils.DataProvider) (
return
}
// GetIfaceFromValues returns an interface for each RSRParser
func (prsrs RSRParsers) GetIfaceFromValues(evNm utils.DataProvider) (iFaceVals []interface{}, err error) {
iFaceVals = make([]interface{}, len(prsrs))
for i, val := range prsrs {
var strVal string
if strVal, err = val.ParseDataProvider(evNm); err != nil {
return
}
iFaceVals[i] = utils.StringToInterface(strVal)
}
return
}
func NewRSRParser(parserRules string) (rsrParser *RSRParser, err error) {
if len(parserRules) == 0 {
return

View File

@@ -570,3 +570,20 @@ func TestRSRParserCompileDynRule(t *testing.T) {
t.Errorf("Expected ~*req.CGRID received: %q", out)
}
}
func TestRSRParsersGetIfaceFromValues(t *testing.T) {
dp := utils.MapStorage{
utils.MetaReq: utils.MapStorage{
utils.Category: "call",
},
}
exp := []interface{}{"*rated", "call"}
if rply, err := NewRSRParsersMustCompile("*rated;~*req.Category", utils.INFIELD_SEP).GetIfaceFromValues(dp); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(exp, rply) {
t.Errorf("Expecting %q, received: %q", exp, rply)
}
if _, err := NewRSRParsersMustCompile("*rated;~req.Category", utils.INFIELD_SEP).GetIfaceFromValues(utils.MapStorage{}); err != utils.ErrNotFound {
t.Error(err)
}
}

View File

@@ -219,7 +219,7 @@ func (eeR *EventExporterRequest) ParseField(
case utils.MetaRemoteHost:
out = eeR.RemoteHost().String()
isString = true
case utils.MetaVariable, utils.META_COMPOSED, utils.MetaGroup:
case utils.MetaVariable, utils.META_COMPOSED:
out, err = cfgFld.Value.ParseDataProvider(eeR)
isString = true
case utils.META_USAGE_DIFFERENCE:
@@ -227,21 +227,21 @@ func (eeR *EventExporterRequest) ParseField(
return nil, fmt.Errorf("invalid arguments <%s> to %s",
utils.ToJSON(cfgFld.Value), utils.META_USAGE_DIFFERENCE)
}
strVal1, err := cfgFld.Value[0].ParseDataProvider(eeR)
if err != nil {
return "", err
var strVal1 string
if strVal1, err = cfgFld.Value[0].ParseDataProvider(eeR); err != nil {
return
}
strVal2, err := cfgFld.Value[1].ParseDataProvider(eeR)
if err != nil {
return "", err
var strVal2 string
if strVal2, err = cfgFld.Value[1].ParseDataProvider(eeR); err != nil {
return
}
tEnd, err := utils.ParseTimeDetectLayout(strVal1, eeR.tmz)
if err != nil {
return "", err
var tEnd time.Time
if tEnd, err = utils.ParseTimeDetectLayout(strVal1, eeR.tmz); err != nil {
return
}
tStart, err := utils.ParseTimeDetectLayout(strVal2, eeR.tmz)
if err != nil {
return "", err
var tStart time.Time
if tStart, err = utils.ParseTimeDetectLayout(strVal2, eeR.tmz); err != nil {
return
}
out = tEnd.Sub(tStart).String()
isString = true
@@ -250,76 +250,63 @@ func (eeR *EventExporterRequest) ParseField(
return nil, fmt.Errorf("invalid arguments <%s> to %s",
utils.ToJSON(cfgFld.Value), utils.MetaCCUsage)
}
strVal1, err := cfgFld.Value[0].ParseDataProvider(eeR) // ReqNr
if err != nil {
return "", err
var strVal1 string
if strVal1, err = cfgFld.Value[0].ParseDataProvider(eeR); err != nil {
return
}
reqNr, err := strconv.ParseInt(strVal1, 10, 64)
if err != nil {
return "", fmt.Errorf("invalid requestNumber <%s> to %s",
var reqNr int64
if reqNr, err = strconv.ParseInt(strVal1, 10, 64); err != nil {
err = fmt.Errorf("invalid requestNumber <%s> to %s",
strVal1, utils.MetaCCUsage)
return
}
strVal2, err := cfgFld.Value[1].ParseDataProvider(eeR) // TotalUsage
if err != nil {
return "", err
var strVal2 string
if strVal2, err = cfgFld.Value[1].ParseDataProvider(eeR); err != nil {
return
}
usedCCTime, err := utils.ParseDurationWithNanosecs(strVal2)
if err != nil {
return "", fmt.Errorf("invalid usedCCTime <%s> to %s",
var usedCCTime time.Duration
if usedCCTime, err = utils.ParseDurationWithNanosecs(strVal2); err != nil {
err = fmt.Errorf("invalid usedCCTime <%s> to %s",
strVal2, utils.MetaCCUsage)
return
}
strVal3, err := cfgFld.Value[2].ParseDataProvider(eeR) // DebitInterval
if err != nil {
return "", err
var strVal3 string
if strVal3, err = cfgFld.Value[2].ParseDataProvider(eeR); err != nil {
return
}
debitItvl, err := utils.ParseDurationWithNanosecs(strVal3)
if err != nil {
return "", fmt.Errorf("invalid debitInterval <%s> to %s",
var debitItvl time.Duration
if debitItvl, err = utils.ParseDurationWithNanosecs(strVal3); err != nil {
err = fmt.Errorf("invalid debitInterval <%s> to %s",
strVal3, utils.MetaCCUsage)
return
}
mltpl := reqNr - 1 // terminate will be ignored (init request should always be 0)
if mltpl < 0 {
mltpl = 0
if reqNr--; reqNr < 0 { // terminate will be ignored (init request should always be 0)
reqNr = 0
}
return usedCCTime + time.Duration(debitItvl.Nanoseconds()*mltpl), nil
return usedCCTime + time.Duration(debitItvl.Nanoseconds()*reqNr), nil
case utils.MetaSum:
iFaceVals := make([]interface{}, len(cfgFld.Value))
for i, val := range cfgFld.Value {
strVal, err := val.ParseDataProvider(eeR)
if err != nil {
return "", err
}
iFaceVals[i] = utils.StringToInterface(strVal)
var iFaceVals []interface{}
if iFaceVals, err = cfgFld.Value.GetIfaceFromValues(eeR); err != nil {
return
}
out, err = utils.Sum(iFaceVals...)
case utils.MetaDifference:
iFaceVals := make([]interface{}, len(cfgFld.Value))
for i, val := range cfgFld.Value {
strVal, err := val.ParseDataProvider(eeR)
if err != nil {
return "", err
}
iFaceVals[i] = utils.StringToInterface(strVal)
var iFaceVals []interface{}
if iFaceVals, err = cfgFld.Value.GetIfaceFromValues(eeR); err != nil {
return
}
out, err = utils.Difference(iFaceVals...)
case utils.MetaMultiply:
iFaceVals := make([]interface{}, len(cfgFld.Value))
for i, val := range cfgFld.Value {
strVal, err := val.ParseDataProvider(eeR)
if err != nil {
return "", err
}
iFaceVals[i] = utils.StringToInterface(strVal)
var iFaceVals []interface{}
if iFaceVals, err = cfgFld.Value.GetIfaceFromValues(eeR); err != nil {
return
}
out, err = utils.Multiply(iFaceVals...)
case utils.MetaDivide:
iFaceVals := make([]interface{}, len(cfgFld.Value))
for i, val := range cfgFld.Value {
strVal, err := val.ParseDataProvider(eeR)
if err != nil {
return "", err
}
iFaceVals[i] = utils.StringToInterface(strVal)
var iFaceVals []interface{}
if iFaceVals, err = cfgFld.Value.GetIfaceFromValues(eeR); err != nil {
return
}
out, err = utils.Divide(iFaceVals...)
case utils.MetaValueExponent:
@@ -327,41 +314,45 @@ func (eeR *EventExporterRequest) ParseField(
return nil, fmt.Errorf("invalid arguments <%s> to %s",
utils.ToJSON(cfgFld.Value), utils.MetaValueExponent)
}
strVal1, err := cfgFld.Value[0].ParseDataProvider(eeR) // String Value
if err != nil {
return "", err
var strVal1 string
if strVal1, err = cfgFld.Value[0].ParseDataProvider(eeR); err != nil {
return
}
val, err := strconv.ParseFloat(strVal1, 64)
if err != nil {
return "", fmt.Errorf("invalid value <%s> to %s",
var val float64
if val, err = strconv.ParseFloat(strVal1, 64); err != nil {
err = fmt.Errorf("invalid value <%s> to %s",
strVal1, utils.MetaValueExponent)
return
}
strVal2, err := cfgFld.Value[1].ParseDataProvider(eeR) // String Exponent
if err != nil {
return "", err
var strVal2 string
if strVal2, err = cfgFld.Value[1].ParseDataProvider(eeR); err != nil {
return
}
exp, err := strconv.Atoi(strVal2)
if err != nil {
return "", err
var exp int
if exp, err = strconv.Atoi(strVal2); err != nil {
return
}
out = strconv.FormatFloat(utils.Round(val*math.Pow10(exp),
config.CgrConfig().GeneralCfg().RoundingDecimals, utils.ROUNDING_MIDDLE), 'f', -1, 64)
case utils.MetaUnixTimestamp:
val, err := cfgFld.Value.ParseDataProvider(eeR)
if err != nil {
return nil, err
var val string
if val, err = cfgFld.Value.ParseDataProvider(eeR); err != nil {
return
}
t, err := utils.ParseTimeDetectLayout(val, cfgFld.Timezone)
if err != nil {
return nil, err
var t1 time.Time
if t1, err = utils.ParseTimeDetectLayout(val, cfgFld.Timezone); err != nil {
return
}
out = strconv.Itoa(int(t.Unix()))
out = strconv.Itoa(int(t1.Unix()))
case utils.MetaMaskedDestination:
//check if we have destination in the event
if dst, err := eeR.req.FieldAsString([]string{utils.Destination}); err != nil {
return nil, fmt.Errorf("error <%s> getting destination for %s",
var dst string
if dst, err = eeR.req.FieldAsString([]string{utils.Destination}); err != nil {
err = fmt.Errorf("error <%s> getting destination for %s",
err, utils.ToJSON(cfgFld))
} else if cfgFld.MaskLen != -1 && len(cfgFld.MaskDestID) != 0 &&
return
}
if cfgFld.MaskLen != -1 && len(cfgFld.MaskDestID) != 0 &&
engine.CachedDestHasPrefix(cfgFld.MaskDestID, dst) {
out = utils.MaskSuffix(dst, cfgFld.MaskLen)
}

View File

@@ -224,7 +224,7 @@ func (alS *AttributeService) processEvent(args *AttrArgsProcessEvent, evNm utils
substitute = tEnd.Sub(tStart).String()
case utils.MetaSum:
var ifaceVals []interface{}
if ifaceVals, err = getIfaceFromValues(attribute.Value, evNm); err != nil {
if ifaceVals, err = attribute.Value.GetIfaceFromValues(evNm); err != nil {
rply = nil
return
}
@@ -236,7 +236,7 @@ func (alS *AttributeService) processEvent(args *AttrArgsProcessEvent, evNm utils
substitute = utils.IfaceAsString(ifaceSum)
case utils.MetaDifference:
var ifaceVals []interface{}
if ifaceVals, err = getIfaceFromValues(attribute.Value, evNm); err != nil {
if ifaceVals, err = attribute.Value.GetIfaceFromValues(evNm); err != nil {
rply = nil
return
}
@@ -248,7 +248,7 @@ func (alS *AttributeService) processEvent(args *AttrArgsProcessEvent, evNm utils
substitute = utils.IfaceAsString(ifaceSum)
case utils.MetaMultiply:
var ifaceVals []interface{}
if ifaceVals, err = getIfaceFromValues(attribute.Value, evNm); err != nil {
if ifaceVals, err = attribute.Value.GetIfaceFromValues(evNm); err != nil {
rply = nil
return
}
@@ -260,7 +260,7 @@ func (alS *AttributeService) processEvent(args *AttrArgsProcessEvent, evNm utils
substitute = utils.IfaceAsString(ifaceSum)
case utils.MetaDivide:
var ifaceVals []interface{}
if ifaceVals, err = getIfaceFromValues(attribute.Value, evNm); err != nil {
if ifaceVals, err = attribute.Value.GetIfaceFromValues(evNm); err != nil {
rply = nil
return
}

View File

@@ -153,15 +153,3 @@ func NewAttributeFromInline(tenant, inlnRule string) (attr *AttributeProfile, er
}
return
}
func getIfaceFromValues(values config.RSRParsers, evNm utils.DataProvider) (iFaceVals []interface{}, err error) {
iFaceVals = make([]interface{}, len(values))
for i, val := range values {
var strVal string
if strVal, err = val.ParseDataProvider(evNm); err != nil {
return
}
iFaceVals[i] = utils.StringToInterface(strVal)
}
return
}

View File

@@ -167,24 +167,6 @@ func TestNewAttributeFromInlineWithMultipleRuns(t *testing.T) {
t.Errorf("Expecting %+v, received: %+v", utils.ToJSON(expAttrPrf1), utils.ToJSON(attr))
}
}
func TestGetIfaceFromValues(t *testing.T) {
dp := utils.MapStorage{
utils.MetaReq: utils.MapStorage{
utils.Category: "call",
},
}
exp := []interface{}{"*rated", "call"}
if rply, err := getIfaceFromValues(config.NewRSRParsersMustCompile("*rated;~*req.Category", utils.INFIELD_SEP), dp); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(exp, rply) {
t.Errorf("Expecting %q, received: %q", exp, rply)
}
if _, err := getIfaceFromValues(config.NewRSRParsersMustCompile("*rated;~req.Category", utils.INFIELD_SEP), utils.MapStorage{}); err != utils.ErrNotFound {
t.Error(err)
}
}
func TestNewAttributeFromInlineWithMultipleRuns2(t *testing.T) {
attrID := "*constant:*req.RequestType*rated;*constant:*req.Category:call"

View File

@@ -2207,11 +2207,11 @@ var (
)
// CGROptionsSet the possible cgr options
var CGROptionsSet = NewStringSet([]string{OptsStirATest, OptsStirPayloadMaxDuration,
OptsStirIdentity, OptsStirOriginatorTn, OptsStirOriginatorURI, OptsStirDestinationTn,
OptsStirDestinationURI, OptsStirPublicKeyPath, OptsStirPrivateKeyPath,
OptsDebitInterval, OptsContext, OptsSessionTTL, OptsSessionTTLMaxDelay,
OptsSessionTTLLastUsed, OptsSessionTTLLastUsage, OptsSessionTTLUsage, OptsAPIKey, OptsRouteID})
var CGROptionsSet = NewStringSet([]string{OptsRatesStartTime, OptsSessionTTL, OptsSessionTTLMaxDelay,
OptsSessionTTLLastUsed, OptsSessionTTLLastUsage, OptsSessionTTLUsage, OptsDebitInterval, OptsStirATest,
OptsStirPayloadMaxDuration, OptsStirIdentity, OptsStirOriginatorTn, OptsStirOriginatorURI,
OptsStirDestinationTn, OptsStirDestinationURI, OptsStirPublicKeyPath, OptsStirPrivateKeyPath,
OptsAPIKey, OptsRouteID, OptsContext, OptsAttributesProcessRuns})
// SessionS ProccessEvent posible options
const (