docs: def process(grammar, testsuite, source=None, select=None,
              generate=False, transfer=False, options=None,
              all_items=False, result_id=None, gzip=False):
      """
      Process (e.g., parse) a [incr tsdb()] profile.
  
      Results are written to directly to *testsuite*.
  
      If *select* is `None`, the defaults depend on the task:
  
          ==========  =========================
          Task        Default value of *select*
          ==========  =========================
          Parsing     `item:i-input`
          Transfer    `result:mrs`
          Generation  `result:mrs`
          ==========  =========================
  
      Args:
          grammar (str): path to a compiled grammar image
          testsuite (str): path to a [incr tsdb()] testsuite where data
              will be read from (see *source*) and written to
          source (str): path to a [incr tsdb()] testsuite; if `None`,
              *testsuite* is used as the source of data
          select (str): TSQL query for selecting processor inputs
              (default depends on the processor type)
          generate (bool): if `True`, generate instead of parse
              (default: `False`)
          transfer (bool): if `True`, transfer instead of parse
              (default: `False`)
          options (list): list of ACE command-line options to use when
              invoking the ACE subprocess; unsupported options will
              give an error message
          all_items (bool): if `True`, don't exclude ignored items
              (those with `i-wf==2`) when parsing
          result_id (int): if given, only keep items with the specified
              `result-id`
          gzip (bool): if `True`, non-empty tables will be compressed
              with gzip
      """
      from delphin.interfaces import ace
  
      if generate and transfer:
          raise ValueError("'generate' is incompatible with 'transfer'")
      if source is None:
          source = testsuite
      if select is None:
          select = 'result:mrs' if (generate or transfer) else 'item:i-input'
      if generate:
          processor = ace.AceGenerator
      elif transfer:
          processor = ace.AceTransferer
      else:
          if not all_items:
              select += ' where i-wf != 2'
          processor = ace.AceParser
      if result_id is not None:
          select += ' where result-id == {}'.format(result_id)
  
      source = itsdb.TestSuite(source)
      target = itsdb.TestSuite(testsuite)
      column, tablename, condition = _interpret_selection(select, source)
      table = itsdb.Table(
          source[tablename].fields,
          tsql.select(
              '* from {} {}'.format(tablename, condition),
              source,
              cast=False))
  
      with processor(grammar, cmdargs=options) as cpu:
          target.process(cpu, ':' + column, source=table, gzip=gzip)