docs: public static Deferred<Object> deleteAllRules(final TSDB tsdb, 
        final int tree_id) {
      if (tree_id < 1 || tree_id > 65535) {
        throw new IllegalArgumentException("Invalid Tree ID");
      }
      
      // fetch the whole row
      final GetRequest get = new GetRequest(tsdb.treeTable(), 
          Tree.idToBytes(tree_id));
      get.family(Tree.TREE_FAMILY());
      
      /**
       * Called after fetching the requested row. If the row is empty, we just
       * return, otherwise we compile a list of qualifiers to delete and submit
       * a single delete request to storage.
       */
      final class GetCB implements Callback<Deferred<Object>, 
        ArrayList<KeyValue>> {
  
        @Override
        public Deferred<Object> call(final ArrayList<KeyValue> row)
            throws Exception {
          if (row == null || row.isEmpty()) {
            return Deferred.fromResult(null);
          }
          
          final ArrayList<byte[]> qualifiers = new ArrayList<byte[]>(row.size());
          
          for (KeyValue column : row) {
            if (column.qualifier().length > RULE_PREFIX.length &&
                Bytes.memcmp(RULE_PREFIX, column.qualifier(), 0, 
                RULE_PREFIX.length) == 0) {
              qualifiers.add(column.qualifier());
            }
          }
          
          final DeleteRequest delete = new DeleteRequest(tsdb.treeTable(), 
              Tree.idToBytes(tree_id), Tree.TREE_FAMILY(), 
              qualifiers.toArray(new byte[qualifiers.size()][]));
          return tsdb.getClient().delete(delete);
        }
        
      }
      
      return tsdb.getClient().get(get).addCallbackDeferring(new GetCB());
    }