/**
* 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.eperson.dao.impl;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.dspace.content.MetadataField;
import org.dspace.core.AbstractHibernateDSODAO;
import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
import org.dspace.eperson.Group;
import org.dspace.eperson.dao.GroupDAO;
import org.hibernate.Query;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
/**
* Hibernate implementation of the Database Access Object interface class for the Group object.
* This class is responsible for all database calls for the Group object and is autowired by spring
* This class should never be accessed directly.
*
* @author kevinvandevelde at atmire.com
*/
public class GroupDAOImpl extends AbstractHibernateDSODAO<Group> implements GroupDAO
{
protected GroupDAOImpl()
{
super();
}
@Override
public List<Group> findByMetadataField(Context context, String searchValue, MetadataField metadataField) throws SQLException
{
StringBuilder queryBuilder = new StringBuilder();
String groupTableName = "g";
queryBuilder.append("SELECT ").append(groupTableName).append(" FROM Group as ").append(groupTableName);
addMetadataLeftJoin(queryBuilder, groupTableName, Collections.singletonList(metadataField));
addMetadataValueWhereQuery(queryBuilder, Collections.singletonList(metadataField), "=", null);
Query query = createQuery(context, queryBuilder.toString());
query.setParameter(metadataField.toString(), metadataField.getID());
query.setParameter("queryParam", searchValue);
return list(query);
}
@Override
public List<Group> findAll(Context context, List<MetadataField> sortMetadataFields, int pageSize, int offset) throws SQLException
{
StringBuilder queryBuilder = new StringBuilder();
String groupTableName = "g";
queryBuilder.append("SELECT ").append(groupTableName).append(" FROM Group as ").append(groupTableName);
addMetadataLeftJoin(queryBuilder, groupTableName, sortMetadataFields);
addMetadataSortQuery(queryBuilder, sortMetadataFields, null);
Query query = createQuery(context, queryBuilder.toString());
if (pageSize > 0) {
query.setMaxResults(pageSize);
}
if (offset > 0) {
query.setFirstResult(offset);
}
for (MetadataField sortField : sortMetadataFields) {
query.setParameter(sortField.toString(), sortField.getID());
}
return list(query);
}
@Override
public List<Group> findAll(Context context, int pageSize, int offset) throws SQLException {
Query query = createQuery(context,
"SELECT g FROM Group g ORDER BY g.name ASC");
if (pageSize > 0) {
query.setMaxResults(pageSize);
}
if (offset > 0) {
query.setFirstResult(offset);
}
query.setCacheable(true);
return list(query);
}
@Override
public List<Group> findByEPerson(Context context, EPerson ePerson) throws SQLException {
Query query = createQuery(context, "from Group where (from EPerson e where e.id = :eperson_id) in elements(epeople)");
query.setParameter("eperson_id", ePerson.getID());
query.setCacheable(true);
return list(query);
}
@Override
public Group findByName(final Context context, final String name) throws SQLException {
Query query = createQuery(context,
"SELECT g from Group g " +
"where g.name = :name ");
query.setParameter("name", name);
query.setCacheable(true);
return singleResult(query);
}
@Override
public Group findByNameAndMembership(Context context, String groupName, EPerson ePerson) throws SQLException {
if(groupName == null || ePerson == null) {
return null;
} else {
Query query = createQuery(context,
"SELECT DISTINCT g FROM Group g " +
"LEFT JOIN g.epeople p " +
"WHERE g.name = :name AND " +
"(p.id = :eperson_id OR " +
"EXISTS ( " +
"SELECT 1 FROM Group2GroupCache gc " +
"JOIN gc.parent p " +
"JOIN gc.child c " +
"JOIN c.epeople cp " +
"WHERE p.id = g.id AND cp.id = :eperson_id " +
") " +
")");
query.setParameter("name", groupName);
query.setParameter("eperson_id", ePerson.getID());
query.setCacheable(true);
return singleResult(query);
}
}
@Override
public List<Group> findByNameLike(final Context context, final String groupName, final int offset, final int limit) throws SQLException {
Query query = createQuery(context,
"SELECT g FROM Group g WHERE lower(g.name) LIKE lower(:name)");
query.setParameter("name", "%" + StringUtils.trimToEmpty(groupName) + "%");
if(0 <= offset)
{
query.setFirstResult(offset);
}
if(0 <= limit)
{
query.setMaxResults(limit);
}
return list(query);
}
@Override
public int countByNameLike(final Context context, final String groupName) throws SQLException {
Query query = createQuery(context,
"SELECT count(*) FROM Group g WHERE lower(g.name) LIKE lower(:name)");
query.setParameter("name", "%" + groupName + "%");
return count(query);
}
@Override
public void delete(Context context, Group group) throws SQLException {
Query query = getHibernateSession(context).createSQLQuery("DELETE FROM group2group WHERE parent_id=:groupId or child_id=:groupId");
query.setParameter("groupId", group.getID());
query.executeUpdate();
super.delete(context, group);
}
@Override
public List<Pair<UUID, UUID>> getGroup2GroupResults(Context context, boolean flushQueries) throws SQLException {
Query query = createQuery(context, "SELECT new org.apache.commons.lang3.tuple.ImmutablePair(g.id, c.id) " +
"FROM Group g " +
"JOIN g.groups c ");
@SuppressWarnings("unchecked")
List<Pair<UUID, UUID>> results = query.list();
return results;
}
@Override
public List<Group> getEmptyGroups(Context context) throws SQLException {
return list(createQuery(context, "SELECT g from Group g where g.epeople is EMPTY"));
}
@Override
public int countRows(Context context) throws SQLException {
return count(createQuery(context, "SELECT count(*) FROM Group"));
}
}