Skip to content

Commit 172d2a7

Browse files
committed
update repo and mapper methods to pass study ids to the queries
1 parent d505088 commit 172d2a7

File tree

7 files changed

+117
-36
lines changed

7 files changed

+117
-36
lines changed

src/integration/java/org/cbioportal/infrastructure/repository/clickhouse/clinical_data/ClickHouseClinicalDataRepositoryIntegrationTest.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import static org.junit.jupiter.api.Assertions.assertTrue;
88

99
import java.util.Arrays;
10+
import java.util.Collections;
1011
import java.util.List;
1112
import org.cbioportal.AbstractClickhouseIntegrationTest;
1213
import org.cbioportal.domain.clinical_data.ClinicalData;
@@ -26,6 +27,10 @@ class ClickHouseClinicalDataRepositoryIntegrationTest extends AbstractClickhouse
2627
private ClickhouseClinicalDataMapper mapper;
2728

2829
// Test data based on actual cBioPortal public dataset
30+
private static final List<String> TEST_STUDY_IDS = Arrays.asList(
31+
"acc_tcga_pan_can_atlas_2018"
32+
);
33+
2934
private static final List<String> TEST_SAMPLE_UNIQUE_IDS = Arrays.asList(
3035
"acc_tcga_pan_can_atlas_2018_TCGA-OR-A5J1-01",
3136
"acc_tcga_pan_can_atlas_2018_TCGA-OR-A5J2-01",
@@ -59,6 +64,7 @@ void testFetchClinicalDataId_WithSampleData() {
5964
List<ClinicalData> result = repository.fetchClinicalDataId(
6065
TEST_SAMPLE_UNIQUE_IDS,
6166
COMMON_SAMPLE_ATTRIBUTES,
67+
TEST_STUDY_IDS,
6268
ClinicalDataType.SAMPLE
6369
);
6470

@@ -79,6 +85,7 @@ void testFetchClinicalDataSummary_WithPatientData() {
7985
List<ClinicalData> result = repository.fetchClinicalDataSummary(
8086
TEST_PATIENT_UNIQUE_IDS,
8187
COMMON_PATIENT_ATTRIBUTES,
88+
TEST_STUDY_IDS,
8289
ClinicalDataType.PATIENT
8390
);
8491

@@ -103,6 +110,7 @@ void testFetchClinicalDataDetailed_WithSpecificValues() {
103110
"acc_tcga_pan_can_atlas_2018_TCGA-OR-A5J2-01"
104111
),
105112
Arrays.asList("ANEUPLOIDY_SCORE", "SAMPLE_TYPE"),
113+
TEST_STUDY_IDS,
106114
ClinicalDataType.SAMPLE
107115
);
108116

@@ -143,6 +151,7 @@ void testFetchClinicalDataMeta_WithSampleData() {
143151
Integer count = repository.fetchClinicalDataMeta(
144152
TEST_SAMPLE_UNIQUE_IDS,
145153
COMMON_SAMPLE_ATTRIBUTES,
154+
TEST_STUDY_IDS,
146155
ClinicalDataType.SAMPLE
147156
);
148157

@@ -152,6 +161,7 @@ void testFetchClinicalDataMeta_WithSampleData() {
152161
List<ClinicalData> actualData = repository.fetchClinicalDataSummary(
153162
TEST_SAMPLE_UNIQUE_IDS,
154163
COMMON_SAMPLE_ATTRIBUTES,
164+
TEST_STUDY_IDS,
155165
ClinicalDataType.SAMPLE
156166
);
157167
assertEquals(actualData.size(), count.intValue());
@@ -163,6 +173,7 @@ void testFetchClinicalDataId_WithEmptyInput() {
163173
List<ClinicalData> result = repository.fetchClinicalDataId(
164174
List.of(),
165175
COMMON_SAMPLE_ATTRIBUTES,
176+
Collections.emptyList(),
166177
ClinicalDataType.SAMPLE
167178
);
168179

@@ -176,6 +187,7 @@ void testFetchClinicalDataMeta_WithEmptyInput() {
176187
Integer count = repository.fetchClinicalDataMeta(
177188
List.of(),
178189
COMMON_SAMPLE_ATTRIBUTES,
190+
Collections.emptyList(),
179191
ClinicalDataType.SAMPLE
180192
);
181193

@@ -193,11 +205,11 @@ void testProjectionConsistency_SameEntitiesReturned() {
193205
List<String> testAttrs = List.of("SAMPLE_TYPE");
194206

195207
List<ClinicalData> idResults = repository.fetchClinicalDataId(
196-
testIds, testAttrs, ClinicalDataType.SAMPLE
208+
testIds, testAttrs, TEST_STUDY_IDS, ClinicalDataType.SAMPLE
197209
);
198210

199211
List<ClinicalData> summaryResults = repository.fetchClinicalDataSummary(
200-
testIds, testAttrs, ClinicalDataType.SAMPLE
212+
testIds, testAttrs, TEST_STUDY_IDS, ClinicalDataType.SAMPLE
201213
);
202214

203215
// Then - should return same entities with different levels of detail
@@ -229,12 +241,14 @@ void testClinicalDataType_PatientVsSample() {
229241
List<ClinicalData> sampleData = repository.fetchClinicalDataSummary(
230242
TEST_SAMPLE_UNIQUE_IDS,
231243
COMMON_SAMPLE_ATTRIBUTES,
244+
TEST_STUDY_IDS,
232245
ClinicalDataType.SAMPLE
233246
);
234247

235248
List<ClinicalData> patientData = repository.fetchClinicalDataSummary(
236249
TEST_PATIENT_UNIQUE_IDS,
237250
COMMON_PATIENT_ATTRIBUTES,
251+
TEST_STUDY_IDS,
238252
ClinicalDataType.PATIENT
239253
);
240254

src/main/java/org/cbioportal/domain/clinical_data/repository/ClinicalDataRepository.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,10 @@ List<ClinicalDataCountItem> getClinicalDataCounts(
6060
* @see ClinicalDataType
6161
*/
6262
List<org.cbioportal.domain.clinical_data.ClinicalData> fetchClinicalDataId(
63-
List<String> uniqueIds, List<String> attributeIds, ClinicalDataType clinicalDataType);
63+
List<String> uniqueIds,
64+
List<String> attributeIds,
65+
List<String> studyIds,
66+
ClinicalDataType clinicalDataType);
6467

6568
/**
6669
* Retrieves clinical data with SUMMARY projection (basic data with values).
@@ -76,7 +79,10 @@ List<org.cbioportal.domain.clinical_data.ClinicalData> fetchClinicalDataId(
7679
* @see ClinicalDataType
7780
*/
7881
List<org.cbioportal.domain.clinical_data.ClinicalData> fetchClinicalDataSummary(
79-
List<String> uniqueIds, List<String> attributeIds, ClinicalDataType clinicalDataType);
82+
List<String> uniqueIds,
83+
List<String> attributeIds,
84+
List<String> studyIds,
85+
ClinicalDataType clinicalDataType);
8086

8187
/**
8288
* Retrieves clinical data with DETAILED projection (complete data set).
@@ -93,7 +99,10 @@ List<org.cbioportal.domain.clinical_data.ClinicalData> fetchClinicalDataSummary(
9399
* @see ClinicalDataType
94100
*/
95101
List<org.cbioportal.domain.clinical_data.ClinicalData> fetchClinicalDataDetailed(
96-
List<String> uniqueIds, List<String> attributeIds, ClinicalDataType clinicalDataType);
102+
List<String> uniqueIds,
103+
List<String> attributeIds,
104+
List<String> studyIds,
105+
ClinicalDataType clinicalDataType);
97106

98107
/**
99108
* Retrieves the count of clinical data records matching the specified criteria.
@@ -109,5 +118,8 @@ List<org.cbioportal.domain.clinical_data.ClinicalData> fetchClinicalDataDetailed
109118
* @see ClinicalDataType
110119
*/
111120
Integer fetchClinicalDataMeta(
112-
List<String> uniqueIds, List<String> attributeIds, ClinicalDataType clinicalDataType);
121+
List<String> uniqueIds,
122+
List<String> attributeIds,
123+
List<String> studyIds,
124+
ClinicalDataType clinicalDataType);
113125
}

src/main/java/org/cbioportal/domain/clinical_data/usecase/FetchClinicalDataMetaUseCase.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,13 @@ public Integer execute(
6262
uniqueIds.add(identifier.getStudyId() + '_' + identifier.getEntityId());
6363
}
6464
List<String> attributeIds = clinicalDataMultiStudyFilter.getAttributeIds();
65+
List<String> studyIds =
66+
clinicalDataMultiStudyFilter.getIdentifiers().stream()
67+
.map(ClinicalDataIdentifier::getStudyId)
68+
.distinct()
69+
.toList();
6570

66-
return clinicalDataRepository.fetchClinicalDataMeta(uniqueIds, attributeIds, clinicalDataType);
71+
return clinicalDataRepository.fetchClinicalDataMeta(
72+
uniqueIds, attributeIds, studyIds, clinicalDataType);
6773
}
6874
}

src/main/java/org/cbioportal/domain/clinical_data/usecase/FetchClinicalDataUseCase.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ public List<ClinicalData> execute(
7474
ClinicalDataMultiStudyFilter clinicalDataMultiStudyFilter,
7575
ClinicalDataType clinicalDataType,
7676
ProjectionType projectionType) {
77+
List<String> studyIds =
78+
clinicalDataMultiStudyFilter.getIdentifiers().stream()
79+
.map(ClinicalDataIdentifier::getStudyId)
80+
.distinct()
81+
.toList();
82+
7783
// Transform filter identifiers into unique IDs for repository layer
7884
List<String> uniqueIds = new ArrayList<>();
7985
for (ClinicalDataIdentifier identifier : clinicalDataMultiStudyFilter.getIdentifiers()) {
@@ -84,13 +90,14 @@ public List<ClinicalData> execute(
8490
// Route to appropriate repository method based on projection type
8591
return switch (projectionType) {
8692
case ID ->
87-
clinicalDataRepository.fetchClinicalDataId(uniqueIds, attributeIds, clinicalDataType);
93+
clinicalDataRepository.fetchClinicalDataId(
94+
uniqueIds, attributeIds, studyIds, clinicalDataType);
8895
case SUMMARY ->
8996
clinicalDataRepository.fetchClinicalDataSummary(
90-
uniqueIds, attributeIds, clinicalDataType);
97+
uniqueIds, attributeIds, studyIds, clinicalDataType);
9198
case DETAILED ->
9299
clinicalDataRepository.fetchClinicalDataDetailed(
93-
uniqueIds, attributeIds, clinicalDataType);
100+
uniqueIds, attributeIds, studyIds, clinicalDataType);
94101
default -> Collections.emptyList();
95102
};
96103
}

src/main/java/org/cbioportal/infrastructure/repository/clickhouse/clinical_data/ClickhouseClinicalDataMapper.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ List<ClinicalData> getPatientClinicalDataFromStudyViewFilter(
5959
* @return list of clinical data records with minimal field set
6060
*/
6161
List<ClinicalData> fetchClinicalDataId(
62-
List<String> uniqueIds, List<String> attributeIds, String clinicalDataType);
62+
List<String> uniqueIds,
63+
List<String> attributeIds,
64+
List<String> studyIds,
65+
String clinicalDataType);
6366

6467
/**
6568
* Retrieves clinical data with SUMMARY projection (basic data with values).
@@ -73,7 +76,10 @@ List<ClinicalData> fetchClinicalDataId(
7376
* @return list of clinical data records with basic field set including values
7477
*/
7578
List<ClinicalData> fetchClinicalDataSummary(
76-
List<String> uniqueIds, List<String> attributeIds, String clinicalDataType);
79+
List<String> uniqueIds,
80+
List<String> attributeIds,
81+
List<String> studyIds,
82+
String clinicalDataType);
7783

7884
/**
7985
* Retrieves clinical data with DETAILED projection (complete data set).
@@ -88,7 +94,10 @@ List<ClinicalData> fetchClinicalDataSummary(
8894
* @return list of clinical data records with complete field set including attribute metadata
8995
*/
9096
List<ClinicalData> fetchClinicalDataDetailed(
91-
List<String> uniqueIds, List<String> attributeIds, String clinicalDataType);
97+
List<String> uniqueIds,
98+
List<String> attributeIds,
99+
List<String> studyIds,
100+
String clinicalDataType);
92101

