private boolean doPushDown(PlanNode node, PlanNode child) {
      boolean columnInjectPushDown = true;
      if (child instanceof SeriesAggregationSourceNode) {
        ((SeriesAggregationSourceNode) child).setOutputEndTime(true);
      } else if (child instanceof SlidingWindowAggregationNode) {
        ((SlidingWindowAggregationNode) child).setOutputEndTime(true);
      } else if (child instanceof AggregationNode) {
        ((AggregationNode) child).setOutputEndTime(true);
      } else if (child instanceof RawDataAggregationNode) {
        ((RawDataAggregationNode) child).setOutputEndTime(true);
      } else if (child instanceof ProjectNode) {
        ProjectNode projectNode = (ProjectNode) child;
        boolean pushDownToChild = doPushDown(child, projectNode.getChild());
        if (pushDownToChild) {
          projectNode.setOutputColumnNames(node.getOutputColumnNames());
        }
        return pushDownToChild;
      } else {
        columnInjectPushDown = false;
      }
      return columnInjectPushDown;
    }
<b>Optimization phase:</b> Distributed plan planning.

<p><b>Rules:</b>
<pre>1.
       ColumnInject
            |              ->  SeriesAggregationSource
 SeriesAggregationSource
<pre>2.
       ColumnInject
            |              ->        Aggregation
       Aggregation
<pre>3.
       ColumnInject
            |              ->     RawDataAggregation
    RawDataAggregation
<pre>4.
       ColumnInject
            |              ->  SlidingWindowAggregation
 SlidingWindowAggregation
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/ColumnInjectionPushDown.java