docs: public PlanNode findAtOrBelow( Traversal order,
                                     Set<Type> typesToFind ) {
          LinkedList<PlanNode> queue = new LinkedList<PlanNode>();
          queue.add(this);
          while (!queue.isEmpty()) {
              PlanNode aNode = queue.poll();
              switch (order) {
                  case LEVEL_ORDER:
                      if (typesToFind.contains(aNode.getType())) {
                          return aNode;
                      }
                      queue.addAll(aNode.getChildren());
                      break;
                  case PRE_ORDER:
                      if (typesToFind.contains(aNode.getType())) {
                          return aNode;
                      }
                      queue.addAll(0, aNode.getChildren());
                      break;
                  case POST_ORDER:
                      queue.addAll(0, aNode.getChildren());
                      if (typesToFind.contains(aNode.getType())) {
                          return aNode;
                      }
                      break;
              }
          }
          return null;
      }