1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
"The data_set package ..."
# builtins imports
import json
import pickle as pickle
# 3rd-party imports
from redis import Redis
# local imports
from .dataset import DataSet
from base import webqtlConfig
from utility.tools import USE_REDIS
from .datasettype import DatasetType
from .tempdataset import TempDataSet
from .datasetgroup import DatasetGroup
from .utils import query_table_timestamp
from .genotypedataset import GenotypeDataSet
from .phenotypedataset import PhenotypeDataSet
from .mrnaassaydataset import MrnaAssayDataSet
from wqflask.database import database_connection
# Used by create_database to instantiate objects
# Each subclass will add to this
DS_NAME_MAP = {
"Temp": "TempDataSet",
"Geno": "GenotypeDataSet",
"Publish": "PhenotypeDataSet",
"ProbeSet": "MrnaAssayDataSet"
}
def create_dataset(dataset_name, dataset_type=None,
get_samplelist=True, group_name=None, redis_conn=Redis()):
if dataset_name == "Temp":
dataset_type = "Temp"
if not dataset_type:
with database_connection() as db_conn, db_conn.cursor() as cursor:
dataset_type = DatasetType(redis_conn)(
dataset_name, redis_conn, cursor)
dataset_ob = DS_NAME_MAP[dataset_type]
dataset_class = globals()[dataset_ob]
if dataset_type == "Temp":
return dataset_class(dataset_name, get_samplelist, group_name)
else:
return dataset_class(dataset_name, get_samplelist)
def datasets(group_name, this_group=None, redis_conn=Redis()):
key = "group_dataset_menu:v2:" + group_name
dataset_menu = []
with database_connection() as conn, conn.cursor() as cursor:
cursor.execute('''
(SELECT '#PublishFreeze',PublishFreeze.FullName,PublishFreeze.Name
FROM PublishFreeze,InbredSet
WHERE PublishFreeze.InbredSetId = InbredSet.Id
and InbredSet.Name = '%s'
ORDER BY PublishFreeze.Id ASC)
UNION
(SELECT '#GenoFreeze',GenoFreeze.FullName,GenoFreeze.Name
FROM GenoFreeze, InbredSet
WHERE GenoFreeze.InbredSetId = InbredSet.Id
and InbredSet.Name = '%s')
UNION
(SELECT Tissue.Name, ProbeSetFreeze.FullName,ProbeSetFreeze.Name
FROM ProbeSetFreeze, ProbeFreeze, InbredSet, Tissue
WHERE ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id
and ProbeFreeze.TissueId = Tissue.Id
and ProbeFreeze.InbredSetId = InbredSet.Id
and InbredSet.Name like %s
ORDER BY Tissue.Name, ProbeSetFreeze.OrderList DESC)
''' % (group_name,
group_name,
"'" + group_name + "'"))
the_results = cursor.fetchall()
sorted_results = sorted(the_results, key=lambda kv: kv[0])
# ZS: This is kind of awkward, but need to ensure Phenotypes show up before Genotypes in dropdown
pheno_inserted = False
geno_inserted = False
for dataset_item in sorted_results:
tissue_name = dataset_item[0]
dataset = dataset_item[1]
dataset_short = dataset_item[2]
if tissue_name in ['#PublishFreeze', '#GenoFreeze']:
if tissue_name == '#PublishFreeze' and (dataset_short == group_name + 'Publish'):
dataset_menu.insert(
0, dict(tissue=None, datasets=[(dataset, dataset_short)]))
pheno_inserted = True
elif pheno_inserted and tissue_name == '#GenoFreeze':
dataset_menu.insert(
1, dict(tissue=None, datasets=[(dataset, dataset_short)]))
geno_inserted = True
else:
dataset_menu.append(
dict(tissue=None, datasets=[(dataset, dataset_short)]))
else:
tissue_already_exists = False
for i, tissue_dict in enumerate(dataset_menu):
if tissue_dict['tissue'] == tissue_name:
tissue_already_exists = True
break
if tissue_already_exists:
dataset_menu[i]['datasets'].append((dataset, dataset_short))
else:
dataset_menu.append(dict(tissue=tissue_name,
datasets=[(dataset, dataset_short)]))
if USE_REDIS:
redis_conn.set(key, pickle.dumps(dataset_menu, pickle.HIGHEST_PROTOCOL))
redis_conn.expire(key, 60 * 5)
if this_group != None:
this_group._datasets = dataset_menu
return this_group._datasets
else:
return dataset_menu
|