docs: public static ArrayDeque<JoinNode> queueJoinOrders(JoinNode joinNode, boolean findAll) {
          assert(joinNode != null);
  
          // Clone the original
          JoinNode clonedTree = (JoinNode) joinNode.clone();
          // Split join tree into a set of subtrees. The join type for all nodes in a subtree is the same
          List<JoinNode> subTrees = clonedTree.extractSubTrees();
          assert(!subTrees.isEmpty());
          // Generate possible join orders for each sub-tree separately
          ArrayList<List<JoinNode>> joinOrderList = generateJoinOrders(subTrees);
          // Reassemble the all possible combinations of the sub-tree and queue them
          ArrayDeque<JoinNode> joinOrders = new ArrayDeque<>();
          queueSubJoinOrders(joinOrderList, 0, new ArrayList<>(), joinOrders, findAll);
          return joinOrders;
      }