code: @Override
      public void toJSONString(JSONStringer stringer) throws JSONException {
          super.toJSONString(stringer);
          stringer.key("AGGREGATE_COLUMNS")
                  .array();
          for (int ii = 0; ii < m_aggregateTypes.size(); ii++) {
              stringer.object();
              stringer.keySymbolValuePair(Members.AGGREGATE_TYPE.name(), m_aggregateTypes.get(ii).name());
              stringer.keySymbolValuePair(Members.AGGREGATE_OUTPUT_COLUMN.name(), m_aggregateOutputColumns.get(ii));
              AbstractExpression.toJSONArray(stringer,
                                             Members.AGGREGATE_EXPRESSIONS.name(),
                                             m_aggregateExpressions.get(ii));
              stringer.endObject();
          }
          stringer.endArray();
          AbstractExpression.toJSONArray(stringer,
                                         Members.PARTITIONBY_EXPRESSIONS.name(),
                                         m_partitionByExpressions);
          AbstractExpression.toJSONArrayFromSortList(stringer,
                                                     m_orderByExpressions,
                                                         null);
      }
docs: Serialize to JSON.  We only serialize the expressions, and not the
  directions.  We won't need them in the executor.  The directions will
  be in the order by plan node in any case.