Skip to content

Commit c2612b7

Browse files
committed
Use prepared statements to avoid injection attack and clickhouse native array to improve performance
1 parent c97fc06 commit c2612b7

File tree

3 files changed

+32
-8
lines changed

3 files changed

+32
-8
lines changed

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

+12
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,21 @@ public static StudyViewFilterHelper build(@Nullable StudyViewFilter studyViewFil
3434
private final StudyViewFilter studyViewFilter;
3535
private final CategorizedGenericAssayDataCountFilter categorizedGenericAssayDataCountFilter;
3636
private final List<CustomSampleIdentifier> customDataSamples;
37+
private final String[] filteredSampleIdentifiers;
3738

3839
private StudyViewFilterHelper(@NonNull StudyViewFilter studyViewFilter,
3940
@NonNull Map<DataSource, List<MolecularProfile>> genericAssayProfilesMap,
4041
@NonNull List<CustomSampleIdentifier> customDataSamples) {
4142
this.studyViewFilter = studyViewFilter;
4243
this.categorizedGenericAssayDataCountFilter = extractGenericAssayDataCountFilters(studyViewFilter, genericAssayProfilesMap);
4344
this.customDataSamples = customDataSamples;
45+
if (studyViewFilter != null && studyViewFilter.getSampleIdentifiers() != null) {
46+
this.filteredSampleIdentifiers = studyViewFilter.getSampleIdentifiers().stream()
47+
.map(sampleIdentifier -> sampleIdentifier.getStudyId() + "_" + sampleIdentifier.getSampleId())
48+
.toArray(String[]::new);
49+
} else {
50+
this.filteredSampleIdentifiers = new String[0];
51+
}
4452
}
4553

4654
public StudyViewFilter studyViewFilter() {
@@ -54,6 +62,10 @@ public CategorizedGenericAssayDataCountFilter categorizedGenericAssayDataCountFi
5462
public List<CustomSampleIdentifier> customDataSamples() {
5563
return this.customDataSamples;
5664
}
65+
66+
public String[] filteredSampleIdentifiers() {
67+
return this.filteredSampleIdentifiers;
68+
}
5769

5870
private CategorizedGenericAssayDataCountFilter extractGenericAssayDataCountFilters(final StudyViewFilter studyViewFilter, Map<DataSource, List<MolecularProfile>> genericAssayProfilesMap) {
5971
if ((studyViewFilter.getGenericAssayDataFilters() == null || genericAssayProfilesMap.isEmpty()))

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

+10-8
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@
5959

6060
</if>
6161

62-
<if test="studyViewFilterHelper.studyViewFilter.sampleIdentifiers != null and !studyViewFilterHelper.studyViewFilter.sampleIdentifiers.isEmpty()">
63-
INTERSECT
62+
<if test="studyViewFilterHelper.filteredSampleIdentifiers != null and studyViewFilterHelper.filteredSampleIdentifiers.length > 0">
63+
INTERSECT
6464
SELECT sample_unique_id
6565
FROM sample_derived
6666
WHERE sample_unique_id IN
67-
<foreach item="sampleIdentifier" collection="studyViewFilterHelper.studyViewFilter.sampleIdentifiers" open="(" separator="," close=")">
68-
'${sampleIdentifier.studyId}_${sampleIdentifier.sampleId}'
69-
</foreach>
67+
(
68+
#{studyViewFilterHelper.filteredSampleIdentifiers, typeHandler=org.apache.ibatis.type.ArrayTypeHandler}
69+
)
7070
</if>
7171
<if test="studyViewFilterHelper.studyViewFilter.customDataFilters != null and !studyViewFilterHelper.studyViewFilter.customDataFilters.isEmpty() and studyViewFilterHelper.customDataSamples != null">
7272
INTERSECT
@@ -84,8 +84,8 @@
8484
sample_unique_id IN (
8585
'',
8686
<foreach item="sampleIdentifier" collection="studyViewFilterHelper.customDataSamples" separator=",">
87-
<if test="!sampleIdentifier.getIsFilteredOut()">
88-
'${sampleIdentifier.studyId}_${sampleIdentifier.sampleId}'
87+
<if test="!sampleIdentifier.getIsFilteredOut() and sampleIdentifier.getUniqueSampleId != null">
88+
#{sampleIdentifier.getUniqueSampleId}
8989
</if>
9090
</foreach>
9191
)
@@ -96,7 +96,9 @@
9696
OR
9797
sample_unique_id NOT IN (
9898
<foreach item="sampleIdentifier" collection="studyViewFilterHelper.customDataSamples" separator=",">
99-
'${sampleIdentifier.studyId}_${sampleIdentifier.sampleId}'
99+
<if test="sampleIdentifier.getUniqueSampleId != null">
100+
#{sampleIdentifier.getUniqueSampleId}
101+
</if>
100102
</foreach>
101103
)
102104
</if>

0 commit comments

Comments
 (0)