/**
  * Order sort groups by increasing totalOutputTupleSize. This minimizes the total volume of data
  * that needs to be sorted.
  */
 public void orderSortGroups() {
   Collections.sort(
       sortGroups,
       new Comparator<SortGroup>() {
         public int compare(SortGroup sg1, SortGroup sg2) {
           Preconditions.checkState(sg1.totalOutputTupleSize > 0);
           Preconditions.checkState(sg2.totalOutputTupleSize > 0);
           int diff = sg1.totalOutputTupleSize - sg2.totalOutputTupleSize;
           return (diff < 0 ? -1 : (diff > 0 ? 1 : 0));
         }
       });
   for (SortGroup sortGroup : sortGroups) {
     sortGroup.orderWindowGroups();
   }
 }