matcher.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. Extend: map[string]interface{}{},
  46. })
  47. userMap[k] = l
  48. }
  49. }
  50. if projectUsers != nil && len(*projectUsers) > 0 {
  51. for _, v := range *projectUsers {
  52. l := projectUserMap[v]
  53. if l == nil {
  54. l = &[]string{}
  55. }
  56. *l = append(*l, util.ObjToString(info["_id"]))
  57. projectUserMap[v] = l
  58. }
  59. }
  60. }(temp)
  61. index++
  62. if index%500 == 0 {
  63. logger.Info("匹配数据", index)
  64. }
  65. }
  66. matchWaitGroup.Wait()
  67. logger.Info("匹配数据结束。。。", index)
  68. return &userMap, &projectUserMap
  69. }