Skip to content

Commit 00cbd18

Browse files
authored
Initialize schema to manage studies/cohorts/timepoints (#335)
1 parent 5015497 commit 00cbd18

File tree

15 files changed

+843
-2
lines changed

15 files changed

+843
-2
lines changed

Studies/api-src/org/labkey/api/studies/StudiesService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
import org.labkey.api.module.Module;
55
import org.labkey.api.resource.Resource;
66
import org.labkey.api.security.User;
7+
import org.labkey.api.studies.study.EventProvider;
78
import org.labkey.api.util.Path;
89

910
import java.io.IOException;
11+
import java.util.List;
1012

1113
/**
1214
* Created by bimber on 11/3/2016.
@@ -28,4 +30,8 @@ static public void setInstance(StudiesService instance)
2830
abstract public void importFolderDefinition(Container container, User user, Module m, Path sourceFolderDirPath) throws IOException;
2931

3032
abstract public void loadTsv(Resource tsv, String schemaName, User u, Container c);
33+
34+
abstract public void registerEventProvider(EventProvider ep);
35+
36+
abstract public List<EventProvider> getEventProviders(Container c);
3137
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package org.labkey.api.studies.study;
2+
3+
import org.jetbrains.annotations.Nullable;
4+
import org.labkey.api.data.Container;
5+
import org.labkey.api.data.TableInfo;
6+
import org.labkey.api.module.Module;
7+
import org.labkey.api.query.QueryService;
8+
import org.labkey.api.query.UserSchema;
9+
import org.labkey.api.security.User;
10+
import org.labkey.api.security.permissions.ReadPermission;
11+
12+
import java.util.Collection;
13+
import java.util.Date;
14+
import java.util.HashMap;
15+
import java.util.Map;
16+
17+
public abstract class AbstractEventProvider implements EventProvider
18+
{
19+
private final String _name;
20+
private final String _label;
21+
private final String _description;
22+
private final Module _owner;
23+
24+
public AbstractEventProvider(String name, String label, String description, Module owner)
25+
{
26+
_name = name;
27+
_label = label;
28+
_description = description;
29+
_owner = owner;
30+
}
31+
32+
@Override
33+
public String getDescription()
34+
{
35+
return _description;
36+
}
37+
38+
@Override
39+
public String getLabel()
40+
{
41+
return _label;
42+
}
43+
44+
@Override
45+
public String getName()
46+
{
47+
return _name;
48+
}
49+
50+
@Override
51+
public boolean isAvailable(Container c)
52+
{
53+
return c.getActiveModules().contains(_owner);
54+
}
55+
56+
@Override
57+
public final Map<String, Date> inferDates(Collection<String> subjectList, Container c, User u)
58+
{
59+
Map<String, Date> result = new HashMap<>(inferDatesRaw(subjectList, c, u));
60+
subjectList.forEach(x -> {
61+
if (!result.containsKey(x))
62+
{
63+
result.put(x, null);
64+
}
65+
});
66+
67+
return result;
68+
}
69+
70+
abstract protected Map<String, Date> inferDatesRaw(Collection<String> subjectList, Container c, User u);
71+
72+
protected @Nullable TableInfo getTable(Container c, User u, String schema, String table)
73+
{
74+
UserSchema us = QueryService.get().getUserSchema(u, c, schema);
75+
if (us == null)
76+
{
77+
return null;
78+
}
79+
80+
TableInfo ti = us.getTable("assignment");
81+
if (ti == null || !ti.hasPermission(u, ReadPermission.class))
82+
{
83+
return null;
84+
}
85+
86+
return ti;
87+
}
88+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.labkey.api.studies.study;
2+
3+
import org.labkey.api.data.Container;
4+
import org.labkey.api.security.User;
5+
6+
import java.util.Collection;
7+
import java.util.Date;
8+
import java.util.Map;
9+
10+
/**
11+
* Each study will have a handful of important dates, which are used to define relative dates for each subject/participant.
12+
* The EventProvider classes provide a code-based way to establish the handful of critical dates. This code is executed to populate
13+
* the KeyEvents table, which maps subject/event to date.
14+
*/
15+
public interface EventProvider
16+
{
17+
boolean isAvailable(Container c);
18+
19+
String getName();
20+
21+
String getLabel();
22+
23+
String getDescription();
24+
25+
Map<String, Date> inferDates(Collection<String> subjectList, Container c, User u);
26+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
CREATE TABLE studies.studies (
2+
rowid serial,
3+
studyName varchar(1000),
4+
label varchar(1000),
5+
category varchar(1000),
6+
description varchar(4000),
7+
8+
lsid entityid,
9+
container entityid,
10+
created timestamp,
11+
createdby int,
12+
modified timestamp,
13+
modifiedby int,
14+
15+
CONSTRAINT PK_studies PRIMARY KEY (rowid)
16+
);
17+
18+
CREATE TABLE studies.studyCohorts (
19+
rowid serial,
20+
studyId int,
21+
cohortName varchar(4000),
22+
label varchar(4000),
23+
category varchar(4000),
24+
description varchar(4000),
25+
isControlGroup bool default false,
26+
sortOrder int,
27+
28+
lsid entityid,
29+
container entityid,
30+
created timestamp,
31+
createdby int,
32+
modified timestamp,
33+
modifiedby int,
34+
35+
CONSTRAINT PK_studyCohorts PRIMARY KEY (rowid)
36+
);
37+
38+
CREATE TABLE studies.anchorEvents (
39+
rowid serial,
40+
studyId int,
41+
label varchar(4000),
42+
description varchar(4000),
43+
eventProviderName varchar(1000),
44+
45+
container entityid,
46+
created timestamp,
47+
createdby int,
48+
modified timestamp,
49+
modifiedby int,
50+
51+
CONSTRAINT PK_anchorEvents PRIMARY KEY (rowid)
52+
);
53+
54+
CREATE TABLE studies.expectedTimepoints (
55+
rowid serial,
56+
studyId int,
57+
cohortId int,
58+
label varchar(4000),
59+
labelShort varchar(100),
60+
description varchar(4000),
61+
numericLabel int,
62+
anchorEvent int,
63+
rangeMin int,
64+
rangeMax int,
65+
66+
container entityid,
67+
created timestamp,
68+
createdby int,
69+
modified timestamp,
70+
modifiedby int,
71+
72+
CONSTRAINT PK_expectedTimepoints PRIMARY KEY (rowid)
73+
);
74+
75+
CREATE TABLE studies.timepointToDate (
76+
rowid serial,
77+
subjectId varchar(4000),
78+
timepointId int,
79+
dateMin timestamp,
80+
dateMax timestamp,
81+
isManualOverride bool default false,
82+
83+
container entityid,
84+
created timestamp,
85+
createdby int,
86+
modified timestamp,
87+
modifiedby int,
88+
89+
CONSTRAINT PK_timepointToDate PRIMARY KEY (rowid)
90+
);
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
CREATE TABLE studies.studies (
2+
rowid int identity(1,1),
3+
studyName varchar(1000),
4+
label varchar(1000),
5+
category varchar(1000),
6+
description varchar(4000),
7+
8+
lsid entityid,
9+
container entityid,
10+
created datetime,
11+
createdby int,
12+
modified datetime,
13+
modifiedby int,
14+
15+
CONSTRAINT PK_studies PRIMARY KEY (rowid)
16+
);
17+
18+
CREATE TABLE studies.studyCohorts (
19+
rowid int identity(1,1),
20+
studyId int,
21+
cohortName varchar(4000),
22+
label varchar(4000),
23+
category varchar(4000),
24+
description varchar(4000),
25+
isControlGroup bit default 0,
26+
sortOrder int,
27+
28+
lsid entityid,
29+
container entityid,
30+
created datetime,
31+
createdby int,
32+
modified datetime,
33+
modifiedby int,
34+
35+
CONSTRAINT PK_studyCohorts PRIMARY KEY (rowid)
36+
);
37+
38+
CREATE TABLE studies.anchorEvents (
39+
rowid int identity(1,1),
40+
studyId int,
41+
label varchar(4000),
42+
description varchar(4000),
43+
eventProviderName varchar(1000),
44+
45+
container entityid,
46+
created datetime,
47+
createdby int,
48+
modified datetime,
49+
modifiedby int,
50+
51+
CONSTRAINT PK_anchorEvents PRIMARY KEY (rowid)
52+
);
53+
54+
CREATE TABLE studies.expectedTimepoints (
55+
rowid int identity(1,1),
56+
studyId int,
57+
cohortId int,
58+
label varchar(4000),
59+
labelShort varchar(100),
60+
description varchar(4000),
61+
numericLabel int,
62+
anchorEvent int,
63+
rangeMin int,
64+
rangeMax int,
65+
66+
container entityid,
67+
created datetime,
68+
createdby int,
69+
modified datetime,
70+
modifiedby int,
71+
72+
CONSTRAINT PK_expectedTimepoints PRIMARY KEY (rowid)
73+
);
74+
75+
CREATE TABLE studies.timepointToDate (
76+
rowid int identity(1,1),
77+
subjectId varchar(4000),
78+
timepointId int,
79+
dateMin datetime,
80+
dateMax datetime,
81+
isManualOverride bit default 0,
82+
83+
container entityid,
84+
created datetime,
85+
createdby int,
86+
modified datetime,
87+
modifiedby int,
88+
89+
CONSTRAINT PK_timepointToDate PRIMARY KEY (rowid)
90+
);

0 commit comments

Comments
 (0)