Added *req as requirement fro attributes FieldName

This commit is contained in:
Trial97
2020-01-15 18:06:45 +02:00
parent e949d4c8dc
commit 6764260be4
11 changed files with 164 additions and 105 deletions

View File

@@ -524,3 +524,39 @@ func (nM *NavigableMap) GetKeys() (keys []string) {
}
return
}
// Remove will remove the items from the given path
func (nM *NavigableMap) Remove(path []string) {
// if ordered {
// nM.order = append(nM.order, path)
// }
mp := nM.data
for i, spath := range path {
oData, has := mp[spath]
if !has { // no need to remove
return
}
if i == len(path)-1 { // last path
delete(mp, spath)
return
}
defer func(np map[string]interface{}, p string) {
o, has := np[p]
if !has {
return
}
if o == nil {
delete(np, p)
return
}
v, ok := o.(map[string]interface{})
if !ok {
return
}
if len(v) == 0 {
delete(np, p)
}
}(mp, spath)
mp = oData.(map[string]interface{}) // so we can check further down
}
}

View File

@@ -22,6 +22,7 @@ import (
"fmt"
"math"
"strconv"
"strings"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/utils"
@@ -166,10 +167,9 @@ func (alS *AttributeService) processEvent(args *AttrArgsProcessEvent) (
}
rply = &AttrSProcessEventReply{
MatchedProfiles: []string{attrPrf.ID},
CGREvent: args.Clone(),
CGREvent: args.Clone(), // do not need to coppy the event
blocker: attrPrf.Blocker}
evNm := config.NewNavigableMap(nil)
evNm.Set([]string{utils.MetaReq}, args.Event, false, false)
evNm := config.NewNavigableMap(map[string]interface{}{utils.MetaReq: args.Event})
for _, attribute := range attrPrf.Attributes {
//in case that we have filter for attribute send them to FilterS to be processed
if len(attribute.FilterIDs) != 0 {
@@ -186,16 +186,16 @@ func (alS *AttributeService) processEvent(args *AttrArgsProcessEvent) (
case utils.META_CONSTANT:
substitute, err = attribute.Value.ParseValue(utils.EmptyString)
case utils.MetaVariable, utils.META_COMPOSED:
substitute, err = attribute.Value.ParseEvent(args.Event)
substitute, err = attribute.Value.ParseDataProvider(evNm, utils.NestingSep)
case utils.META_USAGE_DIFFERENCE:
if len(attribute.Value) != 2 {
return nil, fmt.Errorf("invalid arguments <%s>", utils.ToJSON(attribute.Value))
}
strVal1, err := attribute.Value[0].ParseEvent(args.Event)
strVal1, err := attribute.Value[0].ParseDataProvider(evNm, utils.NestingSep)
if err != nil {
return nil, err
}
strVal2, err := attribute.Value[1].ParseEvent(args.Event)
strVal2, err := attribute.Value[1].ParseDataProvider(evNm, utils.NestingSep)
if err != nil {
return nil, err
}
@@ -211,7 +211,7 @@ func (alS *AttributeService) processEvent(args *AttrArgsProcessEvent) (
case utils.MetaSum:
iFaceVals := make([]interface{}, len(attribute.Value))
for i, val := range attribute.Value {
strVal, err := val.ParseEvent(args.Event)
strVal, err := val.ParseDataProvider(evNm, utils.NestingSep)
if err != nil {
return nil, err
}
@@ -227,7 +227,7 @@ func (alS *AttributeService) processEvent(args *AttrArgsProcessEvent) (
return nil, fmt.Errorf("invalid arguments <%s> to %s",
utils.ToJSON(attribute.Value), utils.MetaValueExponent)
}
strVal1, err := attribute.Value[0].ParseEvent(args.Event) // String Value
strVal1, err := attribute.Value[0].ParseDataProvider(evNm, utils.NestingSep) // String Value
if err != nil {
return nil, err
}
@@ -236,7 +236,7 @@ func (alS *AttributeService) processEvent(args *AttrArgsProcessEvent) (
return nil, fmt.Errorf("invalid value <%s> to %s",
strVal1, utils.MetaValueExponent)
}
strVal2, err := attribute.Value[1].ParseEvent(args.Event) // String Exponent
strVal2, err := attribute.Value[1].ParseDataProvider(evNm, utils.NestingSep) // String Exponent
if err != nil {
return nil, err
}
@@ -247,7 +247,7 @@ func (alS *AttributeService) processEvent(args *AttrArgsProcessEvent) (
substitute = strconv.FormatFloat(utils.Round(val*math.Pow10(exp),
config.CgrConfig().GeneralCfg().RoundingDecimals, utils.ROUNDING_MIDDLE), 'f', -1, 64)
default: // backwards compatible in case that Type is empty
substitute, err = attribute.Value.ParseEvent(args.Event)
substitute, err = attribute.Value.ParseDataProvider(evNm, utils.NestingSep)
}
if err != nil {
@@ -258,14 +258,28 @@ func (alS *AttributeService) processEvent(args *AttrArgsProcessEvent) (
rply.AlteredFields = append(rply.AlteredFields, attribute.FieldName)
}
if substitute == utils.MetaRemove {
delete(rply.CGREvent.Event, attribute.FieldName)
evNm.Remove(strings.Split(attribute.FieldName, utils.NestingSep))
continue
}
if attribute.Type == utils.META_COMPOSED {
substitute = utils.IfaceAsString(rply.CGREvent.Event[attribute.FieldName]) + substitute
var val string
val, err = evNm.FieldAsString(strings.Split(attribute.FieldName, utils.NestingSep))
substitute = val + substitute
}
rply.CGREvent.Event[attribute.FieldName] = substitute
evNm.Set(strings.Split(attribute.FieldName, utils.NestingSep), substitute, false, false)
}
var ev interface{}
ev, err = evNm.FieldAsInterface([]string{utils.MetaReq})
if err != nil {
if err.Error() == utils.ErrNotFound.Error() {
rply.CGREvent.Event = make(map[string]interface{})
return
}
return nil, err
}
var ok bool
if rply.CGREvent.Event, ok = ev.(map[string]interface{}); !ok {
return nil, fmt.Errorf("invalid event")
}
return
}

View File

@@ -87,7 +87,7 @@ var (
},
Attributes: []*Attribute{
{
FieldName: utils.Account,
FieldName: utils.MetaReq + utils.NestingSep + utils.Account,
Value: config.NewRSRParsersMustCompile("1010", true, utils.INFIELD_SEP),
},
},
@@ -104,7 +104,7 @@ var (
},
Attributes: []*Attribute{
{
FieldName: utils.Account,
FieldName: utils.MetaReq + utils.NestingSep + utils.Account,
Value: config.NewRSRParsersMustCompile("1010", true, utils.INFIELD_SEP),
},
},
@@ -121,7 +121,7 @@ var (
},
Attributes: []*Attribute{
{
FieldName: utils.Account,
FieldName: utils.MetaReq + utils.NestingSep + utils.Account,
Value: config.NewRSRParsersMustCompile("1010", true, utils.INFIELD_SEP),
},
},
@@ -138,7 +138,7 @@ var (
},
Attributes: []*Attribute{
{
FieldName: utils.Account,
FieldName: utils.MetaReq + utils.NestingSep + utils.Account,
Value: config.NewRSRParsersMustCompile("1010", true, utils.INFIELD_SEP),
},
},
@@ -269,7 +269,7 @@ func TestAttributeProcessEvent(t *testing.T) {
attrEvs[0].CGREvent.Event["Account"] = "1010" //Field added in event after process
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"AttributeProfile1"},
AlteredFields: []string{"Account"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "Account"},
CGREvent: attrEvs[0].CGREvent,
}
atrp, err := attrService.processEvent(attrEvs[0])
@@ -293,7 +293,7 @@ func TestAttributeProcessEventWithIDs(t *testing.T) {
attrEvs[3].AttributeIDs = []string{"AttributeIDMatch"}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"AttributeIDMatch"},
AlteredFields: []string{"Account"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "Account"},
CGREvent: attrEvs[3].CGREvent,
}
if atrp, err := attrService.processEvent(attrEvs[3]); err != nil {
@@ -406,7 +406,7 @@ func TestAttributeIndexer(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: utils.Account,
FieldName: utils.MetaReq + utils.NestingSep + utils.Account,
Value: config.NewRSRParsersMustCompile("1010", true, utils.INFIELD_SEP),
},
},
@@ -474,7 +474,7 @@ func TestAttributeProcessWithMultipleRuns1(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field1",
FieldName: utils.MetaReq + utils.NestingSep + "Field1",
Value: config.NewRSRParsersMustCompile("Value1", true, utils.INFIELD_SEP),
},
},
@@ -490,7 +490,7 @@ func TestAttributeProcessWithMultipleRuns1(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Value: config.NewRSRParsersMustCompile("Value2", true, utils.INFIELD_SEP),
},
},
@@ -506,7 +506,7 @@ func TestAttributeProcessWithMultipleRuns1(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field3",
FieldName: utils.MetaReq + utils.NestingSep + "Field3",
Value: config.NewRSRParsersMustCompile("Value3", true, utils.INFIELD_SEP),
},
},
@@ -535,7 +535,11 @@ func TestAttributeProcessWithMultipleRuns1(t *testing.T) {
}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"ATTR_1", "ATTR_2", "ATTR_3"},
AlteredFields: []string{"Field1", "Field2", "Field3"},
AlteredFields: []string{
utils.MetaReq + utils.NestingSep + "Field1",
utils.MetaReq + utils.NestingSep + "Field2",
utils.MetaReq + utils.NestingSep + "Field3",
},
CGREvent: &utils.CGREvent{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: utils.GenUUID(),
@@ -552,7 +556,7 @@ func TestAttributeProcessWithMultipleRuns1(t *testing.T) {
t.Errorf("Error: %+v", err)
}
if !reflect.DeepEqual(eRply.MatchedProfiles, reply.MatchedProfiles) {
t.Errorf("Expecting %+v, received: %+v", eRply.MatchedProfiles, reply.MatchedProfiles)
t.Fatalf("Expecting %+v, received: %+v", eRply.MatchedProfiles, reply.MatchedProfiles)
}
if !reflect.DeepEqual(eRply.AlteredFields, reply.AlteredFields) {
t.Errorf("Expecting %+v, received: %+v", eRply.AlteredFields, reply.AlteredFields)
@@ -582,7 +586,7 @@ func TestAttributeProcessWithMultipleRuns2(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field1",
FieldName: utils.MetaReq + utils.NestingSep + "Field1",
Value: config.NewRSRParsersMustCompile("Value1", true, utils.INFIELD_SEP),
},
},
@@ -598,7 +602,7 @@ func TestAttributeProcessWithMultipleRuns2(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Value: config.NewRSRParsersMustCompile("Value2", true, utils.INFIELD_SEP),
},
},
@@ -614,7 +618,7 @@ func TestAttributeProcessWithMultipleRuns2(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field3",
FieldName: utils.MetaReq + utils.NestingSep + "Field3",
Value: config.NewRSRParsersMustCompile("Value3", true, utils.INFIELD_SEP),
},
},
@@ -643,7 +647,8 @@ func TestAttributeProcessWithMultipleRuns2(t *testing.T) {
}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"ATTR_1", "ATTR_2"},
AlteredFields: []string{"Field1", "Field2"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "Field1",
utils.MetaReq + utils.NestingSep + "Field2"},
CGREvent: &utils.CGREvent{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: utils.GenUUID(),
@@ -689,7 +694,7 @@ func TestAttributeProcessWithMultipleRuns3(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field1",
FieldName: utils.MetaReq + utils.NestingSep + "Field1",
Value: config.NewRSRParsersMustCompile("Value1", true, utils.INFIELD_SEP),
},
},
@@ -705,7 +710,7 @@ func TestAttributeProcessWithMultipleRuns3(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Value: config.NewRSRParsersMustCompile("Value2", true, utils.INFIELD_SEP),
},
},
@@ -721,7 +726,7 @@ func TestAttributeProcessWithMultipleRuns3(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field3",
FieldName: utils.MetaReq + utils.NestingSep + "Field3",
Value: config.NewRSRParsersMustCompile("Value3", true, utils.INFIELD_SEP),
},
},
@@ -750,7 +755,8 @@ func TestAttributeProcessWithMultipleRuns3(t *testing.T) {
}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"ATTR_1", "ATTR_2"},
AlteredFields: []string{"Field1", "Field2"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "Field1",
utils.MetaReq + utils.NestingSep + "Field2"},
CGREvent: &utils.CGREvent{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: utils.GenUUID(),
@@ -796,7 +802,7 @@ func TestAttributeProcessWithMultipleRuns4(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field1",
FieldName: utils.MetaReq + utils.NestingSep + "Field1",
Value: config.NewRSRParsersMustCompile("Value1", true, utils.INFIELD_SEP),
},
},
@@ -812,7 +818,7 @@ func TestAttributeProcessWithMultipleRuns4(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Value: config.NewRSRParsersMustCompile("Value2", true, utils.INFIELD_SEP),
},
},
@@ -838,7 +844,8 @@ func TestAttributeProcessWithMultipleRuns4(t *testing.T) {
}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"ATTR_1", "ATTR_2"},
AlteredFields: []string{"Field1", "Field2"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "Field1",
utils.MetaReq + utils.NestingSep + "Field2"},
CGREvent: &utils.CGREvent{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: utils.GenUUID(),
@@ -886,7 +893,7 @@ func TestAttributeMultipleProcessWithBlocker(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field1",
FieldName: utils.MetaReq + utils.NestingSep + "Field1",
Value: config.NewRSRParsersMustCompile("Value1", true, utils.INFIELD_SEP),
},
},
@@ -902,7 +909,7 @@ func TestAttributeMultipleProcessWithBlocker(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Value: config.NewRSRParsersMustCompile("Value2", true, utils.INFIELD_SEP),
},
},
@@ -919,7 +926,7 @@ func TestAttributeMultipleProcessWithBlocker(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field3",
FieldName: utils.MetaReq + utils.NestingSep + "Field3",
Value: config.NewRSRParsersMustCompile("Value3", true, utils.INFIELD_SEP),
},
},
@@ -948,7 +955,8 @@ func TestAttributeMultipleProcessWithBlocker(t *testing.T) {
}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"ATTR_1", "ATTR_2"},
AlteredFields: []string{"Field1", "Field2"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "Field1",
utils.MetaReq + utils.NestingSep + "Field2"},
CGREvent: &utils.CGREvent{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: utils.GenUUID(),
@@ -995,7 +1003,7 @@ func TestAttributeMultipleProcessWithBlocker2(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field1",
FieldName: utils.MetaReq + utils.NestingSep + "Field1",
Value: config.NewRSRParsersMustCompile("Value1", true, utils.INFIELD_SEP),
},
},
@@ -1012,7 +1020,7 @@ func TestAttributeMultipleProcessWithBlocker2(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Value: config.NewRSRParsersMustCompile("Value2", true, utils.INFIELD_SEP),
},
},
@@ -1028,7 +1036,7 @@ func TestAttributeMultipleProcessWithBlocker2(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field3",
FieldName: utils.MetaReq + utils.NestingSep + "Field3",
Value: config.NewRSRParsersMustCompile("Value3", true, utils.INFIELD_SEP),
},
},
@@ -1057,7 +1065,7 @@ func TestAttributeMultipleProcessWithBlocker2(t *testing.T) {
}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"ATTR_1"},
AlteredFields: []string{"Field1"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "Field1"},
CGREvent: &utils.CGREvent{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: utils.GenUUID(),
@@ -1103,8 +1111,8 @@ func TestAttributeProcessValue(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
Value: config.NewRSRParsersMustCompile("~Field1", true, utils.INFIELD_SEP),
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Value: config.NewRSRParsersMustCompile("~*req.Field1", true, utils.INFIELD_SEP),
},
},
Blocker: true,
@@ -1127,7 +1135,7 @@ func TestAttributeProcessValue(t *testing.T) {
}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"ATTR_1"},
AlteredFields: []string{"Field2"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "Field2"},
CGREvent: &utils.CGREvent{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: utils.GenUUID(),
@@ -1173,17 +1181,17 @@ func TestAttributeAttributeFilterIDs(t *testing.T) {
Attributes: []*Attribute{
{
FilterIDs: []string{"*string:~*req.PassField:Test"},
FieldName: "PassField",
FieldName: utils.MetaReq + utils.NestingSep + "PassField",
Value: config.NewRSRParsersMustCompile("Pass", true, utils.INFIELD_SEP),
},
{
FilterIDs: []string{"*string:~*req.PassField:RandomValue"},
FieldName: "NotPassField",
FieldName: utils.MetaReq + utils.NestingSep + "NotPassField",
Value: config.NewRSRParsersMustCompile("NotPass", true, utils.INFIELD_SEP),
},
{
FilterIDs: []string{"*notexists:~*req.RandomField:"},
FieldName: "RandomField",
FieldName: utils.MetaReq + utils.NestingSep + "RandomField",
Value: config.NewRSRParsersMustCompile("RandomValue", true, utils.INFIELD_SEP),
},
},
@@ -1206,7 +1214,8 @@ func TestAttributeAttributeFilterIDs(t *testing.T) {
}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"ATTR_1"},
AlteredFields: []string{"PassField", "RandomField"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "PassField",
utils.MetaReq + utils.NestingSep + "RandomField"},
CGREvent: &utils.CGREvent{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: utils.GenUUID(),
@@ -1252,7 +1261,7 @@ func TestAttributeProcessEventConstant(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Type: utils.META_CONSTANT,
Value: config.NewRSRParsersMustCompile("ConstVal", true, utils.INFIELD_SEP),
},
@@ -1277,7 +1286,7 @@ func TestAttributeProcessEventConstant(t *testing.T) {
}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"ATTR_1"},
AlteredFields: []string{"Field2"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "Field2"},
CGREvent: &utils.CGREvent{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: utils.GenUUID(),
@@ -1323,14 +1332,14 @@ func TestAttributeProcessEventVariable(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~Field1", true, utils.INFIELD_SEP),
Value: config.NewRSRParsersMustCompile("~*req.Field1", true, utils.INFIELD_SEP),
},
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~TheField", true, utils.INFIELD_SEP),
Value: config.NewRSRParsersMustCompile("~*req.TheField", true, utils.INFIELD_SEP),
},
},
Blocker: true,
@@ -1354,7 +1363,7 @@ func TestAttributeProcessEventVariable(t *testing.T) {
}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"ATTR_1"},
AlteredFields: []string{"Field2"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "Field2"},
CGREvent: &utils.CGREvent{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: utils.GenUUID(),
@@ -1401,19 +1410,19 @@ func TestAttributeProcessEventComposed(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Type: utils.META_COMPOSED,
Value: config.NewRSRParsersMustCompile("~Field1", true, utils.INFIELD_SEP),
Value: config.NewRSRParsersMustCompile("~*req.Field1", true, utils.INFIELD_SEP),
},
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Type: utils.META_COMPOSED,
Value: config.NewRSRParsersMustCompile("_", true, utils.INFIELD_SEP),
},
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Type: utils.META_COMPOSED,
Value: config.NewRSRParsersMustCompile("~TheField", true, utils.INFIELD_SEP),
Value: config.NewRSRParsersMustCompile("~*req.TheField", true, utils.INFIELD_SEP),
},
},
Blocker: true,
@@ -1437,7 +1446,7 @@ func TestAttributeProcessEventComposed(t *testing.T) {
}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"ATTR_1"},
AlteredFields: []string{"Field2"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "Field2"},
CGREvent: &utils.CGREvent{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: utils.GenUUID(),
@@ -1484,9 +1493,9 @@ func TestAttributeProcessEventSum(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Type: utils.MetaSum,
Value: config.NewRSRParsersMustCompile("10;~NumField;20", true, utils.INFIELD_SEP),
Value: config.NewRSRParsersMustCompile("10;~*req.NumField;20", true, utils.INFIELD_SEP),
},
},
Blocker: true,
@@ -1511,7 +1520,7 @@ func TestAttributeProcessEventSum(t *testing.T) {
}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"ATTR_1"},
AlteredFields: []string{"Field2"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "Field2"},
CGREvent: &utils.CGREvent{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: utils.GenUUID(),
@@ -1559,9 +1568,9 @@ func TestAttributeProcessEventUsageDifference(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Type: utils.META_USAGE_DIFFERENCE,
Value: config.NewRSRParsersMustCompile("~UnixTimeStamp;~UnixTimeStamp2", true, utils.INFIELD_SEP),
Value: config.NewRSRParsersMustCompile("~*req.UnixTimeStamp;~*req.UnixTimeStamp2", true, utils.INFIELD_SEP),
},
},
Blocker: true,
@@ -1587,7 +1596,7 @@ func TestAttributeProcessEventUsageDifference(t *testing.T) {
}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"ATTR_1"},
AlteredFields: []string{"Field2"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "Field2"},
CGREvent: &utils.CGREvent{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: utils.GenUUID(),
@@ -1636,9 +1645,9 @@ func TestAttributeProcessEventValueExponent(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Type: utils.MetaValueExponent,
Value: config.NewRSRParsersMustCompile("~Multiplier;~Pow", true, utils.INFIELD_SEP),
Value: config.NewRSRParsersMustCompile("~*req.Multiplier;~*req.Pow", true, utils.INFIELD_SEP),
},
},
Blocker: true,
@@ -1664,7 +1673,7 @@ func TestAttributeProcessEventValueExponent(t *testing.T) {
}
eRply := &AttrSProcessEventReply{
MatchedProfiles: []string{"ATTR_1"},
AlteredFields: []string{"Field2"},
AlteredFields: []string{utils.MetaReq + utils.NestingSep + "Field2"},
CGREvent: &utils.CGREvent{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: utils.GenUUID(),
@@ -1721,7 +1730,7 @@ func BenchmarkAttributeProcessEventConstant(b *testing.B) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Type: utils.META_CONSTANT,
Value: config.NewRSRParsersMustCompile("ConstVal", true, utils.INFIELD_SEP),
},
@@ -1782,9 +1791,9 @@ func BenchmarkAttributeProcessEventVariable(b *testing.B) {
},
Attributes: []*Attribute{
{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Type: utils.MetaVariable,
Value: config.NewRSRParsersMustCompile("~Field1", true, utils.INFIELD_SEP),
Value: config.NewRSRParsersMustCompile("~*req.Field1", true, utils.INFIELD_SEP),
},
},
Blocker: true,
@@ -1825,15 +1834,15 @@ func TestGetAttributeProfileFromInline(t *testing.T) {
} else if test != true {
t.Errorf("\nExpecting: true got :%+v", test)
}
attrID := "*sum:Field2:10;~NumField;20"
attrID := "*sum:*req.Field2:10;~*req.NumField;20"
expAttrPrf1 := &AttributeProfile{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: attrID,
Contexts: []string{utils.META_ANY},
Attributes: []*Attribute{&Attribute{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Type: utils.MetaSum,
Value: config.NewRSRParsersMustCompile("10;~NumField;20", true, utils.INFIELD_SEP),
Value: config.NewRSRParsersMustCompile("10;~*req.NumField;20", true, utils.INFIELD_SEP),
}},
}
attr, err := dm.GetAttributeProfile(config.CgrConfig().GeneralCfg().DefaultTenant, attrID, false, false, "")

View File

@@ -39,7 +39,7 @@ func TestConvertExternalToProfile(t *testing.T) {
},
Attributes: []*ExternalAttribute{
&ExternalAttribute{
FieldName: "Account",
FieldName: utils.MetaReq + utils.NestingSep + "Account",
Value: "1001",
},
},
@@ -57,7 +57,7 @@ func TestConvertExternalToProfile(t *testing.T) {
},
Attributes: []*Attribute{
{
FieldName: "Account",
FieldName: utils.MetaReq + utils.NestingSep + "Account",
Value: config.NewRSRParsersMustCompile("1001", true, utils.INFIELD_SEP),
},
},
@@ -108,7 +108,7 @@ func TestConvertExternalToProfileMissing2(t *testing.T) {
},
Attributes: []*ExternalAttribute{
&ExternalAttribute{
FieldName: "Account",
FieldName: utils.MetaReq + utils.NestingSep + "Account",
},
},
Weight: 20,
@@ -122,15 +122,15 @@ func TestConvertExternalToProfileMissing2(t *testing.T) {
}
func TestNewAttributeFromInline(t *testing.T) {
attrID := "*sum:Field2:10;~NumField;20"
attrID := "*sum:*req.Field2:10;~*req.NumField;20"
expAttrPrf1 := &AttributeProfile{
Tenant: config.CgrConfig().GeneralCfg().DefaultTenant,
ID: attrID,
Contexts: []string{utils.META_ANY},
Attributes: []*Attribute{&Attribute{
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Type: utils.MetaSum,
Value: config.NewRSRParsersMustCompile("10;~NumField;20", true, utils.INFIELD_SEP),
Value: config.NewRSRParsersMustCompile("10;~*req.NumField;20", true, utils.INFIELD_SEP),
}},
}
attr, err := NewAttributeFromInline(config.CgrConfig().GeneralCfg().DefaultTenant, attrID)

View File

@@ -263,8 +263,8 @@ cgrates.org,SPP_1,,,,,supplier1,,,,ResGroup4,Stat3,10,,,
`
AttributesCSVContent = `
#Tenant,ID,Contexts,FilterIDs,ActivationInterval,AttributeFilterIDs,FieldName,Type,Value,Blocker,Weight
cgrates.org,ALS1,con1,*string:~*req.Account:1001,2014-07-29T15:00:00Z,*string:~*req.Field1:Initial,Field1,*variable,Sub1,true,20
cgrates.org,ALS1,con2;con3,,,,Field2,*variable,Sub2,true,20
cgrates.org,ALS1,con1,*string:~*req.Account:1001,2014-07-29T15:00:00Z,*string:~*req.Field1:Initial,*req.Field1,*variable,Sub1,true,20
cgrates.org,ALS1,con2;con3,,,,*req.Field2,*variable,Sub2,true,20
`
ChargersCSVContent = `
#Tenant,ID,FilterIDs,ActivationInterval,RunID,AttributeIDs,Weight

View File

@@ -1274,13 +1274,13 @@ func TestLoadAttributeProfiles(t *testing.T) {
Attributes: []*utils.TPAttribute{
&utils.TPAttribute{
FilterIDs: []string{"*string:~*req.Field1:Initial"},
FieldName: "Field1",
FieldName: utils.MetaReq + utils.NestingSep + "Field1",
Type: utils.MetaVariable,
Value: "Sub1",
},
&utils.TPAttribute{
FilterIDs: []string{},
FieldName: "Field2",
FieldName: utils.MetaReq + utils.NestingSep + "Field2",
Type: utils.MetaVariable,
Value: "Sub2",
},

View File

@@ -1211,7 +1211,7 @@ func TestAPItoAttributeProfile(t *testing.T) {
},
Attributes: []*utils.TPAttribute{
&utils.TPAttribute{
FieldName: "FL1",
FieldName: utils.MetaReq + utils.NestingSep + "FL1",
Value: "Al1",
},
},
@@ -1227,7 +1227,7 @@ func TestAPItoAttributeProfile(t *testing.T) {
},
Attributes: []*Attribute{
&Attribute{
FieldName: "FL1",
FieldName: utils.MetaReq + utils.NestingSep + "FL1",
Value: config.NewRSRParsersMustCompile("Al1", true, utils.INFIELD_SEP),
},
},
@@ -1253,7 +1253,7 @@ func TestAPItoModelTPAttribute(t *testing.T) {
},
Attributes: []*utils.TPAttribute{
&utils.TPAttribute{
FieldName: "FL1",
FieldName: utils.MetaReq + utils.NestingSep + "FL1",
Value: "Al1",
},
},
@@ -1266,7 +1266,7 @@ func TestAPItoModelTPAttribute(t *testing.T) {
ID: "ALS1",
Contexts: "con1",
FilterIDs: "FLTR_ACNT_dan;FLTR_DST_DE",
FieldName: "FL1",
FieldName: utils.MetaReq + utils.NestingSep + "FL1",
Value: "Al1",
ActivationInterval: "2014-07-14T14:35:00Z",
Weight: 20,
@@ -1286,7 +1286,7 @@ func TestModelAsTPAttribute(t *testing.T) {
ID: "ALS1",
Contexts: "con1",
FilterIDs: "FLTR_ACNT_dan;FLTR_DST_DE",
FieldName: "FL1",
FieldName: utils.MetaReq + utils.NestingSep + "FL1",
Value: "Al1",
ActivationInterval: "2014-07-14T14:35:00Z",
Weight: 20,
@@ -1305,7 +1305,7 @@ func TestModelAsTPAttribute(t *testing.T) {
Attributes: []*utils.TPAttribute{
&utils.TPAttribute{
FilterIDs: []string{},
FieldName: "FL1",
FieldName: utils.MetaReq + utils.NestingSep + "FL1",
Value: "Al1",
},
},
@@ -1324,7 +1324,7 @@ func TestModelAsTPAttribute(t *testing.T) {
Attributes: []*utils.TPAttribute{
&utils.TPAttribute{
FilterIDs: []string{},
FieldName: "FL1",
FieldName: utils.MetaReq + utils.NestingSep + "FL1",
Value: "Al1",
},
},

View File

@@ -1862,7 +1862,7 @@ func testOnStorITAttributeProfile(t *testing.T) {
Contexts: []string{"con1"},
Attributes: []*Attribute{
{
FieldName: "FN1",
FieldName: utils.MetaReq + utils.NestingSep + "FN1",
Value: config.NewRSRParsersMustCompile("Al1", true, utils.INFIELD_SEP),
},
},
@@ -1942,7 +1942,7 @@ func testOnStorITTestAttributeSubstituteIface(t *testing.T) {
Contexts: []string{"con1"},
Attributes: []*Attribute{
{
FieldName: "FN1",
FieldName: utils.MetaReq + utils.NestingSep + "FN1",
Value: config.NewRSRParsersMustCompile("Val1", true, utils.INFIELD_SEP),
},
},
@@ -1964,7 +1964,7 @@ func testOnStorITTestAttributeSubstituteIface(t *testing.T) {
}
attrProfile.Attributes = []*Attribute{
{
FieldName: "FN1",
FieldName: utils.MetaReq + utils.NestingSep + "FN1",
Value: config.NewRSRParsersMustCompile("123.123", true, utils.INFIELD_SEP),
},
}
@@ -1980,7 +1980,7 @@ func testOnStorITTestAttributeSubstituteIface(t *testing.T) {
}
attrProfile.Attributes = []*Attribute{
{
FieldName: "FN1",
FieldName: utils.MetaReq + utils.NestingSep + "FN1",
Value: config.NewRSRParsersMustCompile("true", true, utils.INFIELD_SEP),
},
}

View File

@@ -109,7 +109,7 @@ func alias2AtttributeProfile(alias *v1Alias, defaultTenant string) *engine.Attri
fieldName = utils.MetaTenant
}
attr := &engine.Attribute{
FieldName: fieldName,
FieldName: utils.MetaReq + utils.NestingSep + fieldName,
Type: utils.MetaVariable, //default type for Attribute
Value: config.NewRSRParsersMustCompile(substitute, true, utils.INFIELD_SEP),
}

View File

@@ -83,7 +83,7 @@ func fieldinfo2Attribute(attr []*engine.Attribute, fieldName, fieldInfo string)
return attr
}
return append(attr, &engine.Attribute{
FieldName: fieldName,
FieldName: utils.MetaReq + utils.NestingSep + fieldName,
Value: rp,
Type: utils.MetaVariable,
})

View File

@@ -63,7 +63,7 @@ func userProfile2attributeProfile(user *v1UserProfile) (attr *engine.AttributePr
}
if user.Tenant != attr.Tenant {
attr.Attributes = append(attr.Attributes, &engine.Attribute{
FieldName: utils.MetaTenant,
FieldName: utils.MetaReq + utils.NestingSep + utils.MetaTenant,
Value: config.NewRSRParsersMustCompile(user.Tenant, true, utils.INFIELD_SEP),
Type: utils.META_CONSTANT,
})
@@ -77,7 +77,7 @@ func userProfile2attributeProfile(user *v1UserProfile) (attr *engine.AttributePr
continue
}
attr.Attributes = append(attr.Attributes, &engine.Attribute{
FieldName: fieldName,
FieldName: utils.MetaReq + utils.NestingSep + fieldName,
Value: config.NewRSRParsersMustCompile(substitute, true, utils.INFIELD_SEP),
Type: utils.MetaVariable,
})