Skip to content

Commit ec346f3

Browse files
authored
Merge pull request #11982 from IQSS/111-address-issues-with-file-search
safe proof sql calls
2 parents 908ce3c + e262735 commit ec346f3

File tree

1 file changed

+13
-51
lines changed

1 file changed

+13
-51
lines changed

src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java

Lines changed: 13 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import jakarta.inject.Named;
4141
import jakarta.persistence.*;
4242
import jakarta.persistence.criteria.*;
43+
import org.apache.commons.lang3.StringUtils;
4344

4445
/**
4546
*
@@ -281,60 +282,21 @@ public List<FileMetadata> findFileMetadataByDatasetVersionId(Long datasetVersion
281282
.setMaxResults(maxResults)
282283
.getResultList();
283284
}
284-
285-
public List<FileMetadata> findFileMetadataByDatasetVersionIdLabelSearchTerm(Long datasetVersionId, String searchTerm, String userSuppliedSortField, String userSuppliedSortOrder){
286-
FileSortFieldAndOrder sortFieldAndOrder = new FileSortFieldAndOrder(userSuppliedSortField, userSuppliedSortOrder);
287285

288-
String sortField = sortFieldAndOrder.getSortField();
289-
String sortOrder = sortFieldAndOrder.getSortOrder();
290-
String searchClause = "";
291-
if(searchTerm != null && !searchTerm.isEmpty()){
292-
searchClause = " and (lower(o.label) like '%" + searchTerm.toLowerCase() + "%' or lower(o.description) like '%" + searchTerm.toLowerCase() + "%')";
293-
}
294-
295-
String queryString = "select o from FileMetadata o where o.datasetVersion.id = :datasetVersionId"
296-
+ searchClause
297-
+ " order by o." + sortField + " " + sortOrder;
298-
return em.createQuery(queryString, FileMetadata.class)
299-
.setParameter("datasetVersionId", datasetVersionId)
300-
.getResultList();
301-
}
302-
303-
public List<Integer> findFileMetadataIdsByDatasetVersionIdLabelSearchTerm(Long datasetVersionId, String searchTerm, String userSuppliedSortField, String userSuppliedSortOrder){
304-
FileSortFieldAndOrder sortFieldAndOrder = new FileSortFieldAndOrder(userSuppliedSortField, userSuppliedSortOrder);
305-
306-
searchTerm=searchTerm.trim();
307-
String sortField = sortFieldAndOrder.getSortField();
308-
String sortOrder = sortFieldAndOrder.getSortOrder();
309-
String searchClause = "";
310-
if(searchTerm != null && !searchTerm.isEmpty()){
311-
searchClause = " and (lower(o.label) like '%" + searchTerm.toLowerCase() + "%' or lower(o.description) like '%" + searchTerm.toLowerCase() + "%')";
312-
}
313-
314-
//the createNativeQuary takes persistant entities, which Integer.class is not,
315-
//which is causing the exception. Hence, this query does not need an Integer.class
316-
//as the second parameter.
317-
return em.createNativeQuery("select o.id from FileMetadata o where o.datasetVersion_id = " + datasetVersionId
318-
+ searchClause
319-
+ " order by o." + sortField + " " + sortOrder)
320-
.getResultList();
321-
}
322-
323-
public List<Long> findDataFileIdsByDatasetVersionIdLabelSearchTerm(Long datasetVersionId, String searchTerm, String userSuppliedSortField, String userSuppliedSortOrder){
286+
public List<Long> findDataFileIdsByDatasetVersionIdLabelSearchTerm(Long datasetVersionId, String userSuppliedSearchTerm, String userSuppliedSortField, String userSuppliedSortOrder) {
324287
FileSortFieldAndOrder sortFieldAndOrder = new FileSortFieldAndOrder(userSuppliedSortField, userSuppliedSortOrder);
325-
326-
searchTerm=searchTerm.trim();
327-
String sortField = sortFieldAndOrder.getSortField();
328-
String sortOrder = sortFieldAndOrder.getSortOrder();
329-
String searchClause = "";
330-
if(searchTerm != null && !searchTerm.isEmpty()){
331-
searchClause = " and (lower(o.label) like '%" + searchTerm.toLowerCase() + "%' or lower(o.description) like '%" + searchTerm.toLowerCase() + "%')";
288+
String searchTerm = !StringUtils.isBlank(userSuppliedSearchTerm) ? "%"+userSuppliedSearchTerm.trim().toLowerCase()+"%" : null;
289+
290+
String selectClause = "select o.datafile_id from FileMetadata o where o.datasetversion_id = " + datasetVersionId;
291+
String searchClause = searchTerm != null ? " and (lower(o.label) like ? or lower(o.description) like ?)" : "";
292+
String orderByClause = " order by o." + sortFieldAndOrder.getSortField() + " " + sortFieldAndOrder.getSortOrder();
293+
294+
Query query = em.createNativeQuery(selectClause + searchClause + orderByClause);
295+
if (searchTerm != null) {
296+
query.setParameter(1, searchTerm);
297+
query.setParameter(2, searchTerm);
332298
}
333-
334-
return em.createNativeQuery("select o.datafile_id from FileMetadata o where o.datasetVersion_id = " + datasetVersionId
335-
+ searchClause
336-
+ " order by o." + sortField + " " + sortOrder)
337-
.getResultList();
299+
return query.getResultList();
338300
}
339301

340302
public List<FileMetadata> findFileMetadataByDatasetVersionIdLazy(Long datasetVersionId, int maxResults, String userSuppliedSortField, String userSuppliedSortOrder, int firstResult) {

0 commit comments

Comments
 (0)