From 179fb9f777ac602e2e910c3ae194899c35bc5e4d Mon Sep 17 00:00:00 2001 From: pvannierop Date: Wed, 13 Sep 2023 11:16:28 +0200 Subject: [PATCH] WIP 6 --- .../model/SampleClinicalDataCollection.java | 10 +- .../service/ClinicalDataService.java | 5 - .../service/impl/ClinicalDataServiceImpl.java | 45 ++----- .../impl/ClinicalDataServiceImplTest.java | 114 +++++++++++++++--- .../cbioportal/web/StudyViewController.java | 10 +- .../web/StudyViewControllerTest.java | 75 ++++++------ 6 files changed, 155 insertions(+), 104 deletions(-) diff --git a/model/src/main/java/org/cbioportal/model/SampleClinicalDataCollection.java b/model/src/main/java/org/cbioportal/model/SampleClinicalDataCollection.java index 64fb0f3cb44..bea32238b9a 100644 --- a/model/src/main/java/org/cbioportal/model/SampleClinicalDataCollection.java +++ b/model/src/main/java/org/cbioportal/model/SampleClinicalDataCollection.java @@ -6,14 +6,14 @@ public class SampleClinicalDataCollection { - private Map> sampleClinicalData = new HashMap<>(); + private Map> byUniqueSampleKey = new HashMap<>(); - public Map> getSampleClinicalData() { - return sampleClinicalData; + public Map> getByUniqueSampleKey() { + return byUniqueSampleKey; } - public void setSampleClinicalData(Map> sampleClinicalData) { - this.sampleClinicalData = sampleClinicalData; + public void setByUniqueSampleKey(Map> byUniqueSampleKey) { + this.byUniqueSampleKey = byUniqueSampleKey; } } diff --git a/service/src/main/java/org/cbioportal/service/ClinicalDataService.java b/service/src/main/java/org/cbioportal/service/ClinicalDataService.java index a93353aba9c..291ed0cde37 100644 --- a/service/src/main/java/org/cbioportal/service/ClinicalDataService.java +++ b/service/src/main/java/org/cbioportal/service/ClinicalDataService.java @@ -56,9 +56,4 @@ List getPatientClinicalDataDetailedToSample(List studyIds, SampleClinicalDataCollection fetchSampleClinicalTable(List studyIds, List sampleIds, Integer pageSize, Integer pageNumber, String searchTerm, String sortBy, String direction); - List getSampleAndPatientClinicalDataBySampleInternalIds(List sampleInternalIds); - - List getVisibleSampleInternalIdsForClinicalTable(List sampleStudyIds, List sampleIds, - Integer pageSize, Integer pageNumber, String searchTerm, - String sortBy, String direction); } diff --git a/service/src/main/java/org/cbioportal/service/impl/ClinicalDataServiceImpl.java b/service/src/main/java/org/cbioportal/service/impl/ClinicalDataServiceImpl.java index e7cf733ad2c..0b677449816 100644 --- a/service/src/main/java/org/cbioportal/service/impl/ClinicalDataServiceImpl.java +++ b/service/src/main/java/org/cbioportal/service/impl/ClinicalDataServiceImpl.java @@ -231,32 +231,26 @@ public List getPatientClinicalDataDetailedToSample(List st @Override public SampleClinicalDataCollection fetchSampleClinicalTable(List studyIds, List sampleIds, Integer pageSize, Integer pageNumber, String searchTerm, String sortBy, String direction) { - if (sampleIds.isEmpty()) { - return new SampleClinicalDataCollection(); + SampleClinicalDataCollection sampleClinicalDataCollection = new SampleClinicalDataCollection(); + if (studyIds == null || studyIds.isEmpty() || sampleIds == null || sampleIds.isEmpty()) { + return sampleClinicalDataCollection; } - List visibleSampleInternalIds = this.getVisibleSampleInternalIdsForClinicalTable( - studyIds, - sampleIds, - pageSize, - pageNumber, - searchTerm, - sortBy, - direction + List visibleSampleInternalIds = clinicalDataRepository.getVisibleSampleInternalIdsForClinicalTable( + studyIds, sampleIds, + pageSize, pageNumber, + searchTerm, sortBy, direction ); - List clinicalData = this.getSampleAndPatientClinicalDataBySampleInternalIds(visibleSampleInternalIds); + List clinicalData = clinicalDataRepository.getSampleAndPatientClinicalDataBySampleInternalIds( + visibleSampleInternalIds + ); - SampleClinicalDataCollection clinicalDataByUniqueSampleKey = clinicalData.stream().collect(Collectors.groupingBy(clinicalDatum -> + sampleClinicalDataCollection.setByUniqueSampleKey(clinicalData.stream().collect(Collectors.groupingBy(clinicalDatum -> calculateBase64(clinicalDatum.getSampleId(), clinicalDatum.getStudyId()) - )); - - Map> sampleAggregatedClinicalData = clinicalDataByUniqueSampleKey.entrySet().stream().collect(Collectors.toMap( - entry -> entry.getKey(), - entry -> aggregateSampleClinicalData(entry.getValue()) - )); + ))); - return sampleAggregatedClinicalData; + return sampleClinicalDataCollection; } /* @@ -278,17 +272,4 @@ private Map aggregateSampleClinicalData(List clini return returnData; } - @Override - public List getVisibleSampleInternalIdsForClinicalTable(List studyIds, List sampleIds, - Integer pageSize, Integer pageNumber, String searchTerm, - String sortBy, String direction) { - return clinicalDataRepository.getVisibleSampleInternalIdsForClinicalTable(studyIds, sampleIds, pageSize, - pageNumber, searchTerm, sortBy, direction); - } - - @Override - public List getSampleAndPatientClinicalDataBySampleInternalIds(List sampleInternalIds) { - return clinicalDataRepository.getSampleAndPatientClinicalDataBySampleInternalIds(sampleInternalIds); - } - } diff --git a/service/src/test/java/org/cbioportal/service/impl/ClinicalDataServiceImplTest.java b/service/src/test/java/org/cbioportal/service/impl/ClinicalDataServiceImplTest.java index ae0d10fcef0..864ccdf9d93 100644 --- a/service/src/test/java/org/cbioportal/service/impl/ClinicalDataServiceImplTest.java +++ b/service/src/test/java/org/cbioportal/service/impl/ClinicalDataServiceImplTest.java @@ -6,7 +6,9 @@ import org.cbioportal.service.*; import org.cbioportal.service.exception.*; import org.cbioportal.service.util.ClinicalAttributeUtil; +import org.cbioportal.utils.Encoding; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; @@ -17,6 +19,9 @@ import java.util.*; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.Mockito.when; + @RunWith(MockitoJUnitRunner.class) public class ClinicalDataServiceImplTest extends BaseServiceImplTest { @@ -35,6 +40,34 @@ public class ClinicalDataServiceImplTest extends BaseServiceImplTest { private ClinicalAttributeService clinicalAttributeService; @Spy private ClinicalAttributeUtil clinicalAttributeUtil = new ClinicalAttributeUtil(); + + ClinicalData datum1 = new ClinicalData(); + ClinicalData datum2 = new ClinicalData(); + String uniqueKeySample1; + String uniqueKeySample2; + List sampleStudyIds = Arrays.asList(STUDY_ID, STUDY_ID, STUDY_ID); + List sampleIds = Arrays.asList(SAMPLE_ID1, SAMPLE_ID2, SAMPLE_ID3); + + Integer pageSize = 100; + Integer pageNumber = 0; + String searchTerm = "mySearch"; + String sortBy = "column name"; + String direction = "ASC"; + List sampleInternalIds = Arrays.asList(0, 1); + + @Before + public void init() { + + datum1.setSampleId("SampleA"); + List sampleIds; + datum1.setStudyId("Study1"); + uniqueKeySample1 = Encoding.calculateBase64("SampleA", "Study1"); + + datum2.setSampleId("SampleA"); + datum2.setStudyId("Study2"); + uniqueKeySample2 = Encoding.calculateBase64("SampleA", "Study2"); + + } @Test public void getAllClinicalDataOfSampleInStudy() throws Exception { @@ -43,7 +76,7 @@ public void getAllClinicalDataOfSampleInStudy() throws Exception { ClinicalData sampleClinicalData = new ClinicalData(); expectedSampleClinicalDataList.add(sampleClinicalData); - Mockito.when(clinicalDataRepository.getAllClinicalDataOfSampleInStudy(STUDY_ID, SAMPLE_ID1, + when(clinicalDataRepository.getAllClinicalDataOfSampleInStudy(STUDY_ID, SAMPLE_ID1, CLINICAL_ATTRIBUTE_ID_1, PROJECTION, PAGE_SIZE, PAGE_NUMBER, SORT, DIRECTION)) .thenReturn(expectedSampleClinicalDataList); @@ -56,7 +89,7 @@ public void getAllClinicalDataOfSampleInStudy() throws Exception { @Test(expected = SampleNotFoundException.class) public void getAllClinicalDataOfSampleInStudySampleNotFound() throws Exception { - Mockito.when(sampleService.getSampleInStudy(STUDY_ID, SAMPLE_ID1)) + when(sampleService.getSampleInStudy(STUDY_ID, SAMPLE_ID1)) .thenThrow(new SampleNotFoundException(STUDY_ID, SAMPLE_ID1)); clinicalDataService.getAllClinicalDataOfSampleInStudy(STUDY_ID, SAMPLE_ID1, CLINICAL_ATTRIBUTE_ID_1, PROJECTION, PAGE_SIZE, PAGE_NUMBER, SORT, DIRECTION); @@ -67,7 +100,7 @@ public void getMetaSampleClinicalData() throws Exception { BaseMeta expectedBaseMeta = new BaseMeta(); - Mockito.when(clinicalDataRepository.getMetaSampleClinicalData(STUDY_ID, SAMPLE_ID1, CLINICAL_ATTRIBUTE_ID_1)) + when(clinicalDataRepository.getMetaSampleClinicalData(STUDY_ID, SAMPLE_ID1, CLINICAL_ATTRIBUTE_ID_1)) .thenReturn(expectedBaseMeta); BaseMeta result = clinicalDataService.getMetaSampleClinicalData(STUDY_ID, SAMPLE_ID1, CLINICAL_ATTRIBUTE_ID_1); @@ -78,7 +111,7 @@ public void getMetaSampleClinicalData() throws Exception { @Test(expected = SampleNotFoundException.class) public void getMetaSampleClinicalDataSampleNotFound() throws Exception { - Mockito.when(sampleService.getSampleInStudy(STUDY_ID, SAMPLE_ID1)) + when(sampleService.getSampleInStudy(STUDY_ID, SAMPLE_ID1)) .thenThrow(new SampleNotFoundException(STUDY_ID, SAMPLE_ID1)); clinicalDataService.getMetaSampleClinicalData(STUDY_ID, SAMPLE_ID1, CLINICAL_ATTRIBUTE_ID_1); } @@ -90,7 +123,7 @@ public void getAllClinicalDataOfPatientInStudy() throws Exception { ClinicalData patientClinicalData = new ClinicalData(); expectedPatientClinicalDataList.add(patientClinicalData); - Mockito.when(clinicalDataRepository.getAllClinicalDataOfPatientInStudy(STUDY_ID, PATIENT_ID_1, + when(clinicalDataRepository.getAllClinicalDataOfPatientInStudy(STUDY_ID, PATIENT_ID_1, CLINICAL_ATTRIBUTE_ID_1, PROJECTION, PAGE_SIZE, PAGE_NUMBER, SORT, DIRECTION)) .thenReturn(expectedPatientClinicalDataList); @@ -103,7 +136,7 @@ public void getAllClinicalDataOfPatientInStudy() throws Exception { @Test(expected = PatientNotFoundException.class) public void getAllClinicalDataOfPatientInStudyPatientNotFound() throws Exception { - Mockito.when(patientService.getPatientInStudy(STUDY_ID, PATIENT_ID_1)) + when(patientService.getPatientInStudy(STUDY_ID, PATIENT_ID_1)) .thenThrow(new PatientNotFoundException(STUDY_ID, PATIENT_ID_1)); clinicalDataService.getAllClinicalDataOfPatientInStudy(STUDY_ID, PATIENT_ID_1, CLINICAL_ATTRIBUTE_ID_1, PROJECTION, PAGE_SIZE, PAGE_NUMBER, SORT, DIRECTION); @@ -114,7 +147,7 @@ public void getMetaPatientClinicalData() throws Exception { BaseMeta expectedBaseMeta = new BaseMeta(); - Mockito.when(clinicalDataRepository.getMetaPatientClinicalData(STUDY_ID, PATIENT_ID_1, CLINICAL_ATTRIBUTE_ID_1)) + when(clinicalDataRepository.getMetaPatientClinicalData(STUDY_ID, PATIENT_ID_1, CLINICAL_ATTRIBUTE_ID_1)) .thenReturn(expectedBaseMeta); BaseMeta result = clinicalDataService.getMetaPatientClinicalData(STUDY_ID, PATIENT_ID_1, @@ -126,7 +159,7 @@ public void getMetaPatientClinicalData() throws Exception { @Test(expected = PatientNotFoundException.class) public void getMetaPatientClinicalDataPatientNotFound() throws Exception { - Mockito.when(patientService.getPatientInStudy(STUDY_ID, PATIENT_ID_1)) + when(patientService.getPatientInStudy(STUDY_ID, PATIENT_ID_1)) .thenThrow(new PatientNotFoundException(STUDY_ID, PATIENT_ID_1)); clinicalDataService.getMetaPatientClinicalData(STUDY_ID, PATIENT_ID_1, CLINICAL_ATTRIBUTE_ID_1); } @@ -138,7 +171,7 @@ public void getAllClinicalDataInStudy() throws Exception { ClinicalData sampleClinicalData = new ClinicalData(); expectedSampleClinicalDataList.add(sampleClinicalData); - Mockito.when(clinicalDataRepository.getAllClinicalDataInStudy(STUDY_ID, CLINICAL_ATTRIBUTE_ID_1, + when(clinicalDataRepository.getAllClinicalDataInStudy(STUDY_ID, CLINICAL_ATTRIBUTE_ID_1, CLINICAL_DATA_TYPE, PROJECTION, PAGE_SIZE, PAGE_NUMBER, SORT, DIRECTION)) .thenReturn(expectedSampleClinicalDataList); @@ -151,7 +184,7 @@ public void getAllClinicalDataInStudy() throws Exception { @Test(expected = StudyNotFoundException.class) public void getAllClinicalDataInStudyNotFound() throws Exception { - Mockito.when(studyService.getStudy(STUDY_ID)).thenThrow(new StudyNotFoundException(STUDY_ID)); + when(studyService.getStudy(STUDY_ID)).thenThrow(new StudyNotFoundException(STUDY_ID)); clinicalDataService.getAllClinicalDataInStudy(STUDY_ID, CLINICAL_ATTRIBUTE_ID_1, CLINICAL_DATA_TYPE, PROJECTION, PAGE_SIZE, PAGE_NUMBER, SORT, DIRECTION); } @@ -162,7 +195,7 @@ public void getMetaAllClinicalData() throws Exception { BaseMeta expectedBaseMeta = new BaseMeta(); expectedBaseMeta.setTotalCount(5); - Mockito.when( + when( clinicalDataRepository.getMetaAllClinicalData(STUDY_ID, CLINICAL_ATTRIBUTE_ID_1, CLINICAL_DATA_TYPE)) .thenReturn(expectedBaseMeta); @@ -175,7 +208,7 @@ public void getMetaAllClinicalData() throws Exception { @Test(expected = StudyNotFoundException.class) public void getMetaAllClinicalDataStudyNotFound() throws Exception { - Mockito.when(studyService.getStudy(STUDY_ID)).thenThrow(new StudyNotFoundException(STUDY_ID)); + when(studyService.getStudy(STUDY_ID)).thenThrow(new StudyNotFoundException(STUDY_ID)); clinicalDataService.getMetaAllClinicalData(STUDY_ID, CLINICAL_ATTRIBUTE_ID_1, CLINICAL_DATA_TYPE); } @@ -191,7 +224,7 @@ public void fetchClinicalDataPatientClinicalDataType() throws Exception { ClinicalData patientClinicalData = new ClinicalData(); expectedPatientClinicalDataList.add(patientClinicalData); - Mockito.when(clinicalDataRepository.fetchClinicalData(studyIds, patientIds, + when(clinicalDataRepository.fetchClinicalData(studyIds, patientIds, Arrays.asList(CLINICAL_ATTRIBUTE_ID_1), CLINICAL_DATA_TYPE, PROJECTION)) .thenReturn(expectedPatientClinicalDataList); @@ -212,7 +245,7 @@ public void fetchMetaClinicalDataPatientClinicalDataType() throws Exception { BaseMeta expectedBaseMeta = new BaseMeta(); expectedBaseMeta.setTotalCount(5); - Mockito.when(clinicalDataRepository.fetchMetaClinicalData(studyIds, patientIds, + when(clinicalDataRepository.fetchMetaClinicalData(studyIds, patientIds, Arrays.asList(CLINICAL_ATTRIBUTE_ID_1), CLINICAL_DATA_TYPE)).thenReturn(expectedBaseMeta); BaseMeta result = clinicalDataService.fetchMetaClinicalData(studyIds, patientIds, @@ -238,7 +271,7 @@ public void fetchClinicalDataCounts() throws Exception { clinicalAttribute4.setAttrId(CLINICAL_ATTRIBUTE_ID_1); clinicalAttribute4.setPatientAttribute(false); - Mockito.when(clinicalAttributeService.getClinicalAttributesByStudyIdsAndAttributeIds( + when(clinicalAttributeService.getClinicalAttributesByStudyIdsAndAttributeIds( Arrays.asList(STUDY_ID, STUDY_ID, STUDY_ID), Arrays.asList(CLINICAL_ATTRIBUTE_ID_1, CLINICAL_ATTRIBUTE_ID_2, CLINICAL_ATTRIBUTE_ID_3))) .thenReturn( @@ -257,7 +290,7 @@ public void fetchClinicalDataCounts() throws Exception { clinicalDataCount6.setValue("value1"); clinicalDataCount6.setCount(2); - Mockito.when(clinicalDataRepository.fetchClinicalDataCounts(Arrays.asList(STUDY_ID, STUDY_ID, STUDY_ID), + when(clinicalDataRepository.fetchClinicalDataCounts(Arrays.asList(STUDY_ID, STUDY_ID, STUDY_ID), Arrays.asList(SAMPLE_ID1, SAMPLE_ID2, SAMPLE_ID3), Arrays.asList(CLINICAL_ATTRIBUTE_ID_3, CLINICAL_ATTRIBUTE_ID_1), "SAMPLE", "SUMMARY")) .thenReturn(Arrays.asList(clinicalDataCount2, clinicalDataCount5, clinicalDataCount6)); @@ -271,7 +304,7 @@ public void fetchClinicalDataCounts() throws Exception { clinicalDataCount4.setValue("value3"); clinicalDataCount4.setCount(1); - Mockito.when(clinicalDataRepository.fetchClinicalDataCounts(Arrays.asList(STUDY_ID, STUDY_ID, STUDY_ID), + when(clinicalDataRepository.fetchClinicalDataCounts(Arrays.asList(STUDY_ID, STUDY_ID, STUDY_ID), Arrays.asList(SAMPLE_ID1, SAMPLE_ID2, SAMPLE_ID3), Arrays.asList(CLINICAL_ATTRIBUTE_ID_2), "PATIENT", "SUMMARY")).thenReturn(Arrays.asList(clinicalDataCount3, clinicalDataCount4)); @@ -280,7 +313,7 @@ public void fetchClinicalDataCounts() throws Exception { clinicalDataCount1.setValue("value1"); clinicalDataCount1.setCount(2); - Mockito.when(clinicalDataRepository.fetchClinicalDataCounts(Arrays.asList(STUDY_ID, STUDY_ID, STUDY_ID), + when(clinicalDataRepository.fetchClinicalDataCounts(Arrays.asList(STUDY_ID, STUDY_ID, STUDY_ID), Arrays.asList(SAMPLE_ID1, SAMPLE_ID2, SAMPLE_ID3), Arrays.asList(CLINICAL_ATTRIBUTE_ID_1), "PATIENT", "DETAILED")).thenReturn(Arrays.asList(clinicalDataCount1)); @@ -298,7 +331,7 @@ public void fetchClinicalDataCounts() throws Exception { patient3.setCancerStudyIdentifier(STUDY_ID); patients.add(patient3); - Mockito.when(patientService.getPatientsOfSamples(Arrays.asList(STUDY_ID, STUDY_ID, STUDY_ID), + when(patientService.getPatientsOfSamples(Arrays.asList(STUDY_ID, STUDY_ID, STUDY_ID), Arrays.asList(SAMPLE_ID1, SAMPLE_ID2, SAMPLE_ID3))).thenReturn(patients); List result = clinicalDataService.fetchClinicalDataCounts( @@ -339,4 +372,47 @@ public void fetchClinicalDataCounts() throws Exception { Assert.assertEquals((Integer) 4, count1.getCount()); } + + @Test + public void fetchSampleClinicalTableHappyCase() { + + when(clinicalDataRepository.getVisibleSampleInternalIdsForClinicalTable( + sampleStudyIds, sampleIds, pageSize, pageNumber, searchTerm, sortBy, direction + )).thenReturn(sampleInternalIds); + + when(clinicalDataRepository.getSampleAndPatientClinicalDataBySampleInternalIds(sampleInternalIds)).thenReturn( + List.of(datum1, datum2) + ); + + SampleClinicalDataCollection collection = clinicalDataService.fetchSampleClinicalTable( + sampleStudyIds, sampleIds, pageSize, pageNumber, searchTerm, sortBy, direction + ); + + Assert.assertEquals(2, collection.getByUniqueSampleKey().size()); + Assert.assertTrue(collection.getByUniqueSampleKey().containsKey(uniqueKeySample1)); + Assert.assertTrue(collection.getByUniqueSampleKey().containsKey(uniqueKeySample2)); + Assert.assertEquals(1, collection.getByUniqueSampleKey().get(uniqueKeySample1).size()); + Assert.assertEquals(1, collection.getByUniqueSampleKey().get(uniqueKeySample2).size()); + Assert.assertEquals("SampleA", collection.getByUniqueSampleKey().get(uniqueKeySample1).get(0).getSampleId()); + Assert.assertEquals("Study1", collection.getByUniqueSampleKey().get(uniqueKeySample1).get(0).getStudyId()); + Assert.assertEquals("SampleA", collection.getByUniqueSampleKey().get(uniqueKeySample2).get(0).getSampleId()); + Assert.assertEquals("Study2", collection.getByUniqueSampleKey().get(uniqueKeySample2).get(0).getStudyId()); + } + + @Test + public void fetchSampleClinicalTableEmptyIdLists() { + Assert.assertEquals(0, clinicalDataService.fetchSampleClinicalTable( + null, sampleIds, pageSize, pageNumber, searchTerm, sortBy, direction + ).getByUniqueSampleKey().size()); + Assert.assertEquals(0, clinicalDataService.fetchSampleClinicalTable( + sampleStudyIds, null, pageSize, pageNumber, searchTerm, sortBy, direction + ).getByUniqueSampleKey().size()); + Assert.assertEquals(0, clinicalDataService.fetchSampleClinicalTable( + new ArrayList<>(), sampleIds, pageSize, pageNumber, searchTerm, sortBy, direction + ).getByUniqueSampleKey().size()); + Assert.assertEquals(0, clinicalDataService.fetchSampleClinicalTable( + sampleStudyIds, new ArrayList<>(), pageSize, pageNumber, searchTerm, sortBy, direction + ).getByUniqueSampleKey().size()); + } + } diff --git a/web/src/main/java/org/cbioportal/web/StudyViewController.java b/web/src/main/java/org/cbioportal/web/StudyViewController.java index 7ffd7f12e9b..0bd68fd33f9 100644 --- a/web/src/main/java/org/cbioportal/web/StudyViewController.java +++ b/web/src/main/java/org/cbioportal/web/StudyViewController.java @@ -959,7 +959,7 @@ public ResponseEntity> fetchGenericAssayDataBinCounts( @RequestMapping(value = "/clinical-data-table/fetch", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @ApiOperation("Fetch clinical data for the Clinical Tab of Study View") - public ResponseEntity>> fetchClinicalDataClinicalTable( + public ResponseEntity fetchClinicalDataClinicalTable( @ApiParam(required = true, value = "Study view filter") @Valid @RequestBody(required = false) StudyViewFilter studyViewFilter, @@ -983,7 +983,7 @@ public ResponseEntity>> fetchClinicalDataClinica @RequestParam(defaultValue = "") String searchTerm, @ApiParam(value = "sampleId, patientId, or the ATTR_ID to sorted by") - @RequestParam(required = false) ClinicalDataSortBy sortBy, + @RequestParam(required = false) String sortBy, @ApiParam("Direction of the sort") @RequestParam(defaultValue = "ASC") Direction direction @@ -993,18 +993,18 @@ public ResponseEntity>> fetchClinicalDataClinica List filteredSampleIdentifiers = studyViewFilterApplier.apply(interceptedStudyViewFilter); studyViewFilterUtil.extractStudyAndSampleIds(filteredSampleIdentifiers, sampleStudyIds, sampleIds); - Map> aggregatedClinicalDataByUniqueSampleKey = clinicalDataService.fetchSampleClinicalTable( + SampleClinicalDataCollection aggregatedClinicalDataByUniqueSampleKey = clinicalDataService.fetchSampleClinicalTable( sampleStudyIds, sampleIds, pageSize, pageNumber, searchTerm, - sortBy.name(), + sortBy, direction.name() ); HttpHeaders responseHeaders = new HttpHeaders(); - responseHeaders.add(HeaderKeyConstants.TOTAL_COUNT, String.valueOf(aggregatedClinicalDataByUniqueSampleKey.keySet().size())); + responseHeaders.add(HeaderKeyConstants.TOTAL_COUNT, String.valueOf(aggregatedClinicalDataByUniqueSampleKey.getByUniqueSampleKey().size())); return new ResponseEntity<>(aggregatedClinicalDataByUniqueSampleKey, responseHeaders, 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 b35ef807849..76f84ced1cd 100644 --- a/web/src/test/java/org/cbioportal/web/StudyViewControllerTest.java +++ b/web/src/test/java/org/cbioportal/web/StudyViewControllerTest.java @@ -6,6 +6,7 @@ import org.cbioportal.persistence.AlterationRepository; import org.cbioportal.service.*; import org.cbioportal.service.util.MolecularProfileUtil; +import org.cbioportal.utils.Encoding; import org.cbioportal.web.config.CustomObjectMapper; import org.cbioportal.web.parameter.*; import org.cbioportal.web.util.StudyViewFilterApplier; @@ -26,10 +27,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -70,6 +68,7 @@ public class StudyViewControllerTest { private List filteredSampleIdentifiers = new ArrayList<>(); private List clinicalData = new ArrayList<>(); + private SampleClinicalDataCollection tableClinicalData = new SampleClinicalDataCollection(); @Autowired private WebApplicationContext wac; @@ -137,7 +136,7 @@ public ViolinPlotService violinPlotService() { private ArrayList filteredSamples = new ArrayList<>(); -// private String uniqueKeySample1 = + private String uniqueKeySample1; @Before public void setUp() throws Exception { @@ -158,6 +157,8 @@ public void setUp() throws Exception { filteredSamples.add(sample1); filteredSamples.add(sample2); + uniqueKeySample1 = Encoding.calculateBase64(TEST_SAMPLE_ID_1, TEST_STUDY_ID); + ClinicalData clinicalData1 = new ClinicalData(); clinicalData1.setAttrId(TEST_ATTRIBUTE_ID); clinicalData1.setAttrValue(TEST_CLINICAL_DATA_VALUE_1); @@ -181,6 +182,10 @@ public void setUp() throws Exception { clinicalData3.setSampleId(TEST_SAMPLE_ID_3); clinicalData3.setPatientId(TEST_PATIENT_ID_3); clinicalData.add(clinicalData3); + + Map> tableClinicalDataMap = new HashMap<>(); + tableClinicalDataMap.put(uniqueKeySample1, List.of(clinicalData1, clinicalData2, clinicalData3)); + tableClinicalData.setByUniqueSampleKey(tableClinicalDataMap); reset(studyViewFilterApplier); reset(clinicalDataService); @@ -871,39 +876,33 @@ public void fetchGenericAssayDataCounts() throws Exception { .andExpect(MockMvcResultMatchers.jsonPath("$[0].counts[1].count").value(1)); } -// @Test -// public void fetchClinicalDataClinicalTable() throws Exception { -// // For this sake of this test the sample clinical data and patient clinical data are identical. -// when(clinicalDataService.fetchSampleClinicalTable(anyList(), anyList(), -// anyInt(), anyInt(), anyString(), any(), anyString())).thenReturn(clinicalData); -// when(clinicalDataService.fetchClinicalData(anyList(), anyList(), -// any(), anyString(), anyString())).thenReturn(clinicalData); -// -// StudyViewFilter studyViewFilter = new StudyViewFilter(); -// studyViewFilter.setStudyIds(Arrays.asList(TEST_STUDY_ID)); -// -// when(studyViewFilterApplier.apply(any())).thenReturn(filteredSampleIdentifiers); -// -// mockMvc.perform(MockMvcRequestBuilders.post("/clinical-data-table/fetch") -// .accept(MediaType.APPLICATION_JSON) -// .contentType(MediaType.APPLICATION_JSON) -// .content(objectMapper.writeValueAsString(studyViewFilter))) -// .andExpect(MockMvcResultMatchers.status().isOk()) -// .andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) -// .andExpect(MockMvcResultMatchers.jsonPath("$.sampleClinicalData.clinicalAttributeId").value(TEST_ATTRIBUTE_ID)) -// .andExpect(MockMvcResultMatchers.jsonPath("$.sampleClinicalData[0].sampleId").value(TEST_SAMPLE_ID_1)) -// .andExpect(MockMvcResultMatchers.jsonPath("$.sampleClinicalData[1].clinicalAttributeId").value(TEST_ATTRIBUTE_ID)) -// .andExpect(MockMvcResultMatchers.jsonPath("$.sampleClinicalData[1].sampleId").value(TEST_SAMPLE_ID_2)) -// .andExpect(MockMvcResultMatchers.jsonPath("$.sampleClinicalData[2].clinicalAttributeId").value(TEST_ATTRIBUTE_ID)) -// .andExpect(MockMvcResultMatchers.jsonPath("$.sampleClinicalData[2].sampleId").value(TEST_SAMPLE_ID_3)) -// .andExpect(MockMvcResultMatchers.jsonPath("$.patientClinicalData[0].clinicalAttributeId").value(TEST_ATTRIBUTE_ID)) -// .andExpect(MockMvcResultMatchers.jsonPath("$.patientClinicalData[0].sampleId").value(TEST_SAMPLE_ID_1)) -// .andExpect(MockMvcResultMatchers.jsonPath("$.patientClinicalData[1].clinicalAttributeId").value(TEST_ATTRIBUTE_ID)) -// .andExpect(MockMvcResultMatchers.jsonPath("$.patientClinicalData[1].sampleId").value(TEST_SAMPLE_ID_2)) -// .andExpect(MockMvcResultMatchers.jsonPath("$.patientClinicalData[2].clinicalAttributeId").value(TEST_ATTRIBUTE_ID)) -// .andExpect(MockMvcResultMatchers.jsonPath("$.patientClinicalData[2].sampleId").value(TEST_SAMPLE_ID_3)); -// -// } + @Test + public void fetchClinicalDataClinicalTable() throws Exception { + // For this sake of this test the sample clinical data and patient clinical data are identical. + when(clinicalDataService.fetchSampleClinicalTable(anyList(), anyList(), + anyInt(), anyInt(), anyString(), any(), anyString())).thenReturn(tableClinicalData); + + StudyViewFilter studyViewFilter = new StudyViewFilter(); + studyViewFilter.setStudyIds(Arrays.asList(TEST_STUDY_ID)); + + when(studyViewFilterApplier.apply(any())).thenReturn(filteredSampleIdentifiers); + + String jsonPath = "$.byUniqueSampleKey." + uniqueKeySample1; + + mockMvc.perform(MockMvcRequestBuilders.post("/clinical-data-table/fetch") + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(studyViewFilter))) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.jsonPath( jsonPath+"[0].clinicalAttributeId", uniqueKeySample1).value(TEST_ATTRIBUTE_ID)) + .andExpect(MockMvcResultMatchers.jsonPath(jsonPath+"[0].sampleId").value(TEST_SAMPLE_ID_1)) + .andExpect(MockMvcResultMatchers.jsonPath(jsonPath+"[1].clinicalAttributeId").value(TEST_ATTRIBUTE_ID)) + .andExpect(MockMvcResultMatchers.jsonPath(jsonPath+"[1].sampleId").value(TEST_SAMPLE_ID_2)) + .andExpect(MockMvcResultMatchers.jsonPath(jsonPath+"[2].clinicalAttributeId").value(TEST_ATTRIBUTE_ID)) + .andExpect(MockMvcResultMatchers.jsonPath(jsonPath+"[2].sampleId").value(TEST_SAMPLE_ID_3)); + + } @Test public void fetchClinicalEventTypeCounts() throws Exception