93102
/**
94103
* Retrieves the count of clinical data records matching the specified criteria.
@@ -103,5 +112,8 @@ List<ClinicalData> fetchClinicalDataDetailed(
103112
* @return total number of clinical data records matching the criteria
104113
*/
105114
Integer fetchClinicalDataMeta(
106-
List<String> uniqueIds, List<String> attributeIds, String clinicalDataType);
115+
List<String> uniqueIds,
116+
List<String> attributeIds,
117+
List<String> studyIds,
118+
String clinicalDataType);
107119
}

src/main/java/org/cbioportal/infrastructure/repository/clickhouse/clinical_data/ClickhouseClinicalDataRepository.java

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,39 +47,55 @@ public List<ClinicalDataCountItem> getClinicalDataCounts(
4747

4848
@Override
4949
public List<ClinicalData> fetchClinicalDataId(
50-
List<String> uniqueIds, List<String> attributeIds, ClinicalDataType clinicalDataType) {
50+
List<String> uniqueIds,
51+
List<String> attributeIds,
52+
List<String> studyIds,
53+
ClinicalDataType clinicalDataType) {
5154
if (CollectionUtils.isEmpty(uniqueIds)) {
5255
return Collections.emptyList();
5356
}
54-
return mapper.fetchClinicalDataId(uniqueIds, attributeIds, clinicalDataType.toString());
57+
return mapper.fetchClinicalDataId(
58+
uniqueIds, attributeIds, studyIds, clinicalDataType.toString());
5559
}
5660

5761
@Override
5862
public List<ClinicalData> fetchClinicalDataSummary(
59-
List<String> uniqueIds, List<String> attributeIds, ClinicalDataType clinicalDataType) {
63+
List<String> uniqueIds,
64+
List<String> attributeIds,
65+
List<String> studyIds,
66+
ClinicalDataType clinicalDataType) {
6067
if (CollectionUtils.isEmpty(uniqueIds)) {
6168
return Collections.emptyList();
6269
}
63-
return mapper.fetchClinicalDataSummary(uniqueIds, attributeIds, clinicalDataType.toString());
70+
return mapper.fetchClinicalDataSummary(
71+
uniqueIds, attributeIds, studyIds, clinicalDataType.toString());
6472
}
6573

6674
@Override
6775
public List<ClinicalData> fetchClinicalDataDetailed(
68-
List<String> uniqueIds, List<String> attributeIds, ClinicalDataType clinicalDataType) {
76+
List<String> uniqueIds,
77+
List<String> attributeIds,
78+
List<String> studyIds,
79+
ClinicalDataType clinicalDataType) {
6980
if (CollectionUtils.isEmpty(uniqueIds)) {
7081
return Collections.emptyList();
7182
}
72-
return mapper.fetchClinicalDataDetailed(uniqueIds, attributeIds, clinicalDataType.toString());
83+
return mapper.fetchClinicalDataDetailed(
84+
uniqueIds, attributeIds, studyIds, clinicalDataType.toString());
7385
}
7486

7587
@Override
7688
public Integer fetchClinicalDataMeta(
77-
List<String> uniqueIds, List<String> attributeIds, ClinicalDataType clinicalDataType) {
89+
List<String> uniqueIds,
90+
List<String> attributeIds,
91+
List<String> studyIds,
92+
ClinicalDataType clinicalDataType) {
7893
if (CollectionUtils.isEmpty(uniqueIds)) {
7994
return 0;
8095
}
8196
Integer cnt =
82-
mapper.fetchClinicalDataMeta(uniqueIds, attributeIds, clinicalDataType.toString());
97+
mapper.fetchClinicalDataMeta(
98+
uniqueIds, attributeIds, studyIds, clinicalDataType.toString());
8399
return cnt == null ? 0 : cnt;
84100
}
85101
}

