Skip to content

Commit 36a6a32

Browse files
committed
Use prepared statements to avoid injection attack and clickhouse native array to improve performance
1 parent 4f04525 commit 36a6a32

File tree

3 files changed

+33
-8
lines changed

3 files changed

+33
-8
lines changed

src/main/java/org/cbioportal/persistence/helper/StudyViewFilterHelper.java

+12
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public static StudyViewFilterHelper build(@Nullable StudyViewFilter studyViewFil
5555
private final StudyViewFilter studyViewFilter;
5656
private final CategorizedGenericAssayDataCountFilter categorizedGenericAssayDataCountFilter;
5757
private final List<CustomSampleIdentifier> customDataSamples;
58+
private final String[] filteredSampleIdentifiers;
5859
private final List<String> involvedCancerStudies;
5960

6061
private StudyViewFilterHelper(@NonNull StudyViewFilter studyViewFilter,
@@ -65,6 +66,13 @@ private StudyViewFilterHelper(@NonNull StudyViewFilter studyViewFilter,
6566
this.categorizedGenericAssayDataCountFilter = extractGenericAssayDataCountFilters(studyViewFilter, genericAssayProfilesMap);
6667
this.customDataSamples = customDataSamples;
6768
this.involvedCancerStudies = involvedCancerStudies;
69+
if (studyViewFilter != null && studyViewFilter.getSampleIdentifiers() != null) {
70+
this.filteredSampleIdentifiers = studyViewFilter.getSampleIdentifiers().stream()
71+
.map(sampleIdentifier -> sampleIdentifier.getStudyId() + "_" + sampleIdentifier.getSampleId())
72+
.toArray(String[]::new);
73+
} else {
74+
this.filteredSampleIdentifiers = new String[0];
75+
}
6876
}
6977

7078
public StudyViewFilter studyViewFilter() {
@@ -79,6 +87,10 @@ public List<CustomSampleIdentifier> customDataSamples() {
7987
return this.customDataSamples;
8088
}
8189

90+
public String[] filteredSampleIdentifiers() {
91+
return this.filteredSampleIdentifiers;
92+
}
93+
8294
public List<String> involvedCancerStudies() {
8395
return involvedCancerStudies;
8496
}

src/main/java/org/cbioportal/web/parameter/CustomSampleIdentifier.java

+10
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,14 @@ public String getValue() {
2222
public void setValue(String value) {
2323
this.value = value;
2424
}
25+
26+
// Generating unique SampleId by concatenating studyId and sampleId
27+
public String getUniqueSampleId() {
28+
// Assuming studyId and sampleId are available in SampleIdentifier
29+
// Concatenate with "_" in between if both values are not null
30+
if (getStudyId() != null && getSampleId() != null) {
31+
return getStudyId() + "_" + getSampleId();
32+
}
33+
return null; // or return a default value if either studyId or sampleId is null
34+
}
2535
}

src/main/resources/org/cbioportal/persistence/mybatisclickhouse/StudyViewFilterMapper.xml

+11-8
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,14 @@
6161

6262
</if>
6363

64-
<if test="studyViewFilterHelper.studyViewFilter.sampleIdentifiers != null and !studyViewFilterHelper.studyViewFilter.sampleIdentifiers.isEmpty()">
65-
INTERSECT
64+
<if test="studyViewFilterHelper.filteredSampleIdentifiers != null and studyViewFilterHelper.filteredSampleIdentifiers.length > 0">
65+
INTERSECT
6666
SELECT sample_unique_id
6767
FROM sample_derived
6868
WHERE sample_unique_id IN
69-
<foreach item="sampleIdentifier" collection="studyViewFilterHelper.studyViewFilter.sampleIdentifiers" open="(" separator="," close=")">
70-
'${sampleIdentifier.studyId}_${sampleIdentifier.sampleId}'
71-
</foreach>
69+
(
70+
#{studyViewFilterHelper.filteredSampleIdentifiers, typeHandler=org.apache.ibatis.type.ArrayTypeHandler}
71+
)
7272
</if>
7373
<if test="studyViewFilterHelper.studyViewFilter.customDataFilters != null and !studyViewFilterHelper.studyViewFilter.customDataFilters.isEmpty() and studyViewFilterHelper.customDataSamples != null">
7474
INTERSECT
@@ -86,8 +86,8 @@
8686
sample_unique_id IN (
8787
'',
8888
<foreach item="sampleIdentifier" collection="studyViewFilterHelper.customDataSamples" separator=",">
89-
<if test="!sampleIdentifier.getIsFilteredOut()">
90-
'${sampleIdentifier.studyId}_${sampleIdentifier.sampleId}'
89+
<if test="!sampleIdentifier.getIsFilteredOut() and sampleIdentifier.getUniqueSampleId() != null">
90+
#{sampleIdentifier.getUniqueSampleId()}
9191
</if>
9292
</foreach>
9393
)
@@ -97,8 +97,11 @@
9797
<if test="customDataFilterValue.value eq 'NA'">
9898
OR
9999
sample_unique_id NOT IN (
100+
'',
100101
<foreach item="sampleIdentifier" collection="studyViewFilterHelper.customDataSamples" separator=",">
101-
'${sampleIdentifier.studyId}_${sampleIdentifier.sampleId}'
102+
<if test="sampleIdentifier.getUniqueSampleId() != null">
103+
#{sampleIdentifier.getUniqueSampleId()}
104+
</if>
102105
</foreach>
103106
)
104107
</if>

0 commit comments

Comments
 (0)