We need a method to detect and remove cycles in the join graph.
Should we add a method here to compute the join cardinality of the join graph that represents a JoinSubset in the enumeration? We could also do it inside the join optimizer. but it will be nice to abstract it at this level for generality.
Maybe also add a method to return the subset of the join graph that represents a JoinSubset (may not be needed) just for completeness? It will be needed for join cardinality computation anyway.