Skip to content

fix #3081 #3082

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Mar 12, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
generate_analysis_list_per_study to speed up retrival
  • Loading branch information
antgonza committed Mar 5, 2021
commit f175e0f13de9245622f44d7c6696ae2f1781496f
42 changes: 42 additions & 0 deletions qiita_db/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -1976,6 +1976,48 @@ def generate_analysis_list(analysis_ids, public_only=False):
return results


def generate_analysis_list_per_study(study_id):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it should be this:

Suggested change
def generate_analysis_list_per_study(study_id):
def generate_analyses_list_per_study(study_id):

"""Get study analyses and their preparations

Parameters
----------
study_id : int
The study id

Returns
-------
list of dict
The available analyses and their general information
"""
sql = """
SELECT analysis_id, qiita.analysis.name, email, dflt,
array_agg(DISTINCT aa.artifact_id) FILTER (
WHERE aa.artifact_id IS NOT NULL) as artifact_ids,
array_agg(DISTINCT prep_template_id) as prep_ids,
array_agg(DISTINCT visibility) as visibility
FROM qiita.analysis_sample analysiss
LEFT JOIN qiita.analysis_artifact aa USING (analysis_id)
LEFT JOIN qiita.analysis USING (analysis_id)
LEFT JOIN qiita.preparation_artifact pa ON (
analysiss.artifact_id = pa.artifact_id)
LEFT JOIN qiita.artifact a ON (
analysiss.artifact_id = a.artifact_id)
LEFT JOIN qiita.visibility USING (visibility_id)
WHERE sample_id IN (SELECT sample_id
FROM qiita.study_sample
WHERE study_id = %s)
GROUP BY analysis_id, qiita.analysis.name, email, dflt
ORDER BY analysis_id
"""
results = []
with qdb.sql_connection.TRN:
qdb.sql_connection.TRN.add(sql, [study_id])
for row in qdb.sql_connection.TRN.execute_fetchindex():
results.append(dict(row))

return results


def create_nested_path(path):
"""Wraps makedirs() to make it safe to use across multiple concurrent calls.
Returns successfully if the path was created, or if it already exists.
Expand Down
8 changes: 2 additions & 6 deletions qiita_pet/handlers/api_proxy/sample_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@

from qiita_core.util import execute_as_transaction
from qiita_core.qiita_settings import r_client
from qiita_db.study import Study
from qiita_db.artifact import Artifact
from qiita_db.util import generate_analysis_list_per_study
from qiita_db.metadata_template.sample_template import SampleTemplate
from qiita_db.exceptions import QiitaDBUnknownIDError
from qiita_db.exceptions import QiitaDBColumnError
Expand Down Expand Up @@ -207,10 +206,7 @@ def study_available_analyses(study_id, user_id):
if access_error:
return access_error

values = [(a, sorted(set([Artifact(x).prep_templates[0].id
for x in a.samples.keys()
if Artifact(x).study.id == study_id])))
for a in Study(study_id).analyses()]
values = generate_analysis_list_per_study(study_id)

return {'status': 'success',
'message': '',
Expand Down
12 changes: 9 additions & 3 deletions qiita_pet/handlers/api_proxy/tests/test_sample_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,19 @@ def test_study_available_analyses(self):
exp = {'status': 'success', 'message': '', 'values': []}
self.assertEqual(obs, exp)

AN = qdb.analysis.Analysis
obs = study_available_analyses(1, 'test@foo.bar')
exp = {'status': 'success', 'message': '', 'values': [
(AN(1), [1]), (AN(2), [1]), (AN(3), [1])]}
{'analysis_id': 1, 'name': 'SomeAnalysis', 'email': 'test@foo.bar',
'dflt': False, 'artifact_ids': [8, 9], 'prep_ids': [1],
'visibility': ['private']},
{'analysis_id': 2, 'name': 'SomeSecondAnalysis',
'email': 'admin@foo.bar', 'dflt': False, 'artifact_ids': None,
'prep_ids': [1], 'visibility': ['private']},
{'analysis_id': 3, 'name': 'test@foo.bar-dflt-1',
'email': 'test@foo.bar', 'dflt': True, 'artifact_ids': None,
'prep_ids': [1], 'visibility': ['private']}]}
self.assertEqual(obs, exp)

AN = qdb.analysis.Analysis
obs = study_available_analyses(self.new_study.id, 'shared@foo.bar')
exp = {'status': 'error',
'message': 'User does not have access to study'}
Expand Down
29 changes: 22 additions & 7 deletions qiita_pet/templates/study_ajax/study_analyses.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,39 @@
$('#studies-analyses-table').dataTable();
</script>
<h3>Analyses that have used this study</h3>

Note that if an analysis doesn't have a link, it means that is a "User default analysis"; which means that the analysis belows to that user but the user has only selected artifacts but hasn't created the actual anlaysis. Please contact the user and ask them to delete that artifact from their analysis creation page.
<br/><br/>
<table id="studies-analyses-table" class="display table-bordered table-hover" style="width:100%">
<thead>
<tr>
<th>Analysis</th>
<th>Owner</th>
<th>Prep IDs Used</th>
<th>Is Public?</th>
<th>Artifacts</th>
<th>Artifacts in Analysis</th>
</tr>
</thead>
<tbody>
{% for a, preps in analyses %}
{% for a in analyses %}
<tr>
<td><a href="{% raw qiita_config.portal_dir %}/analysis/description/{{a.id}}/" target="_blank">{{a.name}} (ID: {{a.id}})</a></td>
<td>{{a.owner.email}}</td>
<td>{{','.join(map(str, preps))}}</td>
<td>{{a.is_public}}</td>
<td>{{len(a.artifacts)}}</td>
<td>
{% if a['dflt'] %}
{{a['name']}} (ID: {{a['analysis_id']}})
{% else %}
<a href="{% raw qiita_config.portal_dir %}/analysis/description/{{a['analysis_id']}}/" target="_blank">{{a['name']}} (ID: {{a['analysis_id']}})</a>
{% end %}
</td>
<td>{{a['email']}}</td>
<td>{{','.join(map(str, a['prep_ids']))}}</td>
<td>{{a['visibility'] == ['public']}}</td>
<td>
{% if a['artifact_ids'] is None %}
0
{% else %}
{{len(a['artifact_ids'])}}
{% end %}
</td>
</tr>
{% end %}
</tbody>
Expand Down