Skip to content

Commit b78e50a

Browse files
committed
fix #1091
1 parent 39f7961 commit b78e50a

File tree

2 files changed

+87
-2
lines changed

2 files changed

+87
-2
lines changed

qiita_db/analysis.py

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
from .base import QiitaStatusObject
3333
from .data import ProcessedData
3434
from .study import Study
35-
from .exceptions import QiitaDBStatusError, QiitaDBError
35+
from .exceptions import QiitaDBStatusError, QiitaDBError, QiitaDBUnknownIDError
3636
from .util import (convert_to_id, get_work_base_dir,
3737
get_mountpoint, insert_filepaths)
3838

@@ -66,9 +66,13 @@ class Analysis(QiitaStatusObject):
6666
unshare
6767
build_files
6868
summary_data
69+
exists
70+
create
71+
delete
6972
"""
7073

7174
_table = "analysis"
75+
_analysis_id_column = 'analysis_id'
7276

7377
def _lock_check(self, conn_handler):
7478
"""Raises QiitaDBStatusError if analysis is not in_progress"""
@@ -165,6 +169,71 @@ def create(cls, owner, name, description, parent=None, from_default=False):
165169
a_id = conn_handler.execute_queue(queue)[0]
166170
return cls(a_id)
167171

172+
@classmethod
173+
def delete(cls, _id):
174+
"""Deletes an analysis
175+
176+
Parameters
177+
----------
178+
_id : int
179+
The analysis id
180+
181+
Raises
182+
------
183+
QiitaDBUnknownIDError
184+
If the analysis id doesn't exist
185+
"""
186+
# check if the analysis exist
187+
if not cls.exists(_id):
188+
raise QiitaDBUnknownIDError(_id, "analysis")
189+
190+
queue = "delete_analysis_%d" % _id
191+
conn_handler = SQLConnectionHandler()
192+
conn_handler.create_queue(queue)
193+
194+
sql = ("DELETE FROM qiita.analysis_filepath WHERE "
195+
"{0} = {1}".format(cls._analysis_id_column, _id))
196+
conn_handler.add_to_queue(queue, sql)
197+
198+
sql = ("DELETE FROM qiita.analysis_workflow WHERE "
199+
"{0} = {1}".format(cls._analysis_id_column, _id))
200+
conn_handler.add_to_queue(queue, sql)
201+
202+
sql = ("DELETE FROM qiita.analysis_sample WHERE "
203+
"{0} = {1}".format(cls._analysis_id_column, _id))
204+
conn_handler.add_to_queue(queue, sql)
205+
206+
sql = ("DELETE FROM qiita.collection_analysis WHERE "
207+
"{0} = {1}".format(cls._analysis_id_column, _id))
208+
conn_handler.add_to_queue(queue, sql)
209+
210+
sql = ("DELETE FROM qiita.{0} WHERE "
211+
"{1} = {2}".format(cls._table, cls._analysis_id_column, _id))
212+
conn_handler.add_to_queue(queue, sql)
213+
214+
conn_handler.execute_queue(queue)
215+
216+
@classmethod
217+
def exists(cls, analysis_id):
218+
r"""Checks if the given analysis _id exists
219+
220+
Parameters
221+
----------
222+
analysis_id : int
223+
The id of the analysis we are searching for
224+
225+
Returns
226+
-------
227+
bool
228+
True if exists, false otherwise.
229+
"""
230+
conn_handler = SQLConnectionHandler()
231+
232+
return conn_handler.execute_fetchone(
233+
"SELECT EXISTS(SELECT * FROM qiita.{0} WHERE "
234+
"{1}=%s)".format(cls._table, cls._analysis_id_column),
235+
(analysis_id, ))[0]
236+
168237
# ---- Properties ----
169238
@property
170239
def owner(self):

qiita_db/test/test_analysis.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
from qiita_db.analysis import Analysis, Collection
1313
from qiita_db.job import Job
1414
from qiita_db.user import User
15-
from qiita_db.exceptions import QiitaDBStatusError, QiitaDBError
15+
from qiita_db.exceptions import (QiitaDBStatusError, QiitaDBError,
16+
QiitaDBUnknownIDError)
1617
from qiita_db.util import get_mountpoint, get_count
1718
from qiita_db.study import Study, StudyPerson
1819
from qiita_db.data import ProcessedData
@@ -145,6 +146,21 @@ def test_create_from_default(self):
145146
[new_id, 1, '1.SKM4.640180']]
146147
self.assertEqual(obs, exp)
147148

149+
def test_exists(self):
150+
self.assertTrue(Analysis.exists(1))
151+
new_id = get_count("qiita.analysis") + 1
152+
self.assertFalse(Analysis.exists(new_id))
153+
154+
def test_delete(self):
155+
# successful delete
156+
total_analyses = get_count("qiita.analysis")
157+
Analysis.delete(1)
158+
self.assertEqual(total_analyses - 1, get_count("qiita.analysis"))
159+
160+
# no possible to delete
161+
with self.assertRaises(QiitaDBUnknownIDError):
162+
Analysis.delete(total_analyses + 1)
163+
148164
def test_retrieve_owner(self):
149165
self.assertEqual(self.analysis.owner, "test@foo.bar")
150166

0 commit comments

Comments
 (0)