Skip to content

Commit 8fb9ca0

Browse files
authored
fix #2751 (#3062)
1 parent cffb35f commit 8fb9ca0

20 files changed

+68
-76
lines changed

qiita_db/meta_util.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ def generate_biom_and_metadata_release(study_status='public'):
412412
continue
413413
fp = relpath(x['fp'], bdir)
414414
for pt in a.prep_templates:
415-
categories = pt.categories()
415+
categories = pt.categories
416416
platform = ''
417417
target_gene = ''
418418
if 'platform' in categories:

qiita_db/metadata_template/base_metadata_template.py

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,19 @@
5555
QIITA_COLUMN_NAME = 'qiita_sample_column_names'
5656

5757

58+
def _helper_get_categories(table):
59+
"""This is a helper function to avoid duplication of code"""
60+
with qdb.sql_connection.TRN:
61+
sql = """SELECT sample_values->>'columns'
62+
FROM qiita.{0}
63+
WHERE sample_id = '{1}'""".format(table, QIITA_COLUMN_NAME)
64+
qdb.sql_connection.TRN.add(sql)
65+
results = qdb.sql_connection.TRN.execute_fetchflatten()
66+
if results:
67+
results = sorted(loads(results[0]))
68+
return results
69+
70+
5871
class BaseSample(qdb.base.QiitaObject):
5972
r"""Sample object that accesses the db to get the information of a sample
6073
belonging to a PrepTemplate or a SampleTemplate.
@@ -184,17 +197,7 @@ def _get_categories(self):
184197
set of str
185198
The set of all available metadata categories
186199
"""
187-
with qdb.sql_connection.TRN:
188-
sql = """SELECT sample_values->>'columns'
189-
FROM qiita.{0}
190-
WHERE sample_id = '{1}'""".format(
191-
self._dynamic_table, QIITA_COLUMN_NAME)
192-
qdb.sql_connection.TRN.add(sql)
193-
results = qdb.sql_connection.TRN.execute_fetchflatten()
194-
if results:
195-
results = loads(results[0])
196-
197-
return set(results)
200+
return set(_helper_get_categories(self._dynamic_table))
198201

199202
def _to_dict(self):
200203
r"""Returns the categories and their values in a dictionary
@@ -729,7 +732,7 @@ def delete_column(self, column_name):
729732
If the column_name is selected as a specimen_id_column in the
730733
study.
731734
"""
732-
if column_name not in self.categories():
735+
if column_name not in self.categories:
733736
raise qdb.exceptions.QiitaDBColumnError(
734737
"'%s' not in info file %d" % (column_name, self._id))
735738
if not self.can_be_updated(columns={column_name}):
@@ -754,7 +757,7 @@ def delete_column(self, column_name):
754757
qdb.sql_connection.TRN.add(sql, [column_name, QIITA_COLUMN_NAME])
755758

756759
# deleting from QIITA_COLUMN_NAME
757-
columns = self.categories()
760+
columns = self.categories
758761
columns.remove(column_name)
759762
values = '{"columns": %s}' % dumps(columns)
760763
sql = """UPDATE {0}
@@ -834,7 +837,7 @@ def _common_extend_steps(self, md_template):
834837

835838
# Check if we are adding new columns
836839
headers = md_template.keys().tolist()
837-
new_cols = set(headers).difference(self.categories())
840+
new_cols = set(headers).difference(self.categories)
838841

839842
if not new_cols and not new_samples:
840843
return None, None
@@ -855,7 +858,7 @@ def _common_extend_steps(self, md_template):
855858
# code). Sorting the new columns to enforce an order
856859
new_cols = sorted(new_cols)
857860

858-
cols = self.categories()
861+
cols = self.categories
859862
cols.extend(new_cols)
860863

861864
values = dumps({"columns": cols})
@@ -1167,7 +1170,7 @@ def _common_to_dataframe_steps(self):
11671170
"""
11681171
with qdb.sql_connection.TRN:
11691172
# Retrieve all the information from the database
1170-
cols = self.categories()
1173+
cols = self.categories
11711174
sql = """SELECT sample_id, sample_values
11721175
FROM qiita.{0}
11731176
WHERE sample_id != '{1}'""".format(
@@ -1237,6 +1240,7 @@ def get_filepaths(self):
12371240
self._filepath_table, self._id_column, self.id,
12381241
sort='descending')]
12391242

