Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[GLT-4049] added case deliverables #38

Merged
merged 1 commit into from
Dec 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions cardea-data/src/main/java/ca/on/oicr/gsi/cardea/data/Case.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public class Case {
private final Requisition requisition;
private final LocalDate startDate;
private final List<Test> tests;
private final List<Deliverable> deliverables;
private final String timepoint;
private final String tissueOrigin;
private final String tissueType;
Expand All @@ -55,6 +56,8 @@ private Case(Builder builder) {
this.timepoint = builder.timepoint;
this.receipts = unmodifiableList(builder.receipts);
this.tests = unmodifiableList(builder.tests);
this.deliverables =
builder.deliverables == null ? null : unmodifiableList(builder.deliverables);
this.requisition = requireNonNull(builder.requisition);
this.startDate = requireNonNull(builder.startDate);
this.latestActivityDate = Stream
Expand Down Expand Up @@ -115,6 +118,10 @@ public List<Test> getTests() {
return tests;
}

public List<Deliverable> getDeliverables() {
return deliverables;
}

public String getTimepoint() {
return timepoint;
}
Expand Down Expand Up @@ -167,6 +174,7 @@ public static class Builder {
private List<Sample> receipts;
private Requisition requisition;
private List<Test> tests;
private List<Deliverable> deliverables;
private String timepoint;
private String tissueOrigin;
private String tissueType;
Expand Down Expand Up @@ -227,6 +235,11 @@ public Builder requisition(Requisition requisition) {
return this;
}

public Builder deliverables(List<Deliverable> deliverables) {
this.deliverables = deliverables;
return this;
}

public Builder tests(List<Test> tests) {
this.tests = tests;
return this;
Expand Down
144 changes: 144 additions & 0 deletions cardea-data/src/main/java/ca/on/oicr/gsi/cardea/data/Deliverable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
package ca.on.oicr.gsi.cardea.data;

import static java.util.Objects.requireNonNull;

import java.time.LocalDate;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;

public class Deliverable {

private final DeliverableType deliverableType;
private final LocalDate analysisReviewQcDate;
private final Boolean analysisReviewQcPassed;
private final String analysisReviewQcUser;
private final LocalDate releaseApprovalQcDate;
private final Boolean releaseApprovalQcPassed;
private final String releaseApprovalQcUser;
private final LocalDate releaseQcDate;
private final Boolean releaseQcPassed;
private final String releaseQcUser;

private Deliverable(Builder builder) {
this.deliverableType = requireNonNull(builder.deliverableType);
this.analysisReviewQcDate = builder.analysisReviewQcDate;
this.analysisReviewQcPassed = builder.analysisReviewQcPassed;
this.analysisReviewQcUser = builder.analysisReviewQcUser;
this.releaseApprovalQcDate = builder.releaseApprovalQcDate;
this.releaseApprovalQcPassed = builder.releaseApprovalQcPassed;
this.releaseApprovalQcUser = builder.releaseApprovalQcUser;
this.releaseQcDate = builder.releaseQcDate;
this.releaseQcPassed = builder.releaseQcPassed;
this.releaseQcUser = builder.releaseQcUser;
}

public DeliverableType getDeliverableType() {
return deliverableType;
}

public LocalDate getAnalysisReviewQcDate() {
return analysisReviewQcDate;
}

public Boolean getAnalysisReviewQcPassed() {
return analysisReviewQcPassed;
}

public String getAnalysisReviewQcUser() {
return analysisReviewQcUser;
}

public LocalDate getReleaseApprovalQcDate() {
return releaseApprovalQcDate;
}

public Boolean getReleaseApprovalQcPassed() {
return releaseApprovalQcPassed;
}

public String getReleaseApprovalQcUser() {
return releaseApprovalQcUser;
}

public LocalDate getReleaseQcDate() {
return releaseQcDate;
}

public Boolean getReleaseQcPassed() {
return releaseQcPassed;
}

public String getReleaseQcUser() {
return releaseQcUser;
}

@JsonPOJOBuilder(withPrefix = "")
public static class Builder {

private DeliverableType deliverableType;
private LocalDate analysisReviewQcDate;
private Boolean analysisReviewQcPassed;
private String analysisReviewQcUser;
private LocalDate releaseApprovalQcDate;
private Boolean releaseApprovalQcPassed;
private String releaseApprovalQcUser;
private LocalDate releaseQcDate;
private Boolean releaseQcPassed;
private String releaseQcUser;

public Builder deliverableType(DeliverableType deliverableType) {
this.deliverableType = deliverableType;
return this;
}

public Builder analysisReviewQcDate(LocalDate analysisReviewQcDate) {
this.analysisReviewQcDate = analysisReviewQcDate;
return this;
}

public Builder analysisReviewQcPassed(Boolean analysisReviewQcPassed) {
this.analysisReviewQcPassed = analysisReviewQcPassed;
return this;
}

public Builder analysisReviewQcUser(String analysisReviewQcUser) {
this.analysisReviewQcUser = analysisReviewQcUser;
return this;
}

public Builder releaseApprovalQcDate(LocalDate releaseApprovalQcDate) {
this.releaseApprovalQcDate = releaseApprovalQcDate;
return this;
}

public Builder releaseApprovalQcPassed(Boolean releaseApprovalQcPassed) {
this.releaseApprovalQcPassed = releaseApprovalQcPassed;
return this;
}

public Builder releaseApprovalQcUser(String releaseApprovalQcUser) {
this.releaseApprovalQcUser = releaseApprovalQcUser;
return this;
}

public Builder releaseQcDate(LocalDate releaseQcDate) {
this.releaseQcDate = releaseQcDate;
return this;
}

public Builder releaseQcPassed(Boolean releaseQcPassed) {
this.releaseQcPassed = releaseQcPassed;
return this;
}

public Builder releaseQcUser(String releaseQcUser) {
this.releaseQcUser = releaseQcUser;
return this;
}

public Deliverable build() {
return new Deliverable(this);
}

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ca.on.oicr.gsi.cardea.data;

public enum DeliverableType {

CLINICAL_REPORT("Clinical Report"), DATA_RELEASE("Data Release");

private final String label;

private DeliverableType(String label) {
this.label = label;
}

public String getLabel() {
return label;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import ca.on.oicr.gsi.cardea.data.AssayTargets;
import ca.on.oicr.gsi.cardea.data.Case;
import ca.on.oicr.gsi.cardea.data.CaseData;
import ca.on.oicr.gsi.cardea.data.Deliverable;
import ca.on.oicr.gsi.cardea.data.DeliverableType;
import ca.on.oicr.gsi.cardea.data.Donor;
import ca.on.oicr.gsi.cardea.data.Lane;
import ca.on.oicr.gsi.cardea.data.Metric;
Expand Down Expand Up @@ -226,6 +228,7 @@ private List<Case> loadCases(FileReader fileReader, Map<String, Project> project
.timepoint(parseString(json, "timepoint"))
.receipts(parseIdsAndGet(json, "receipt_ids", JsonNode::asText, samplesById))
.tests(parseTests(json, "assay_tests", samplesById))
.deliverables(parseDeliverables(json.get("deliverables")))
.requisition(requisitionsById.get(requisitionId))
.startDate(parseDate(json, "start_date"))
.receiptDaysSpent(parseInteger(json, "receipt_days_spent", true))
Expand Down Expand Up @@ -324,7 +327,7 @@ protected Map<Long, Run> loadRuns(FileReader fileReader) throws DataParseExcepti
.percentOverQ30(parseDecimal(json, "percent_over_q30", false))
.clustersPf(parseLong(json, "clusters_pf", false))
.lanes(parseLanes(json.get("lanes")))
.qcPassed(parseQcPassed(json, "qc_state"))
.qcPassed(parseQcPassed(json, "qc_state", true))
.qcUser(parseString(json, "qc_user"))
.qcDate(parseDate(json, "qc_date"))
.dataReviewPassed(parseDataReviewPassed(json, "data_review_state"))
Expand Down Expand Up @@ -390,7 +393,7 @@ protected Map<String, Sample> loadSamples(FileReader fileReader, Map<String, Don
.lambdaClusters(parseInteger(json, "lambda_clusters", false))
.puc19Methylation(parseDecimal(json, "puc19_methylation", false))
.puc19Clusters(parseInteger(json, "puc19_clusters", false))
.qcPassed(parseQcPassed(json, "qc_state"))
.qcPassed(parseQcPassed(json, "qc_state", true))
.qcReason(parseString(json, "qc_reason"))
.qcNote(parseString(json, "qc_note"))
.qcUser(parseString(json, "qc_user"))
Expand Down Expand Up @@ -485,8 +488,12 @@ private static Long parseLong(JsonNode json, String fieldName, boolean required)
return node == null ? null : node.asLong();
}

private static Boolean parseQcPassed(JsonNode json, String fieldName) throws DataParseException {
String qcState = parseString(json, fieldName, true);
private static Boolean parseQcPassed(JsonNode json, String fieldName, boolean required)
throws DataParseException {
String qcState = parseString(json, fieldName, required);
if (qcState == null) {
return null;
}
switch (qcState) {
case "Ready":
return Boolean.TRUE;
Expand Down Expand Up @@ -529,7 +536,7 @@ private static List<RequisitionQc> parseRequisitionQcs(JsonNode json, String fie
List<RequisitionQc> qcs = new ArrayList<>();
for (JsonNode node : arr) {
qcs.add(new RequisitionQc.Builder()
.qcPassed(parseQcPassed(node, "qc_state"))
.qcPassed(parseQcPassed(node, "qc_state", true))
.qcUser(parseString(node, "qc_user"))
.qcDate(parseDate(node, "qc_date"))
.build());
Expand Down Expand Up @@ -727,6 +734,28 @@ private List<Test> parseTests(JsonNode json, String fieldName, Map<String, Sampl
return tests;
}

private List<Deliverable> parseDeliverables(JsonNode deliverablesNode) throws DataParseException {
if (deliverablesNode == null) {
return null;
}
List<Deliverable> deliverables = new ArrayList<>();
for (JsonNode node : deliverablesNode) {
deliverables.add(new Deliverable.Builder()
.deliverableType(DeliverableType.valueOf(parseString(node, "deliverable_type")))
.analysisReviewQcDate(parseDate(node, "analysis_review_qc_date"))
.analysisReviewQcPassed(parseQcPassed(node, "analysis_review_qc_state", false))
.analysisReviewQcUser(parseString(node, "analysis_review_qc_user"))
.releaseApprovalQcDate(parseDate(node, "release_approval_qc_date"))
.releaseApprovalQcPassed(parseQcPassed(node, "release_approval_qc_state", false))
.releaseApprovalQcUser(parseString(node, "release_approval_qc_user"))
.releaseQcDate(parseDate(node, "release_qc_date"))
.releaseQcPassed(parseQcPassed(node, "release_qc_state", false))
.releaseQcUser(parseString(node, "release_qc_user"))
.build());
}
return deliverables;
}

@FunctionalInterface
private static interface ParseFunction<T, R> {
R apply(T input) throws DataParseException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import ca.on.oicr.gsi.cardea.data.AssayTargets;
import ca.on.oicr.gsi.cardea.data.Case;
import ca.on.oicr.gsi.cardea.data.CaseData;
import ca.on.oicr.gsi.cardea.data.Deliverable;
import ca.on.oicr.gsi.cardea.data.DeliverableType;
import ca.on.oicr.gsi.cardea.data.Donor;
import ca.on.oicr.gsi.cardea.data.Metric;
import ca.on.oicr.gsi.cardea.data.MetricCategory;
Expand Down Expand Up @@ -40,7 +42,6 @@ public class CaseLoaderTest {
private static final String testProjectName = "PROJ";
private static final String testSampleId = "SAM413577";
private static File dataDirectory;
private List<Case> cases = MockCase.getCases();
private CaseLoader sut;

@BeforeAll
Expand Down Expand Up @@ -137,6 +138,14 @@ public void testLoad() throws Exception {
assertEquals("5476_1_LDI73620", fullDepth.getId());
assertEquals("PROJ_1289_Ly_R_PE_567_WG", fullDepth.getName());
assertEquals(Boolean.TRUE, fullDepth.getQcPassed());

assertNotNull(kase.getDeliverables());
assertEquals(1, kase.getDeliverables().size());
Deliverable deliverable = kase.getDeliverables().get(0);
assertEquals(DeliverableType.CLINICAL_REPORT, deliverable.getDeliverableType());
assertEquals("Person", deliverable.getAnalysisReviewQcUser());
assertEquals(LocalDate.of(2021, 8, 10), deliverable.getAnalysisReviewQcDate());
assertTrue(deliverable.getAnalysisReviewQcPassed());
}

@Test
Expand Down
14 changes: 14 additions & 0 deletions cardea-server/src/test/resources/testdata/cases.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,20 @@
"full_depth_sequencing_days_spent": 0
}
],
"deliverables": [
{
"deliverable_type": "CLINICAL_REPORT",
"analysis_review_qc_state": "Ready",
"analysis_review_qc_user": "Person",
"analysis_review_qc_date": "2021-08-10",
"release_approval_qc_state": null,
"release_approval_qc_user": null,
"release_approval_qc_date": null,
"release_qc_state": null,
"release_qc_user": null,
"release_qc_date": null
}
],
"requisition_id": 512,
"stopped": false,
"start_date": "2021-07-19",
Expand Down
1 change: 1 addition & 0 deletions changes/add_deliverables.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Case deliverables