Pārlūkot izejas kodu

[fix] duplicated push at sub2node

master
extra1563 4 gadus atpakaļ
vecāks
revīzija
a9e249cda5
1 mainītis faili ar 49 papildinājumiem un 84 dzēšanām
  1. 49
    84
      src/broker/modules/subscription.go

+ 49
- 84
src/broker/modules/subscription.go Parādīt failu

@@ -6,7 +6,7 @@ import (
6 6
 
7 7
 // Structure for managing subscriptions
8 8
 type sub_manager struct {
9
-	list 	   	topicList			// Data Structure for Manage TopicNode
9
+	list 	   	topicList		// Data Structure for Manage TopicNode
10 10
 	count_sub  	int                 // Subscription#
11 11
 	emptylist  	[]int               // For administrate Subscription#(Deleted)
12 12
 	ip2sub     	map[string][]int    // For mapping {ip : Sub#s List}
@@ -55,9 +55,9 @@ func (manager *sub_manager) isDuplicated(msg MsgUnit) bool{
55 55
 					valPtr := node.valNodeList[0]
56 56
 					if Compare(valPtr.val ,value) == 0{
57 57
 						op := operator[0]
58
-						cnt += findOperatorList(op, valPtr, sub, true)
58
+						cnt += valPtr.findOperatorList(op, sub, true)
59 59
 					}
60
-				} else { // value가 숫자일 때
60
+				} else {
61 61
 					leftop := operator[0]
62 62
 					logicalop := operator[1]
63 63
 					rightop := operator[2]
@@ -69,11 +69,11 @@ func (manager *sub_manager) isDuplicated(msg MsgUnit) bool{
69 69
 
70 70
 					if Compare(nodeValList, value) == 0 {
71 71
 						if logicalop == "&&" {
72
-							cnt += findOperatorList(leftop, leftValuePtr, sub, false)
73
-							cnt += findOperatorList(rightop, rightValuePtr, sub, false)
72
+							cnt += leftValuePtr.findOperatorList(leftop, sub, false)
73
+							cnt += rightValuePtr.findOperatorList(rightop, sub, false)
74 74
 						} else {
75
-							cnt += findOperatorList(leftop, leftValuePtr, sub, true)
76
-							cnt += findOperatorList(rightop, rightValuePtr, sub, true)
75
+							cnt += leftValuePtr.findOperatorList(leftop, sub, true)
76
+							cnt += rightValuePtr.findOperatorList(rightop, sub, true)
77 77
 						}
78 78
 					}
79 79
 				}
@@ -87,44 +87,8 @@ func (manager *sub_manager) isDuplicated(msg MsgUnit) bool{
87 87
 	return canFind
88 88
 }
89 89
 
90
-// op와 같은 node내의 operator리스트에서 sub가 있다면 리턴
91
-func findOperatorList(op string, node *valueNode, sub int, issingle bool) int {
92
-	ret := -1
93
-	if issingle == true {
94
-		switch op {
95
-		case "<":
96
-			ret = findSub(node.single2sub_s, sub)
97
-		case "<=":
98
-			ret = findSub(node.single2sub_es, sub)
99
-		case ">":
100
-			ret = findSub(node.single2sub_b, sub)
101
-		case ">=":
102
-			ret = findSub(node.single2sub_eb, sub)
103
-		case "==":
104
-			ret = findSub(node.single2sub_e, sub)
105
-		}
106
-	} else {
107
-		switch op {
108
-		case "<":
109
-			ret = findSub(node.range2sub_s, sub)
110
-		case "<=":
111
-			ret = findSub(node.range2sub_es, sub)
112
-		case ">":
113
-			ret = findSub(node.range2sub_b, sub)
114
-		case ">=":
115
-			ret = findSub(node.range2sub_eb, sub)
116
-		}
117
-	}
118
-	if ret < 0{
119
-		return 0
120
-	} else{
121
-		return 1
122
-	}
123
-}
124
-
125
-//	### To Insert sub#
90
+// To Insert sub#
126 91
 func (manager *sub_manager) addSubscription(msg MsgUnit) error {
127
-
128 92
 	topic := msg.(SubscriptionMsg).Topic
129 93
 	value := msg.(SubscriptionMsg).Value
130 94
 	operator := msg.(SubscriptionMsg).Operator
@@ -138,7 +102,7 @@ func (manager *sub_manager) addSubscription(msg MsgUnit) error {
138 102
 	// 1. Mapping incoming IP address to sub #
139 103
 	if len(manager.emptylist) == 0 {
140 104
 		subnumber = manager.count_sub
141
-		manager.ip2sub[msg.(SubscriptionMsg).From] = append(manager.ip2sub[msg.(SubscriptionMsg).From], manager.count_sub)
105
+		manager.ip2sub[msg.(SubscriptionMsg).From] = append(manager.ip2sub[msg.(SubscriptionMsg).From], subnumber)
142 106
 		manager.sub2ip[subnumber] = msg.(SubscriptionMsg).From
143 107
 		manager.count_sub++
144 108
 	} else {
@@ -148,91 +112,93 @@ func (manager *sub_manager) addSubscription(msg MsgUnit) error {
148 112
 		manager.sub2ip[subnumber] = msg.(SubscriptionMsg).From
149 113
 	}
150 114
 
151
-	nameptr := manager.list.head
152
-	findOk := false
115
+	topicptr := manager.list.head
116
+	existTopic := false
153 117
 
154
-	// * 2. Add Subscription
118
+	// 2. Add Subscription
155 119
 
156
-	// Find name in namelist, add if not found
157
-	for nameptr != nil {
158
-		if Compare(nameptr.topic, topic) == 0 {
159
-			findOk = true
120
+	// Find topic in topiclist, add if not found
121
+	for topicptr != nil {
122
+		if Compare(topicptr.topic, topic) == 0 {
123
+			existTopic = true
160 124
 			break
161 125
 		}
162
-		nameptr = nameptr.next
126
+		topicptr = topicptr.next
163 127
 	}
164 128
 
165
-
166
-	if !findOk {
129
+	if !existTopic {
167 130
 		manager.list.addTopicNode(topic)
168
-		nameptr = manager.list.tail
131
+		topicptr = manager.list.tail
169 132
 	}
170 133
 
171 134
 	var addValNodeList []*valueNode
172 135
 
173
-	// Add Value to list[name]
174
-	if len(operator) == 1 { // if single expression
175
-		valptr := nameptr.list.getValueNodePos(value)
136
+	// if single expression
137
+	if len(operator) == 1 {
138
+		valptr := topicptr.list.getValueNodePos(value)
139
+		op := operator[0]
140
+
176 141
 		if valptr == nil {
177
-			nameptr.list.addValueNode(value)
178
-			valptr = nameptr.list.tail
142
+			topicptr.list.addValueNode(value)
143
+			valptr = topicptr.list.tail
179 144
 		}
145
+
180 146
 		addValNodeList = append(addValNodeList, valptr)
181 147
 		manager.sub2node[subnumber] = append(manager.sub2node[subnumber], nodeInfo{addValNodeList, topic})
182 148
 		manager.israngesub[subnumber] = false
183
-		valptr.insertSub(operator[0], subnumber, true)
149
+		valptr.insertSub(op, subnumber, true)
150
+
184 151
 		return nil // AddSubscription ok
185 152
 	} else {
186
-		// {">" "&&" "<"}
187
-		// For compound expressions bounded by '&&' and '||'
188
-		// (ex) { (234 < x) && (x <= 1293) } , { (234 < x) || ( x < 1293) }
153
+		// if Multi expression
154
+		// (ex) : { (234 < x) && (x <= 1293) } , { (234 < x) || (x < 1293) }
189 155
 
190
-		logical_operator := operator[1]
156
+		leftOperator := operator[0]
157
+		logicalOperator := operator[1] // For compound expressions bounded by '&&' and '||'
158
+		rightOperator := operator[2]
191 159
 
192
-		// Find ValueNode = (namelist[name].list.val == Value)
193
-		valptr1 := nameptr.list.getValueNodePos([]int64{value[0]})
194
-		valptr2 := nameptr.list.getValueNodePos([]int64{value[1]})
160
+		// Find ValueNode = (topiclist[topic].list.val == value)
161
+		valptr1 := topicptr.list.getValueNodePos([]int64{value[0]})
162
+		valptr2 := topicptr.list.getValueNodePos([]int64{value[1]})
195 163
 
196 164
 		if valptr1 == nil {
197
-			nameptr.list.addValueNode([]int64{value[0]})
198
-			valptr1 = nameptr.list.tail
165
+			topicptr.list.addValueNode([]int64{value[0]})
166
+			valptr1 = topicptr.list.tail
199 167
 		}
200 168
 		if valptr2 == nil {
201
-			nameptr.list.addValueNode([]int64{value[1]})
202
-			valptr2 = nameptr.list.tail
169
+			topicptr.list.addValueNode([]int64{value[1]})
170
+			valptr2 = topicptr.list.tail
203 171
 		}
172
+
204 173
 		addValNodeList = append(addValNodeList, valptr1)
205 174
 		addValNodeList = append(addValNodeList, valptr2)
206 175
 		manager.sub2node[subnumber] = append(manager.sub2node[subnumber], nodeInfo{addValNodeList, topic})
207
-		manager.sub2node[subnumber] = append(manager.sub2node[subnumber], nodeInfo{addValNodeList, topic})
208 176
 
209
-		if logical_operator == "&&" {
177
+		if logicalOperator == "&&" {
210 178
 			// If they are enclosed in '&&' -> Insert Value to range_operator_list
211 179
 			manager.israngesub[subnumber] = true
212
-			valptr1.insertSub(operator[0], subnumber, false)
213
-			valptr2.insertSub(operator[2], subnumber, false)
180
+			valptr1.insertSub(leftOperator, subnumber, false)
181
+			valptr2.insertSub(rightOperator, subnumber, false)
214 182
 
215 183
 		} else {
216 184
 			// if they are enclosed in '||' -> Insert Value to single_operator_list
217 185
 			manager.israngesub[subnumber] = false
218
-			valptr1.insertSub(operator[0], subnumber, true)
219
-			valptr2.insertSub(operator[2], subnumber, true)
186
+			valptr1.insertSub(leftOperator, subnumber, true)
187
+			valptr2.insertSub(rightOperator, subnumber, true)
220 188
 		}
221
-
222 189
 		return nil // addSubscription ok
223 190
 	}
224 191
 	return errors.New("Can't addSubscription")
225 192
 }
226 193
 
227
-// To delete subscription
194
+// To delete subscriptions
228 195
 func (manager *sub_manager) delete(from string) error {
229
-
230 196
 	ip := from
231 197
 	cand := manager.ip2sub[ip]
232 198
 
233 199
 	for i := 0; i < len(cand); i++ {
234
-
235 200
 		sub := cand[i]
201
+
236 202
 		for j := 0; j < len(manager.sub2node[sub]); j++ {
237 203
 			nodeinfo := manager.sub2node[sub][j]
238 204
 			node := nodeinfo.valNodeList
@@ -294,7 +260,6 @@ func (manager *sub_manager) delete(from string) error {
294 260
 						node[k].single2sub_e = remove(node[k].single2sub_e, pos)
295 261
 						manager.emptylist = append(manager.emptylist, sub)
296 262
 					}
297
-
298 263
 				}
299 264
 			}
300 265
 		}

Notiek ielāde…
Atcelt
Saglabāt