matcher.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package matcher
  2. import (
  3. "sync"
  4. util "app.yhyue.com/moapp/jybase/common"
  5. "app.yhyue.com/moapp/jybase/logger"
  6. . "bp.jydev.jianyu360.cn/BaseService/pushpkg/p"
  7. )
  8. type Matcher interface {
  9. Match(poolSize int, datas *[]map[string]interface{}) (*map[*UserInfo]*SortList, *map[*UserInfo]*[]string)
  10. ToMatch(info map[string]interface{}) (*map[*UserInfo]*MatchUser, *[]*UserInfo)
  11. }
  12. //
  13. func EachFoMatch(matcher Matcher, poolSize int, datas *[]map[string]interface{}) (*map[*UserInfo]*SortList, *map[*UserInfo]*[]string) {
  14. defer util.Catch()
  15. logger.Info("开始匹配数据。。。")
  16. userMap := map[*UserInfo]*SortList{}
  17. projectUserMap := map[*UserInfo]*[]string{}
  18. lock := &sync.Mutex{}
  19. var index int
  20. matchPool := make(chan bool, poolSize)
  21. matchWaitGroup := &sync.WaitGroup{}
  22. for _, temp := range *datas {
  23. matchPool <- true
  24. matchWaitGroup.Add(1)
  25. go func(info map[string]interface{}) {
  26. defer util.Catch()
  27. defer func() {
  28. matchWaitGroup.Done()
  29. <-matchPool
  30. }()
  31. users, projectUsers := matcher.ToMatch(info)
  32. lock.Lock()
  33. defer lock.Unlock()
  34. if users != nil && len(*users) > 0 {
  35. for k, v := range *users {
  36. l := userMap[k]
  37. if l == nil {
  38. l = &SortList{}
  39. }
  40. *l = append(*l, &MatchInfo{
  41. Info: info,
  42. Keys: v.Keys,
  43. Items: v.Items,
  44. MatchWays: v.MatchWays,
  45. })
  46. userMap[k] = l
  47. }
  48. }
  49. if projectUsers != nil && len(*projectUsers) > 0 {
  50. for _, v := range *projectUsers {
  51. l := projectUserMap[v]
  52. if l == nil {
  53. l = &[]string{}
  54. }
  55. *l = append(*l, util.ObjToString(info["_id"]))
  56. projectUserMap[v] = l
  57. }
  58. }
  59. }(temp)
  60. index++
  61. if index%500 == 0 {
  62. logger.Info("匹配数据", index)
  63. }
  64. }
  65. matchWaitGroup.Wait()
  66. logger.Info("匹配数据结束。。。", index)
  67. return &userMap, &projectUserMap
  68. }