Explorar el Código

[fix] duplicated push at sub2node

master
extra1563 hace 4 años
padre
commit
a9e249cda5
Se han modificado 1 ficheros con 49 adiciones y 84 borrados
  1. 49
    84
      src/broker/modules/subscription.go

+ 49
- 84
src/broker/modules/subscription.go Ver fichero

6
 
6
 
7
 // Structure for managing subscriptions
7
 // Structure for managing subscriptions
8
 type sub_manager struct {
8
 type sub_manager struct {
9
-	list 	   	topicList			// Data Structure for Manage TopicNode
9
+	list 	   	topicList		// Data Structure for Manage TopicNode
10
 	count_sub  	int                 // Subscription#
10
 	count_sub  	int                 // Subscription#
11
 	emptylist  	[]int               // For administrate Subscription#(Deleted)
11
 	emptylist  	[]int               // For administrate Subscription#(Deleted)
12
 	ip2sub     	map[string][]int    // For mapping {ip : Sub#s List}
12
 	ip2sub     	map[string][]int    // For mapping {ip : Sub#s List}
55
 					valPtr := node.valNodeList[0]
55
 					valPtr := node.valNodeList[0]
56
 					if Compare(valPtr.val ,value) == 0{
56
 					if Compare(valPtr.val ,value) == 0{
57
 						op := operator[0]
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
 					leftop := operator[0]
61
 					leftop := operator[0]
62
 					logicalop := operator[1]
62
 					logicalop := operator[1]
63
 					rightop := operator[2]
63
 					rightop := operator[2]
69
 
69
 
70
 					if Compare(nodeValList, value) == 0 {
70
 					if Compare(nodeValList, value) == 0 {
71
 						if logicalop == "&&" {
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
 						} else {
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
 	return canFind
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
 func (manager *sub_manager) addSubscription(msg MsgUnit) error {
91
 func (manager *sub_manager) addSubscription(msg MsgUnit) error {
127
-
128
 	topic := msg.(SubscriptionMsg).Topic
92
 	topic := msg.(SubscriptionMsg).Topic
129
 	value := msg.(SubscriptionMsg).Value
93
 	value := msg.(SubscriptionMsg).Value
130
 	operator := msg.(SubscriptionMsg).Operator
94
 	operator := msg.(SubscriptionMsg).Operator
138
 	// 1. Mapping incoming IP address to sub #
102
 	// 1. Mapping incoming IP address to sub #
139
 	if len(manager.emptylist) == 0 {
103
 	if len(manager.emptylist) == 0 {
140
 		subnumber = manager.count_sub
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
 		manager.sub2ip[subnumber] = msg.(SubscriptionMsg).From
106
 		manager.sub2ip[subnumber] = msg.(SubscriptionMsg).From
143
 		manager.count_sub++
107
 		manager.count_sub++
144
 	} else {
108
 	} else {
148
 		manager.sub2ip[subnumber] = msg.(SubscriptionMsg).From
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
 			break
124
 			break
161
 		}
125
 		}
162
-		nameptr = nameptr.next
126
+		topicptr = topicptr.next
163
 	}
127
 	}
164
 
128
 
165
-
166
-	if !findOk {
129
+	if !existTopic {
167
 		manager.list.addTopicNode(topic)
130
 		manager.list.addTopicNode(topic)
168
-		nameptr = manager.list.tail
131
+		topicptr = manager.list.tail
169
 	}
132
 	}
170
 
133
 
171
 	var addValNodeList []*valueNode
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
 		if valptr == nil {
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
 		addValNodeList = append(addValNodeList, valptr)
146
 		addValNodeList = append(addValNodeList, valptr)
181
 		manager.sub2node[subnumber] = append(manager.sub2node[subnumber], nodeInfo{addValNodeList, topic})
147
 		manager.sub2node[subnumber] = append(manager.sub2node[subnumber], nodeInfo{addValNodeList, topic})
182
 		manager.israngesub[subnumber] = false
148
 		manager.israngesub[subnumber] = false
183
-		valptr.insertSub(operator[0], subnumber, true)
149
+		valptr.insertSub(op, subnumber, true)
150
+
184
 		return nil // AddSubscription ok
151
 		return nil // AddSubscription ok
185
 	} else {
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
 		if valptr1 == nil {
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
 		if valptr2 == nil {
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
 		addValNodeList = append(addValNodeList, valptr1)
173
 		addValNodeList = append(addValNodeList, valptr1)
205
 		addValNodeList = append(addValNodeList, valptr2)
174
 		addValNodeList = append(addValNodeList, valptr2)
206
 		manager.sub2node[subnumber] = append(manager.sub2node[subnumber], nodeInfo{addValNodeList, topic})
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
 			// If they are enclosed in '&&' -> Insert Value to range_operator_list
178
 			// If they are enclosed in '&&' -> Insert Value to range_operator_list
211
 			manager.israngesub[subnumber] = true
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
 		} else {
183
 		} else {
216
 			// if they are enclosed in '||' -> Insert Value to single_operator_list
184
 			// if they are enclosed in '||' -> Insert Value to single_operator_list
217
 			manager.israngesub[subnumber] = false
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
 		return nil // addSubscription ok
189
 		return nil // addSubscription ok
223
 	}
190
 	}
224
 	return errors.New("Can't addSubscription")
191
 	return errors.New("Can't addSubscription")
225
 }
192
 }
226
 
193
 
227
-// To delete subscription
194
+// To delete subscriptions
228
 func (manager *sub_manager) delete(from string) error {
195
 func (manager *sub_manager) delete(from string) error {
229
-
230
 	ip := from
196
 	ip := from
231
 	cand := manager.ip2sub[ip]
197
 	cand := manager.ip2sub[ip]
232
 
198
 
233
 	for i := 0; i < len(cand); i++ {
199
 	for i := 0; i < len(cand); i++ {
234
-
235
 		sub := cand[i]
200
 		sub := cand[i]
201
+
236
 		for j := 0; j < len(manager.sub2node[sub]); j++ {
202
 		for j := 0; j < len(manager.sub2node[sub]); j++ {
237
 			nodeinfo := manager.sub2node[sub][j]
203
 			nodeinfo := manager.sub2node[sub][j]
238
 			node := nodeinfo.valNodeList
204
 			node := nodeinfo.valNodeList
294
 						node[k].single2sub_e = remove(node[k].single2sub_e, pos)
260
 						node[k].single2sub_e = remove(node[k].single2sub_e, pos)
295
 						manager.emptylist = append(manager.emptylist, sub)
261
 						manager.emptylist = append(manager.emptylist, sub)
296
 					}
262
 					}
297
-
298
 				}
263
 				}
299
 			}
264
 			}
300
 		}
265
 		}

Loading…
Cancelar
Guardar