/** * 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.Bitstream; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; import org.dspace.content.dao.BitstreamDAO; import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.core.Constants; import org.dspace.core.Context; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.criterion.Restrictions; import java.sql.SQLException; import java.util.Iterator; import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the Bitstream object. * This class is responsible for all database calls for the Bitstream object and is autowired by spring * This class should never be accessed directly. * * @author kevinvandevelde at atmire.com */ public class BitstreamDAOImpl extends AbstractHibernateDSODAO<Bitstream> implements BitstreamDAO { protected BitstreamDAOImpl() { super(); } @Override public List<Bitstream> findDeletedBitstreams(Context context) throws SQLException { Criteria criteria = createCriteria(context, Bitstream.class); criteria.add(Restrictions.eq("deleted", true)); return list(criteria); } @Override public List<Bitstream> findDuplicateInternalIdentifier(Context context, Bitstream bitstream) throws SQLException { Criteria criteria = createCriteria(context, Bitstream.class); criteria.add(Restrictions.and( Restrictions.eq("internalId", bitstream.getInternalId()), Restrictions.not(Restrictions.eq("id", bitstream.getID())) )); return list(criteria); } @Override public List<Bitstream> findBitstreamsWithNoRecentChecksum(Context context) throws SQLException { // "select bitstream.deleted, bitstream.store_number, bitstream.size_bytes, " // + "bitstreamformatregistry.short_description, bitstream.bitstream_id, " // + "bitstream.user_format_description, bitstream.internal_id, " // + "bitstream.source, bitstream.checksum_algorithm, bitstream.checksum, " // + "bitstream.name, bitstream.description " // + "from bitstream left outer join bitstreamformatregistry on " // + "bitstream.bitstream_format_id = bitstreamformatregistry.bitstream_format_id " // + "where not exists( select 'x' from most_recent_checksum " // + "where most_recent_checksum.bitstream_id = bitstream.bitstream_id )" Query query = createQuery(context, "select b from Bitstream b where b not in (select c.bitstream from MostRecentChecksum c)"); return query.list(); } @Override public Iterator<Bitstream> findByCommunity(Context context, Community community) throws SQLException { Query query = createQuery(context, "select b from Bitstream b " + "join b.bundles bitBundles " + "join bitBundles.items item " + "join item.collections itemColl " + "join itemColl.communities community " + "WHERE :community IN community"); query.setParameter("community", community); return iterate(query); } @Override public Iterator<Bitstream> findByCollection(Context context, Collection collection) throws SQLException { Query query = createQuery(context, "select b from Bitstream b " + "join b.bundles bitBundles " + "join bitBundles.items item " + "join item.collections c " + "WHERE :collection IN c"); query.setParameter("collection", collection); return iterate(query); } @Override public Iterator<Bitstream> findByItem(Context context, Item item) throws SQLException { Query query = createQuery(context, "select b from Bitstream b " + "join b.bundles bitBundles " + "join bitBundles.items item " + "WHERE :item IN item"); query.setParameter("item", item); return iterate(query); } @Override public Iterator<Bitstream> findByStoreNumber(Context context, Integer storeNumber) throws SQLException { Query query = createQuery(context, "select b from Bitstream b where b.storeNumber = :storeNumber"); query.setParameter("storeNumber", storeNumber); return iterate(query); } @Override public Long countByStoreNumber(Context context, Integer storeNumber) throws SQLException { Criteria criteria = createCriteria(context, Bitstream.class); criteria.add(Restrictions.eq("storeNumber", storeNumber)); return countLong(criteria); } @Override public int countRows(Context context) throws SQLException { return count(createQuery(context, "SELECT count(*) from Bitstream")); } @Override public int countDeleted(Context context) throws SQLException { return count(createQuery(context, "SELECT count(*) FROM Bitstream b WHERE b.deleted=true")); } @Override public int countWithNoPolicy(Context context) throws SQLException { Query query = createQuery(context,"SELECT count(bit.id) from Bitstream bit where bit.deleted<>true and bit.id not in" + " (select res.dSpaceObject from ResourcePolicy res where res.resourceTypeId = :typeId )" ); query.setParameter("typeId", Constants.BITSTREAM); return count(query); } @Override public List<Bitstream> getNotReferencedBitstreams(Context context) throws SQLException { return list(createQuery(context,"select bit from Bitstream bit where bit.deleted != true" + " and bit.id not in (select bit2.id from Bundle bun join bun.bitstreams bit2)" + " and bit.id not in (select com.logo.id from Community com)" + " and bit.id not in (select col.logo.id from Collection col)" + " and bit.id not in (select bun.primaryBitstream.id from Bundle bun)")); } @Override public Iterator<Bitstream> findAll(Context context, int limit, int offset) throws SQLException { Query query = createQuery(context, "select b FROM Bitstream b"); query.setFirstResult(offset); query.setMaxResults(limit); return iterate(query); } }