code: protected Stream<Push> findPushesInSelectedSubtree(IntermediateQuery query, QueryNode subtreeRoot,
                                                              JoinOrFilterNode providerNode,
                                                              ImmutableExpression expression) {
  
          if (subtreeRoot instanceof CommutativeJoinOrFilterNode) {
              return findPushesInCommutativeJoinOrFilterRootedSubtree((CommutativeJoinOrFilterNode) subtreeRoot, expression);
          }
  
          if (subtreeRoot instanceof LeafIQTree) {
              return Stream.of(getProviderAsPush(providerNode, expression));
          }
          if (subtreeRoot instanceof LeftJoinNode) {
              return Stream.of(findPushInLeftJoinRootedSubtree(query, expression, providerNode, (LeftJoinNode) subtreeRoot));
          }
          if (subtreeRoot instanceof UnionNode) {
              return findPushesInUnionNodeRootedSubtree(query, expression, (UnionNode) subtreeRoot);
          }
          if (subtreeRoot instanceof ConstructionNode) {
              return Stream.of(findPushInConstructionNodeRootedSubtree(query, expression, (ConstructionNode) subtreeRoot));
          }
          /*
           * for GroupNodes only (not supported yet) ?
           */
          else {
              return findPushesInUnexpectedNodeRootedSubtree(query, expression, providerNode, subtreeRoot);
          }
      }
docs: TODO: explain