diff --git a/src/main/java/org/cbioportal/persistence/StudyViewRepository.java b/src/main/java/org/cbioportal/persistence/StudyViewRepository.java index 696d8a4bdd5..1c93f3ef57d 100644 --- a/src/main/java/org/cbioportal/persistence/StudyViewRepository.java +++ b/src/main/java/org/cbioportal/persistence/StudyViewRepository.java @@ -5,6 +5,7 @@ import org.cbioportal.model.CaseListDataCount; import org.cbioportal.model.ClinicalData; import org.cbioportal.model.ClinicalDataCount; +import org.cbioportal.model.ClinicalEventTypeCount; import org.cbioportal.model.CopyNumberCountByGene; import org.cbioportal.model.GenomicDataCount; import org.cbioportal.model.Sample; @@ -44,4 +45,6 @@ public interface StudyViewRepository { Map> getMatchingGenePanelIds(StudyViewFilter studyViewFilter, String alterationType); int getTotalProfiledCountsByAlterationType(StudyViewFilter studyViewFilter, String alterationType); + + List getClinicalEventTypeCounts(StudyViewFilter studyViewFilter); } diff --git a/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.java b/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.java index a739590e5be..0e762a1d07a 100644 --- a/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.java +++ b/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.java @@ -6,6 +6,7 @@ import org.cbioportal.model.ClinicalAttribute; import org.cbioportal.model.ClinicalData; import org.cbioportal.model.ClinicalDataCount; +import org.cbioportal.model.ClinicalEventTypeCount; import org.cbioportal.model.CopyNumberCountByGene; import org.cbioportal.model.GenePanelToGene; import org.cbioportal.model.GenomicDataCount; @@ -51,4 +52,6 @@ List getClinicalDataCounts(StudyViewFilter studyViewFilter, C List getMatchingGenePanelIds(StudyViewFilter studyViewFilter, CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter, boolean applyPatientIdFilters, String alterationType); int getTotalProfiledCountByAlterationType(StudyViewFilter studyViewFilter, CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter, boolean applyPatientIdFilters, String alterationType); + + List getClinicalEventTypeCounts(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 0df436bff4f..a0709db0e78 100644 --- a/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMyBatisRepository.java +++ b/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMyBatisRepository.java @@ -4,6 +4,7 @@ import org.cbioportal.model.CaseListDataCount; import org.cbioportal.model.ClinicalData; import org.cbioportal.model.ClinicalDataCount; +import org.cbioportal.model.ClinicalEventTypeCount; import org.cbioportal.model.GenePanelToGene; import org.cbioportal.model.GenomicDataCount; import org.cbioportal.model.CopyNumberCountByGene; @@ -39,14 +40,14 @@ public StudyViewMyBatisRepository(StudyViewMapper mapper) { @Override public List getFilteredSamples(StudyViewFilter studyViewFilter) { CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); - return mapper.getFilteredSamples(studyViewFilter, categorizedClinicalDataCountFilter, shouldApplyPatientIdFilters(categorizedClinicalDataCountFilter)); + return mapper.getFilteredSamples(studyViewFilter, categorizedClinicalDataCountFilter, shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter)); } @Override public List getMutatedGenes(StudyViewFilter studyViewFilter) { CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); return mapper.getMutatedGenes(studyViewFilter, categorizedClinicalDataCountFilter, - shouldApplyPatientIdFilters(categorizedClinicalDataCountFilter), + shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter), AlterationFilterHelper.build(studyViewFilter.getAlterationFilter())); } @@ -54,7 +55,7 @@ public List getMutatedGenes(StudyViewFilter studyViewFilt public List getCnaGenes(StudyViewFilter studyViewFilter) { CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); return mapper.getCnaGenes(studyViewFilter, categorizedClinicalDataCountFilter, - shouldApplyPatientIdFilters(categorizedClinicalDataCountFilter), + shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter), AlterationFilterHelper.build(studyViewFilter.getAlterationFilter())); } @@ -62,21 +63,23 @@ public List getCnaGenes(StudyViewFilter studyViewFilter) public List getStructuralVariantGenes(StudyViewFilter studyViewFilter) { CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); return mapper.getStructuralVariantGenes(studyViewFilter, categorizedClinicalDataCountFilter, - shouldApplyPatientIdFilters(categorizedClinicalDataCountFilter), + shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter), AlterationFilterHelper.build(studyViewFilter.getAlterationFilter())); } @Override public List getClinicalDataCounts(StudyViewFilter studyViewFilter, List filteredAttributes) { CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); - return mapper.getClinicalDataCounts(studyViewFilter, categorizedClinicalDataCountFilter, shouldApplyPatientIdFilters(categorizedClinicalDataCountFilter), + return mapper.getClinicalDataCounts(studyViewFilter, categorizedClinicalDataCountFilter, + shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter), filteredAttributes, FILTERED_CLINICAL_ATTR_VALUES ); } @Override public List getGenomicDataCounts(StudyViewFilter studyViewFilter) { CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); - return mapper.getGenomicDataCounts(studyViewFilter, categorizedClinicalDataCountFilter, shouldApplyPatientIdFilters(categorizedClinicalDataCountFilter)); + return mapper.getGenomicDataCounts(studyViewFilter, categorizedClinicalDataCountFilter, + shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter)); } @Override @@ -106,46 +109,47 @@ public Map getClinicalAttributeDatatypeMap() { @Override public List getCaseListDataCounts(StudyViewFilter studyViewFilter) { CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); - return mapper.getCaseListDataCounts(studyViewFilter, categorizedClinicalDataCountFilter, shouldApplyPatientIdFilters(categorizedClinicalDataCountFilter)); + return mapper.getCaseListDataCounts(studyViewFilter, categorizedClinicalDataCountFilter, shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter)); } - private boolean shouldApplyPatientIdFilters(CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter) { - return categorizedClinicalDataCountFilter.getPatientCategoricalClinicalDataFilters() != null && !categorizedClinicalDataCountFilter.getPatientCategoricalClinicalDataFilters().isEmpty() + private boolean shouldApplyPatientIdFilters(StudyViewFilter studyViewFilter, CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter) { + return studyViewFilter.getClinicalEventFilters() != null && !studyViewFilter.getClinicalEventFilters().isEmpty() + || categorizedClinicalDataCountFilter.getPatientCategoricalClinicalDataFilters() != null && !categorizedClinicalDataCountFilter.getPatientCategoricalClinicalDataFilters().isEmpty() || categorizedClinicalDataCountFilter.getPatientNumericalClinicalDataFilters() != null && !categorizedClinicalDataCountFilter.getPatientNumericalClinicalDataFilters().isEmpty(); } @Override public List getSampleClinicalData(StudyViewFilter studyViewFilter, List attributeIds) { CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); - return mapper.getSampleClinicalDataFromStudyViewFilter(studyViewFilter, categorizedClinicalDataCountFilter, shouldApplyPatientIdFilters(categorizedClinicalDataCountFilter), attributeIds); + return mapper.getSampleClinicalDataFromStudyViewFilter(studyViewFilter, categorizedClinicalDataCountFilter, shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter), attributeIds); } @Override public List getPatientClinicalData(StudyViewFilter studyViewFilter, List attributeIds) { CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); - return mapper.getPatientClinicalDataFromStudyViewFilter(studyViewFilter, categorizedClinicalDataCountFilter, shouldApplyPatientIdFilters(categorizedClinicalDataCountFilter), attributeIds); + return mapper.getPatientClinicalDataFromStudyViewFilter(studyViewFilter, categorizedClinicalDataCountFilter, shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter), attributeIds); } @Override public Map getTotalProfiledCounts(StudyViewFilter studyViewFilter, String alterationType) { CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); return mapper.getTotalProfiledCounts(studyViewFilter, categorizedClinicalDataCountFilter, - shouldApplyPatientIdFilters(categorizedClinicalDataCountFilter), alterationType); + shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter), alterationType); } @Override public int getFilteredSamplesCount(StudyViewFilter studyViewFilter) { CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); return mapper.getFilteredSamplesCount(studyViewFilter, categorizedClinicalDataCountFilter, - shouldApplyPatientIdFilters(categorizedClinicalDataCountFilter)); + shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter)); } @Override public Map> getMatchingGenePanelIds(StudyViewFilter studyViewFilter, String alterationType) { CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); return mapper.getMatchingGenePanelIds(studyViewFilter, categorizedClinicalDataCountFilter, - shouldApplyPatientIdFilters(categorizedClinicalDataCountFilter), alterationType) + shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter), alterationType) .stream() .collect(Collectors.groupingBy(GenePanelToGene::getHugoGeneSymbol, Collectors.mapping(GenePanelToGene::getGenePanelId, Collectors.toSet()))); @@ -155,7 +159,14 @@ public Map> getMatchingGenePanelIds(StudyViewFilter studyVie public int getTotalProfiledCountsByAlterationType(StudyViewFilter studyViewFilter, String alterationType) { CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); return mapper.getTotalProfiledCountByAlterationType(studyViewFilter, categorizedClinicalDataCountFilter, - shouldApplyPatientIdFilters(categorizedClinicalDataCountFilter), alterationType); + shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter), alterationType); + } + + @Override + public List getClinicalEventTypeCounts(StudyViewFilter studyViewFilter) { + CategorizedClinicalDataCountFilter categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter); + return mapper.getClinicalEventTypeCounts(studyViewFilter, categorizedClinicalDataCountFilter, + shouldApplyPatientIdFilters(studyViewFilter,categorizedClinicalDataCountFilter)); } private void buildClinicalAttributeNameMap() { diff --git a/src/main/java/org/cbioportal/service/StudyViewColumnarService.java b/src/main/java/org/cbioportal/service/StudyViewColumnarService.java index 7018f0e3e26..8ae5ea20608 100644 --- a/src/main/java/org/cbioportal/service/StudyViewColumnarService.java +++ b/src/main/java/org/cbioportal/service/StudyViewColumnarService.java @@ -4,6 +4,7 @@ import org.cbioportal.model.CaseListDataCount; import org.cbioportal.model.ClinicalData; import org.cbioportal.model.ClinicalDataCountItem; +import org.cbioportal.model.ClinicalEventTypeCount; import org.cbioportal.model.GenomicDataCount; import org.cbioportal.model.CopyNumberCountByGene; import org.cbioportal.model.Sample; @@ -32,5 +33,7 @@ public interface StudyViewColumnarService { List getSampleClinicalData(StudyViewFilter studyViewFilter, List attributeIds); List getGenomicDataCounts(StudyViewFilter studyViewFilter); + + List getClinicalEventTypeCounts(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 e1759dc47b7..b73ca064803 100644 --- a/src/main/java/org/cbioportal/service/impl/StudyViewColumnarServiceImpl.java +++ b/src/main/java/org/cbioportal/service/impl/StudyViewColumnarServiceImpl.java @@ -5,6 +5,7 @@ import org.cbioportal.model.ClinicalData; import org.cbioportal.model.ClinicalDataCount; import org.cbioportal.model.ClinicalDataCountItem; +import org.cbioportal.model.ClinicalEventTypeCount; import org.cbioportal.model.CopyNumberCountByGene; import org.cbioportal.model.GenomicDataCount; import org.cbioportal.model.Sample; @@ -50,7 +51,12 @@ public List getMutatedGenes(StudyViewFilter studyViewFilt public List getGenomicDataCounts(StudyViewFilter studyViewFilter) { return studyViewRepository.getGenomicDataCounts(studyViewFilter); } - + + @Override + public List getClinicalEventTypeCounts(StudyViewFilter studyViewFilter) { + return studyViewRepository.getClinicalEventTypeCounts(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 6393b061164..3ec1ccf90a6 100644 --- a/src/main/java/org/cbioportal/web/columnar/StudyViewColumnStoreController.java +++ b/src/main/java/org/cbioportal/web/columnar/StudyViewColumnStoreController.java @@ -13,9 +13,10 @@ import org.cbioportal.model.ClinicalData; import org.cbioportal.model.ClinicalDataBin; import org.cbioportal.model.ClinicalDataCountItem; +import org.cbioportal.model.ClinicalEventTypeCount; import org.cbioportal.model.ClinicalViolinPlotData; -import org.cbioportal.model.DensityPlotData; import org.cbioportal.model.CopyNumberCountByGene; +import org.cbioportal.model.DensityPlotData; import org.cbioportal.model.GenomicDataCount; import org.cbioportal.model.Sample; import org.cbioportal.service.ClinicalDataDensityPlotService; @@ -325,4 +326,28 @@ public ResponseEntity fetchClinicalDataViolinPlots( return new ResponseEntity<>(result, HttpStatus.OK); } + + @PreAuthorize("hasPermission(#involvedCancerStudies, 'Collection', T(org.cbioportal.utils.security.AccessLevel).READ)") + @PostMapping(value = "/column-store/clinical-event-type-counts/fetch", consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(description = "Get Counts of Clinical Event Types by Study View Filter") + @ApiResponse(responseCode = "200", description = "OK", + content = @Content(array = @ArraySchema(schema = @Schema(implementation = ClinicalEventTypeCount.class)))) + public ResponseEntity> getClinicalEventTypeCounts( + @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.getClinicalEventTypeCounts(interceptedStudyViewFilter), HttpStatus.OK); + } } diff --git a/src/main/resources/db-scripts/clickhouse/clickhouse.sql b/src/main/resources/db-scripts/clickhouse/clickhouse.sql index 83c517f15c7..5cad1670464 100644 --- a/src/main/resources/db-scripts/clickhouse/clickhouse.sql +++ b/src/main/resources/db-scripts/clickhouse/clickhouse.sql @@ -3,6 +3,7 @@ DROP TABLE IF EXISTS gene_panel_to_gene_derived; DROP TABLE IF EXISTS sample_derived; DROP TABLE IF EXISTS genomic_event_derived; DROP TABLE IF EXISTS clinical_data_derived; +DROP TABLE IF EXISTS clinical_event_derived; CREATE TABLE sample_to_gene_panel_derived @@ -249,8 +250,36 @@ FROM patient AS p ON (p.internal_id = clinpat.internal_id) AND (clinpat.attr_id = cam.attr_id) WHERE cam.patient_attribute = 1; +CREATE TABLE clinical_event_derived +( + patient_unique_id String, + key String, + value String, + start_date Int32, + stop_date Int32 DEFAULT 0, + event_type LowCardinality(String), + cancer_study_identifier LowCardinality(String) +) +ENGINE = MergeTree + ORDER BY (event_type, patient_unique_id, cancer_study_identifier); + +INSERT INTO clinical_event_derived +SELECT + concat(cs.cancer_study_identifier, '_', p.stable_id) AS patient_unique_id, + ced.key AS key, + ced.value AS value, + ce.start_date AS start_date, + ifNull(ce.stop_date, 0) AS stop_date, + ce.event_type AS event_type, + cs.cancer_study_identifier +FROM clinical_event ce + LEFT JOIN clinical_event_data ced ON ce.clinical_event_id = ced.clinical_event_id + INNER JOIN patient p ON ce.patient_id = p.internal_id + INNER JOIN cancer_study cs ON p.cancer_study_id = cs.cancer_study_id; + OPTIMIZE TABLE sample_to_gene_panel_derived; OPTIMIZE TABLE gene_panel_to_gene_derived; OPTIMIZE TABLE sample_derived; OPTIMIZE TABLE genomic_event_derived; OPTIMIZE TABLE clinical_data_derived; +OPTIMIZE TABLE clinical_event_derived; \ No newline at end of file diff --git a/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewFilterMapper.xml b/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewFilterMapper.xml index ca63efa765b..44d3cd5523c 100644 --- a/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewFilterMapper.xml +++ b/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewFilterMapper.xml @@ -109,6 +109,20 @@ + + + SELECT patient_unique_id + FROM clinical_event_derived + + + event_type = '${dataFilterValue.value}' + + + + + @@ -129,6 +143,10 @@ + + + + diff --git a/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.xml b/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.xml index 040ccedfc90..576c5b7378b 100644 --- a/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.xml +++ b/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.xml @@ -13,13 +13,10 @@ patient_unique_id_base64 as uniquePatientKey FROM sample_derived - sample_unique_id IN ( ) - - - AND patient_unique_id IN () - + + + - ORDER BY sample_stable_id ASC; @@ -32,7 +29,9 @@ FROM genomic_event_derived variant_type = 'mutation' AND - + + + @@ -52,7 +51,9 @@ FROM genomic_event_derived variant_type = 'cna' AND - + + + @@ -69,7 +70,9 @@ FROM genomic_event_derived variant_type = 'structural_variant' AND - + + + GROUP BY hugo_gene_symbol; @@ -83,12 +86,9 @@ cancer_study_identifier as studyId FROM clinical_data_derived - sample_unique_id IN ( - - - INTERSECT - - ) + + + AND attribute_name IN @@ -107,12 +107,9 @@ cancer_study_identifier as studyId FROM clinical_data_derived - patient_unique_id IN ( - - - INTERSECT - - ) + + + AND attribute_name IN @@ -141,7 +138,9 @@ LEFT JOIN sample_derived ON sample_profile.sample_id=sample_derived.internal_id LEFT JOIN genetic_profile on sample_profile.genetic_profile_id = genetic_profile.genetic_profile_id - sample_unique_id IN ( ) + + + GROUP BY genetic_profile.stable_id, genetic_profile.name, sample_derived.cancer_study_identifier; @@ -157,7 +156,9 @@ LEFT JOIN sample_derived s ON sll.sample_id=s.internal_id LEFT JOIN sample_list sl on sll.list_id=sl.list_id - sample_unique_id IN ( ) + + + GROUP BY s.cancer_study_identifier, sl.stable_id, sl.name; @@ -174,13 +175,9 @@ FROM clinical_data_derived type='sample' AND - sample_unique_id IN ( - - INTERSECT - SELECT sample_unique_id from sample_derived WHERE sample_derived.patient_unique_id IN - () - - ) + + + AND UPPER(value) NOT IN @@ -207,11 +204,9 @@ FROM clinical_data_derived type='patient' AND - patient_unique_id IN ( - - INTERSECT - - ) + + + AND UPPER(value) NOT IN @@ -227,22 +222,6 @@ value - - SELECT sample_unique_id - FROM sample_derived - - patient_unique_id IN () - - - - - SELECT patient_unique_id - FROM sample_derived - - sample_unique_id IN () - - - @@ -282,11 +259,9 @@ stgp.alteration_type = '${alterationType}' AND - sample_unique_id IN ( - - INTERSECT - - ) + + + @@ -296,7 +271,9 @@ COUNT(*) FROM sample_derived - + + + @@ -313,24 +290,94 @@ alteration_type = '${alterationType}' AND - sample_unique_id IN ( - - INTERSECT - - ) + + + ) GROUP BY gene, gene_panel_id; + + + + + + + + + + + sample_unique_id IN ( ) + + AND patient_unique_id IN () + + + + + + + + patient_unique_id in ( + SELECT patient_unique_id + FROM sample_derived + + sample_unique_id IN () + + + + INTERSECT + + + ) + + + + sample_unique_id IN ( ) - AND patient_unique_id IN () + INTERSECT + + + + SELECT sample_unique_id + FROM sample_derived + + patient_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 dfde0006df9..f8019f72e54 100644 --- a/src/test/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapperTest.java +++ b/src/test/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapperTest.java @@ -5,6 +5,8 @@ import org.cbioportal.persistence.helper.AlterationFilterHelper; import org.cbioportal.persistence.mybatisclickhouse.config.MyBatisConfig; import org.cbioportal.web.parameter.CategorizedClinicalDataCountFilter; +import org.cbioportal.web.parameter.DataFilter; +import org.cbioportal.web.parameter.DataFilterValue; import org.cbioportal.web.parameter.StudyViewFilter; import org.junit.Test; import org.junit.runner.RunWith; @@ -22,6 +24,8 @@ import java.util.Objects; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; @RunWith(SpringRunner.class) @Import(MyBatisConfig.class) @@ -112,7 +116,39 @@ public void getTotalProfiledCountsByGene() { var akt2TotalProfiledCounts = totalProfiledCountsMap.get("akt2"); assertEquals(4, akt2TotalProfiledCounts.getNumberOfProfiledCases().intValue()); - } + + @Test + public void getClinicalEventTypeCounts() { + StudyViewFilter studyViewFilter = new StudyViewFilter(); + studyViewFilter.setStudyIds(List.of(STUDY_TCGA_PUB)); + + var clinicalEventTypeCounts = studyViewMapper.getClinicalEventTypeCounts(studyViewFilter, + CategorizedClinicalDataCountFilter.getBuilder().build(), false); + + assertEquals(4, clinicalEventTypeCounts.size()); + + var clinicalEventTypeCountOptional = clinicalEventTypeCounts.stream().filter(ce -> ce.getEventType().equals("treatment")) + .findFirst(); + + assertTrue(clinicalEventTypeCountOptional.isPresent()); + assertEquals(1, clinicalEventTypeCountOptional.get().getCount().intValue()); + + DataFilter dataFilter = new DataFilter(); + DataFilterValue dataFilterValue = new DataFilterValue(); + dataFilterValue.setValue("treatment"); + dataFilter.setValues(List.of(dataFilterValue)); + studyViewFilter.setClinicalEventFilters(List.of(dataFilter)); + + clinicalEventTypeCounts = studyViewMapper.getClinicalEventTypeCounts(studyViewFilter, + CategorizedClinicalDataCountFilter.getBuilder().build(), true); + + assertEquals(2, clinicalEventTypeCounts.size()); + + clinicalEventTypeCountOptional = clinicalEventTypeCounts.stream().filter(ce -> ce.getEventType().equals("status")) + .findFirst(); + + assertFalse(clinicalEventTypeCountOptional.isPresent()); + } } \ No newline at end of file diff --git a/src/test/resources/clickhouse_cgds.sql b/src/test/resources/clickhouse_cgds.sql index b5a3f2ed8f4..0b7945d4cfa 100644 --- a/src/test/resources/clickhouse_cgds.sql +++ b/src/test/resources/clickhouse_cgds.sql @@ -543,10 +543,10 @@ CREATE TABLE cosmic_mutation CREATE TABLE clinical_event ( clinical_event_id Int32, - patient_id Nullable(Int32), + patient_id Int, event_type String, - start_date Nullable(DateTime), - stop_date Nullable(DateTime) + start_date Int32 default 0, + stop_date Int32 default 0 ) ENGINE = MergeTree() ORDER BY clinical_event_id; -- -------------------------------------------------------- diff --git a/src/test/resources/clickhouse_data.sql b/src/test/resources/clickhouse_data.sql index bbc0fb76143..16193741624 100644 --- a/src/test/resources/clickhouse_data.sql +++ b/src/test/resources/clickhouse_data.sql @@ -454,7 +454,7 @@ insert into gistic_to_gene (gistic_roi_id,entrez_gene_id) values (1,208); insert into gistic_to_gene (gistic_roi_id,entrez_gene_id) values (2,207); 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,null,'status'); +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 (4,2,211,441,'seqencing');