docs: @Override
      public Schema transform(Schema schema) {
          int nCols = schema.numColumns();
          List<String> colNames = schema.getColumnNames();
          List<ColumnMetaData> meta = schema.getColumnMetaData();
          List<ColumnMetaData> newMeta = new ArrayList<>(nCols);
  
          for (int i = 0; i < nCols; i++) {
              String name = colNames.get(i);
              ColumnMetaData inMeta = meta.get(i);
  
              if (keyColumnsSet != null && keyColumnsSet.contains(name)) {
                  //No change to key columns
                  newMeta.add(inMeta);
                  continue;
              }
  
              //First: check for a custom reduction on this column
              if (customReductions != null && customReductions.containsKey(name)) {
                  AggregableColumnReduction reduction = customReductions.get(name);
  
                  List<String> outName = reduction.getColumnsOutputName(name);
                  List<ColumnMetaData> outMeta = reduction.getColumnOutputMetaData(outName, inMeta);
                  newMeta.addAll(outMeta);
                  continue;
              }
  
              //Second: check for conditional reductions on this column:
              if (conditionalReductions != null && conditionalReductions.containsKey(name)) {
                  ConditionalReduction reduction = conditionalReductions.get(name);
  
                  List<String> outNames = reduction.getOutputNames();
                  List<ReduceOp> reductions = reduction.getReductions();
                  for (int j = 0; j < reduction.getReductions().size(); j++) {
                      ReduceOp red = reductions.get(j);
                      String outName = outNames.get(j);
                      ColumnMetaData m = getMetaForColumn(red, name, inMeta);
                      m.setName(outName);
                      newMeta.add(m);
                  }
                  continue;
              }
  
  
              //Otherwise: get the specified (built-in) reduction op
              //If no reduction op is specified for that column: use the default
              List<ReduceOp> lop = opMap.containsKey(name) ? opMap.get(name) : Collections.singletonList(defaultOp);
              if (lop != null)
                  for (ReduceOp op : lop) {
                      newMeta.add(getMetaForColumn(op, name, inMeta));
                  }
          }
  
          return schema.newSchema(newMeta);
      }