123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- package matcher
- import (
- "sync"
- util "app.yhyue.com/moapp/jybase/common"
- "app.yhyue.com/moapp/jybase/logger"
- . "bp.jydev.jianyu360.cn/BaseService/pushpkg/p"
- )
- type Matcher interface {
- Match(poolSize int, datas *[]map[string]interface{}) (*map[*UserInfo]*SortList, *map[*UserInfo]*[]string)
- ToMatch(info map[string]interface{}) (*map[*UserInfo]*MatchUser, *[]*UserInfo)
- }
- //
- func EachFoMatch(matcher Matcher, poolSize int, datas *[]map[string]interface{}) (*map[*UserInfo]*SortList, *map[*UserInfo]*[]string) {
- defer util.Catch()
- logger.Info("开始匹配数据。。。")
- userMap := map[*UserInfo]*SortList{}
- projectUserMap := map[*UserInfo]*[]string{}
- lock := &sync.Mutex{}
- var index int
- matchPool := make(chan bool, poolSize)
- matchWaitGroup := &sync.WaitGroup{}
- for _, temp := range *datas {
- matchPool <- true
- matchWaitGroup.Add(1)
- go func(info map[string]interface{}) {
- defer util.Catch()
- defer func() {
- matchWaitGroup.Done()
- <-matchPool
- }()
- users, projectUsers := matcher.ToMatch(info)
- lock.Lock()
- defer lock.Unlock()
- if users != nil && len(*users) > 0 {
- for k, v := range *users {
- l := userMap[k]
- if l == nil {
- l = &SortList{}
- }
- *l = append(*l, &MatchInfo{
- Info: info,
- Keys: v.Keys,
- Items: v.Items,
- MatchWays: v.MatchWays,
- })
- userMap[k] = l
- }
- }
- if projectUsers != nil && len(*projectUsers) > 0 {
- for _, v := range *projectUsers {
- l := projectUserMap[v]
- if l == nil {
- l = &[]string{}
- }
- *l = append(*l, util.ObjToString(info["_id"]))
- projectUserMap[v] = l
- }
- }
- }(temp)
- index++
- if index%500 == 0 {
- logger.Info("匹配数据", index)
- }
- }
- matchWaitGroup.Wait()
- logger.Info("匹配数据结束。。。", index)
- return &userMap, &projectUserMap
- }
|