protected List<Expression> getReconstructedChildren(
      FunctionExpression functionExpression, C context) {
    List<Expression> expressions = functionExpression.getExpressions();

    int childrenStartIndex = 0;
    // just process first input Expression of COUNT_IF
    int childrenEndIndex =
        SqlConstant.COUNT_IF.equalsIgnoreCase(functionExpression.getFunctionName())
            ? 1
            : expressions.size();

    List<Expression> reconstructedChildren = new ArrayList<>();
    for (int i = childrenStartIndex; i < childrenEndIndex; i++) {
      // process each child
      reconstructedChildren.add(process(expressions.get(i), context));
    }
    for (int i = childrenEndIndex; i < expressions.size(); i++) {
      // just copy attributes, e.g. [keep > 1] in COUNT_IF
      reconstructedChildren.add(expressions.get(i));
    }
    return reconstructedChildren;
  }
Collect result from child, then reconstruct. For example, two child each give me 1 result, I
should use them to reconstruct 1 new result to upper level.
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ReconstructVisitor.java