\r
package eu.etaxonomy.cdm.persistence.dao.hibernate.media;\r
\r
+import java.util.ArrayList;\r
import java.util.HashSet;\r
import java.util.List;\r
import java.util.Set;\r
\r
+import org.apache.lucene.analysis.SimpleAnalyzer;\r
+import org.apache.lucene.queryParser.ParseException;\r
+import org.apache.lucene.queryParser.QueryParser;\r
import org.hibernate.Criteria;\r
+import org.hibernate.Hibernate;\r
+import org.hibernate.Query;\r
import org.hibernate.criterion.Projections;\r
import org.hibernate.criterion.Restrictions;\r
+import org.hibernate.envers.query.AuditEntity;\r
+import org.hibernate.envers.query.AuditQuery;\r
+import org.hibernate.search.FullTextSession;\r
+import org.hibernate.search.Search;\r
+import org.hibernate.search.SearchFactory;\r
import org.springframework.stereotype.Repository;\r
\r
-import eu.etaxonomy.cdm.model.description.IdentificationKey;\r
+import eu.etaxonomy.cdm.model.agent.AgentBase;\r
+import eu.etaxonomy.cdm.model.description.MediaKey;\r
import eu.etaxonomy.cdm.model.location.NamedArea;\r
import eu.etaxonomy.cdm.model.media.Media;\r
+import eu.etaxonomy.cdm.model.media.Rights;\r
+import eu.etaxonomy.cdm.model.molecular.PhylogeneticTree;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.cdm.model.view.AuditEvent;\r
+import eu.etaxonomy.cdm.persistence.dao.QueryParseException;\r
+import eu.etaxonomy.cdm.persistence.dao.common.OperationNotSupportedInPriorViewException;\r
import eu.etaxonomy.cdm.persistence.dao.hibernate.common.AnnotatableDaoImpl;\r
import eu.etaxonomy.cdm.persistence.dao.media.IMediaDao;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
\r
/**\r
* @author a.babadshanjan\r
* @created 08.09.2008\r
*/\r
@Repository\r
-public class MediaDaoHibernateImpl extends AnnotatableDaoImpl<Media> \r
- implements IMediaDao {\r
+public class MediaDaoHibernateImpl extends AnnotatableDaoImpl<Media> implements IMediaDao {\r
\r
+ private String defaultField = "title.text";\r
+ private Class<? extends Media> indexedClasses[]; \r
+ \r
public MediaDaoHibernateImpl() {\r
super(Media.class);\r
+ indexedClasses = new Class[3];\r
+ indexedClasses[0] = Media.class;\r
+ indexedClasses[1] = MediaKey.class;\r
+ indexedClasses[2] = PhylogeneticTree.class;\r
}\r
\r
- public int countIdentificationKeys(Set<Taxon> taxonomicScope, Set<NamedArea> geoScopes) {\r
- checkNotInPriorView("MediaDaoHibernateImpl.countIdentificationKeys(Set<Taxon> taxonomicScope, Set<NamedArea> geoScopes)");\r
- Criteria criteria = getSession().createCriteria(IdentificationKey.class);\r
- \r
- if(taxonomicScope != null && !taxonomicScope.isEmpty()) {\r
- Set<Integer> taxonomicScopeIds = new HashSet<Integer>();\r
- for(Taxon n : taxonomicScope) {\r
- taxonomicScopeIds.add(n.getId());\r
+ public int countMediaKeys(Set<Taxon> taxonomicScope, Set<NamedArea> geoScopes) {\r
+ AuditEvent auditEvent = getAuditEventFromContext();\r
+ if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
+ Criteria criteria = getSession().createCriteria(MediaKey.class);\r
+ \r
+ if(taxonomicScope != null && !taxonomicScope.isEmpty()) {\r
+ Set<Integer> taxonomicScopeIds = new HashSet<Integer>();\r
+ for(Taxon n : taxonomicScope) {\r
+ taxonomicScopeIds.add(n.getId());\r
+ }\r
+ criteria.createCriteria("taxonomicScope").add(Restrictions.in("id", taxonomicScopeIds));\r
}\r
- criteria.createCriteria("taxonomicScope").add(Restrictions.in("id", taxonomicScopeIds));\r
- }\r
- \r
- if(geoScopes != null && !geoScopes.isEmpty()) {\r
- Set<Integer> geoScopeIds = new HashSet<Integer>();\r
- for(NamedArea n : geoScopes) {\r
- geoScopeIds.add(n.getId());\r
+ \r
+ if(geoScopes != null && !geoScopes.isEmpty()) {\r
+ Set<Integer> geoScopeIds = new HashSet<Integer>();\r
+ for(NamedArea n : geoScopes) {\r
+ geoScopeIds.add(n.getId());\r
+ }\r
+ criteria.createCriteria("geographicalScope").add(Restrictions.in("id", geoScopeIds));\r
+ }\r
+ \r
+ criteria.setProjection(Projections.countDistinct("id"));\r
+ \r
+ return (Integer)criteria.uniqueResult();\r
+ } else {\r
+ if((taxonomicScope == null || taxonomicScope.isEmpty()) && (geoScopes == null || geoScopes.isEmpty())) {\r
+ AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(MediaKey.class,auditEvent.getRevisionNumber());\r
+ query.addProjection(AuditEntity.id().count("id"));\r
+ return ((Long)query.getSingleResult()).intValue();\r
+ } else {\r
+ throw new OperationNotSupportedInPriorViewException("countMediaKeys(Set<Taxon> taxonomicScope, Set<NamedArea> geoScopes)");\r
}\r
- criteria.createCriteria("geoScopes").add(Restrictions.in("id", geoScopeIds));\r
}\r
- \r
- criteria.setProjection(Projections.countDistinct("id"));\r
- \r
- return (Integer)criteria.uniqueResult();\r
}\r
\r
- public List<IdentificationKey> getIdentificationKeys(Set<Taxon> taxonomicScope, Set<NamedArea> geoScopes, Integer pageSize, Integer pageNumber) {\r
- checkNotInPriorView("MediaDaoHibernateImpl.getIdentificationKeys(Set<Taxon> taxonomicScope, Set<NamedArea> geoScopes, Integer pageSize, Integer pageNumber)");\r
- Criteria inner = getSession().createCriteria(IdentificationKey.class);\r
- \r
- if(taxonomicScope != null && !taxonomicScope.isEmpty()) {\r
- Set<Integer> taxonomicScopeIds = new HashSet<Integer>();\r
- for(Taxon n : taxonomicScope) {\r
- taxonomicScopeIds.add(n.getId());\r
+ public List<MediaKey> getMediaKeys(Set<Taxon> taxonomicScope, Set<NamedArea> geoScopes, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
+ AuditEvent auditEvent = getAuditEventFromContext();\r
+ if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
+ Criteria inner = getSession().createCriteria(MediaKey.class);\r
+\r
+ if(taxonomicScope != null && !taxonomicScope.isEmpty()) {\r
+ Set<Integer> taxonomicScopeIds = new HashSet<Integer>();\r
+ for(Taxon n : taxonomicScope) {\r
+ taxonomicScopeIds.add(n.getId());\r
+ }\r
+ inner.createCriteria("taxonomicScope").add(Restrictions.in("id", taxonomicScopeIds));\r
+ }\r
+\r
+ if(geoScopes != null && !geoScopes.isEmpty()) {\r
+ Set<Integer> geoScopeIds = new HashSet<Integer>();\r
+ for(NamedArea n : geoScopes) {\r
+ geoScopeIds.add(n.getId());\r
+ }\r
+ inner.createCriteria("geographicalScope").add(Restrictions.in("id", geoScopeIds));\r
+ }\r
+\r
+ inner.setProjection(Projections.distinct(Projections.id()));\r
+\r
+ Criteria criteria = getSession().createCriteria(MediaKey.class);\r
+ criteria.add(Restrictions.in("id", (List<Integer>)inner.list()));\r
+\r
+ if(pageSize != null) {\r
+ criteria.setMaxResults(pageSize);\r
+ if(pageNumber != null) {\r
+ criteria.setFirstResult(pageNumber * pageSize);\r
+ }\r
+ }\r
+\r
+ List<MediaKey> results = (List<MediaKey>)criteria.list();\r
+\r
+ defaultBeanInitializer.initializeAll(results, propertyPaths);\r
+\r
+ return results;\r
+ } else {\r
+ if((taxonomicScope == null || taxonomicScope.isEmpty()) && (geoScopes == null || geoScopes.isEmpty())) {\r
+ AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(MediaKey.class,auditEvent.getRevisionNumber());\r
+ \r
+ if(pageSize != null) {\r
+ query.setMaxResults(pageSize);\r
+ if(pageNumber != null) {\r
+ query.setFirstResult(pageNumber * pageSize);\r
+ } else {\r
+ query.setFirstResult(0);\r
+ }\r
+ }\r
+ List<MediaKey> results = (List<MediaKey>)query.getResultList();\r
+ defaultBeanInitializer.initializeAll(results, propertyPaths);\r
+ return results;\r
+ } else {\r
+ throw new OperationNotSupportedInPriorViewException("getMediaKeys(Set<Taxon> taxonomicScope, Set<NamedArea> geoScopes, Integer pageSize, Integer pageNumber, List<String> propertyPaths)");\r
}\r
- inner.createCriteria("taxonomicScope").add(Restrictions.in("id", taxonomicScopeIds));\r
}\r
+ }\r
+ \r
+ public List<Rights> getRights(Media media, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
+ checkNotInPriorView("MediaDaoHibernateImpl.getRights(Media t, Integer pageSize, Integer pageNumber, List<String> propertyPaths)");\r
+ Query query = getSession().createQuery("select rights from Media media join media.rights rights where media = :media");\r
+ query.setParameter("media",media);\r
+ setPagingParameter(query, pageSize, pageNumber);\r
+ List<Rights> results = (List<Rights>)query.list();\r
+ defaultBeanInitializer.initializeAll(results, propertyPaths);\r
+ return results;\r
+ }\r
+ \r
+ public int countRights(Media media) {\r
+ checkNotInPriorView("MediaDaoHibernateImpl.countRights(Media t)");\r
+ Query query = getSession().createQuery("select count(rights) from Media media join media.rights rights where media = :media");\r
+ query.setParameter("media",media);\r
+ return ((Long)query.uniqueResult()).intValue();\r
+ }\r
+\r
+ public int count(Class<? extends Media> clazz, String queryString) {\r
+ checkNotInPriorView("MediaDaoHibernateImpl.count(String queryString, Boolean accepted)");\r
+ QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer());\r
\r
- if(geoScopes != null && !geoScopes.isEmpty()) {\r
- Set<Integer> geoScopeIds = new HashSet<Integer>();\r
- for(NamedArea n : geoScopes) {\r
- geoScopeIds.add(n.getId());\r
+ try {\r
+ org.apache.lucene.search.Query query = queryParser.parse(queryString);\r
+ \r
+ FullTextSession fullTextSession = Search.getFullTextSession(this.getSession());\r
+ org.hibernate.search.FullTextQuery fullTextQuery = null;\r
+ \r
+ if(clazz == null) {\r
+ fullTextQuery = fullTextSession.createFullTextQuery(query, type);\r
+ } else {\r
+ fullTextQuery = fullTextSession.createFullTextQuery(query, clazz);\r
}\r
- inner.createCriteria("geoScopes").add(Restrictions.in("id", geoScopeIds));\r
+ \r
+ Integer result = fullTextQuery.getResultSize();\r
+ return result;\r
+\r
+ } catch (ParseException e) {\r
+ throw new QueryParseException(e, queryString);\r
}\r
- \r
- inner.setProjection(Projections.distinct(Projections.id()));\r
- \r
- Criteria criteria = getSession().createCriteria(IdentificationKey.class);\r
- criteria.add(Restrictions.in("id", (List<Integer>)inner.list()));\r
- \r
- if(pageSize != null) {\r
- criteria.setMaxResults(pageSize);\r
- if(pageNumber != null) {\r
- criteria.setFirstResult(pageNumber * pageSize);\r
- }\r
+ }\r
+\r
+ public void optimizeIndex() {\r
+ FullTextSession fullTextSession = Search.getFullTextSession(getSession());\r
+ SearchFactory searchFactory = fullTextSession.getSearchFactory();\r
+ for(Class clazz : indexedClasses) {\r
+ searchFactory.optimize(clazz); // optimize the indices ()\r
}\r
+ fullTextSession.flushToIndexes();\r
+ }\r
+\r
+ public void purgeIndex() {\r
+ FullTextSession fullTextSession = Search.getFullTextSession(getSession());\r
+ for(Class clazz : indexedClasses) {\r
+ fullTextSession.purgeAll(clazz); // remove all taxon base from indexes\r
+ }\r
+ fullTextSession.flushToIndexes();\r
+ }\r
+\r
+ public void rebuildIndex() {\r
+ FullTextSession fullTextSession = Search.getFullTextSession(getSession());\r
\r
- return (List<IdentificationKey>)criteria.list();\r
+ for(Media media : list(null,null)) { // re-index all media\r
+ Hibernate.initialize(media.getTitle());\r
+ Hibernate.initialize(media.getDescription());\r
+ Hibernate.initialize(media.getArtist());\r
+ fullTextSession.index(media);\r
+ }\r
+ fullTextSession.flushToIndexes();\r
+ }\r
+\r
+ public List<Media> search(Class<? extends Media> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints,List<String> propertyPaths) {\r
+ checkNotInPriorView("MediaDaoHibernateImpl.searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber)");\r
+ QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer());\r
+ List<Media> results = new ArrayList<Media>();\r
+ \r
+ try {\r
+ org.apache.lucene.search.Query query = queryParser.parse(queryString);\r
+ \r
+ FullTextSession fullTextSession = Search.getFullTextSession(getSession());\r
+ org.hibernate.search.FullTextQuery fullTextQuery = null;\r
+ \r
+ if(clazz == null) {\r
+ fullTextQuery = fullTextSession.createFullTextQuery(query, type);\r
+ } else {\r
+ fullTextQuery = fullTextSession.createFullTextQuery(query, clazz);\r
+ }\r
+ \r
+ addOrder(fullTextQuery,orderHints);\r
+ \r
+ if(pageSize != null) {\r
+ fullTextQuery.setMaxResults(pageSize);\r
+ if(pageNumber != null) {\r
+ fullTextQuery.setFirstResult(pageNumber * pageSize);\r
+ } else {\r
+ fullTextQuery.setFirstResult(0);\r
+ }\r
+ }\r
+ \r
+ List<Media> result = (List<Media>)fullTextQuery.list();\r
+ defaultBeanInitializer.initializeAll(result, propertyPaths);\r
+ return result;\r
+\r
+ } catch (ParseException e) {\r
+ throw new QueryParseException(e, queryString);\r
+ }\r
+ }\r
+\r
+ public String suggestQuery(String string) {\r
+ throw new UnsupportedOperationException("suggestQuery is not supported for Media");\r
}\r
}\r