diff --git a/persistence/persistence-mybatis/src/test/java/org/cbioportal/persistence/mybatis/MutationMyBatisRepositoryTest.java b/persistence/persistence-mybatis/src/test/java/org/cbioportal/persistence/mybatis/MutationMyBatisRepositoryTest.java index 6f13f7b9ff3..b6dab4bbd02 100644 --- a/persistence/persistence-mybatis/src/test/java/org/cbioportal/persistence/mybatis/MutationMyBatisRepositoryTest.java +++ b/persistence/persistence-mybatis/src/test/java/org/cbioportal/persistence/mybatis/MutationMyBatisRepositoryTest.java @@ -1,10 +1,6 @@ package org.cbioportal.persistence.mybatis; -import org.cbioportal.model.AlleleSpecificCopyNumber; -import org.cbioportal.model.Gene; -import org.cbioportal.model.GeneFilterQuery; -import org.cbioportal.model.Mutation; -import org.cbioportal.model.MutationCountByPosition; +import org.cbioportal.model.*; import org.cbioportal.model.meta.MutationMeta; import org.cbioportal.model.util.Select; import org.junit.Assert; @@ -18,6 +14,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; @RunWith(SpringJUnit4ClassRunner.class) @@ -554,4 +551,18 @@ public void getMutationCountByPosition() throws Exception { Assert.assertEquals((Integer) 936, result.getProteinPosEnd()); Assert.assertEquals((Integer) 3, result.getCount()); } + + @Test + public void getMutationCountsByType() { + GenomicDataCountItem result = mutationMyBatisRepository.getMutationCountsByType( + Collections.singletonList("study_tcga_pub_mutations"), + sampleIds, + Collections.singletonList(207), + "mutations" + ); + + Assert.assertEquals("AKT1", result.getHugoGeneSymbol()); + Assert.assertEquals("mutations", result.getProfileType()); + Assert.assertEquals(2, result.getCounts().size()); + } } diff --git a/service/src/main/java/org/cbioportal/service/StudyViewService.java b/service/src/main/java/org/cbioportal/service/StudyViewService.java index 93645a36dc7..bdb383191db 100644 --- a/service/src/main/java/org/cbioportal/service/StudyViewService.java +++ b/service/src/main/java/org/cbioportal/service/StudyViewService.java @@ -12,7 +12,7 @@ public interface StudyViewService { List getMutationAlterationCountByGenes(List studyIds, List sampleIds, AlterationFilter annotationFilter) throws StudyNotFoundException; - List getMutationCountsByGeneSpecific(List studyIds, List sampleIds, List> genomicDataFilters, AlterationFilter annotationFilter); + List getMutationCountsByGeneSpecific(List studyIds, List sampleIds, List> genomicDataFilters, AlterationFilter annotationFilter, String projection); List getMutationTypeCountsByGeneSpecific(List studyIds, List sampleIds, List> genomicDataFilters); diff --git a/service/src/main/java/org/cbioportal/service/impl/StudyViewServiceImpl.java b/service/src/main/java/org/cbioportal/service/impl/StudyViewServiceImpl.java index a6daecdb4ea..8fea51e7ed3 100644 --- a/service/src/main/java/org/cbioportal/service/impl/StudyViewServiceImpl.java +++ b/service/src/main/java/org/cbioportal/service/impl/StudyViewServiceImpl.java @@ -1,5 +1,6 @@ package org.cbioportal.service.impl; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.map.MultiKeyMap; import org.apache.commons.lang3.StringUtils; import org.apache.commons.math3.util.Pair; @@ -111,7 +112,8 @@ public List getMutationAlterationCountByGenes(List getMutationCountsByGeneSpecific(List studyIds, List sampleIds, List> genomicDataFilters, - AlterationFilter alterationFilter) { + AlterationFilter alterationFilter, + String projection) { List caseIdentifiers = molecularProfileService.getMutationProfileCaseIdentifiers(studyIds, sampleIds); @@ -124,14 +126,21 @@ public List getMutationCountsByGeneSpecific(List s .stream() .map(Gene::getEntrezGeneId) .collect(Collectors.toList()); - + List alterationCountByGenes = alterationCountService.getSampleMutationGeneCounts( caseIdentifiers, Select.byValues(entrezGeneIds), true, false, alterationFilter).getFirst(); - + + List mutationTypeCountItems; + if (projection.equals("DETAILED")) { + mutationTypeCountItems = getMutationTypeCountsByGeneSpecific(studyIds, sampleIds, genomicDataFilters); + } else { + mutationTypeCountItems = new ArrayList<>(); + } + return genomicDataFilters .stream() .flatMap(gdFilter -> { @@ -145,36 +154,46 @@ public List getMutationCountsByGeneSpecific(List s .stream() .filter(g -> StringUtils.isNotEmpty(g.getHugoGeneSymbol()) && g.getHugoGeneSymbol().equals(hugoGeneSymbol)) .findFirst(); - + if (!filteredAlterationCount.isPresent()) { return Stream.of(); } - + int mutatedCount = filteredAlterationCount.get().getNumberOfAlteredCases(); int profiledCount = filteredAlterationCount.get().getNumberOfProfiledCases(); int totalCount = sampleIds.size(); - + List genomicDataCounts = new ArrayList<>(); - GenomicDataCount genomicDataCountMutated = new GenomicDataCount(); - genomicDataCountMutated.setLabel(MutationFilterOption.MUTATED.name()); - genomicDataCountMutated.setValue(MutationFilterOption.MUTATED.name()); - genomicDataCountMutated.setCount(mutatedCount); + + if (CollectionUtils.isNotEmpty(mutationTypeCountItems)) { + Optional genomicDataCountItemType = mutationTypeCountItems.stream() + .filter(item -> item.getHugoGeneSymbol().equals(hugoGeneSymbol) && item.getProfileType().equals(profileType)) + .findFirst(); + genomicDataCountItemType.ifPresent(dataCountItem -> genomicDataCounts.addAll(dataCountItem.getCounts())); + } + + if (CollectionUtils.isEmpty(genomicDataCounts)) { + GenomicDataCount genomicDataCountMutated = new GenomicDataCount(); + genomicDataCountMutated.setLabel(MutationFilterOption.MUTATED.name()); + genomicDataCountMutated.setValue(MutationFilterOption.MUTATED.name()); + genomicDataCountMutated.setCount(mutatedCount); + genomicDataCounts.add(genomicDataCountMutated); + } GenomicDataCount genomicDataCountNotMutated = new GenomicDataCount(); genomicDataCountNotMutated.setLabel(MutationFilterOption.NOT_MUTATED.name()); genomicDataCountNotMutated.setValue(MutationFilterOption.NOT_MUTATED.name()); genomicDataCountNotMutated.setCount(profiledCount - mutatedCount); + genomicDataCounts.add(genomicDataCountNotMutated); GenomicDataCount genomicDataCountNotProfiled = new GenomicDataCount(); genomicDataCountNotProfiled.setLabel(MutationFilterOption.NOT_PROFILED.name()); genomicDataCountNotProfiled.setValue(MutationFilterOption.NOT_PROFILED.name()); genomicDataCountNotProfiled.setCount(totalCount - profiledCount); - - genomicDataCounts.add(genomicDataCountMutated); - genomicDataCounts.add(genomicDataCountNotMutated); genomicDataCounts.add(genomicDataCountNotProfiled); + genomicDataCountItem.setCounts(genomicDataCounts); - + return Stream.of(genomicDataCountItem); }) .collect(Collectors.toList()); diff --git a/service/src/test/java/org/cbioportal/service/impl/MutationServiceImplTest.java b/service/src/test/java/org/cbioportal/service/impl/MutationServiceImplTest.java index e8bc163e3ea..cb37d765a82 100644 --- a/service/src/test/java/org/cbioportal/service/impl/MutationServiceImplTest.java +++ b/service/src/test/java/org/cbioportal/service/impl/MutationServiceImplTest.java @@ -1,10 +1,6 @@ package org.cbioportal.service.impl; -import org.cbioportal.model.Gene; -import org.cbioportal.model.GeneFilterQuery; -import org.cbioportal.model.MolecularProfile; -import org.cbioportal.model.Mutation; -import org.cbioportal.model.MutationCountByPosition; +import org.cbioportal.model.*; import org.cbioportal.model.meta.MutationMeta; import org.cbioportal.persistence.MutationRepository; import org.cbioportal.service.MolecularProfileService; @@ -19,6 +15,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import static org.mockito.ArgumentMatchers.anyList; @@ -224,4 +221,27 @@ public void fetchMutationCountsByPosition() throws Exception { Assert.assertEquals(1, result.size()); Assert.assertEquals(expectedMutationCountByPosition, result.get(0)); } + + @Test + public void getMutationCountsByType() { + GenomicDataCountItem expectedGenomicDataCountItem = new GenomicDataCountItem(); + expectedGenomicDataCountItem.setProfileType(PROFILE_TYPE_1); + expectedGenomicDataCountItem.setHugoGeneSymbol(HUGO_GENE_SYMBOL_1); + GenomicDataCount expectedGenomicDataCount = new GenomicDataCount(); + expectedGenomicDataCount.setLabel(MutationEventType.missense_mutation.getMutationType()); + expectedGenomicDataCount.setValue(MutationEventType.missense_mutation.getMutationType()); + expectedGenomicDataCount.setCount(1); + expectedGenomicDataCountItem.setCounts(Collections.singletonList(expectedGenomicDataCount)); + + Mockito.when(mutationRepository.getMutationCountsByType( + Collections.singletonList(MOLECULAR_PROFILE_ID), Collections.singletonList(SAMPLE_ID1), + Collections.singletonList(ENTREZ_GENE_ID_1), PROFILE_TYPE_1)).thenReturn(expectedGenomicDataCountItem); + + GenomicDataCountItem result = mutationService.getMutationCountsByType( + Collections.singletonList(MOLECULAR_PROFILE_ID), Collections.singletonList(SAMPLE_ID1), + Collections.singletonList(ENTREZ_GENE_ID_1), PROFILE_TYPE_1); + + Assert.assertEquals(expectedGenomicDataCountItem, result); + Assert.assertEquals(1, result.getCounts().size()); + } } \ No newline at end of file diff --git a/service/src/test/java/org/cbioportal/service/impl/StudyViewServiceImplTest.java b/service/src/test/java/org/cbioportal/service/impl/StudyViewServiceImplTest.java index a1c9c1e0fab..d94c8633f51 100644 --- a/service/src/test/java/org/cbioportal/service/impl/StudyViewServiceImplTest.java +++ b/service/src/test/java/org/cbioportal/service/impl/StudyViewServiceImplTest.java @@ -223,7 +223,7 @@ public void getMutationCountsByGeneSpecific() { alterationCountByGene1.setTotalCount(2); alterationCountByGene1.setNumberOfProfiledCases(2); alterationCountByGenes.add(alterationCountByGene1); - + Mockito.when(alterationCountService.getSampleMutationGeneCounts(anyList(), any(), anyBoolean(), @@ -234,10 +234,36 @@ public void getMutationCountsByGeneSpecific() { List> genomicDataFilters = new ArrayList<>(); Pair genomicDataFilter = new Pair<>(BaseServiceImplTest.HUGO_GENE_SYMBOL_1, BaseServiceImplTest.PROFILE_TYPE_1); genomicDataFilters.add(genomicDataFilter); + + GenomicDataCountItem genomicDataCountItem = new GenomicDataCountItem(); + genomicDataCountItem.setHugoGeneSymbol(BaseServiceImplTest.HUGO_GENE_SYMBOL_1); + genomicDataCountItem.setProfileType(BaseServiceImplTest.PROFILE_TYPE_1); + List genomicDataCounts = new ArrayList<>(); + GenomicDataCount genomicDataCount1 = new GenomicDataCount(); + genomicDataCount1.setLabel(MutationEventType.missense_mutation.getMutationType()); + genomicDataCount1.setValue(MutationEventType.missense_mutation.getMutationType()); + genomicDataCount1.setCount(2); + genomicDataCounts.add(genomicDataCount1); + GenomicDataCount genomicDataCount2 = new GenomicDataCount(); + genomicDataCount2.setLabel(MutationEventType.splice_site_indel.getMutationType()); + genomicDataCount2.setValue(MutationEventType.splice_site_indel.getMutationType()); + genomicDataCount2.setCount(2); + genomicDataCounts.add(genomicDataCount2); + genomicDataCountItem.setCounts(genomicDataCounts); + + Mockito.when(studyViewService.getMutationTypeCountsByGeneSpecific( + anyList(), anyList(), anyList() + )).thenReturn(Collections.singletonList(genomicDataCountItem)); List result = studyViewService.getMutationCountsByGeneSpecific( - studyIds, sampleIds, genomicDataFilters, alterationFilter); + studyIds, sampleIds, genomicDataFilters, alterationFilter, "SUMMARY"); + Assert.assertEquals(1, result.size()); + Assert.assertEquals(3, result.get(0).getCounts().size()); + + result = studyViewService.getMutationCountsByGeneSpecific( + studyIds, sampleIds, genomicDataFilters, alterationFilter, "DETAILED"); Assert.assertEquals(1, result.size()); + Assert.assertTrue(3 <= result.get(0).getCounts().size()); } @Test diff --git a/web/src/main/java/org/cbioportal/web/StudyViewController.java b/web/src/main/java/org/cbioportal/web/StudyViewController.java index 8317f5a9267..d31da9b6b81 100644 --- a/web/src/main/java/org/cbioportal/web/StudyViewController.java +++ b/web/src/main/java/org/cbioportal/web/StudyViewController.java @@ -1082,7 +1082,7 @@ public List cachedClinicalEventTypeCounts( @ApiOperation("Fetch mutation data counts by GenomicDataCountFilter") public ResponseEntity> fetchMutationDataCounts( @ApiParam("Level of detail of the response") - @RequestParam(defaultValue = "MUTATED") MutationOption categorization, + @RequestParam(defaultValue = "SUMMARY") Projection projection, @ApiParam(required = true, value = "Genomic data count filter") @Valid @RequestBody(required = false) GenomicDataCountFilter genomicDataCountFilter, @ApiIgnore // prevent reference to this attribute in the swagger-ui interface @RequestAttribute(required = false, value = "involvedCancerStudies") Collection involvedCancerStudies, @@ -1112,19 +1112,13 @@ public ResponseEntity> fetchMutationDataCounts( List sampleIds = new ArrayList<>(); studyViewFilterUtil.extractStudyAndSampleIds(filteredSampleIdentifiers, studyIds, sampleIds); - List result; - if (categorization == MutationOption.MUTATED) { - result = studyViewService.getMutationCountsByGeneSpecific( - studyIds, - sampleIds, - gdFilters.stream().map(gdFilter -> new Pair<>(gdFilter.getHugoGeneSymbol(), gdFilter.getProfileType())).collect(Collectors.toList()), - studyViewFilter.getAlterationFilter()); - } else { - result = studyViewService.getMutationTypeCountsByGeneSpecific( - studyIds, - sampleIds, - gdFilters.stream().map(gdFilter -> new Pair<>(gdFilter.getHugoGeneSymbol(), gdFilter.getProfileType())).collect(Collectors.toList())); - } + List result = studyViewService.getMutationCountsByGeneSpecific( + studyIds, + sampleIds, + gdFilters.stream().map(gdFilter -> new Pair<>(gdFilter.getHugoGeneSymbol(), gdFilter.getProfileType())).collect(Collectors.toList()), + studyViewFilter.getAlterationFilter(), + projection.name() + ); return new ResponseEntity<>(result, HttpStatus.OK); } diff --git a/web/src/test/java/org/cbioportal/web/StudyViewControllerTest.java b/web/src/test/java/org/cbioportal/web/StudyViewControllerTest.java index 6a8a300544a..ce967ecf23b 100644 --- a/web/src/test/java/org/cbioportal/web/StudyViewControllerTest.java +++ b/web/src/test/java/org/cbioportal/web/StudyViewControllerTest.java @@ -1117,13 +1117,8 @@ public void fetchMutationDataCounts() throws Exception { anyList(), anyList(), anyList(), - any(AlterationFilter.class))) - .thenReturn(genomicDataCountItems); - - when(studyViewService.getMutationTypeCountsByGeneSpecific( - anyList(), - anyList(), - anyList())) + any(AlterationFilter.class), + anyString())) .thenReturn(genomicDataCountItems); GenomicDataCountFilter genomicDataCountFilter = new GenomicDataCountFilter(); @@ -1146,10 +1141,10 @@ public void fetchMutationDataCounts() throws Exception { studyViewFilter.setAlterationFilter(alterationFilter); genomicDataCountFilter.setStudyViewFilter(studyViewFilter); - ResultActions result1 = mockMvc.perform(MockMvcRequestBuilders.post("/mutation-data-counts/fetch") .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) + .param("projection", "SUMMARY") .content(objectMapper.writeValueAsString(genomicDataCountFilter))); result1 @@ -1175,7 +1170,7 @@ public void fetchMutationDataCounts() throws Exception { ResultActions result2 = mockMvc.perform(MockMvcRequestBuilders.post("/mutation-data-counts/fetch") .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) - .param("categorization", "EVENT") + .param("projection", "DETAILED") .content(objectMapper.writeValueAsString(genomicDataCountFilter))); result2