code: func (e *joinReOrderSolver) walkGraphAndComposeJoin(u int) {
  	e.visited[u] = true
  	for _, edge := range e.graph[u] {
  		v := edge.nodeID
  		if !e.visited[v] {
  			e.resultJoin = e.newJoin(e.resultJoin, e.group[v])
  			e.walkGraphAndComposeJoin(v)
  		}
  	}
  }
docs: // walkGraph implements a dfs algorithm. Each time it picks a edge with lowest rate, which has been sorted before.