docs: public long run(String partitionValue, TimestampType newestToDiscard, long targetMaxRowsToDelete) {
          if (newestToDiscard == null) {
              throw new VoltAbortException("newestToDiscard shouldn't be null.");
              // It might be Long.MIN_VALUE as a TimestampType though.
          }
          if (targetMaxRowsToDelete <= 0) {
              throw new VoltAbortException("maxRowsToDeletePerProc must be > 0.");
          }
  
          // Get the total number of rows older than the given timestamp.
          voltQueueSQL(countMatchingRows, EXPECT_SCALAR_LONG, newestToDiscard);
          long agedOutCount = voltExecuteSQL()[0].asScalarLong();
  
          if (agedOutCount > targetMaxRowsToDelete) {
              // Find the timestamp of the row at position N in the sorted order, where N is the chunk size
              voltQueueSQL(getNthOldestTimestamp, EXPECT_SCALAR, targetMaxRowsToDelete);
              newestToDiscard = voltExecuteSQL()[0].fetchRow(0).getTimestampAsTimestamp(0);
          }
  
          // Delete all rows >= the timestamp found in the previous statement.
          // This will delete AT LEAST N rows, but since timestamps may be non-unique,
          //  it might delete more than N. In the worst case, it could delete all rows
          //  if every row has an identical timestamp value. It is guaranteed to make
          //  progress. If we used strictly less than, it might not make progress.
          // This is why the max rows to delete number is a target, not always a perfect max.
          voltQueueSQL(deleteOlderThanDate, EXPECT_SCALAR_LONG, newestToDiscard);
          long deletedCount = voltExecuteSQL(true)[0].asScalarLong();
  
          // Return the number of deleted rows.
          return deletedCount;
      }