func()

in vermeer/algorithms/cycle_detection.go [175:234]


func (cdw *CycleDetectionWorker) dfs(rootID serialize.SUint32, vertexID serialize.SUint32, stack []serialize.SUint32) {
	//logrus.Infof("root:%v, vID:%v, stack:%v", rootID, vertexID, stack)
	if len(stack) > cdw.maxLen {
		return
	}
	temp := make(map[serialize.SUint32]struct{}, len(stack))
	for _, node := range stack {
		if _, ok := temp[node]; ok {
			return
		}
		temp[node] = struct{}{}
	}

	for _, edge := range cdw.inEdges[vertexID] {
		if _, ok := temp[edge]; ok {
			continue
		}
		switch cdw.mode {
		case All:
			if cdw.WContext.GraphData.Vertex.GetVertex(uint32(rootID)).ID < cdw.WContext.GraphData.Vertex.GetVertex(uint32(edge)).ID {
				cdw.dfs(rootID, edge, append(stack, edge))
			} else if rootID == edge && len(stack) >= cdw.minLen {
				vIDx := uint32(rootID) - cdw.WContext.GraphData.VertIDStart
				newList := make([]serialize.SString, 0, len(stack))
				for _, node := range stack {
					newList = append(newList, serialize.SString(cdw.WContext.GraphData.Vertex.GetVertex(uint32(node)).ID))
				}
				cdw.cycleList[vIDx] = append(cdw.cycleList[vIDx], newList)
			}
		case Limit:
			vIDx := uint32(rootID) - cdw.WContext.GraphData.VertIDStart
			if len(cdw.cycleList[vIDx]) >= cdw.limit {
				return
			}
			if cdw.WContext.GraphData.Vertex.GetVertex(uint32(rootID)).ID < cdw.WContext.GraphData.Vertex.GetVertex(uint32(edge)).ID {
				cdw.dfs(rootID, edge, append(stack, edge))
			} else if rootID == edge && len(stack) >= cdw.minLen {
				vIDx := uint32(rootID) - cdw.WContext.GraphData.VertIDStart
				newList := make([]serialize.SString, 0, len(stack))
				for _, node := range stack {
					newList = append(newList, serialize.SString(cdw.WContext.GraphData.Vertex.GetVertex(uint32(node)).ID))
				}
				cdw.cycleList[vIDx] = append(cdw.cycleList[vIDx], newList)
				if len(cdw.cycleList[vIDx]) >= cdw.limit {
					return
				}
			}
		case Boolean:
			if cdw.hasCycle[uint32(rootID)-cdw.WContext.GraphData.VertIDStart] == 1 {
				return
			}
			if rootID != edge {
				cdw.dfs(rootID, edge, append(stack, edge))
			} else if len(stack) >= cdw.minLen {
				cdw.hasCycle[uint32(rootID)-cdw.WContext.GraphData.VertIDStart] = 1
				return
			}
		}
	}
}