filter/condition_filter.go (69 lines of code) (raw):
package filter
import (
"errors"
"fmt"
"github.com/alibaba/pairec/v2/log"
"github.com/alibaba/pairec/v2/module"
"github.com/alibaba/pairec/v2/recconf"
)
type ConditionFilterItem struct {
filterParam *module.FilterParam
filterName string
}
type ConditionFilter struct {
filterItems []*ConditionFilterItem
defaultFitlerName string
}
func NewConditionFilter(config recconf.FilterConfig) *ConditionFilter {
var items []*ConditionFilterItem
for _, item := range config.ConditionFilterConfs.FilterConfs {
filterItem := ConditionFilterItem{
filterName: item.FilterName,
}
if len(item.Conditions) > 0 {
filterItem.filterParam = module.NewFilterParamWithConfig(item.Conditions)
}
items = append(items, &filterItem)
}
filter := ConditionFilter{
defaultFitlerName: config.ConditionFilterConfs.DefaultFilterName,
filterItems: items,
}
return &filter
}
func (f *ConditionFilter) Filter(filterData *FilterData) error {
if _, ok := filterData.Data.([]*module.Item); !ok {
return errors.New("filter data type error")
}
userProperties := filterData.User.MakeUserFeatures2()
for _, item := range f.filterItems {
if item.filterParam != nil {
if flag, err := item.filterParam.EvaluateByDomain(userProperties, nil); err == nil {
// if match condition
if flag {
filter, err := GetFilter(item.filterName)
if err != nil {
log.Error(fmt.Sprintf("requestId=%s\tmodule=ConditionFilter\tfilterName=%s\terror=%v", filterData.Context.RecommendId, item.filterName, err))
return err
}
log.Info(fmt.Sprintf("requestId=%s\tmodule=ConditionFilter\tfilterName=%s", filterData.Context.RecommendId, item.filterName))
return filter.Filter(filterData)
}
} else {
log.Error(fmt.Sprintf("requestId=%s\tmodule=ConditionFilter\tfilterName=%s\terror=%v", filterData.Context.RecommendId, item.filterName, err))
}
}
}
if len(f.defaultFitlerName) > 0 {
filter, err := GetFilter(f.defaultFitlerName)
if err != nil {
log.Error(fmt.Sprintf("requestId=%s\tmodule=ConditionFilter\tdefaultFilterName=%s\terror=%v", filterData.Context.RecommendId, f.defaultFitlerName, err))
return err
}
log.Info(fmt.Sprintf("requestId=%s\tmodule=ConditionFilter\tfilterName=%s", filterData.Context.RecommendId, f.defaultFitlerName))
return filter.Filter(filterData)
}
return nil
}
func (f *ConditionFilter) MatchTag(tag string) bool {
// default filter, so filter all tag
return true
}