Project Moscato Team Messaging Middleware Implemetation Message Middleware by Golang Operate as Secure, Effectively
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

matching.go 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package modules
  2. import (
  3. "errors"
  4. _ "errors"
  5. "fmt"
  6. "github.com/juliangruber/go-intersect"
  7. "reflect"
  8. )
  9. type match_manager struct {
  10. match_count int
  11. }
  12. // Matching -> Return (list of IP addresses of matched subs, Pub Msg, error)
  13. func (moscato *Moscato) Matching() {
  14. msg := moscato.queue.pop(true)
  15. topic := msg.(PublishMsg).Topic
  16. value := msg.(PublishMsg).Value
  17. sub_mng := moscato.SubscriptionManager
  18. fmt.Println("matchßing st")
  19. fmt.Println("value = ", value)
  20. // listß
  21. ret := make([]string, 0)
  22. // list for matched range subscriptions
  23. big := make([]int, 0)
  24. small := make([]int, 0)
  25. // 1. Find (topicNode[Topic] == msg.Topic) Node
  26. topicPtr := sub_mng.list
  27. pos := topicPtr.getTopicNodePos(topic)
  28. // Don't Exist topicNode
  29. if pos == nil {
  30. moscato.SendQueue <- myType{nil, msg, errors.New("Don't Exist Matching Topic")}
  31. } else {
  32. // 2. Traverse all valueNode -> and Match
  33. valPtr := pos.list.head
  34. for valPtr != nil {
  35. compare := Compare(valPtr.val, value)
  36. if compare < 0 { // sub.val > pub.val
  37. // single : { >, >= }
  38. // (1) case : >
  39. for i := 0; i < len(valPtr.single2sub_b); i++ {
  40. sub := valPtr.single2sub_b[i]
  41. ip := sub_mng.sub2ip[sub]
  42. ret = append(ret, ip)
  43. }
  44. // (2) case : >=
  45. for i := 0; i < len(valPtr.single2sub_eb); i++ {
  46. sub := valPtr.single2sub_eb[i]
  47. ip := sub_mng.sub2ip[sub]
  48. ret = append(ret, ip)
  49. }
  50. // range : { >, >= }
  51. // (1) case : >
  52. for i := 0; i < len(valPtr.range2sub_b); i++ {
  53. sub := valPtr.range2sub_b[i]
  54. big = append(big, sub)
  55. }
  56. // (2) case : >=
  57. for i := 0; i < len(valPtr.range2sub_eb); i++ {
  58. sub := valPtr.range2sub_eb[i]
  59. big = append(big, sub)
  60. }
  61. } else if compare > 0 { // sub.val < pub.val
  62. // single : { <, <= }
  63. // (1) case : <
  64. for i := 0; i < len(valPtr.single2sub_s); i++ {
  65. sub := valPtr.single2sub_s[i]
  66. ip := sub_mng.sub2ip[sub]
  67. ret = append(ret, ip)
  68. }
  69. // (2) case : <=
  70. for i := 0; i < len(valPtr.single2sub_es); i++ {
  71. sub := valPtr.single2sub_es[i]
  72. ip := sub_mng.sub2ip[sub]
  73. ret = append(ret, ip)
  74. }
  75. // range : { <, <= }
  76. // (1) case : <
  77. for i := 0; i < len(valPtr.range2sub_s); i++ {
  78. sub := valPtr.range2sub_s[i]
  79. small = append(small, sub)
  80. }
  81. // (2) case : <=
  82. for i := 0; i < len(valPtr.range2sub_es); i++ {
  83. sub := valPtr.range2sub_es[i]
  84. small = append(small, sub)
  85. }
  86. } else { // sub.val == pub.val
  87. // single : { <=, >=, ==}
  88. // (1) case : <=
  89. for i := 0; i < len(valPtr.single2sub_es); i++ {
  90. sub := valPtr.single2sub_es[i]
  91. ip := sub_mng.sub2ip[sub]
  92. ret = append(ret, ip)
  93. }
  94. // (2) case : >=
  95. for i := 0; i < len(valPtr.single2sub_eb); i++ {
  96. sub := valPtr.single2sub_eb[i]
  97. ip := sub_mng.sub2ip[sub]
  98. ret = append(ret, ip)
  99. }
  100. // (3) case : ==
  101. for i := 0; i < len(valPtr.single2sub_e); i++ {
  102. sub := valPtr.single2sub_e[i]
  103. ip := sub_mng.sub2ip[sub]
  104. ret = append(ret, ip)
  105. }
  106. // range : { <=, >= }
  107. // (1) case : <=
  108. for i := 0; i < len(valPtr.range2sub_es); i++ {
  109. sub := valPtr.range2sub_es[i]
  110. small = append(small, sub)
  111. }
  112. // (2) case : >=
  113. for i := 0; i < len(valPtr.range2sub_eb); i++ {
  114. sub := valPtr.range2sub_eb[i]
  115. big = append(big, sub)
  116. }
  117. }
  118. valPtr = valPtr.next
  119. }
  120. //fmt.Println("hi")
  121. // Add the intersection IP address of two sets (large and small) to the return list
  122. hash := intersect.Hash(small, big)
  123. list := reflect.ValueOf(hash)
  124. for i := 0; i < list.Len(); i++ {
  125. sub := list.Index(i).Interface().(int)
  126. ip := sub_mng.sub2ip[sub]
  127. ret = append(ret, ip)
  128. }
  129. fmt.Println("Big =", big)
  130. fmt.Println("small =", small)
  131. fmt.Println("matching: ", ret)
  132. moscato.MatchingManager.match_count++
  133. moscato.SendQueue <- myType{ret, msg, nil}
  134. }
  135. }