/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.core; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.ListUtils; import org.apache.commons.lang3.StringUtils; import org.dspace.content.DSpaceObject; import org.dspace.content.MetadataField; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; import java.sql.SQLException; import java.util.Collection; import java.util.List; /** * Hibernate implementation used by DSO Database Access Objects , includes commonly used methods * Each DSO Database Access Objects should extend this class to prevent code duplication. * * @author kevinvandevelde at atmire.com * @param <T> class type */ public abstract class AbstractHibernateDSODAO<T extends DSpaceObject> extends AbstractHibernateDAO<T> { public T findByLegacyId(Context context, int legacyId, Class<T> clazz) throws SQLException { Criteria criteria = createCriteria(context, clazz); criteria.add(Restrictions.eq("legacyId", legacyId)); return uniqueResult(criteria); } /** * Add left outer join on all metadata fields which are passed to this function. * The identifier of the join will be the toString() representation of the metadata field. * The joineded metadata fields can then be used to query or sort. * @param query * partial SQL query (to be appended) * @param tableIdentifier * DB table to join with * @param metadataFields * a collection of metadata fields */ protected void addMetadataLeftJoin(StringBuilder query, String tableIdentifier, Collection<MetadataField> metadataFields) { for (MetadataField metadataField : metadataFields) { query.append(" left join ").append(tableIdentifier).append(".metadata ").append(metadataField.toString()); query.append(" WITH ").append(metadataField.toString()).append(".metadataField.id").append(" = :").append(metadataField.toString()); } } /** * Using the metadata tables mapped in the leftJoin, this function creates a where query which can check the values * Values can be checked using a like or an "=" query, this is determined by the "operator" parameter * When creating a query, the "queryParam" string can be used set as parameter for the query. * * @param query the already existing query builder, all changes will be appended * @param metadataFields the metadatafields who's metadata value should be queried * @param operator can either be "=" or "like" * @param additionalWhere additional where query */ protected void addMetadataValueWhereQuery(StringBuilder query, List<MetadataField> metadataFields, String operator, String additionalWhere) { if (CollectionUtils.isNotEmpty(metadataFields) || StringUtils.isNotBlank(additionalWhere)) { //Add the where query on metadata query.append(" WHERE "); for (int i = 0; i < metadataFields.size(); i++) { MetadataField metadataField = metadataFields.get(i); if (StringUtils.isNotBlank(operator)) { query.append(" ("); query.append("lower(STR(" + metadataField.toString()).append(".value)) ").append(operator).append(" lower(:queryParam)"); query.append(")"); if (i < metadataFields.size() - 1) { query.append(" OR "); } } } if (StringUtils.isNotBlank(additionalWhere)) { if (CollectionUtils.isNotEmpty(metadataFields)) { query.append(" OR "); } query.append(additionalWhere); } } } protected void addMetadataSortQuery(StringBuilder query, List<MetadataField> metadataSortFields, List<String> columnSortFields) { addMetadataSortQuery(query, metadataSortFields, columnSortFields, ListUtils.EMPTY_LIST); } protected void addMetadataSortQuery(StringBuilder query, List<MetadataField> metadataSortFields, List<String> columnSortFields, List<String> direction) { if (CollectionUtils.isNotEmpty(metadataSortFields)) { query.append(" ORDER BY "); for (int i = 0; i < metadataSortFields.size(); i++) { MetadataField metadataField = metadataSortFields.get(i); query.append("STR(").append(metadataField.toString()).append(".value)"); String dir = direction.size() > i ? " " + direction.get(i) : ""; query.append(dir); if(i != metadataSortFields.size() -1) { query.append(","); } } } else if (CollectionUtils.isNotEmpty(columnSortFields)) { query.append(" ORDER BY "); for (int i = 0; i < columnSortFields.size(); i++) { String sortField = columnSortFields.get(i); query.append(sortField); if (i != columnSortFields.size() -1) { query.append(","); } } } } }