Skip to content

Commit dd2836c

Browse files
dippindotsCopilot
andcommitted
Trim generic assay backend scope
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent a025987 commit dd2836c

8 files changed

Lines changed: 157 additions & 180 deletions

File tree

src/main/java/org/cbioportal/legacy/service/StudyViewColumnarService.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,6 @@ List<GenomicDataCountItem> getCNACountsByGeneSpecific(
6262
List<GenericAssayDataCountItem> getGenericAssayDataCounts(
6363
StudyViewFilter studyViewFilter, List<GenericAssayDataFilter> genericAssayDataFilters);
6464

65-
List<GenericAssayDataCountItem> getGenericAssayDataCounts(
66-
StudyViewFilter studyViewFilter, String profileType);
67-
6865
List<GenomicDataCountItem> getMutationCountsByGeneSpecific(
6966
StudyViewFilter studyViewFilter, List<GenomicDataFilter> genomicDataFilters);
7067

src/main/java/org/cbioportal/legacy/service/StudyViewService.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@ List<GenericAssayDataCountItem> fetchGenericAssayDataCounts(
4949
List<String> stableIds,
5050
List<String> profileTypes);
5151

52-
List<GenericAssayDataCountItem> fetchGenericAssayDataCountsByProfileType(
53-
List<String> sampleIds, List<String> studyIds, String profileType);
54-
5552
List<NamespaceDataCountItem> fetchNamespaceDataCounts(
5653
List<String> studyIds, List<String> sampleIds, List<NamespaceAttribute> namespaceAttributes);
5754
}

src/main/java/org/cbioportal/legacy/service/impl/StudyViewServiceImpl.java

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -502,26 +502,6 @@ public List<GenericAssayDataCountItem> fetchGenericAssayDataCounts(
502502
return new ArrayList<>();
503503
}
504504

