mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
Added *req as requirement fro attributes FieldName
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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, "")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
},
|
||||
|
||||
@@ -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),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user