@classmethod
  def ListClientLogs(cls, user_id, start_timestamp, end_timestamp, filter, callback):
    obj_store = ObjectStore.GetInstance(ObjectStore.USER_LOG)

    def _OnListDates(date_listings):
      """Assemble {filename, url} objects for each date listing."""
      filter_re = re.compile(filter or '.*')
      callback([{'filename': key, 'url': obj_store.GenerateUrl(key)}
                for logs in date_listings for key in logs if filter_re.search(key)])

    with util.ArrayBarrier(_OnListDates) as b:
      iso_dates = set()
      t = start_timestamp
      while t < end_timestamp:
        iso_dates.add(ClientLog._IsoDate(t))
        t += constants.SECONDS_PER_DAY
      iso_dates.add(ClientLog._IsoDate(end_timestamp))
      iso_dates = sorted(iso_dates)

      for iso_date in iso_dates:
        ClientLog._ListAllKeys(obj_store, ClientLog._LogKeyPrefix(user_id, iso_date), b.Callback())
Computes the transformation matrix from the Mahalanobis matrix.
dataset/ETHPy150Open viewfinderco/viewfinder/backend/db/client_log.py/ClientLog.ListClientLogs--crossover with--dataset/ETHPy150Open all-umass/metric-learn/metric_learn/base_metric.py/BaseMetricLearner.transformer