505-
List<GenericAssayData> data =
506-
fetchGenericAssayData(sampleIds, studyIds, stableIds, profileTypes);
507-
508-
return aggregateGenericAssayDataCounts(data, sampleIds);
509-
}
510-
511-
@Override
512-
public List<GenericAssayDataCountItem> fetchGenericAssayDataCountsByProfileType(
513-
List<String> sampleIds, List<String> studyIds, String profileType) {
514-
List<GenericAssayData> data =
515-
fetchGenericAssayData(sampleIds, studyIds, null, List.of(profileType));
516-
517-
return aggregateGenericAssayDataCounts(data, sampleIds);
518-
}
519-
520-
private List<GenericAssayData> fetchGenericAssayData(
521-
List<String> sampleIds,
522-
List<String> studyIds,
523-
List<String> stableIds,
524-
List<String> profileTypes) {
525505
List<GenericAssayData> data =
526506
profileTypes.stream()
527507
.flatMap(
@@ -542,11 +522,6 @@ private List<GenericAssayData> fetchGenericAssayData(
542522
})
543523
.toList();
544524

545-
return data;
546-
}
547-
548-
private List<GenericAssayDataCountItem> aggregateGenericAssayDataCounts(
549-
List<GenericAssayData> data, List<String> sampleIds) {
550525
return data.stream()
551526
.collect(Collectors.groupingBy(GenericAssayData::getGenericAssayStableId))
552527
.entrySet()

src/main/java/org/cbioportal/legacy/web/StudyViewController.java

Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@
9797
import org.springframework.http.MediaType;
9898
import org.springframework.http.ResponseEntity;
9999
import org.springframework.security.access.prepost.PreAuthorize;
100-
import org.springframework.util.StringUtils;
101100
import org.springframework.validation.annotation.Validated;
102101
import org.springframework.web.bind.annotation.RequestAttribute;
103102
import org.springframework.web.bind.annotation.RequestBody;
@@ -1364,23 +1363,9 @@ public ResponseEntity<List<GenericAssayDataCountItem>> fetchGenericAssayDataCoun
13641363
@RequestAttribute(required = false, value = "interceptedGenericAssayDataCountFilter")
13651364
GenericAssayDataCountFilter interceptedGenericAssayDataCountFilter) {
13661365

1367-
GenericAssayDataCountFilter effectiveGenericAssayDataCountFilter =
1368-
interceptedGenericAssayDataCountFilter != null
1369-
? interceptedGenericAssayDataCountFilter
1370-
: genericAssayDataCountFilter;
1371-
if (effectiveGenericAssayDataCountFilter == null) {
1372-
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
1373-
}
1374-
13751366
List<GenericAssayDataFilter> gaFilters =
1376-
effectiveGenericAssayDataCountFilter.getGenericAssayDataFilters() == null
1377-
? new ArrayList<>()
1378-
: effectiveGenericAssayDataCountFilter.getGenericAssayDataFilters();
1379-
String profileType = effectiveGenericAssayDataCountFilter.getProfileType();
1380-
StudyViewFilter studyViewFilter = effectiveGenericAssayDataCountFilter.getStudyViewFilter();
1381-
if (gaFilters.isEmpty() && !StringUtils.hasText(profileType)) {
1382-
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
1383-
}
1367+
interceptedGenericAssayDataCountFilter.getGenericAssayDataFilters();
1368+
StudyViewFilter studyViewFilter = interceptedGenericAssayDataCountFilter.getStudyViewFilter();
13841369
// when there is only one filter, it means study view is doing a single chart filter operation
13851370
// remove filter from studyViewFilter to return all data counts
13861371
// the reason we do this is to make sure after chart get filtered, user can still see unselected
@@ -1400,21 +1385,14 @@ public ResponseEntity<List<GenericAssayDataCountItem>> fetchGenericAssayDataCoun
14001385
List<String> sampleIds = new ArrayList<>();
14011386
studyViewFilterUtil.extractStudyAndSampleIds(filteredSampleIdentifiers, studyIds, sampleIds);
14021387

1403-
List<GenericAssayDataCountItem> result;
1404-
if (!gaFilters.isEmpty()) {
1405-
result =
1406-
studyViewService.fetchGenericAssayDataCounts(
1407-
sampleIds,
1408-
studyIds,
1409-
gaFilters.stream().map(GenericAssayDataFilter::getStableId).toList(),
1410-
gaFilters.stream()
1411-
.map(GenericAssayDataFilter::getProfileType)
1412-
.collect(Collectors.toList()));
1413-
} else {
1414-
result =
1415-
studyViewService.fetchGenericAssayDataCountsByProfileType(
1416-
sampleIds, studyIds, profileType);
1417-
}
1388+
List<GenericAssayDataCountItem> result =
1389+
studyViewService.fetchGenericAssayDataCounts(
1390+
sampleIds,
1391+
studyIds,
1392+
gaFilters.stream().map(GenericAssayDataFilter::getStableId).toList(),
1393+
gaFilters.stream()
1394+
.map(GenericAssayDataFilter::getProfileType)
1395+
.collect(Collectors.toList()));
14181396

14191397
return new ResponseEntity<>(result, HttpStatus.OK);
14201398
}

src/main/resources/mappers/clickhouse/generic_assay/GenericAssayMapper.xml

Lines changed: 67 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,30 @@
9090

