From 6764260be49cc354ab2be2755a1f484507a65486 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 15 Jan 2020 18:06:45 +0200 Subject: [PATCH] Added *req as requirement fro attributes FieldName --- config/navigablemap.go | 36 +++++++++ engine/attributes.go | 42 +++++++---- engine/attributes_test.go | 141 +++++++++++++++++++---------------- engine/libattributes_test.go | 12 +-- engine/libtest.go | 4 +- engine/loader_csv_test.go | 4 +- engine/model_helpers_test.go | 14 ++-- engine/onstor_it_test.go | 8 +- migrator/alias.go | 2 +- migrator/derived_chargers.go | 2 +- migrator/user.go | 4 +- 11 files changed, 164 insertions(+), 105 deletions(-) diff --git a/config/navigablemap.go b/config/navigablemap.go index 30ed581c4..9d3125349 100644 --- a/config/navigablemap.go +++ b/config/navigablemap.go @@ -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 + } +} diff --git a/engine/attributes.go b/engine/attributes.go index 6078256fd..ad6ef3630 100644 --- a/engine/attributes.go +++ b/engine/attributes.go @@ -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 } diff --git a/engine/attributes_test.go b/engine/attributes_test.go index d7d88ca43..e699cc5e4 100644 --- a/engine/attributes_test.go +++ b/engine/attributes_test.go @@ -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, "") diff --git a/engine/libattributes_test.go b/engine/libattributes_test.go index edd3a1577..f4c0a012f 100644 --- a/engine/libattributes_test.go +++ b/engine/libattributes_test.go @@ -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) diff --git a/engine/libtest.go b/engine/libtest.go index bfaa1d902..e49a0791f 100644 --- a/engine/libtest.go +++ b/engine/libtest.go @@ -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 diff --git a/engine/loader_csv_test.go b/engine/loader_csv_test.go index c5d87b6b6..ed5e887bc 100644 --- a/engine/loader_csv_test.go +++ b/engine/loader_csv_test.go @@ -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", }, diff --git a/engine/model_helpers_test.go b/engine/model_helpers_test.go index 9461bf020..6a5deb3f1 100644 --- a/engine/model_helpers_test.go +++ b/engine/model_helpers_test.go @@ -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", }, }, diff --git a/engine/onstor_it_test.go b/engine/onstor_it_test.go index 3326463bc..b39a81292 100644 --- a/engine/onstor_it_test.go +++ b/engine/onstor_it_test.go @@ -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), }, } diff --git a/migrator/alias.go b/migrator/alias.go index 621a31ebe..81a11b054 100644 --- a/migrator/alias.go +++ b/migrator/alias.go @@ -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), } diff --git a/migrator/derived_chargers.go b/migrator/derived_chargers.go index 1ff0dfb66..0204cb054 100644 --- a/migrator/derived_chargers.go +++ b/migrator/derived_chargers.go @@ -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, }) diff --git a/migrator/user.go b/migrator/user.go index 62d81ce51..51861af35 100644 --- a/migrator/user.go +++ b/migrator/user.go @@ -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, })