From 909f97cfb6f7be3200a6a1706a58e918a26552eb Mon Sep 17 00:00:00 2001 From: DanB Date: Fri, 8 Jun 2018 19:35:32 +0200 Subject: [PATCH] Inline filters cached via datamanager, simplified definition --- apier/v1/filter_indexes.go | 45 -------------------------- engine/datamanager.go | 51 +++-------------------------- engine/filters.go | 66 ++++++++++++++------------------------ 3 files changed, 29 insertions(+), 133 deletions(-) diff --git a/apier/v1/filter_indexes.go b/apier/v1/filter_indexes.go index ad3252917..fcfeb5269 100644 --- a/apier/v1/filter_indexes.go +++ b/apier/v1/filter_indexes.go @@ -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 { diff --git a/engine/datamanager.go b/engine/datamanager.go index ff3d29b30..0b8899131 100644 --- a/engine/datamanager.go +++ b/engine/datamanager.go @@ -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 { diff --git a/engine/filters.go b/engine/filters.go index e90663322..ccb427295 100644 --- a/engine/filters.go +++ b/engine/filters.go @@ -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