@Override
  public Result apply(ProjectNode parent, Captures captures, Context context) {
    N targetNode = captures.get(targetCapture);

    return pruneInputs(targetNode.getOutputSymbols(), parent.getAssignments().getExpressions())
        .flatMap(prunedOutputs -> this.pushDownProjectOff(context, targetNode, prunedOutputs))
        .map(newChild -> parent.replaceChildren(ImmutableList.of(newChild)))
        .map(Result::ofPlanNode)
        .orElse(Result.empty());
  }
@param <N> The node type to look for under the ProjectNode Looks for a Project parent over a N
    child, such that the parent doesn't use all the output columns of the child. Given that
    situation, invokes the pushDownProjectOff helper to possibly rewrite the child to produce
    fewer outputs.
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/ProjectOffPushDownRule.java