src/test/java/org/cbioportal/infrastructure/repository/clickhouse/clinical_data/ClickhouseClinicalDataMapperTest.java

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -319,15 +319,17 @@ public void testDataCountConsistency() {
319319
List<String> sampleAttributeIds = List.of("mutation_count");
320320

321321
List<ClinicalData> sampleData =
322-
mapper.fetchClinicalDataSummary(sampleUniqueIds, sampleAttributeIds, "sample");
322+
mapper.fetchClinicalDataSummary(
323+
sampleUniqueIds, sampleAttributeIds, List.of(STUDY_GENIE_PUB), "sample");
323324
Integer sampleCount =
324-
mapper.fetchClinicalDataMeta(sampleUniqueIds, sampleAttributeIds, "sample");
325+
mapper.fetchClinicalDataMeta(
326+
sampleUniqueIds, sampleAttributeIds, List.of(STUDY_GENIE_PUB), "sample");
325327

326328
assertEquals("Sample data count should match", sampleData.size(), sampleCount.intValue());
327329

328330
// Test Patient type - all data
329-
List<ClinicalData> allPatientData = mapper.fetchClinicalDataId(null, null, "patient");
330-
Integer allPatientCount = mapper.fetchClinicalDataMeta(null, null, "patient");
331+
List<ClinicalData> allPatientData = mapper.fetchClinicalDataId(null, null, null, "patient");
332+
Integer allPatientCount = mapper.fetchClinicalDataMeta(null, null, null, "patient");
331333

332334
assertEquals(
333335
"Patient data count should match", allPatientData.size(), allPatientCount.intValue());
@@ -338,9 +340,11 @@ public void testDataCountConsistency() {
338340
List<String> patientAttributeIds = List.of("age", "center");
339341

340342
List<ClinicalData> filteredPatientData =
341-
mapper.fetchClinicalDataSummary(patientUniqueIds, patientAttributeIds, "patient");
343+
mapper.fetchClinicalDataSummary(
344+
patientUniqueIds, patientAttributeIds, List.of(STUDY_GENIE_PUB), "patient");
342345
Integer filteredPatientCount =
343-
mapper.fetchClinicalDataMeta(patientUniqueIds, patientAttributeIds, "patient");
346+
mapper.fetchClinicalDataMeta(
347+
patientUniqueIds, patientAttributeIds, List.of(STUDY_GENIE_PUB), "patient");
344348

345349
assertEquals(
346350
"Filtered patient data count should match",
@@ -357,8 +361,11 @@ public void testEmptyAndNullConditions() {
357361
// Test with non-existent IDs - should return empty results
358362
List<String> nonExistentIds = List.of("non_existent_study_non_existent_id");
359363

360-
List<ClinicalData> emptyData = mapper.fetchClinicalDataSummary(nonExistentIds, null, "sample");
361-
Integer emptyCount = mapper.fetchClinicalDataMeta(nonExistentIds, null, "sample");
364+
List<ClinicalData> emptyData =
365+
mapper.fetchClinicalDataSummary(
366+
nonExistentIds, null, List.of("non_existent_study"), "sample");
367+
Integer emptyCount =
368+
mapper.fetchClinicalDataMeta(nonExistentIds, null, List.of("non_existent_study"), "sample");
362369

363370
assertEquals("Empty data should have size 0", 0, emptyData.size());
364371
assertEquals("Empty count should be 0", 0, emptyCount.intValue());
@@ -368,8 +375,11 @@ public void testEmptyAndNullConditions() {
368375
List<String> nonExistentAttrs = List.of("non_existent_attribute");
369376

370377
List<ClinicalData> noAttrData =
371-
mapper.fetchClinicalDataSummary(validIds, nonExistentAttrs, "sample");
372-
Integer noAttrCount = mapper.fetchClinicalDataMeta(validIds, nonExistentAttrs, "sample");
378+
mapper.fetchClinicalDataSummary(
379+
validIds, nonExistentAttrs, List.of("non_existent_study"), "sample");
380+
Integer noAttrCount =
381+
mapper.fetchClinicalDataMeta(
382+
validIds, nonExistentAttrs, List.of("non_existent_study"), "sample");
373383

374384
assertEquals("No attribute data should have size 0", 0, noAttrData.size());
375385
assertEquals("No attribute count should be 0", 0, noAttrCount.intValue());
@@ -383,12 +393,16 @@ public void testProjectionTypesConsistency() {
383393
List<String> sameAttributes = List.of("mutation_count");
384394

385395
// Test all projection types return same count
386-
List<ClinicalData> idData = mapper.fetchClinicalDataId(sameIds, sameAttributes, "sample");
396+
List<ClinicalData> idData =
397+
mapper.fetchClinicalDataId(sameIds, sameAttributes, List.of(STUDY_GENIE_PUB), "sample");
387398
List<ClinicalData> summaryData =
388-
mapper.fetchClinicalDataSummary(sameIds, sameAttributes, "sample");
399+
mapper.fetchClinicalDataSummary(
400+
sameIds, sameAttributes, List.of(STUDY_GENIE_PUB), "sample");
389401
List<ClinicalData> detailedData =
390-
mapper.fetchClinicalDataDetailed(sameIds, sameAttributes, "sample");
391-
Integer metaCount = mapper.fetchClinicalDataMeta(sameIds, sameAttributes, "sample");
402+
mapper.fetchClinicalDataDetailed(
403+
sameIds, sameAttributes, List.of(STUDY_GENIE_PUB), "sample");
404+
Integer metaCount =
405+
mapper.fetchClinicalDataMeta(sameIds, sameAttributes, List.of(STUDY_GENIE_PUB), "sample");
392406

393407
// All should have the same count
394408
assertEquals(

0 commit comments

Comments
 (0)