9191
<select id="getGenericAssayDataCounts" resultMap="GenericAssayDataCountItemResultMap">
9292
<bind name="profileType" value="genericAssayDataFilters[0].profileType"/>
93-
WITH generic_assay_query AS (
93+
WITH profile_level AS (
94+
SELECT
95+
count() > 0 AS is_patient_level
96+
FROM genetic_profile
97+
WHERE
98+
patient_level = 1
99+
<if
100+
test="studyViewFilterContext.customDataFilterCancerStudies() != null and !studyViewFilterContext.customDataFilterCancerStudies().isEmpty()">
101+
AND stable_id IN
102+
<foreach item="studyId" collection="studyViewFilterContext.customDataFilterCancerStudies()" open="(" separator="," close=")">
103+
concat(#{studyId}, '_', #{profileType})
104+
</foreach>
105+
</if>
106+
),
107+
generic_assay_query AS (
94108
SELECT
95109
entity_stable_id AS stableId,
96110
value,
97-
cast(count(distinct patient_unique_id) AS INTEGER) AS count
111+
cast(
112+
multiIf(
113+
(SELECT is_patient_level FROM profile_level LIMIT 1),
114+
count(distinct patient_unique_id),
115+
count(distinct sample_unique_id)
116+
) AS INTEGER) AS count
98117
FROM generic_assay_data_derived
99118
<where>
100119
<!-- Table creation in clickhouse.sql has ensured no NA values but extra caution is always appreciated -->
@@ -116,6 +135,21 @@
116135
sum(count) AS gad_count
117136
FROM generic_assay_query
118137
GROUP BY stableId
138+
),
139+
total_count AS (
140+
SELECT
141+
cast(
142+
multiIf(
143+
(SELECT is_patient_level FROM profile_level LIMIT 1),
144+
count(distinct patient_unique_id),
145+
count(distinct sample_unique_id)
146+
) AS INTEGER) AS total
147+
FROM generic_assay_data_derived
148+
<where>
149+
profile_type = #{profileType} AND
150+
<include
151+
refid="org.cbioportal.infrastructure.repository.clickhouse.studyview.ClickhouseStudyViewFilterMapper.applyStudyViewFilterUsingSampleId"/>
152+
</where>
119153
)
120154

121155
SELECT * FROM generic_assay_query
@@ -126,33 +160,36 @@
126160
coalesce((SELECT stableId FROM generic_assay_data_sum LIMIT 1), #{genericAssayDataFilters[0].stableId}) as stableId,
127161
'NA' as value,
128162
cast((
129-
multiIf(
130-
(
131-
SELECT count() > 0
132-
FROM genetic_profile
133-
WHERE
134-
patient_level = 1
135-
<if
136-
test="studyViewFilterContext.customDataFilterCancerStudies() != null and !studyViewFilterContext.customDataFilterCancerStudies().isEmpty()">
137-
AND stable_id IN
138-
<foreach item="studyId" collection="studyViewFilterContext.customDataFilterCancerStudies()" open="(" separator="," close=")">
139-
concat(#{studyId}, '_', #{profileType})
140-
</foreach>
141-
</if>
142-
),
143-
(SELECT * FROM (<include refid="org.cbioportal.infrastructure.repository.clickhouse.patient.ClickhousePatientMapper.getFilteredPatientCount"/>)),
144-
(SELECT * FROM (<include refid="org.cbioportal.infrastructure.repository.clickhouse.sample.ClickhouseSampleMapper.getFilteredSampleCount"/>))
145-
)
163+
coalesce((SELECT total FROM total_count LIMIT 1), 0)
146164
- coalesce((SELECT gad_count FROM generic_assay_data_sum LIMIT 1), 0))
147165
as INTEGER) as count
148166
</select>
149167

150168
<select id="getGenericAssayDataCountsByProfileType" resultMap="GenericAssayDataCountItemResultMap">
151-
WITH generic_assay_query AS (
169+
WITH profile_level AS (
170+
SELECT
171+
count() > 0 AS is_patient_level
172+
FROM genetic_profile
173+
WHERE patient_level = 1
174+
<if
175+
test="studyViewFilterContext.customDataFilterCancerStudies() != null and !studyViewFilterContext.customDataFilterCancerStudies().isEmpty()">
176+
AND stable_id IN
177+
<foreach item="studyId" collection="studyViewFilterContext.customDataFilterCancerStudies()" open="(" separator="," close=")">
178+
concat(#{studyId}, '_', #{profileType})
179+
</foreach>
180+
</if>
181+
),
182+
generic_assay_query AS (
152183
SELECT
153184
entity_stable_id AS stableId,
154185
value,
155-
cast(count(distinct patient_unique_id) AS INTEGER) AS count
186+
cast(
187+
multiIf(
188+
(SELECT is_patient_level FROM profile_level LIMIT 1),
189+
count(distinct patient_unique_id),
190+
count(distinct sample_unique_id)
191+
)
192+
AS INTEGER) AS count
156193
FROM generic_assay_data_derived
157194
<where>
158195
<include refid="org.cbioportal.infrastructure.repository.clickhouse.studyview.ClickhouseStudyViewFilterMapper.normalizeAttributeValue">
@@ -185,22 +222,17 @@
185222
SELECT
186223
cast(
187224
multiIf(
188-
(
189-
SELECT count() > 0
190-
FROM genetic_profile
191-
WHERE patient_level = 1
192-
<if
193-
test="studyViewFilterContext.customDataFilterCancerStudies() != null and !studyViewFilterContext.customDataFilterCancerStudies().isEmpty()">
194-
AND stable_id IN
195-
<foreach item="studyId" collection="studyViewFilterContext.customDataFilterCancerStudies()" open="(" separator="," close=")">
196-
concat(#{studyId}, '_', #{profileType})
197-
</foreach>
198-
</if>
199-
),
200-
(SELECT * FROM (<include refid="org.cbioportal.infrastructure.repository.clickhouse.patient.ClickhousePatientMapper.getFilteredPatientCount"/>)),
201-
(SELECT * FROM (<include refid="org.cbioportal.infrastructure.repository.clickhouse.sample.ClickhouseSampleMapper.getFilteredSampleCount"/>))
225+
(SELECT is_patient_level FROM profile_level LIMIT 1),
226+
count(distinct patient_unique_id),
227+
count(distinct sample_unique_id)
202228
)
203229
AS INTEGER) AS total
230+
FROM generic_assay_data_derived
231+
<where>
232+
profile_type = #{profileType} AND
233+
<include
234+
refid="org.cbioportal.infrastructure.repository.clickhouse.studyview.ClickhouseStudyViewFilterMapper.applyStudyViewFilterUsingSampleId"/>
235+
</where>
204236
),
205237
na_counts AS (
206238
SELECT

src/test/java/org/cbioportal/infrastructure/repository/clickhouse/generic_assay/ClickhouseGenericAssayMapperTest.java

Lines changed: 74 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void getSampleCategoricalGenericAssayDataCounts() {
5252
new GenericAssayDataCountItem(
5353
"1p_status",
5454
List.of(
55-
new GenericAssayDataCount("Loss", 1),
55+
new GenericAssayDataCount("Loss", 2),
5656
new GenericAssayDataCount("Gain", 1),
5757
new GenericAssayDataCount("Unchanged", 1),
5858
new GenericAssayDataCount("NA", 1))));
@@ -105,26 +105,71 @@ public void getSampleCategoricalGenericAssayDataCountsByProfileType() {
105105
new GenericAssayDataCountItem(
106106
"1p_status",
107107
List.of(
108-
new GenericAssayDataCount("Loss", 1),
108+
new GenericAssayDataCount("Loss", 2),
109109
new GenericAssayDataCount("Gain", 1),
110110
new GenericAssayDataCount("Unchanged", 1),
111111
new GenericAssayDataCount("NA", 1))),
112112
new GenericAssayDataCountItem(
113113
"2p_status",
114114
List.of(
115-
new GenericAssayDataCount("Loss", 1),
115+
new GenericAssayDataCount("Loss", 2),
116116
new GenericAssayDataCount("Unchanged", 2),
117117
new GenericAssayDataCount("NA", 1))),
118118
new GenericAssayDataCountItem(
119119
"9p_status",
120120
List.of(
121-
new GenericAssayDataCount("Loss", 1),
121+
new GenericAssayDataCount("Loss", 2),
122122
new GenericAssayDataCount("Gain", 1),
123123
new GenericAssayDataCount("Unchanged", 2))),
124124
new GenericAssayDataCountItem(
125125
"10p_status",
126126
List.of(
127+
new GenericAssayDataCount("Gain", 2),
128+
new GenericAssayDataCount("Unchanged", 2),
129+
new GenericAssayDataCount("NA", 1))));
130+
131+
assertThat(actualCounts)
132+
.usingRecursiveComparison()
133+
.ignoringCollectionOrder()
134+
.isEqualTo(expectedCounts);
135+
}
136+
137+
@Test
138+
public void
139+
getSampleCategoricalGenericAssayDataCountsByProfileType_ignoresStudiesWithoutProfile() {
140+
StudyViewFilter studyViewFilter = new StudyViewFilter();
141+
studyViewFilter.setStudyIds(List.of(ACC_TCGA, STUDY_GENIE_PUB));
142+
143+
List<GenericAssayDataCountItem> actualCounts =
144+
mapper.getGenericAssayDataCountsByProfileType(
145+
StudyViewFilterFactory.make(studyViewFilter, null, studyViewFilter.getStudyIds(), null),
146+
"armlevel_cna");
147+
148+
List<GenericAssayDataCountItem> expectedCounts =
149+
List.of(
150+
new GenericAssayDataCountItem(
151+
"1p_status",
152+
List.of(
153+
new GenericAssayDataCount("Loss", 2),
154+
new GenericAssayDataCount("Gain", 1),
155+
new GenericAssayDataCount("Unchanged", 1),
156+
new GenericAssayDataCount("NA", 1))),
157+
new GenericAssayDataCountItem(
158+
"2p_status",
159+
List.of(
160+
new GenericAssayDataCount("Loss", 2),
161+
new GenericAssayDataCount("Unchanged", 2),
162+
new GenericAssayDataCount("NA", 1))),
163+
new GenericAssayDataCountItem(
164+
"9p_status",
165+
List.of(
166+
new GenericAssayDataCount("Loss", 2),
127167
new GenericAssayDataCount("Gain", 1),
168+
new GenericAssayDataCount("Unchanged", 2))),
169+
new GenericAssayDataCountItem(
170+
"10p_status",
171+
List.of(
172+
new GenericAssayDataCount("Gain", 2),
128173
new GenericAssayDataCount("Unchanged", 2),
129174
new GenericAssayDataCount("NA", 1))));
130175

@@ -134,6 +179,31 @@ public void getSampleCategoricalGenericAssayDataCountsByProfileType() {
134179
.isEqualTo(expectedCounts);
135180
}
136181

182+
@Test
183+
public void getPatientCategoricalGenericAssayDataCountsByProfileType() {
184+
StudyViewFilter studyViewFilter = new StudyViewFilter();
185+
studyViewFilter.setStudyIds(List.of(STUDY_GENIE_PUB));
186+
187+
List<GenericAssayDataCountItem> actualCounts =
188+
mapper.getGenericAssayDataCountsByProfileType(
189+
StudyViewFilterFactory.make(studyViewFilter, null, studyViewFilter.getStudyIds(), null),
190+
"distant_mets");
191+
192+
List<GenericAssayDataCountItem> expectedCounts =
193+
List.of(
194+
new GenericAssayDataCountItem(
195+
"DMETS_DX_ADRENAL",
196+
List.of(
197+
new GenericAssayDataCount("No", 9),
198+
new GenericAssayDataCount("Yes", 1),
199+
new GenericAssayDataCount("NA", 14))));
200+
201+
assertThat(actualCounts)
202+
.usingRecursiveComparison()
203+
.ignoringCollectionOrder()
204+
.isEqualTo(expectedCounts);
205+
}
206+
137207
@Test
138208
public void getGenericAssayStableIdsByProfileIds_returnsEntityStableIds() {
139209
List<String> stableIds =

0 commit comments

Comments
 (0)