code: private Optional<PushUpBooleanExpressionProposal> adjustProposal(PushUpBooleanExpressionProposal proposal,
                                                              IntermediateQuery query) {
  
          QueryNode currentNode = proposal.getUpMostPropagatingNode();
          Optional<QueryNode> optChild;
          // Will be removed from the list of inbetween projectors
          ImmutableSet.Builder<ExplicitVariableProjectionNode> removedProjectors = ImmutableSet.builder();
  
          while ((optChild = query.getFirstChild(currentNode)).isPresent()) {
              if (currentNode instanceof ConstructionNode || currentNode instanceof  QueryModifierNode) {
                  if(currentNode instanceof ConstructionNode) {
                      removedProjectors.add((ConstructionNode) currentNode);
                  }
                  currentNode = optChild.get();
                  continue;
              }
              // Note that the iteration is stopped (among other) by any binary operator
              break;
          }
          // If we went back to the provider node
          if(proposal.getProvider2NonPropagatedExpressionMap().keySet().contains(currentNode)){
              return Optional.empty();
          }
          // adjust the upmost propagating node
          QueryNode upMostPropagatingNode = currentNode;
          // if it it a filter or join, use it as a recipient for the expression
          Optional<JoinOrFilterNode> recipient = currentNode instanceof CommutativeJoinOrFilterNode ?
                  Optional.of((JoinOrFilterNode) currentNode) :
                  Optional.empty();
          // update inbetween projectors
          ImmutableSet<ExplicitVariableProjectionNode> inbetweenProjectors = computeDifference(
                  proposal.getInbetweenProjectors(),
                  removedProjectors.build()
          );
  
          return Optional.of(
                  new PushUpBooleanExpressionProposalImpl(
                      proposal.getPropagatedExpression(),
                      proposal.getProvider2NonPropagatedExpressionMap(),
                      upMostPropagatingNode,
                      recipient,
                      inbetweenProjectors
                  ));
      }
docs: If the expression was blocked by a union or the root of the query