mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-16 21:59:53 +05:00
Inline filters cached via datamanager, simplified definition
This commit is contained in:
@@ -419,15 +419,6 @@ func (self *ApierV1) computeThresholdIndexes(tenant string, thIDs *[]string, tra
|
||||
},
|
||||
},
|
||||
}
|
||||
} else if strings.HasPrefix(fltrID, utils.Meta) {
|
||||
inFltr, err := engine.NewInlineFilter(fltrID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
fltr, err = inFltr.AsFilter(th.Tenant)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else if fltr, err = self.DataManager.GetFilter(th.Tenant, fltrID,
|
||||
false, utils.NonTransactional); err != nil {
|
||||
if err == utils.ErrNotFound {
|
||||
@@ -494,15 +485,6 @@ func (self *ApierV1) computeAttributeIndexes(tenant string, attrIDs *[]string, t
|
||||
},
|
||||
},
|
||||
}
|
||||
} else if strings.HasPrefix(fltrID, utils.Meta) {
|
||||
inFltr, err := engine.NewInlineFilter(fltrID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
fltr, err = inFltr.AsFilter(ap.Tenant)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else if fltr, err = self.DataManager.GetFilter(ap.Tenant, fltrID,
|
||||
false, utils.NonTransactional); err != nil {
|
||||
if err == utils.ErrNotFound {
|
||||
@@ -569,15 +551,6 @@ func (self *ApierV1) computeResourceIndexes(tenant string, rsIDs *[]string, tran
|
||||
},
|
||||
},
|
||||
}
|
||||
} else if strings.HasPrefix(fltrID, utils.Meta) {
|
||||
inFltr, err := engine.NewInlineFilter(fltrID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
fltr, err = inFltr.AsFilter(rp.Tenant)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else if fltr, err = self.DataManager.GetFilter(rp.Tenant, fltrID,
|
||||
false, utils.NonTransactional); err != nil {
|
||||
if err == utils.ErrNotFound {
|
||||
@@ -644,15 +617,6 @@ func (self *ApierV1) computeStatIndexes(tenant string, stIDs *[]string, transact
|
||||
},
|
||||
},
|
||||
}
|
||||
} else if strings.HasPrefix(fltrID, utils.Meta) {
|
||||
inFltr, err := engine.NewInlineFilter(fltrID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
fltr, err = inFltr.AsFilter(sqp.Tenant)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else if fltr, err = self.DataManager.GetFilter(sqp.Tenant, fltrID,
|
||||
false, utils.NonTransactional); err != nil {
|
||||
if err == utils.ErrNotFound {
|
||||
@@ -719,15 +683,6 @@ func (self *ApierV1) computeSupplierIndexes(tenant string, sppIDs *[]string, tra
|
||||
},
|
||||
},
|
||||
}
|
||||
} else if strings.HasPrefix(fltrID, utils.Meta) {
|
||||
inFltr, err := engine.NewInlineFilter(fltrID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
fltr, err = inFltr.AsFilter(spp.Tenant)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else if fltr, err = self.DataManager.GetFilter(spp.Tenant, fltrID,
|
||||
false, utils.NonTransactional); err != nil {
|
||||
if err == utils.ErrNotFound {
|
||||
|
||||
@@ -314,7 +314,11 @@ func (dm *DataManager) GetFilter(tenant, id string,
|
||||
return x.(*Filter), nil
|
||||
}
|
||||
}
|
||||
fltr, err = dm.dataDB.GetFilterDrv(tenant, id)
|
||||
if strings.HasPrefix(id, utils.Meta) {
|
||||
fltr, err = NewFilterFromInline(tenant, id)
|
||||
} else {
|
||||
fltr, err = dm.dataDB.GetFilterDrv(tenant, id)
|
||||
}
|
||||
if err != nil {
|
||||
if err == utils.ErrNotFound {
|
||||
Cache.Set(utils.CacheFilters, tntID, nil, nil,
|
||||
@@ -448,15 +452,6 @@ func (dm *DataManager) SetThresholdProfile(th *ThresholdProfile, withIndex bool)
|
||||
},
|
||||
},
|
||||
}
|
||||
} else if strings.HasPrefix(fltrID, utils.Meta) {
|
||||
inFltr, err := NewInlineFilter(fltrID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fltr, err = inFltr.AsFilter(th.Tenant)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else if fltr, err = dm.GetFilter(th.Tenant, fltrID,
|
||||
false, utils.NonTransactional); err != nil {
|
||||
if err == utils.ErrNotFound {
|
||||
@@ -566,15 +561,6 @@ func (dm *DataManager) SetStatQueueProfile(sqp *StatQueueProfile, withIndex bool
|
||||
},
|
||||
},
|
||||
}
|
||||
} else if strings.HasPrefix(fltrID, utils.Meta) {
|
||||
inFltr, err := NewInlineFilter(fltrID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fltr, err = inFltr.AsFilter(sqp.Tenant)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else if fltr, err = dm.GetFilter(sqp.Tenant, fltrID,
|
||||
false, utils.NonTransactional); err != nil {
|
||||
if err == utils.ErrNotFound {
|
||||
@@ -768,15 +754,6 @@ func (dm *DataManager) SetResourceProfile(rp *ResourceProfile, withIndex bool) (
|
||||
},
|
||||
},
|
||||
}
|
||||
} else if strings.HasPrefix(fltrID, utils.Meta) {
|
||||
inFltr, err := NewInlineFilter(fltrID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fltr, err = inFltr.AsFilter(rp.Tenant)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else if fltr, err = dm.GetFilter(rp.Tenant, fltrID,
|
||||
false, utils.NonTransactional); err != nil {
|
||||
if err == utils.ErrNotFound {
|
||||
@@ -1267,15 +1244,6 @@ func (dm *DataManager) SetSupplierProfile(supp *SupplierProfile, withIndex bool)
|
||||
},
|
||||
},
|
||||
}
|
||||
} else if strings.HasPrefix(fltrID, utils.Meta) {
|
||||
inFltr, err := NewInlineFilter(fltrID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fltr, err = inFltr.AsFilter(supp.Tenant)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else if fltr, err = dm.GetFilter(supp.Tenant, fltrID,
|
||||
false, utils.NonTransactional); err != nil {
|
||||
if err == utils.ErrNotFound {
|
||||
@@ -1413,15 +1381,6 @@ func (dm *DataManager) SetAttributeProfile(ap *AttributeProfile, withIndex bool)
|
||||
},
|
||||
},
|
||||
}
|
||||
} else if strings.HasPrefix(fltrID, utils.Meta) {
|
||||
inFltr, err := NewInlineFilter(fltrID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fltr, err = inFltr.AsFilter(ap.Tenant)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else if fltr, err = dm.GetFilter(ap.Tenant, fltrID,
|
||||
false, utils.NonTransactional); err != nil {
|
||||
if err == utils.ErrNotFound {
|
||||
|
||||
@@ -71,36 +71,6 @@ func (fS *FilterS) connStatS() (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func NewInlineFilter(content string) (f *InlineFilter, err error) {
|
||||
if len(strings.Split(content, utils.InInFieldSep)) != 3 {
|
||||
return nil, fmt.Errorf("parse error for string: <%s>", content)
|
||||
}
|
||||
contentSplit := strings.Split(content, utils.InInFieldSep)
|
||||
return &InlineFilter{Type: contentSplit[0], FieldName: contentSplit[1], FieldVal: contentSplit[2]}, nil
|
||||
}
|
||||
|
||||
type InlineFilter struct {
|
||||
Type string
|
||||
FieldName string
|
||||
FieldVal string
|
||||
}
|
||||
|
||||
//AsFilter convert InlineFilter to Filter
|
||||
func (inFtr *InlineFilter) AsFilter(tenant string) (f *Filter, err error) {
|
||||
f = &Filter{
|
||||
Tenant: tenant,
|
||||
ID: utils.MetaInline,
|
||||
Rules: make([]*FilterRule, 1),
|
||||
}
|
||||
rf := &FilterRule{Type: inFtr.Type, FieldName: inFtr.FieldName, Values: []string{inFtr.FieldVal}}
|
||||
if err := rf.CompileValues(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
f.Rules[0] = rf
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// PassFiltersForEvent will check all filters wihin filterIDs and require them passing for event
|
||||
// there should be at least one filter passing, ie: if filters are not active event will fail to pass
|
||||
func (fS *FilterS) PassFiltersForEvent(tenant string, ev map[string]interface{}, filterIDs []string) (pass bool, err error) {
|
||||
@@ -109,18 +79,9 @@ func (fS *FilterS) PassFiltersForEvent(tenant string, ev map[string]interface{},
|
||||
return true, nil
|
||||
}
|
||||
for _, fltrID := range filterIDs {
|
||||
var f *Filter
|
||||
if strings.HasPrefix(fltrID, utils.Meta) {
|
||||
inFtr, err := NewInlineFilter(fltrID)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
f, err = inFtr.AsFilter(tenant)
|
||||
} else {
|
||||
f, err = fS.dm.GetFilter(tenant, fltrID, false, utils.NonTransactional)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
f, err := fS.dm.GetFilter(tenant, fltrID, false, utils.NonTransactional)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if f.ActivationInterval != nil &&
|
||||
!f.ActivationInterval.IsActiveAtTime(time.Now()) { // not active
|
||||
@@ -157,6 +118,27 @@ func (fS *FilterS) PassFiltersForEvent(tenant string, ev map[string]interface{},
|
||||
return atLeastOneFilterPassing, nil
|
||||
}
|
||||
|
||||
// NewFilterFromInline parses an inline rule into a compiled Filter
|
||||
func NewFilterFromInline(tenant, inlnRule string) (f *Filter, err error) {
|
||||
ruleSplt := strings.Split(inlnRule, utils.InInFieldSep)
|
||||
if len(ruleSplt) != 3 {
|
||||
return nil, fmt.Errorf("inline parse error for string: <%s>", inlnRule)
|
||||
}
|
||||
f = &Filter{
|
||||
Tenant: tenant,
|
||||
ID: inlnRule,
|
||||
Rules: []*FilterRule{
|
||||
&FilterRule{
|
||||
Type: ruleSplt[0],
|
||||
FieldName: ruleSplt[1],
|
||||
Values: strings.Split(ruleSplt[2], utils.INFIELD_SEP)}},
|
||||
}
|
||||
if err = f.Compile(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
type Filter struct {
|
||||
Tenant string
|
||||
ID string
|
||||
|
||||
Reference in New Issue
Block a user