matcher.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. var index int
  19. if datas != nil {
  20. lock := &sync.Mutex{}
  21. matchPool := make(chan bool, poolSize)
  22. matchWaitGroup := &sync.WaitGroup{}
  23. for _, temp := range *datas {
  24. matchPool <- true
  25. matchWaitGroup.Add(1)
  26. go func(info map[string]interface{}) {
  27. defer util.Catch()
  28. defer func() {
  29. matchWaitGroup.Done()
  30. <-matchPool
  31. }()
  32. users, projectUsers := matcher.ToMatch(info)
  33. lock.Lock()
  34. defer lock.Unlock()
  35. if users != nil && len(*users) > 0 {
  36. for k, v := range *users {
  37. l := userMap[k]
  38. if l == nil {
  39. l = &SortList{}
  40. }
  41. *l = append(*l, &MatchInfo{
  42. Info: info,
  43. Keys: v.Keys,
  44. Items: v.Items,
  45. MatchWays: v.MatchWays,
  46. Extend: map[string]interface{}{},
  47. })
  48. userMap[k] = l
  49. }
  50. }
  51. if projectUsers != nil && len(*projectUsers) > 0 {
  52. for _, v := range *projectUsers {
  53. l := projectUserMap[v]
  54. if l == nil {
  55. l = &[]string{}
  56. }
  57. *l = append(*l, util.ObjToString(info["_id"]))
  58. projectUserMap[v] = l
  59. }
  60. }
  61. }(temp)
  62. index++
  63. if index%500 == 0 {
  64. logger.Info("匹配数据", index)
  65. }
  66. }
  67. matchWaitGroup.Wait()
  68. }
  69. logger.Info("匹配数据结束。。。", index)
  70. return &userMap, &projectUserMap
  71. }