docs: def merge(self, groupBy=None):
          """
          *Wrapper of* ``MERGE``
  
          The MERGE operator builds a new dataset consisting of a single sample having
          
              * as regions all the regions of all the input samples, with the 
                same attributes and values
              * as metadata the union of all the metadata attribute-values 
                of the input samples.
                  
          A groupby clause can be specified on metadata: the samples are then
          partitioned in groups, each with a distinct value of the grouping metadata 
          attributes, and the MERGE operation is applied to each group separately, 
          yielding to one sample in the result dataset for each group.
          Samples without the grouping metadata attributes are disregarded
          
          :param groupBy: list of metadata attributes
          :return: a new GMQLDataset
  
          Example of usage::
  
              import gmql as gl
  
              d1 = gl.get_example_dataset("Example_Dataset_1")
              result = d1.merge(['antibody'])
          """
  
          if isinstance(groupBy, list) and \
              all([isinstance(x, str) for x in groupBy]):
              groupBy = Some(groupBy)
          elif groupBy is None:
              groupBy = none()
          else:
              raise TypeError("groupBy must be a list of strings. "
                              "{} was provided".format(type(groupBy)))
  
          new_index = self.opmng.merge(self.__index, groupBy)
          return GMQLDataset(index=new_index, location=self.location,
                             local_sources=self._local_sources,
                             remote_sources=self._remote_sources,
                             meta_profile=self.meta_profile)