From 9ffc3b3a284cd8356965b378422eba86aaa0d5e9 Mon Sep 17 00:00:00 2001 From: Antonio Gonzalez Date: Thu, 18 Nov 2021 10:01:32 -0700 Subject: [PATCH 1/3] add has_sample_info to generate_study_list --- qiita_db/metadata_template/base_metadata_template.py | 9 +++------ qiita_db/util.py | 10 +++++++++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/qiita_db/metadata_template/base_metadata_template.py b/qiita_db/metadata_template/base_metadata_template.py index e2f7939e8..f12ed4cf1 100644 --- a/qiita_db/metadata_template/base_metadata_template.py +++ b/qiita_db/metadata_template/base_metadata_template.py @@ -453,13 +453,10 @@ class MetadataTemplate(qdb.base.QiitaObject): # sub-classes. _forbidden_words = {} - def _check_id(self, id_): + @classmethod + def _check_id(cls, id_): r"""Checks that the MetadataTemplate id_ exists on the database""" - with qdb.sql_connection.TRN: - sql = "SELECT EXISTS(SELECT * FROM qiita.{0} WHERE {1}=%s)".format( - self._table, self._id_column) - qdb.sql_connection.TRN.add(sql, [id_]) - return qdb.sql_connection.TRN.execute_fetchlast() + return qdb.util.exists_table(f'{cls._table_prefix}{id_}') @classmethod def _table_name(cls, obj_id): diff --git a/qiita_db/util.py b/qiita_db/util.py index defc024e7..936411b14 100644 --- a/qiita_db/util.py +++ b/qiita_db/util.py @@ -369,7 +369,7 @@ def exists_table(table): """ with qdb.sql_connection.TRN: sql = """SELECT exists( - SELECT * FROM information_schema.tables + SELECT table_name FROM information_schema.tables WHERE table_name=%s)""" qdb.sql_connection.TRN.add(sql, [table]) return qdb.sql_connection.TRN.execute_fetchlast() @@ -1464,6 +1464,10 @@ def generate_study_list(user, visibility): (SELECT COUNT(sample_id) FROM qiita.study_sample WHERE study_id=qiita.study.study_id) AS number_samples_collected, + (SELECT EXIST( + SELECT 1 FROM qiita.study_sample + WHERE study_id = qiita.study.study_id LIMIT 1)) + AS has_sample_info, (SELECT array_agg(row_to_json((prep_template_id, data_type, artifact_id, artifact_type, deprecated, qiita.bioms_from_preparation_artifacts(prep_template_id)), @@ -1558,6 +1562,10 @@ def generate_study_list(user, visibility): del info["shared_with_name"] del info["shared_with_email"] + # add extra info about sample information file + has_sample_info = info['has_sample_info'] + del info['has_sample_info'] + infolist.append(info) return infolist From a78712d922a0ae6492530b07944a032a8b70d7b9 Mon Sep 17 00:00:00 2001 From: Antonio Gonzalez Date: Thu, 18 Nov 2021 10:21:24 -0700 Subject: [PATCH 2/3] EXIST -> EXISTS --- qiita_db/util.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/qiita_db/util.py b/qiita_db/util.py index 936411b14..a5f2d467b 100644 --- a/qiita_db/util.py +++ b/qiita_db/util.py @@ -1464,7 +1464,7 @@ def generate_study_list(user, visibility): (SELECT COUNT(sample_id) FROM qiita.study_sample WHERE study_id=qiita.study.study_id) AS number_samples_collected, - (SELECT EXIST( + (SELECT EXISTS( SELECT 1 FROM qiita.study_sample WHERE study_id = qiita.study.study_id LIMIT 1)) AS has_sample_info, @@ -1563,7 +1563,9 @@ def generate_study_list(user, visibility): del info["shared_with_email"] # add extra info about sample information file - has_sample_info = info['has_sample_info'] + if info['has_sample_info']: + qdb.metadata_template.sample_template.SampleTemplate( + info['study_id']) del info['has_sample_info'] infolist.append(info) From cfdf212a12f92f24048d69d5313011af7203cd67 Mon Sep 17 00:00:00 2001 From: Antonio Gonzalez Date: Fri, 19 Nov 2021 08:09:35 -0700 Subject: [PATCH 3/3] adding some more code --- qiita_db/util.py | 154 +++++++++++++++++++++++++++-------------------- 1 file changed, 89 insertions(+), 65 deletions(-) diff --git a/qiita_db/util.py b/qiita_db/util.py index a5f2d467b..c322d5d38 100644 --- a/qiita_db/util.py +++ b/qiita_db/util.py @@ -1504,71 +1504,95 @@ def generate_study_list(user, visibility): if sids: with qdb.sql_connection.TRN: qdb.sql_connection.TRN.add(sql, [tuple(sids)]) - for info in qdb.sql_connection.TRN.execute_fetchindex(): - info = dict(info) - - # cleaning owners name - if info['owner'] in (None, ''): - info['owner'] = info['owner_email'] - del info['owner_email'] - - preparation_data_types = [] - artifact_biom_ids = [] - if info['preparation_information'] is not None: - for pinfo in info['preparation_information']: - # 'f1': prep_template_id, 'f2': data_type, - # 'f3': artifact_id, 'f4': artifact_type, - # 'f5':deprecated, 'f6': biom artifacts - if pinfo['f5']: - continue - preparation_data_types.append(pinfo['f2']) - if pinfo['f4'] == 'BIOM': - artifact_biom_ids.append(pinfo['f3']) - if pinfo['f6'] is not None: - artifact_biom_ids.extend( - map(int, pinfo['f6'].split(','))) - del info['preparation_information'] - info['artifact_biom_ids'] = list(set(artifact_biom_ids)) - info['preparation_data_types'] = list(set( - preparation_data_types)) - - # publication info - info['publication_doi'] = [] - info['publication_pid'] = [] - if info['publications'] is not None: - for p in info['publications']: - # f1-2 are the default names given by pgsql - pub = p['f1'] - is_doi = p['f2'] - if is_doi: - info['publication_doi'].append(pub) - else: - info['publication_pid'].append(pub) - del info['publications'] - - # pi info - info["pi"] = (info['pi_email'], info['pi_name']) - del info["pi_email"] - del info["pi_name"] - - # shared with - info['shared'] = [] - if info['shared_with_name'] and info['shared_with_email']: - for name, email in zip(info['shared_with_name'], - info['shared_with_email']): - if not name: - name = email - info['shared'].append((email, name)) - del info["shared_with_name"] - del info["shared_with_email"] - - # add extra info about sample information file - if info['has_sample_info']: - qdb.metadata_template.sample_template.SampleTemplate( - info['study_id']) - del info['has_sample_info'] - - infolist.append(info) + results = qdb.sql_connection.TRN.execute_fetchindex() + + for info in results: + info = dict(info) + + # cleaning owners name + if info['owner'] in (None, ''): + info['owner'] = info['owner_email'] + del info['owner_email'] + + preparation_data_types = [] + artifact_biom_ids = [] + if info['preparation_information'] is not None: + for pinfo in info['preparation_information']: + # 'f1': prep_template_id, 'f2': data_type, + # 'f3': artifact_id, 'f4': artifact_type, + # 'f5':deprecated, 'f6': biom artifacts + if pinfo['f5']: + continue + preparation_data_types.append(pinfo['f2']) + if pinfo['f4'] == 'BIOM': + artifact_biom_ids.append(pinfo['f3']) + if pinfo['f6'] is not None: + artifact_biom_ids.extend( + map(int, pinfo['f6'].split(','))) + del info['preparation_information'] + info['artifact_biom_ids'] = list(set(artifact_biom_ids)) + info['preparation_data_types'] = list(set( + preparation_data_types)) + + # publication info + info['publication_doi'] = [] + info['publication_pid'] = [] + if info['publications'] is not None: + for p in info['publications']: + # f1-2 are the default names given by pgsql + pub = p['f1'] + is_doi = p['f2'] + if is_doi: + info['publication_doi'].append(pub) + else: + info['publication_pid'].append(pub) + del info['publications'] + + # pi info + info["pi"] = (info['pi_email'], info['pi_name']) + del info["pi_email"] + del info["pi_name"] + + # shared with + info['shared'] = [] + if info['shared_with_name'] and info['shared_with_email']: + for name, email in zip(info['shared_with_name'], + info['shared_with_email']): + if not name: + name = email + info['shared'].append((email, name)) + del info["shared_with_name"] + del info["shared_with_email"] + + # # add extra info about sample information file + # if info['has_sample_info']: + # # the fix for #3091 should go here; please reference that + # # issue for more information of why it hasn't been closed + # with qdb.sql_connection.TRN: + # # check if host_scientific_name is part of the metadata + # BMT = qdb.metadata_template.base_metadata_template + # QCN = BMT.QIITA_COLUMN_NAME + # sql = """SELECT POSITION('host_scientific_name' IN + # sample_values->>'columns') + # FROM qiita.sample_%d + # WHERE sample_id = '%s'""" % ( + # info['study_id'], QCN) + # qdb.sql_connection.TRN.add(sql) + # has_hsn = qdb.sql_connection.TRN.execute_fetchflatten() + # # if it has that column, we can retrieve the information + # if has_hsn[0] != 0: + # sql = """SELECT array_agg( + # DISTINCT + # sample_values->>'host_scientific_name') + # FROM qiita.sample_%d + # WHERE sample_id != '%s'""" % ( + # info['study_id'], QCN)) + # qdb.sql_connection.TRN.add(sql) + # hsn = qdb.sql_connection.TRN.execute_fetchflatten() + # info['host_scientific_name'] = hsn + del info['has_sample_info'] + + infolist.append(info) return infolist