diff --git a/src/main/java/org/cbioportal/persistence/StudyViewRepository.java b/src/main/java/org/cbioportal/persistence/StudyViewRepository.java index 3b60e17fcd4..478b263ade3 100644 --- a/src/main/java/org/cbioportal/persistence/StudyViewRepository.java +++ b/src/main/java/org/cbioportal/persistence/StudyViewRepository.java @@ -47,6 +47,8 @@ public interface StudyViewRepository { int getFilteredSamplesCount(StudyViewFilterContext studyViewFilterContext); + int getFilteredPatientCount(StudyViewFilterContext studyViewFilterContext); + Map> getMatchingGenePanelIds(StudyViewFilterContext studyViewFilterContext, String alterationType); int getTotalProfiledCountsByAlterationType(StudyViewFilterContext studyViewFilterContext, String alterationType); diff --git a/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.java b/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.java index 5bc659e5c5a..2135ccea95d 100644 --- a/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.java +++ b/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.java @@ -48,6 +48,8 @@ public interface StudyViewMapper { int getFilteredSamplesCount(@Param("studyViewFilterHelper") StudyViewFilterHelper studyViewFilterHelper); + int getFilteredPatientsCount(@Param("studyViewFilterHelper") StudyViewFilterHelper studyViewFilterHelper); + List getMatchingGenePanelIds(StudyViewFilterHelper studyViewFilterHelper, String alterationType); int getTotalProfiledCountByAlterationType(StudyViewFilterHelper studyViewFilterHelper, String alterationType); diff --git a/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMyBatisRepository.java b/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMyBatisRepository.java index 41687281c5d..a0a3a572e60 100644 --- a/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMyBatisRepository.java +++ b/src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMyBatisRepository.java @@ -163,6 +163,11 @@ public int getFilteredSamplesCount(StudyViewFilterContext studyViewFilterContext return mapper.getFilteredSamplesCount(createStudyViewFilterHelper(studyViewFilterContext)); } + @Override + public int getFilteredPatientCount(StudyViewFilterContext studyViewFilterContext) { + return mapper.getFilteredPatientsCount(createStudyViewFilterHelper(studyViewFilterContext)); + } + @Override public Map> getMatchingGenePanelIds(StudyViewFilterContext studyViewFilterContext, String alterationType) { return mapper.getMatchingGenePanelIds(createStudyViewFilterHelper(studyViewFilterContext), alterationType) diff --git a/src/main/java/org/cbioportal/service/impl/StudyViewColumnarServiceImpl.java b/src/main/java/org/cbioportal/service/impl/StudyViewColumnarServiceImpl.java index b1ada8fac31..6ab20d58e29 100644 --- a/src/main/java/org/cbioportal/service/impl/StudyViewColumnarServiceImpl.java +++ b/src/main/java/org/cbioportal/service/impl/StudyViewColumnarServiceImpl.java @@ -107,7 +107,17 @@ public Map getClinicalAttributeDatatypeMap() { @Override public List getClinicalDataCounts(StudyViewFilter studyViewFilter, List filteredAttributes) { - return generateDataCountItemsFromDataCounts(studyViewRepository.getClinicalDataCounts(createContext(studyViewFilter), filteredAttributes)); + StudyViewFilterContext studyViewFilterContext = createContext(studyViewFilter); + List dataCounts = studyViewRepository.getClinicalDataCounts(studyViewFilterContext, filteredAttributes); + List clinicalDataCountItems = generateDataCountItemsFromDataCounts(dataCounts); + + return calculateMissingNaCountsForClinicalDataCountItems( + clinicalDataCountItems, + filteredAttributes, + this.getClinicalAttributeDatatypeMap(), + studyViewRepository.getFilteredSamplesCount(studyViewFilterContext), + studyViewRepository.getFilteredPatientCount(studyViewFilterContext) + ); } @Override @@ -170,6 +180,76 @@ private List generateDataCountItemsFromDataCounts(List calculateMissingNaCountsForClinicalDataCountItems( + List clinicalDataCountItems, + List filteredAttributes, + Map clinicalAttributeDatatypeMap, + int filteredSamplesCount, + int filteredPatientsCount + ) { + // Postprocess clinical data count items to adjust NA counts + List combinedClinicalDataCountItems = new ArrayList<>(); + + Map clinicalDataCountItemMap = clinicalDataCountItems + .stream() + .collect(Collectors.toMap( + ClinicalDataCountItem::getAttributeId, + item -> item + )); + + // go over all filtered attributes, not just attributes found in clinicalDataCountItems + for (String attributeId: filteredAttributes) { + ClinicalDataCountItem clinicalDataCountItem = clinicalDataCountItemMap.get(attributeId); + boolean isItemMissing = false; + + if (clinicalDataCountItem == null) { + isItemMissing = true; + clinicalDataCountItem = new ClinicalDataCountItem(); + clinicalDataCountItem.setAttributeId(attributeId); + clinicalDataCountItem.setCounts(new ArrayList<>()); + } + + Integer totalClinicalDataCount = clinicalDataCountItem + .getCounts() + .stream() + .map(ClinicalDataCount::getCount) + .reduce(0, Integer::sum); + // depending on clinical data type we either use filtered sample count or filtered patient count + int filteredCount = clinicalAttributeDatatypeMap.get(clinicalDataCountItem.getAttributeId()) == ClinicalDataType.SAMPLE ? + filteredSamplesCount: filteredPatientsCount; + int casesWithoutClinicalData = filteredCount - totalClinicalDataCount; + + if (casesWithoutClinicalData > 0) { + // some of these attributes may be completely missing in clinicalDataCountItem + // in case the only attribute value is NA. + // we need to manually add those missing items to make sure we have NA counts. + if (isItemMissing) { + combinedClinicalDataCountItems.add(clinicalDataCountItem); + } + + // find "NA" or else create a new one + ClinicalDataCount naClinicalDataCount = clinicalDataCountItem + .getCounts() + .stream() + .filter(c -> c.getValue().equals("NA")) + .findFirst() + .orElseGet(() -> { + // this should only happen when there are multiple studies + ClinicalDataCount count = new ClinicalDataCount(); + count.setAttributeId(attributeId); + count.setValue("NA"); + count.setCount(0); + return count; + }); + + naClinicalDataCount.setCount(naClinicalDataCount.getCount() + casesWithoutClinicalData); + } + } + + combinedClinicalDataCountItems.addAll(clinicalDataCountItems); + return combinedClinicalDataCountItems; + } + public static List mergeCaseListCounts(List counts) { Map> countsPerListType = counts.stream() .collect((Collectors.groupingBy(CaseListDataCount::getValue))); diff --git a/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.xml b/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.xml index ddd65175da7..4fad2f3b14c 100644 --- a/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.xml +++ b/src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.xml @@ -226,7 +226,13 @@ FROM sample_derived WHERE sample_unique_id IN () - + + + SELECT count(distinct patient_unique_id) as count + FROM sample_derived sd + WHERE sample_unique_id IN () + + - + + +