public static FilterNode deserializeUseTemplate(
      ByteBuffer byteBuffer, TypeProvider typeProvider) {
    PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
    boolean fromWhere = ReadWriteIOUtils.readBool(byteBuffer);
    if (!fromWhere) {
      int outputExpressionsLength = ReadWriteIOUtils.readInt(byteBuffer);
      Expression[] outputExpressions = new Expression[outputExpressionsLength];
      for (int i = 0; i < outputExpressionsLength; ++i) {
        outputExpressions[i] = Expression.deserialize(byteBuffer);
      }
      Expression predicate = Expression.deserialize(byteBuffer);
      boolean keepNull = ReadWriteIOUtils.readBool(byteBuffer);
      Ordering scanOrder = Ordering.values()[ReadWriteIOUtils.readInt(byteBuffer)];
      return new FilterNode(planNodeId, outputExpressions, predicate, keepNull, scanOrder, false);
    } else {
      return new FilterNode(
          planNodeId,
          null,
          typeProvider.getTemplatedInfo().getPredicate(),
          typeProvider.getTemplatedInfo().isKeepNull(),
          typeProvider.getTemplatedInfo().getScanOrder(),
          true);
    }
  }
This construction method is only used in inner of class `FilterNode`.
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/process/FilterNode.java