/**
* 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.content.dao.impl;
import org.dspace.content.Collection;
import org.dspace.content.Item;
import org.dspace.content.MetadataField;
import org.dspace.content.dao.CollectionDAO;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.core.AbstractHibernateDSODAO;
import org.dspace.eperson.EPerson;
import org.dspace.eperson.Group;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.BasicTransformerAdapter;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* Hibernate implementation of the Database Access Object interface class for the Collection object.
* This class is responsible for all database calls for the Collection object and is autowired by spring
* This class should never be accessed directly.
*
* @author kevinvandevelde at atmire.com
*/
public class CollectionDAOImpl extends AbstractHibernateDSODAO<Collection> implements CollectionDAO
{
protected CollectionDAOImpl()
{
super();
}
/**
* Get all collections in the system. These are alphabetically sorted by
* collection name.
*
* @param context
* DSpace context object
* @param order order by MetadataField
* @return the collections in the system
* @throws SQLException if database error
*/
@Override
public List<Collection> findAll(Context context, MetadataField order) throws SQLException
{
return findAll(context, order, null, null);
}
@Override
public List<Collection> findAll(Context context, MetadataField order, Integer limit, Integer offset) throws SQLException {
StringBuilder query = new StringBuilder();
query.append("SELECT ").append(Collection.class.getSimpleName()).append(" FROM Collection as ").append(Collection.class.getSimpleName()).append(" ");
addMetadataLeftJoin(query, Collection.class.getSimpleName(), Arrays.asList(order));
addMetadataSortQuery(query, Arrays.asList(order), null);
Query hibernateQuery = createQuery(context, query.toString());
if(offset != null)
{
hibernateQuery.setFirstResult(offset);
}
if(limit != null){
hibernateQuery.setMaxResults(limit);
}
hibernateQuery.setParameter(order.toString(), order.getID());
return list(hibernateQuery);
}
@Override
public Collection findByTemplateItem(Context context, Item item) throws SQLException {
Criteria criteria = createCriteria(context, Collection.class);
criteria.add(Restrictions.eq("template_item", item));
return uniqueResult(criteria);
}
@Override
public Collection findByGroup(Context context, Group group) throws SQLException {
Criteria criteria = createCriteria(context, Collection.class);
criteria.add(
Restrictions.or(
Restrictions.eq("workflowStep1", group),
Restrictions.eq("workflowStep2", group),
Restrictions.eq("workflowStep3", group),
Restrictions.eq("submitters", group),
Restrictions.eq("admins", group)
)
);
return singleResult(criteria);
}
@Override
public List<Collection> findAuthorized(Context context, EPerson ePerson, List<Integer> actions) throws SQLException {
// TableRowIterator tri = DatabaseManager.query(context,
// "SELECT * FROM collection, resourcepolicy, eperson " +
// "WHERE resourcepolicy.resource_id = collection.collection_id AND " +
// "eperson.eperson_id = resourcepolicy.eperson_id AND "+
// "resourcepolicy.resource_type_id = 3 AND "+
// "( resourcepolicy.action_id = 3 OR resourcepolicy.action_id = 11 ) AND "+
// "eperson.eperson_id = ?", context.getCurrentUser().getID());
Criteria criteria = createCriteria(context, Collection.class);
criteria.createAlias("resourcePolicies", "resourcePolicy");
Disjunction actionQuery = Restrictions.or();
for (Integer action : actions)
{
actionQuery.add(Restrictions.eq("resourcePolicy.actionId", action));
}
criteria.add(Restrictions.and(
Restrictions.eq("resourcePolicy.resourceTypeId", Constants.COLLECTION),
Restrictions.eq("resourcePolicy.eperson", ePerson),
actionQuery
));
return list(criteria);
}
@Override
public List<Collection> findAuthorizedByGroup(Context context, EPerson ePerson, List<Integer> actions) throws SQLException {
// TableRowIterator tri = DatabaseManager.query(context,
// "SELECT \n" +
// " * \n" +
// "FROM \n" +
// " public.eperson, \n" +
// " public.epersongroup2eperson, \n" +
// " public.epersongroup, \n" +
// " public.group2group, \n" +
// " public.resourcepolicy rp_parent, \n" +
// " public.collection\n" +
// "WHERE \n" +
// " epersongroup2eperson.eperson_id = eperson.eperson_id AND\n" +
// " epersongroup.eperson_group_id = epersongroup2eperson.eperson_group_id AND\n" +
// " group2group.child_id = epersongroup.eperson_group_id AND\n" +
// " rp_parent.epersongroup_id = group2group.parent_id AND\n" +
// " collection.collection_id = rp_parent.resource_id AND\n" +
// " eperson.eperson_id = ? AND \n" +
// " (rp_parent.action_id = 3 OR \n" +
// " rp_parent.action_id = 11 \n" +
// " ) AND rp_parent.resource_type_id = 3;", context.getCurrentUser().getID());
StringBuilder query = new StringBuilder();
query.append("select c from Collection c join c.resourcePolicies rp join rp.epersonGroup rpGroup WHERE ");
for (int i = 0; i < actions.size(); i++) {
Integer action = actions.get(i);
if(i != 0)
{
query.append(" AND ");
}
query.append("rp.actionId=").append(action);
}
query.append(" AND rp.resourceTypeId=").append(Constants.COLLECTION);
query.append(" AND rp.epersonGroup.id IN (select g.id from Group g where (from EPerson e where e.id = :eperson_id) in elements(epeople))");
Query hibernateQuery = createQuery(context, query.toString());
hibernateQuery.setParameter("eperson_id", ePerson.getID());
return list(hibernateQuery);
}
@Override
public List<Collection> findCollectionsWithSubscribers(Context context) throws SQLException {
return list(createQuery(context, "SELECT DISTINCT col FROM Subscription s join s.collection col"));
}
@Override
public int countRows(Context context) throws SQLException {
return count(createQuery(context, "SELECT count(*) FROM Collection"));
}
@Override
@SuppressWarnings("unchecked")
public List<Map.Entry<Collection, Long>> getCollectionsWithBitstreamSizesTotal(Context context) throws SQLException {
String q = "select col as collection, sum(bit.sizeBytes) as totalBytes from Item i join i.collections col join i.bundles bun join bun.bitstreams bit group by col";
Query query = createQuery(context, q);
query.setResultTransformer(new BasicTransformerAdapter() {
@Override
public Object transformTuple(Object[] tuple, String[] aliases) {
return new java.util.AbstractMap.SimpleImmutableEntry<>((Collection)tuple[0], (Long)tuple[1]);
}
});
return ((List<Map.Entry<Collection, Long>>)query.list());
}
}