diff --git a/SivStudies/src/org/labkey/sivstudies/SivStudiesModule.java b/SivStudies/src/org/labkey/sivstudies/SivStudiesModule.java index 020e9889..4bedeb33 100644 --- a/SivStudies/src/org/labkey/sivstudies/SivStudiesModule.java +++ b/SivStudies/src/org/labkey/sivstudies/SivStudiesModule.java @@ -21,6 +21,9 @@ import org.labkey.api.data.Container; import org.labkey.api.ldk.ExtendedSimpleModule; import org.labkey.api.module.ModuleContext; +import org.labkey.api.studies.StudiesService; +import org.labkey.sivstudies.study.ArtInitiationEventProvider; +import org.labkey.sivstudies.study.SivInfectionEventProvider; import java.util.Collection; import java.util.Collections; @@ -51,7 +54,8 @@ protected void init() @Override public void doStartupAfterSpringConfig(ModuleContext moduleContext) { - + StudiesService.get().registerEventProvider(new SivInfectionEventProvider()); + StudiesService.get().registerEventProvider(new ArtInitiationEventProvider()); } @Override diff --git a/SivStudies/src/org/labkey/sivstudies/study/ArtInitiationEventProvider.java b/SivStudies/src/org/labkey/sivstudies/study/ArtInitiationEventProvider.java new file mode 100644 index 00000000..c627d406 --- /dev/null +++ b/SivStudies/src/org/labkey/sivstudies/study/ArtInitiationEventProvider.java @@ -0,0 +1,58 @@ +package org.labkey.sivstudies.study; + +import org.labkey.api.data.CompareType; +import org.labkey.api.data.Container; +import org.labkey.api.data.SimpleFilter; +import org.labkey.api.data.TableInfo; +import org.labkey.api.data.TableSelector; +import org.labkey.api.module.ModuleLoader; +import org.labkey.api.query.FieldKey; +import org.labkey.api.security.User; +import org.labkey.api.studies.study.AbstractEventProvider; +import org.labkey.api.study.DatasetTable; +import org.labkey.api.util.PageFlowUtil; +import org.labkey.sivstudies.SivStudiesModule; + +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class ArtInitiationEventProvider extends AbstractEventProvider +{ + public ArtInitiationEventProvider() + { + super("ART_Initiation", "ART Initiation", "This is the first date when the subject was assigned to the study, as defined in the study assignment table", ModuleLoader.getInstance().getModule(SivStudiesModule.class)); + } + + @Override + protected Map inferDatesRaw(Collection subjectList, Container c, User u) + { + TableInfo ti = getTable(c, u, "study", "treatments"); + if (ti == null) + { + return null; + } + + if (ti instanceof DatasetTable ds) + { + Map ret = new HashMap<>(); + final String subjectCol = ds.getDataset().getStudy().getSubjectColumnName(); + new TableSelector(ti, PageFlowUtil.set(subjectCol, "date"), new SimpleFilter(FieldKey.fromString(subjectCol), subjectList, CompareType.IN), null).forEachResults(rs -> { + String subjectId = rs.getString(FieldKey.fromString(subjectCol)); + Date date = rs.getDate(FieldKey.fromString("date")); + + if (!ret.containsKey(subjectId) || date.before(ret.get(subjectId))) + { + ret.put(subjectId, date); + } + }); + + return ret; + } + else + { + throw new IllegalStateException("Expected study.assignment to be a DatasetTable"); + } + } +} diff --git a/SivStudies/src/org/labkey/sivstudies/study/SivInfectionEventProvider.java b/SivStudies/src/org/labkey/sivstudies/study/SivInfectionEventProvider.java new file mode 100644 index 00000000..6ff2c177 --- /dev/null +++ b/SivStudies/src/org/labkey/sivstudies/study/SivInfectionEventProvider.java @@ -0,0 +1,62 @@ +package org.labkey.sivstudies.study; + +import org.labkey.api.data.CompareType; +import org.labkey.api.data.Container; +import org.labkey.api.data.SimpleFilter; +import org.labkey.api.data.TableInfo; +import org.labkey.api.data.TableSelector; +import org.labkey.api.module.ModuleLoader; +import org.labkey.api.query.FieldKey; +import org.labkey.api.query.QueryService; +import org.labkey.api.query.UserSchema; +import org.labkey.api.security.User; +import org.labkey.api.security.permissions.ReadPermission; +import org.labkey.api.studies.study.AbstractEventProvider; +import org.labkey.api.study.DatasetTable; +import org.labkey.api.util.PageFlowUtil; +import org.labkey.sivstudies.SivStudiesModule; + +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class SivInfectionEventProvider extends AbstractEventProvider +{ + public SivInfectionEventProvider() + { + super("SIV_Infection", "SIV Infection", "This is the official date of SIV infection, used to calculate days-post-infection", ModuleLoader.getInstance().getModule(SivStudiesModule.class)); + } + + @Override + protected Map inferDatesRaw(Collection subjectList, Container c, User u) + { + UserSchema us = QueryService.get().getUserSchema(u, c, "study"); + if (us == null) + { + return Collections.emptyMap(); + } + + TableInfo ti = us.getTable("assignment"); + if (ti == null || !ti.hasPermission(u, ReadPermission.class)) + { + return Collections.emptyMap(); + } + + if (ti instanceof DatasetTable ds) + { + Map ret = new HashMap<>(); + final String subjectCol = ds.getDataset().getStudy().getSubjectColumnName(); + new TableSelector(ti, PageFlowUtil.set(subjectCol, "date"), new SimpleFilter(FieldKey.fromString(subjectCol), subjectList, CompareType.IN), null).forEachResults(rs -> { + ret.put(rs.getString(FieldKey.fromString(subjectCol)), rs.getDate(FieldKey.fromString("date"))); + }); + + return ret; + } + else + { + throw new IllegalStateException("Expected study.assignment to be a DatasetTable"); + } + } +}