Inline filters cached via datamanager, simplified definition

This commit is contained in:
DanB
2018-06-08 19:35:32 +02:00
parent 6f178bb38c
commit 909f97cfb6
3 changed files with 29 additions and 133 deletions

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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