1243+
@property
12401244
def categories(self):
12411245
"""Identifies the metadata columns present in an info file
12421246
@@ -1245,19 +1249,7 @@ def categories(self):
12451249
cols : list
12461250
The category fields
12471251
"""
1248-
with qdb.sql_connection.TRN:
1249-
sql = """SELECT sample_values->>'columns'
1250-
FROM qiita.{0}
1251-
WHERE sample_id = '{1}'""".format(
1252-
self._table_name(self._id), QIITA_COLUMN_NAME)
1253-
1254-
qdb.sql_connection.TRN.add(sql)
1255-
1256-
results = qdb.sql_connection.TRN.execute_fetchflatten()
1257-
if results:
1258-
results = sorted(loads(results[0]))
1259-
1260-
return results
1252+
return _helper_get_categories(self._table_name(self._id))
12611253

12621254
def extend(self, md_template):
12631255
"""Adds the given template to the current one
@@ -1269,7 +1261,7 @@ def extend(self, md_template):
12691261
"""
12701262
with qdb.sql_connection.TRN:
12711263
md_template = self._clean_validate_template(
1272-
md_template, self.study_id, current_columns=self.categories())
1264+
md_template, self.study_id, current_columns=self.categories)
12731265
new_samples, new_columns = self._common_extend_steps(md_template)
12741266
if new_samples or new_columns:
12751267
self.validate(self.columns_restrictions)
@@ -1396,7 +1388,7 @@ def _update(self, md_template):
13961388
self._table_name(self._id))
13971389
qdb.sql_connection.TRN.add(sql, [dumps(values), sid])
13981390

1399-
nc = list(set(new_columns).union(set(self.categories())))
1391+
nc = list(set(new_columns).union(set(self.categories)))
14001392
table_name = self._table_name(self.id)
14011393
values = dumps({"columns": nc})
14021394
sql = """UPDATE qiita.{0}
@@ -1430,7 +1422,7 @@ def update(self, md_template):
14301422
with qdb.sql_connection.TRN:
14311423
# Clean and validate the metadata template given
14321424
new_map = self._clean_validate_template(
1433-
md_template, self.study_id, current_columns=self.categories())
1425+
md_template, self.study_id, current_columns=self.categories)
14341426
samples, columns = self._update(new_map)
14351427
self.validate(self.columns_restrictions)
14361428
self.generate_files(samples, columns)
@@ -1450,7 +1442,7 @@ def extend_and_update(self, md_template):
14501442
"""
14511443
with qdb.sql_connection.TRN:
14521444
md_template = self._clean_validate_template(
1453-
md_template, self.study_id, current_columns=self.categories())
1445+
md_template, self.study_id, current_columns=self.categories)
14541446
new_samples, new_columns = self._common_extend_steps(md_template)
14551447
samples, columns = self._update(md_template)
14561448
if samples is None:
@@ -1516,7 +1508,7 @@ def get_category(self, category):
15161508
If category is not part of the template
15171509
"""
15181510
with qdb.sql_connection.TRN:
1519-
if category not in self.categories():
1511+
if category not in self.categories:
15201512
raise qdb.exceptions.QiitaDBColumnError(category)
15211513
sql = """SELECT sample_id,
15221514
COALESCE(sample_values->>'{0}', 'None') AS {0}
@@ -1542,7 +1534,7 @@ def check_restrictions(self, restrictions):
15421534
cols = {col for restriction in restrictions
15431535
for col in restriction.columns}
15441536

1545-
return cols.difference(self.categories())
1537+
return cols.difference(self.categories)
15461538

15471539
def _get_accession_numbers(self, column):
15481540
"""Return the accession numbers stored in `column`
@@ -1639,7 +1631,7 @@ def validate(self, restriction_dict):
16391631
If the values aren't castable
16401632
"""
16411633
warning_msg = []
1642-
columns = self.categories()
1634+
columns = self.categories
16431635
wrong_msg = 'Sample "%s", column "%s", wrong value "%s"'
16441636
for label, restriction in restriction_dict.items():
16451637
missing = set(restriction.columns).difference(columns)
@@ -1796,7 +1788,7 @@ def validate_restrictions(self):
17961788
success = True
17971789
message = []
17981790
restrictions = self.restrictions
1799-
categories = self.categories()
1791+
categories = self.categories
18001792

18011793
difference = sorted(set(restrictions.keys()) - set(categories))
18021794
if difference:

qiita_db/metadata_template/prep_template.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def create(cls, md_template, study, data_type, investigation_type=None,
142142

143143
md_template = cls._clean_validate_template(md_template, study.id)
144144
_check_duplicated_columns(list(md_template.columns),
145-
study.sample_template.categories())
145+
study.sample_template.categories)
146146

