From 94b431cbfb76ad00c607f367a587e28a2e05eed5 Mon Sep 17 00:00:00 2001 From: Charles Haynes <33608920+haynescd@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:30:22 -0400 Subject: [PATCH] Rfc80/treatments patients endpoint (#10903) * Create new endpoint treatment/patient-counts/fetch * Create StudyViewFilterHelper class * :arrow_up: Upgrade CH client Version * Fix Merge Conflict issue * Update Treatment event name * Update to handle patient treatment filtering * Fix sonar issues * Fix sonar comments 2 --- pom.xml | 2 +- .../cbioportal/model/PatientTreatment.java | 7 ++ .../model/PatientTreatmentReport.java | 11 +++ .../persistence/StudyViewRepository.java | 6 ++ .../helper/StudyViewFilterHelper.java | 78 +++++++++++++++++++ .../mybatisclickhouse/StudyViewMapper.java | 5 ++ .../StudyViewMyBatisRepository.java | 30 ++++++- .../service/StudyViewColumnarService.java | 3 +- .../impl/StudyViewColumnarServiceImpl.java | 6 ++ .../StudyViewColumnStoreController.java | 32 ++++++++ ...volvedCancerStudyExtractorInterceptor.java | 4 +- .../StudyViewFilterMapper.xml | 22 +++++- .../mybatisclickhouse/StudyViewMapper.xml | 59 ++++++++++++-- .../StudyViewMapperTest.java | 43 +++++++++- src/test/resources/clickhouse_data.sql | 4 +- 15 files changed, 295 insertions(+), 17 deletions(-) create mode 100644 src/main/java/org/cbioportal/model/PatientTreatment.java create mode 100644 src/main/java/org/cbioportal/model/PatientTreatmentReport.java create mode 100644 src/main/java/org/cbioportal/persistence/helper/StudyViewFilterHelper.java diff --git a/pom.xml b/pom.xml index 858d70d204c..46bbe2dfa94 100644 --- a/pom.xml +++ b/pom.xml @@ -358,7 +358,7 @@ com.clickhouse clickhouse-jdbc - 0.5.0 + 0.6.2 all diff --git a/src/main/java/org/cbioportal/model/PatientTreatment.java b/src/main/java/org/cbioportal/model/PatientTreatment.java new file mode 100644 index 00000000000..c838d23777e --- /dev/null +++ b/src/main/java/org/cbioportal/model/PatientTreatment.java @@ -0,0 +1,7 @@ +package org.cbioportal.model; + +import java.io.Serializable; + +public record PatientTreatment (String treatment, int count) implements Serializable { + +} diff --git a/src/main/java/org/cbioportal/model/PatientTreatmentReport.java b/src/main/java/org/cbioportal/model/PatientTreatmentReport.java new file mode 100644 index 00000000000..d09a2276f06 --- /dev/null +++ b/src/main/java/org/cbioportal/model/PatientTreatmentReport.java @@ -0,0 +1,11 @@ +package org.cbioportal.model; + +import java.io.Serializable; +import java.util.Collections; +import java.util.List; + +public record PatientTreatmentReport (int totalPatients, int totalSamples, List patientTreatments) implements Serializable { + public PatientTreatmentReport(int totalPatients, int totalSamples) { + this(totalPatients, totalSamples, Collections.emptyList()); + } +} diff --git a/src/main/java/org/cbioportal/persistence/StudyViewRepository.java b/src/main/java/org/cbioportal/persistence/StudyViewRepository.java index cc2b2629a58..59deedce6d4 100644 --- a/src/main/java/org/cbioportal/persistence/StudyViewRepository.java +++ b/src/main/java/org/cbioportal/persistence/StudyViewRepository.java @@ -8,6 +8,8 @@ import org.cbioportal.model.ClinicalEventTypeCount; import org.cbioportal.model.CopyNumberCountByGene; import org.cbioportal.model.GenomicDataCount; +import org.cbioportal.model.PatientTreatment; +import org.cbioportal.model.PatientTreatmentReport; import org.cbioportal.model.Sample; import org.cbioportal.web.parameter.ClinicalDataType; import org.cbioportal.web.parameter.StudyViewFilter; @@ -49,4 +51,8 @@ public interface StudyViewRepository { int getSampleProfileCountWithoutPanelData(StudyViewFilter studyViewFilter, String alterationType); List getClinicalEventTypeCounts(StudyViewFilter studyViewFilter); + + List getPatientTreatments(StudyViewFilter studyViewFilter); + + PatientTreatmentReport getPatientTreatmentReport(StudyViewFilter studyViewFilter); } diff --git a/src/main/java/org/cbioportal/persistence/helper/StudyViewFilterHelper.java b/src/main/java/org/cbioportal/persistence/helper/StudyViewFilterHelper.java new file mode 100644 index 00000000000..5d63ac03b90 --- /dev/null +++ b/src/main/java/org/cbioportal/persistence/helper/StudyViewFilterHelper.java @@ -0,0 +1,78 @@ +package org.cbioportal.persistence.helper; + +import org.cbioportal.model.ClinicalAttribute; +import org.cbioportal.persistence.enums.ClinicalAttributeDataSource; +import org.cbioportal.web.parameter.CategorizedClinicalDataCountFilter; +import org.cbioportal.web.parameter.StudyViewFilter; +import org.springframework.lang.NonNull; +import org.springframework.lang.Nullable; + +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class StudyViewFilterHelper { + public static StudyViewFilterHelper build(@Nullable StudyViewFilter studyViewFilter, @Nullable EnumMap> clinicalAttributesMap) { + if (Objects.isNull(studyViewFilter)) { + studyViewFilter = new StudyViewFilter(); + } + if (Objects.isNull(clinicalAttributesMap)) { + clinicalAttributesMap = new EnumMap<>(ClinicalAttributeDataSource.class); + } + return new StudyViewFilterHelper(studyViewFilter, clinicalAttributesMap); + } + + private final StudyViewFilter studyViewFilter; + private final CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter; + + + private StudyViewFilterHelper(@NonNull StudyViewFilter studyViewFilter, @NonNull Map> clinicalAttributesMap ) { + this.studyViewFilter = studyViewFilter; + this.categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter, clinicalAttributesMap); + } + + private CategorizedClinicalDataCountFilter extractClinicalDataCountFilters(final StudyViewFilter studyViewFilter, Map> clinicalAttributesMap) { + + if (studyViewFilter.getClinicalDataFilters() == null || clinicalAttributesMap.isEmpty()) { + return CategorizedClinicalDataCountFilter.getBuilder().build(); + } + + List patientCategoricalAttributes = clinicalAttributesMap.get(ClinicalAttributeDataSource.PATIENT) + .stream().filter(ca -> ca.getDatatype().equals("STRING")) + .map(ClinicalAttribute::getAttrId) + .toList(); + + List patientNumericalAttributes = clinicalAttributesMap.get(ClinicalAttributeDataSource.PATIENT) + .stream().filter(ca -> ca.getDatatype().equals("NUMBER")) + .map(ClinicalAttribute::getAttrId) + .toList(); + + List sampleCategoricalAttributes = clinicalAttributesMap.get(ClinicalAttributeDataSource.SAMPLE) + .stream().filter(ca -> ca.getDatatype().equals("STRING")) + .map(ClinicalAttribute::getAttrId) + .toList(); + + List sampleNumericalAttributes = clinicalAttributesMap.get(ClinicalAttributeDataSource.SAMPLE) + .stream().filter(ca -> ca.getDatatype().equals("NUMBER")) + .map(ClinicalAttribute::getAttrId) + .toList(); + + return CategorizedClinicalDataCountFilter.getBuilder() + .setPatientCategoricalClinicalDataFilters(studyViewFilter.getClinicalDataFilters() + .stream().filter(clinicalDataFilter -> patientCategoricalAttributes.contains(clinicalDataFilter.getAttributeId())) + .toList()) + .setPatientNumericalClinicalDataFilters(studyViewFilter.getClinicalDataFilters().stream() + .filter(clinicalDataFilter -> patientNumericalAttributes.contains(clinicalDataFilter.getAttributeId())) + .toList()) + .setSampleCategoricalClinicalDataFilters(studyViewFilter.getClinicalDataFilters().stream() + .filter(clinicalDataFilter -> sampleCategoricalAttributes.contains(clinicalDataFilter.getAttributeId())) + .toList()) + .setSampleNumericalClinicalDataFilters(studyViewFilter.getClinicalDataFilters().stream() + .filter(clinicalDataFilter -> sampleNumericalAttributes.contains(clinicalDataFilter.getAttributeId())) + .toList()) + .build(); + } + + +} diff --git a/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.java b/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.java index a249333641e..bd9d4b602c3 100644 --- a/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.java +++ b/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.java @@ -10,6 +10,8 @@ import org.cbioportal.model.CopyNumberCountByGene; import org.cbioportal.model.GenePanelToGene; import org.cbioportal.model.GenomicDataCount; +import org.cbioportal.model.PatientTreatment; +import org.cbioportal.model.PatientTreatmentReport; import org.cbioportal.model.Sample; import org.cbioportal.persistence.helper.AlterationFilterHelper; import org.cbioportal.web.parameter.CategorizedClinicalDataCountFilter; @@ -55,4 +57,7 @@ List getClinicalDataCounts(StudyViewFilter studyViewFilter, C int getSampleProfileCountWithoutPanelData(StudyViewFilter studyViewFilter, CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter, boolean applyPatientIdFilters, String alterationType); List getClinicalEventTypeCounts(StudyViewFilter studyViewFilter, CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter, boolean applyPatientIdFilters); + + List getPatientTreatments(StudyViewFilter studyViewFilter, CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter, boolean applyPatientIdFilters); + PatientTreatmentReport getPatientTreatmentCounts(StudyViewFilter studyViewFilter, CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter, boolean applyPatientIdFilters); } diff --git a/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMyBatisRepository.java b/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMyBatisRepository.java index 1690ba82a8b..7da568dabf2 100644 --- a/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMyBatisRepository.java +++ b/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMyBatisRepository.java @@ -8,6 +8,8 @@ import org.cbioportal.model.GenePanelToGene; import org.cbioportal.model.GenomicDataCount; import org.cbioportal.model.CopyNumberCountByGene; +import org.cbioportal.model.PatientTreatment; +import org.cbioportal.model.PatientTreatmentReport; import org.cbioportal.model.Sample; import org.cbioportal.persistence.StudyViewRepository; import org.cbioportal.persistence.enums.ClinicalAttributeDataSource; @@ -114,8 +116,9 @@ public List getCaseListDataCounts(StudyViewFilter studyViewFi private boolean shouldApplyPatientIdFilters(StudyViewFilter studyViewFilter, CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter) { - return studyViewFilter.getClinicalEventFilters() != null && !studyViewFilter.getClinicalEventFilters().isEmpty() - || categorizedClinicalDataCountFilter.getPatientCategoricalClinicalDataFilters() != null && !categorizedClinicalDataCountFilter.getPatientCategoricalClinicalDataFilters().isEmpty() + return studyViewFilter.getClinicalEventFilters() != null && !studyViewFilter.getClinicalEventFilters().isEmpty() + || studyViewFilter.getPatientTreatmentFilters() != null && studyViewFilter.getPatientTreatmentFilters().getFilters()!= null && !studyViewFilter.getPatientTreatmentFilters().getFilters().isEmpty() + || categorizedClinicalDataCountFilter.getPatientCategoricalClinicalDataFilters() != null && !categorizedClinicalDataCountFilter.getPatientCategoricalClinicalDataFilters().isEmpty() || categorizedClinicalDataCountFilter.getPatientNumericalClinicalDataFilters() != null && !categorizedClinicalDataCountFilter.getPatientNumericalClinicalDataFilters().isEmpty(); } @@ -180,12 +183,35 @@ public List getClinicalEventTypeCounts(StudyViewFilter s shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter)); } + @Override + public List getPatientTreatments(StudyViewFilter studyViewFilter) { + CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); + return mapper.getPatientTreatments(studyViewFilter, categorizedClinicalDataCountFilter, shouldApplyPatientIdFilters(studyViewFilter, categorizedClinicalDataCountFilter)); + } + + @Override + public PatientTreatmentReport getPatientTreatmentReport(StudyViewFilter studyViewFilter) { + CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); + var patientTreatmentCounts = mapper.getPatientTreatmentCounts(studyViewFilter, categorizedClinicalDataCountFilter, + shouldApplyPatientIdFilters(studyViewFilter, categorizedClinicalDataCountFilter)); + var patientTreatments = mapper.getPatientTreatments(studyViewFilter, categorizedClinicalDataCountFilter, + shouldApplyPatientIdFilters(studyViewFilter, categorizedClinicalDataCountFilter)); + return new PatientTreatmentReport(patientTreatmentCounts.totalPatients(), patientTreatmentCounts.totalSamples(), patientTreatments); + } + private void buildClinicalAttributeNameMap() { clinicalAttributesMap = this.getClinicalAttributes() .stream() .collect(Collectors.groupingBy(ca -> ca.getPatientAttribute() ? ClinicalAttributeDataSource.PATIENT : ClinicalAttributeDataSource.SAMPLE)); } + private Map> getClinicalAttributeNameMap() { + if (clinicalAttributesMap.isEmpty()) { + buildClinicalAttributeNameMap(); + } + return clinicalAttributesMap; + } + private CategorizedClinicalDataCountFilter extractClinicalDataCountFilters(final StudyViewFilter studyViewFilter) { if (clinicalAttributesMap.isEmpty()) { buildClinicalAttributeNameMap(); diff --git a/src/main/java/org/cbioportal/service/StudyViewColumnarService.java b/src/main/java/org/cbioportal/service/StudyViewColumnarService.java index 8ae5ea20608..f332b586361 100644 --- a/src/main/java/org/cbioportal/service/StudyViewColumnarService.java +++ b/src/main/java/org/cbioportal/service/StudyViewColumnarService.java @@ -7,6 +7,7 @@ import org.cbioportal.model.ClinicalEventTypeCount; import org.cbioportal.model.GenomicDataCount; import org.cbioportal.model.CopyNumberCountByGene; +import org.cbioportal.model.PatientTreatmentReport; import org.cbioportal.model.Sample; import org.cbioportal.web.parameter.ClinicalDataType; import org.cbioportal.web.parameter.StudyViewFilter; @@ -35,5 +36,5 @@ public interface StudyViewColumnarService { List getGenomicDataCounts(StudyViewFilter studyViewFilter); List getClinicalEventTypeCounts(StudyViewFilter studyViewFilter); - + PatientTreatmentReport getPatientTreatmentReport(StudyViewFilter studyViewFilter); } diff --git a/src/main/java/org/cbioportal/service/impl/StudyViewColumnarServiceImpl.java b/src/main/java/org/cbioportal/service/impl/StudyViewColumnarServiceImpl.java index b73ca064803..31dc8f01ac0 100644 --- a/src/main/java/org/cbioportal/service/impl/StudyViewColumnarServiceImpl.java +++ b/src/main/java/org/cbioportal/service/impl/StudyViewColumnarServiceImpl.java @@ -8,6 +8,7 @@ import org.cbioportal.model.ClinicalEventTypeCount; import org.cbioportal.model.CopyNumberCountByGene; import org.cbioportal.model.GenomicDataCount; +import org.cbioportal.model.PatientTreatmentReport; import org.cbioportal.model.Sample; import org.cbioportal.persistence.StudyViewRepository; import org.cbioportal.service.AlterationCountService; @@ -57,6 +58,11 @@ public List getClinicalEventTypeCounts(StudyViewFilter s return studyViewRepository.getClinicalEventTypeCounts(studyViewFilter); } + @Override + public PatientTreatmentReport getPatientTreatmentReport(StudyViewFilter studyViewFilter) { + return studyViewRepository.getPatientTreatmentReport(studyViewFilter); + } + public List getCnaGenes(StudyViewFilter studyViewFilter) { return alterationCountService.getCnaGenes(studyViewFilter); } diff --git a/src/main/java/org/cbioportal/web/columnar/StudyViewColumnStoreController.java b/src/main/java/org/cbioportal/web/columnar/StudyViewColumnStoreController.java index 3ec1ccf90a6..e8b3a6181a3 100644 --- a/src/main/java/org/cbioportal/web/columnar/StudyViewColumnStoreController.java +++ b/src/main/java/org/cbioportal/web/columnar/StudyViewColumnStoreController.java @@ -13,11 +13,14 @@ import org.cbioportal.model.ClinicalData; import org.cbioportal.model.ClinicalDataBin; import org.cbioportal.model.ClinicalDataCountItem; +import org.cbioportal.model.ClinicalEventKeyCode; import org.cbioportal.model.ClinicalEventTypeCount; import org.cbioportal.model.ClinicalViolinPlotData; import org.cbioportal.model.CopyNumberCountByGene; import org.cbioportal.model.DensityPlotData; import org.cbioportal.model.GenomicDataCount; +import org.cbioportal.model.PatientTreatmentReport; +import org.cbioportal.model.PatientTreatmentRow; import org.cbioportal.model.Sample; import org.cbioportal.service.ClinicalDataDensityPlotService; import org.cbioportal.service.StudyViewColumnarService; @@ -350,4 +353,33 @@ public ResponseEntity> getClinicalEventTypeCounts( ) { return new ResponseEntity<>(studyViewColumnarService.getClinicalEventTypeCounts(interceptedStudyViewFilter), HttpStatus.OK); } + + @PreAuthorize("hasPermission(#involvedCancerStudies, 'Collection', T(org.cbioportal.utils.security.AccessLevel).READ)") + @PostMapping(value = "/column-store/treatments/patient-counts/fetch", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(description = "Get all patient level treatments") + @ApiResponse(responseCode = "200", description = "OK", + content = @Content(array = @ArraySchema(schema = @Schema(implementation = PatientTreatmentRow.class)))) + public ResponseEntity getPatientTreatmentCounts( + @Parameter(required = false ) + @RequestParam(name = "tier", required = false, defaultValue = "Agent") + ClinicalEventKeyCode tier, + + @Parameter(required = true, description = "Study view filter") + @Valid + @RequestBody(required = false) + StudyViewFilter studyViewFilter, + + @Parameter(hidden = true) // prevent reference to this attribute in the swagger-ui interface + @RequestAttribute(required = false, value = "involvedCancerStudies") + Collection involvedCancerStudies, + + @Parameter(hidden = true) // prevent reference to this attribute in the swagger-ui interface. this attribute is needed for the @PreAuthorize tag above. + @Valid + @RequestAttribute(required = false, value = "interceptedStudyViewFilter") + StudyViewFilter interceptedStudyViewFilter + ) { + return new ResponseEntity<>(studyViewColumnarService.getPatientTreatmentReport(interceptedStudyViewFilter), + HttpStatus.OK); + } + } diff --git a/src/main/java/org/cbioportal/web/util/InvolvedCancerStudyExtractorInterceptor.java b/src/main/java/org/cbioportal/web/util/InvolvedCancerStudyExtractorInterceptor.java index 633ec0d0fca..9e46b5260b3 100644 --- a/src/main/java/org/cbioportal/web/util/InvolvedCancerStudyExtractorInterceptor.java +++ b/src/main/java/org/cbioportal/web/util/InvolvedCancerStudyExtractorInterceptor.java @@ -134,6 +134,7 @@ public class InvolvedCancerStudyExtractorInterceptor implements HandlerIntercept public static final String CLINICAL_EVENT_TYPE_COUNT_FETCH_PATH = "/clinical-event-type-counts/fetch"; public static final String SURVIVAL_DATA_FETCH_PATH = "/survival-data/fetch"; public static final String CLINICAL_EVENT_META_FETCH_PATH = "/clinical-events-meta/fetch"; + public static final String TREATMENTS_PATIENT_COUNT_FETCH_PATH = "/treatments/patient-counts/fetch"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { if (!request.getMethod().equals("POST")) { @@ -178,7 +179,8 @@ public class InvolvedCancerStudyExtractorInterceptor implements HandlerIntercept } else if (Arrays.asList(STUDY_VIEW_CLINICAL_DATA_DENSITY_PATH, STUDY_VIEW_CLINICAL_DATA_VIOLIN_PATH, STUDY_VIEW_CNA_GENES, STUDY_VIEW_FILTERED_SAMPLES, STUDY_VIEW_MUTATED_GENES, STUDY_VIEW_STRUCTURAL_VARIANT_GENES, STUDY_VIEW_STRUCTURAL_VARIANT_COUNTS, STUDY_VIEW_SAMPLE_COUNTS, STUDY_VIEW_SAMPLE_LIST_COUNTS_PATH, STUDY_VIEW_CLINICAL_TABLE_DATA_FETCH_PATH, - TREATMENTS_PATIENT_PATH, TREATMENTS_SAMPLE_PATH, STUDY_VIEW_PROFILE_SAMPLE_COUNTS_PATH, CLINICAL_EVENT_TYPE_COUNT_FETCH_PATH + TREATMENTS_PATIENT_PATH, TREATMENTS_SAMPLE_PATH, STUDY_VIEW_PROFILE_SAMPLE_COUNTS_PATH, CLINICAL_EVENT_TYPE_COUNT_FETCH_PATH, + TREATMENTS_PATIENT_COUNT_FETCH_PATH ).contains(requestPathInfo)) { return extractAttributesFromStudyViewFilter(request); } else if (requestPathInfo.equals(CLINICAL_DATA_ENRICHMENT_FETCH_PATH)) { diff --git a/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewFilterMapper.xml b/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewFilterMapper.xml index 44d3cd5523c..2c2a7cd1dc4 100644 --- a/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewFilterMapper.xml +++ b/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewFilterMapper.xml @@ -122,6 +122,22 @@ + + + + SELECT patient_unique_id + FROM clinical_event_derived + + + event_type = 'Treatment' + AND key = 'AGENT' + AND value = '${patientTreatmentFilter.treatment}' + + + + @@ -144,9 +160,13 @@ - + + + + + diff --git a/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.xml b/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.xml index e4e226be8c2..fcfce0e9439 100644 --- a/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.xml +++ b/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.xml @@ -17,6 +17,7 @@ + ORDER BY sample_stable_id ASC; @@ -329,6 +330,56 @@ GROUP BY event_type; + + + + + + + + + + + + + + + + patient_unique_id in ( SELECT patient_unique_id @@ -377,10 +425,7 @@ ) - - + sample_unique_id IN ( ) diff --git a/src/test/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapperTest.java b/src/test/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapperTest.java index 0a6279ae937..0045bb65ea4 100644 --- a/src/test/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapperTest.java +++ b/src/test/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapperTest.java @@ -8,6 +8,9 @@ import org.cbioportal.web.parameter.DataFilter; import org.cbioportal.web.parameter.DataFilterValue; import org.cbioportal.web.parameter.StudyViewFilter; +import org.cbioportal.web.parameter.filter.AndedPatientTreatmentFilters; +import org.cbioportal.web.parameter.filter.OredPatientTreatmentFilters; +import org.cbioportal.web.parameter.filter.PatientTreatmentFilter; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -129,7 +132,7 @@ public void getClinicalEventTypeCounts() { assertEquals(4, clinicalEventTypeCounts.size()); - var clinicalEventTypeCountOptional = clinicalEventTypeCounts.stream().filter(ce -> ce.getEventType().equals("treatment")) + var clinicalEventTypeCountOptional = clinicalEventTypeCounts.stream().filter(ce -> ce.getEventType().equals("Treatment")) .findFirst(); assertTrue(clinicalEventTypeCountOptional.isPresent()); @@ -137,7 +140,7 @@ public void getClinicalEventTypeCounts() { DataFilter dataFilter = new DataFilter(); DataFilterValue dataFilterValue = new DataFilterValue(); - dataFilterValue.setValue("treatment"); + dataFilterValue.setValue("Treatment"); dataFilter.setValues(List.of(dataFilterValue)); studyViewFilter.setClinicalEventFilters(List.of(dataFilter)); @@ -151,5 +154,41 @@ public void getClinicalEventTypeCounts() { assertFalse(clinicalEventTypeCountOptional.isPresent()); } + + @Test + public void getPatientTreatmentReportCounts() { + StudyViewFilter studyViewFilter = new StudyViewFilter(); + studyViewFilter.setStudyIds(List.of(STUDY_TCGA_PUB)); + + + var patientTreatmentCounts = studyViewMapper.getPatientTreatmentCounts(studyViewFilter, + CategorizedClinicalDataCountFilter.getBuilder().build(), false ); + + var patientTreatments = studyViewMapper.getPatientTreatments(studyViewFilter, + CategorizedClinicalDataCountFilter.getBuilder().build(), false ); + + assertEquals(1, patientTreatmentCounts.totalPatients()); + assertEquals("madeupanib", patientTreatments.get(0).treatment()); + + PatientTreatmentFilter filter = new PatientTreatmentFilter(); + filter.setTreatment("madeupanib"); + + OredPatientTreatmentFilters oredPatientTreatmentFilters = new OredPatientTreatmentFilters(); + oredPatientTreatmentFilters.setFilters(List.of(filter)); + + AndedPatientTreatmentFilters andedPatientTreatmentFilters = new AndedPatientTreatmentFilters(); + andedPatientTreatmentFilters.setFilters(List.of(oredPatientTreatmentFilters)); + studyViewFilter.setPatientTreatmentFilters(andedPatientTreatmentFilters); + + patientTreatmentCounts = studyViewMapper.getPatientTreatmentCounts(studyViewFilter, + CategorizedClinicalDataCountFilter.getBuilder().build(), true ); + + patientTreatments = studyViewMapper.getPatientTreatments(studyViewFilter, + CategorizedClinicalDataCountFilter.getBuilder().build(), true ); + + assertEquals(1, patientTreatmentCounts.totalPatients()); + assertEquals("madeupanib", patientTreatments.get(0).treatment()); + + } } \ No newline at end of file diff --git a/src/test/resources/clickhouse_data.sql b/src/test/resources/clickhouse_data.sql index 16193741624..810e1b742ad 100644 --- a/src/test/resources/clickhouse_data.sql +++ b/src/test/resources/clickhouse_data.sql @@ -456,7 +456,7 @@ insert into gistic_to_gene (gistic_roi_id,entrez_gene_id) values (3,208); insert into clinical_event (clinical_event_id,patient_id,start_date,stop_date,event_type) values (1,1,123,0,'status'); insert into clinical_event (clinical_event_id,patient_id,start_date,stop_date,event_type) values (2,1,233,345,'specimen'); -insert into clinical_event (clinical_event_id,patient_id,start_date,stop_date,event_type) values (3,2,213,445,'treatment'); +insert into clinical_event (clinical_event_id,patient_id,start_date,stop_date,event_type) values (3,2,213,445,'Treatment'); insert into clinical_event (clinical_event_id,patient_id,start_date,stop_date,event_type) values (4,2,211,441,'seqencing'); insert into clinical_event_data (clinical_event_id,key,value) values (1,'status','radiographic_progression'); @@ -464,7 +464,7 @@ insert into clinical_event_data (clinical_event_id,key,value) values (1,'sample_ insert into clinical_event_data (clinical_event_id,key,value) values (2,'surgery','oa ii initial'); insert into clinical_event_data (clinical_event_id,key,value) values (2,'sample_id','tcga-a1-a0sb-01'); insert into clinical_event_data (clinical_event_id,key,value) values (3,'event_type_detailed','aa iii recurrence1'); -insert into clinical_event_data (clinical_event_id,key,value) values (3,'agent','madeupanib'); +insert into clinical_event_data (clinical_event_id,key,value) values (3,'AGENT','madeupanib'); insert into clinical_event_data (clinical_event_id,key,value) values (3,'agent_target','directly to forehead, elbow'); insert into clinical_event_data (clinical_event_id,key,value) values (3,'sample_id','tcga-a1-a0sd-01'); insert into clinical_event_data (clinical_event_id,key,value) values (4,'sample_id','tcga-a1-a0sd-01');