last bugfixes for tests in persistence
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / hibernate / media / MediaDaoHibernateImpl.java
index a56fdeddd80e28c7d5ef1e0d1831fdfa6633a9e1..cfefddb7d3ef70a642166a1164dade5759ec22d8 100644 (file)
 \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