public ExpressionProtos.WindowFunction toProtoBuf() {
    ExpressionProtos.WindowFunction.Builder builder = ExpressionProtos.WindowFunction.newBuilder();
    builder.setProject(project);
    builder.setName(name);
    builder.setIsDistinct(distinct);

    for (ScalarExpression param : parameters) {
      builder.addParameters(param.toProtoBuf());
    }

    for (ScalarExpression pb : partitionBy) {
      builder.addPartitionBy(pb.toProtoBuf());
    }

    if (sortBy != null && sortBy.size() > 0) {
      for (Order order : sortBy) {
        builder.addOrderBy(order.toProtoBuf());
      }
    }

    if (windowing != null) {
      builder.setWindowingClause(windowing.toProtoBuf());
    }

    return builder.build();
  }
    public ExpressionProtos.WindowFunction.OrderBy toProtoBuf() {
      ExpressionProtos.WindowFunction.OrderBy.Builder builder =
          ExpressionProtos.WindowFunction.OrderBy.newBuilder();
      builder.setExpression(expression.toProtoBuf());
      builder.setIsAsc(asc);

      return builder.build();
    }