147147
# Insert the metadata template
148148
sql = """INSERT INTO qiita.prep_template
@@ -394,7 +394,7 @@ def can_be_extended(self, new_samples, new_columns):
394394
"prep template")
395395

396396
_check_duplicated_columns(list(new_columns), qdb.study.Study(
397-
self.study_id).sample_template.categories())
397+
self.study_id).sample_template.categories)
398398

399399
return True, ""
400400

qiita_db/metadata_template/test/test_prep_template.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,7 @@ def _common_creation_checks(self, pt, fp_count, name):
909909
'instrument_model', 'experiment_design_description',
910910
'library_construction_protocol', 'center_name',
911911
'center_project_name', 'emp_status'}
912-
self.assertCountEqual(pt.categories(), exp_categories)
912+
self.assertCountEqual(pt.categories, exp_categories)
913913
exp_dict = {
914914
'%s.SKB7.640196' % self.test_study.id: {
915915
'barcode': 'CCTCTGAGAGCT',
@@ -1058,7 +1058,7 @@ def test_create_warning(self):
10581058
'instrument_model', 'experiment_design_description',
10591059
'library_construction_protocol', 'center_name',
10601060
'center_project_name', 'emp_status'}
1061-
self.assertCountEqual(pt.categories(), exp_categories)
1061+
self.assertCountEqual(pt.categories, exp_categories)
10621062
exp_dict = {
10631063
'%s.SKB7.640196' % self.test_study.id: {
10641064
'ebi_submission_accession': None,
@@ -1628,7 +1628,7 @@ def test_delete_column(self):
16281628
pt = qdb.metadata_template.prep_template.PrepTemplate.create(
16291629
self.metadata, self.test_study, self.data_type)
16301630
pt.delete_column('str_column')
1631-
self.assertNotIn('str_column', pt.categories())
1631+
self.assertNotIn('str_column', pt.categories)
16321632

16331633
# testing errors
16341634
pt = qdb.metadata_template.prep_template.PrepTemplate(1)

qiita_db/metadata_template/test/test_sample_template.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ def test_categories(self):
542542
'physical_specimen_remaining', 'dna_extracted',
543543
'sample_type', 'collection_timestamp', 'host_subject_id',
544544
'description', 'latitude', 'longitude', 'scientific_name'}
545-
obs = set(self.tester.categories())
545+
obs = set(self.tester.categories)
546546
self.assertCountEqual(obs, exp)
547547

548548
def test_iter(self):
@@ -974,7 +974,7 @@ def test_create(self):
974974
'longitude', 'physical_specimen_location',
975975
'physical_specimen_remaining', 'sample_type',
976976
'scientific_name', 'taxon_id'}
977-
self.assertCountEqual(st.categories(), exp_categories)
977+
self.assertCountEqual(st.categories, exp_categories)
978978
exp_dict = {
979979
"%s.Sample1" % new_id: {
980980
'collection_timestamp': '2014-05-29 12:24:15',
@@ -1040,7 +1040,7 @@ def test_create_int_prefix(self):
10401040
'longitude', 'physical_specimen_location',
10411041
'physical_specimen_remaining', 'sample_type',
10421042
'scientific_name', 'taxon_id'}
1043-
self.assertCountEqual(st.categories(), exp_categories)
1043+
self.assertCountEqual(st.categories, exp_categories)
10441044
exp_dict = {
10451045
"%s.12.Sample1" % new_id: {
10461046
'collection_timestamp': '2014-05-29 12:24:15',
@@ -1106,7 +1106,7 @@ def test_create_str_prefixes(self):
11061106
'longitude', 'physical_specimen_location',
11071107
'physical_specimen_remaining', 'sample_type',
11081108
'scientific_name', 'taxon_id'}
1109-
self.assertCountEqual(st.categories(), exp_categories)
1109+
self.assertCountEqual(st.categories, exp_categories)
11101110
exp_dict = {
11111111
"%s.foo.Sample1" % new_id: {
11121112
'collection_timestamp': '2014-05-29 12:24:15',
@@ -1172,7 +1172,7 @@ def test_create_already_prefixed_samples(self):
11721172
'longitude', 'physical_specimen_location',
11731173
'physical_specimen_remaining', 'sample_type',
11741174
'scientific_name', 'taxon_id'}
1175-
self.assertCountEqual(st.categories(), exp_categories)
1175+
self.assertCountEqual(st.categories, exp_categories)
11761176
exp_dict = {
11771177
"%s.Sample1" % new_id: {
11781178
'collection_timestamp': '2014-05-29 12:24:15',
@@ -1463,7 +1463,7 @@ def test_extend_add_samples(self):
14631463
'longitude', 'physical_specimen_location',
14641464
'physical_specimen_remaining', 'sample_type',
14651465
'scientific_name', 'taxon_id'}
1466-
self.assertCountEqual(st.categories(), exp_categories)
1466+
self.assertCountEqual(st.categories, exp_categories)
14671467
exp_dict = {
14681468
"%s.Sample1" % st.id: {
14691469
'collection_timestamp': '2014-05-29 12:24:15',
@@ -1568,7 +1568,7 @@ def test_extend_add_duplicate_samples(self):
15681568
'longitude', 'physical_specimen_location',
15691569
'physical_specimen_remaining', 'sample_type',
15701570
'scientific_name', 'taxon_id'}
1571-
self.assertCountEqual(st.categories(), exp_categories)
1571+
self.assertCountEqual(st.categories, exp_categories)
15721572
exp_dict = {
15731573
"%s.Sample1" % st.id: {
15741574
'collection_timestamp': '2014-05-29 12:24:15',
@@ -1650,7 +1650,7 @@ def test_extend_new_columns(self):
16501650
'physical_specimen_remaining', 'sample_type',
16511651
'scientific_name', 'taxon_id',
16521652
'texture', 'tot_nitro'}
1653-
self.assertCountEqual(st.categories(), exp_categories)
1653+
self.assertCountEqual(st.categories, exp_categories)
16541654
exp_dict = {
16551655
"%s.Sample1" % st.id: {
16561656
'collection_timestamp': '2014-05-29 12:24:15',
@@ -1736,7 +1736,7 @@ def test_extend_new_samples_and_columns(self):
17361736
'longitude', 'physical_specimen_location',
17371737
'physical_specimen_remaining', 'sample_type',
17381738
'scientific_name', 'taxon_id', 'tot_nitro'}
1739-
self.assertCountEqual(st.categories(), exp_categories)
1739+
self.assertCountEqual(st.categories, exp_categories)
17401740
exp_dict = {
17411741
"%s.Sample1" % st.id: {
17421742
'collection_timestamp': '2014-05-29 12:24:15',
@@ -1835,7 +1835,7 @@ def test_extend_update(self):
18351835
'longitude', 'physical_specimen_location',
18361836
'physical_specimen_remaining', 'sample_type',
18371837
'scientific_name', 'taxon_id', 'tot_nitro'}
1838-
self.assertCountEqual(st.categories(), exp_categories)
1838+
self.assertCountEqual(st.categories, exp_categories)
18391839
exp_dict = {
18401840
"%s.Sample1" % st.id: {
18411841
'collection_timestamp': '2014-05-29 12:24:15',
@@ -2247,7 +2247,7 @@ def test_delete_column(self):
22472247
st = qdb.metadata_template.sample_template.SampleTemplate.create(
22482248
self.metadata, self.new_study)
22492249
st.delete_column('dna_extracted')
2250-
self.assertNotIn('dna_extracted', st.categories())
2250+
self.assertNotIn('dna_extracted', st.categories)
22512251

22522252
def test_delete_column_specimen_id(self):
22532253
st = qdb.metadata_template.sample_template.SampleTemplate.create(

qiita_db/processing_job.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1815,7 +1815,7 @@ def shape(self):
18151815
pass
18161816
else:
18171817
samples = len(st)
1818-
columns = len(st.categories())
1818+
columns = len(st.categories)
18191819
elif analysis_id is not None:
18201820
try:
18211821
analysis = qdb.analysis.Analysis(analysis_id)

qiita_db/study.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -784,7 +784,7 @@ def specimen_id_column(self, value):
784784
"sample information.")
785785

786786
if value is not None:
787-
if value not in st.categories():
787+
if value not in st.categories:
788788
raise qdb.exceptions.QiitaDBLookupError("Category '%s' is not "
789789
"present in the sample"
790790
" information."

qiita_db/util.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1790,7 +1790,7 @@ def get_artifacts_information(artifact_ids, only_biom=True):
17901790
if prep_template_id is not None:
17911791
if prep_template_id not in ps:
17921792
pt = PT(prep_template_id)
1793-
categories = pt.categories()
1793+
categories = pt.categories
17941794
if 'platform' in categories:
17951795
platform = ', '.join(
17961796
set(pt.get_category('platform').values()))

qiita_pet/handlers/api_proxy/prep_template.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ def prep_template_ajax_get_req(user_id, prep_id):
137137

138138
# The call to list is needed because keys is an iterator
139139
num_samples = len(list(pt.keys()))
140-
num_columns = len(pt.categories())
140+
num_columns = len(pt.categories)
141141
investigation_type = pt.investigation_type
142142

143143
download_prep_id = None

qiita_pet/handlers/api_proxy/sample_template.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def sample_template_meta_cats_get_req(samp_id, user_id):
139139

140140
return {'status': 'success',
141141
'message': '',
142-
'categories': sorted(SampleTemplate(int(samp_id)).categories())
142+
'categories': sorted(SampleTemplate(int(samp_id)).categories)
143143
}
144144

145145

0 commit comments

Comments
 (0)