docs: def _get_metadata(network_id, user_id):
      """
          Get all the metadata in a network, across all scenarios
          returns a dictionary of dict objects, keyed on dataset ID
      """
      log.info("Getting Metadata")
      dataset_qry = db.DBSession.query(
                  Dataset
      ).outerjoin(DatasetOwner, and_(DatasetOwner.dataset_id==Dataset.id, DatasetOwner.user_id==user_id)).filter(
                  or_(Dataset.hidden=='N', DatasetOwner.user_id != None),
                  Scenario.id==ResourceScenario.scenario_id,
                  Scenario.network_id==network_id,
                  Dataset.id==ResourceScenario.dataset_id).distinct().subquery()
  
      rs_qry = db.DBSession.query(
                  Metadata
      ).join(dataset_qry, Metadata.dataset_id==dataset_qry.c.id)
  
      x = time.time()
      logging.info("Getting all matadata")
      all_metadata = db.DBSession.execute(rs_qry.statement).fetchall()
      log.info("%s metadata jointly retrieved in %s",len(all_metadata), time.time()-x)
  
      logging.info("metadata retrieved. Processing results...")
      x = time.time()
      metadata_dict = dict()
      for m in all_metadata:
          if metadata_dict.get(m.dataset_id):
              metadata_dict[m.dataset_id][m.key] = six.text_type(m.value)
          else:
              metadata_dict[m.dataset_id] = {m.key : six.text_type(m.value)}
  
      logging.info("metadata processed in %s", time.time()-x)
  
      return metadata_dict