fixing #4112 (portal/taxon/{uuid}/accepted/{uuid} takes exceedingly much time in...
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / hibernate / description / DescriptionDaoImpl.java
index fd1eee8cdd189bb7c9028cd9377c97d56de48910..7b5029ee749f4a43f3d3c7424a141fb8a51f40f6 100644 (file)
@@ -13,6 +13,7 @@ import java.util.ArrayList;
 import java.util.HashSet;\r
 import java.util.List;\r
 import java.util.Set;\r
+import java.util.UUID;\r
 \r
 import org.apache.log4j.Logger;\r
 import org.hibernate.Criteria;\r
@@ -25,6 +26,7 @@ import org.hibernate.envers.query.AuditQuery;
 import org.springframework.beans.factory.annotation.Qualifier;\r
 import org.springframework.stereotype.Repository;\r
 \r
+import eu.etaxonomy.cdm.model.common.DefinedTerm;\r
 import eu.etaxonomy.cdm.model.common.LSID;\r
 import eu.etaxonomy.cdm.model.common.MarkerType;\r
 import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
@@ -32,11 +34,11 @@ import eu.etaxonomy.cdm.model.description.DescriptionBase;
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
 import eu.etaxonomy.cdm.model.description.Feature;\r
 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
-import eu.etaxonomy.cdm.model.description.Scope;\r
 import eu.etaxonomy.cdm.model.description.SpecimenDescription;\r
 import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
 import eu.etaxonomy.cdm.model.description.TaxonNameDescription;\r
 import eu.etaxonomy.cdm.model.location.NamedArea;\r
+import eu.etaxonomy.cdm.model.media.Media;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.view.AuditEvent;\r
@@ -50,7 +52,6 @@ import eu.etaxonomy.cdm.persistence.query.OrderHint;
 @Qualifier("descriptionDaoImpl")\r
 public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> implements IDescriptionDao{\r
 \r
-    @SuppressWarnings("unused")\r
     private static final Logger logger = Logger.getLogger(DescriptionDaoImpl.class);\r
 \r
     public DescriptionDaoImpl() {\r
@@ -61,6 +62,18 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
         indexedClasses[2] = SpecimenDescription.class;\r
     }\r
 \r
+//    @Override  //Override for testing\r
+//    public DescriptionBase load(UUID uuid, List<String> propertyPaths){\r
+//     DescriptionBase bean = findByUuid(uuid);\r
+//        if(bean == null){\r
+//            return bean;\r
+//        }\r
+//        defaultBeanInitializer.initialize(bean, propertyPaths);\r
+//\r
+//        return bean;\r
+//    }\r
+\r
+    @Override\r
     public int countDescriptionByDistribution(Set<NamedArea> namedAreas, PresenceAbsenceTermBase status) {\r
         checkNotInPriorView("DescriptionDaoImpl.countDescriptionByDistribution(Set<NamedArea> namedAreas, PresenceAbsenceTermBase status)");\r
         Query query = null;\r
@@ -76,7 +89,14 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
         return ((Long)query.uniqueResult()).intValue();\r
     }\r
 \r
+    @Override\r
     public int countDescriptionElements(DescriptionBase description, Set<Feature> features, Class<? extends DescriptionElementBase> clazz) {\r
+        return countDescriptionElements(description, null, features, clazz);\r
+    }\r
+\r
+    @Override\r
+    public int countDescriptionElements(DescriptionBase description, Class<? extends DescriptionBase> descriptionType,\r
+            Set<Feature> features, Class<? extends DescriptionElementBase> clazz) {\r
         AuditEvent auditEvent = getAuditEventFromContext();\r
         if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
             Criteria criteria = null;\r
@@ -90,13 +110,17 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
                 criteria.add(Restrictions.eq("inDescription", description));\r
             }\r
 \r
+            if(descriptionType != null) {\r
+                criteria.createAlias("inDescription", "d").add(Restrictions.eq("d.class", descriptionType));\r
+            }\r
+\r
             if(features != null && !features.isEmpty()) {\r
                 criteria.add(Restrictions.in("feature", features));\r
             }\r
 \r
             criteria.setProjection(Projections.rowCount());\r
 \r
-            return (Integer)criteria.uniqueResult();\r
+            return ((Number)criteria.uniqueResult()).intValue();\r
         } else {\r
             if(features != null && !features.isEmpty()) {\r
                 Integer count = 0;\r
@@ -112,6 +136,10 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
                         query.add(AuditEntity.relatedId("inDescription").eq(description.getId()));\r
                     }\r
 \r
+                    if(descriptionType != null) {\r
+                        query.add(AuditEntity.property("inDescription.class").eq(descriptionType));\r
+                    }\r
+\r
                     query.add(AuditEntity.relatedId("feature").eq(f.getId()));\r
                     query.addProjection(AuditEntity.id().count("id"));\r
                     count += ((Long)query.getSingleResult()).intValue();\r
@@ -129,12 +157,17 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
                 if(description != null) {\r
                     query.add(AuditEntity.relatedId("inDescription").eq(description.getId()));\r
                 }\r
+                if(descriptionType != null) {\r
+                    query.add(AuditEntity.property("inDescription.class").eq(descriptionType));\r
+                }\r
+\r
                 query.addProjection(AuditEntity.id().count("id"));\r
                 return ((Long)query.getSingleResult()).intValue();\r
             }\r
         }\r
     }\r
 \r
+    @Override\r
     public int countDescriptions(Class<? extends DescriptionBase> clazz, Boolean hasImages, Boolean hasText, Set<Feature> features) {\r
         checkNotInPriorView("DescriptionDaoImpl.countDescriptions(Class<TYPE> type, Boolean hasImages, Boolean hasText, Set<Feature> features)");\r
         Criteria inner = null;\r
@@ -168,10 +201,11 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
 \r
         inner.setProjection(Projections.countDistinct("id"));\r
 \r
-        return (Integer) inner.uniqueResult();\r
+        return ((Number) inner.uniqueResult()).intValue();\r
     }\r
 \r
-    public int countTaxonDescriptions(Taxon taxon, Set<Scope> scopes,Set<NamedArea> geographicalScopes, Set<MarkerType> markerTypes) {\r
+    @Override\r
+    public int countTaxonDescriptions(Taxon taxon, Set<DefinedTerm> scopes,Set<NamedArea> geographicalScopes, Set<MarkerType> markerTypes) {\r
         AuditEvent auditEvent = getAuditEventFromContext();\r
         if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
             Criteria criteria = getSession().createCriteria(TaxonDescription.class);\r
@@ -182,7 +216,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
 \r
             if(scopes != null && !scopes.isEmpty()) {\r
                 Set<Integer> scopeIds = new HashSet<Integer>();\r
-                for(Scope s : scopes) {\r
+                for(DefinedTerm s : scopes) {\r
                     scopeIds.add(s.getId());\r
                 }\r
                 criteria.createCriteria("scopes").add(Restrictions.in("id", scopeIds));\r
@@ -202,7 +236,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
 \r
             criteria.setProjection(Projections.rowCount());\r
 \r
-            return (Integer)criteria.uniqueResult();\r
+            return ((Number)criteria.uniqueResult()).intValue();\r
         } else {\r
             if((scopes == null || scopes.isEmpty())&& (geographicalScopes == null || geographicalScopes.isEmpty()) && (markerTypes == null || markerTypes.isEmpty())) {\r
                 AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(TaxonDescription.class,auditEvent.getRevisionNumber());\r
@@ -225,8 +259,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
      *\r
      */\r
     //TODO move to AnnotatableEntityDao(?)\r
-    private void addMarkerTypesCriterion(Set<MarkerType> markerTypes,\r
-            Criteria criteria) {\r
+    private void addMarkerTypesCriterion(Set<MarkerType> markerTypes, Criteria criteria) {\r
 \r
         if(markerTypes != null && !markerTypes.isEmpty()) {\r
             Set<Integer> markerTypeIds = new HashSet<Integer>();\r
@@ -237,11 +270,22 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
                     .createAlias("markerType", "mt")\r
                      .add(Restrictions.in("mt.id", markerTypeIds));\r
         } else if (markerTypes != null && markerTypes.isEmpty()){\r
-               //AT: added in case the projects requires an third state description, An empty Marker type set\r
+            //AT: added in case the projects requires an third state description, An empty Marker type set\r
         }\r
     }\r
+    @Override\r
+    public List<DescriptionElementBase> getDescriptionElements(\r
+            DescriptionBase description, Set<Feature> features,\r
+            Class<? extends DescriptionElementBase> clazz, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
+        return getDescriptionElements(description, null, features, clazz, pageSize, pageNumber, propertyPaths);\r
+    }\r
 \r
-    public List<DescriptionElementBase> getDescriptionElements(DescriptionBase description, Set<Feature> features,Class<? extends DescriptionElementBase> clazz, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
+    @Override\r
+    public List<DescriptionElementBase> getDescriptionElements(\r
+            DescriptionBase description, Class<? extends DescriptionBase> descriptionType,\r
+            Set<Feature> features,\r
+            Class<? extends DescriptionElementBase> clazz,\r
+            Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
 \r
         AuditEvent auditEvent = getAuditEventFromContext();\r
         if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
@@ -255,6 +299,9 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
             if(description != null) {\r
                 criteria.add(Restrictions.eq("inDescription", description));\r
             }\r
+            if(descriptionType != null) {\r
+                criteria.createAlias("inDescription", "d").add(Restrictions.eq("d.class", descriptionType));\r
+            }\r
 \r
             if(features != null && !features.isEmpty()) {\r
                 criteria.add(Restrictions.in("feature", features));\r
@@ -267,7 +314,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
                 }\r
             }\r
 \r
-            List<DescriptionElementBase> results = (List<DescriptionElementBase>)criteria.list();\r
+            List<DescriptionElementBase> results = criteria.list();\r
 \r
             defaultBeanInitializer.initializeAll(results, propertyPaths);\r
 \r
@@ -288,8 +335,12 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
                         query.add(AuditEntity.relatedId("inDescription").eq(description.getId()));\r
                     }\r
 \r
+                    if(descriptionType != null) {\r
+                        query.add(AuditEntity.property("inDescription.class").eq(descriptionType));\r
+                    }\r
+\r
                     query.add(AuditEntity.relatedId("feature").eq(f.getId()));\r
-                    result.addAll((List<DescriptionElementBase>)query.getResultList());\r
+                    result.addAll(query.getResultList());\r
                 }\r
             } else {\r
                 AuditQuery query = null;\r
@@ -303,6 +354,10 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
                     query.add(AuditEntity.relatedId("inDescription").eq(description.getId()));\r
                 }\r
 \r
+                if(descriptionType != null) {\r
+                    query.add(AuditEntity.property("inDescription.class").eq(descriptionType));\r
+                }\r
+\r
                 result = query.getResultList();\r
             }\r
 \r
@@ -312,7 +367,8 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
         }\r
     }\r
 \r
-    public List<TaxonDescription> listTaxonDescriptions(Taxon taxon, Set<Scope> scopes, Set<NamedArea> geographicalScopes, Set<MarkerType> markerTypes, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
+    @Override\r
+    public List<TaxonDescription> listTaxonDescriptions(Taxon taxon, Set<DefinedTerm> scopes, Set<NamedArea> geographicalScopes, Set<MarkerType> markerTypes, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
         AuditEvent auditEvent = getAuditEventFromContext();\r
         if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
             Criteria criteria = getSession().createCriteria(TaxonDescription.class);\r
@@ -323,7 +379,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
 \r
             if(scopes != null && !scopes.isEmpty()) {\r
                 Set<Integer> scopeIds = new HashSet<Integer>();\r
-                for(Scope s : scopes) {\r
+                for(DefinedTerm s : scopes) {\r
                     scopeIds.add(s.getId());\r
                 }\r
                 criteria.createCriteria("scopes").add(Restrictions.in("id", scopeIds));\r
@@ -346,7 +402,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
                 }\r
             }\r
 \r
-            List<TaxonDescription> results = (List<TaxonDescription>)criteria.list();\r
+            List<TaxonDescription> results = criteria.list();\r
 \r
             defaultBeanInitializer.initializeAll(results, propertyPaths);\r
 \r
@@ -367,7 +423,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
                     }\r
                 }\r
 \r
-                List<TaxonDescription> results = (List<TaxonDescription>)query.getResultList();\r
+                List<TaxonDescription> results = query.getResultList();\r
                 defaultBeanInitializer.initializeAll(results, propertyPaths);\r
                 return results;\r
             } else {\r
@@ -376,6 +432,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
         }\r
     }\r
 \r
+    @Override\r
     public List<TaxonNameDescription> getTaxonNameDescriptions(TaxonNameBase name, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
         AuditEvent auditEvent = getAuditEventFromContext();\r
         if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
@@ -392,7 +449,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
               }\r
           }\r
 \r
-          List<TaxonNameDescription> results = (List<TaxonNameDescription>)criteria.list();\r
+          List<TaxonNameDescription> results = criteria.list();\r
 \r
           defaultBeanInitializer.initializeAll(results, propertyPaths);\r
 \r
@@ -411,7 +468,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
                   }\r
             }\r
 \r
-            List<TaxonNameDescription> results = (List<TaxonNameDescription>)query.getResultList();\r
+            List<TaxonNameDescription> results = query.getResultList();\r
 \r
             defaultBeanInitializer.initializeAll(results, propertyPaths);\r
 \r
@@ -420,6 +477,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
 \r
     }\r
 \r
+    @Override\r
     public int countTaxonNameDescriptions(TaxonNameBase name) {\r
         AuditEvent auditEvent = getAuditEventFromContext();\r
         if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
@@ -431,7 +489,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
 \r
             criteria.setProjection(Projections.rowCount());\r
 \r
-            return (Integer)criteria.uniqueResult();\r
+            return ((Number)criteria.uniqueResult()).intValue();\r
         } else {\r
             AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(TaxonNameDescription.class,auditEvent.getRevisionNumber());\r
 \r
@@ -451,6 +509,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
      *\r
      * outer.add(Subqueries.propertyIn("id", inner));\r
      */\r
+    @Override\r
     public List<DescriptionBase> listDescriptions(Class<? extends DescriptionBase> clazz, Boolean hasImages, Boolean hasText,  Set<Feature> features, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
         checkNotInPriorView("DescriptionDaoImpl.listDescriptions(Class<TYPE> type, Boolean hasImages, Boolean hasText, Set<Feature> features, Integer pageSize, Integer pageNumber)");\r
         Criteria inner = null;\r
@@ -484,7 +543,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
 \r
         inner.setProjection(Projections.distinct(Projections.id()));\r
 \r
-        List<Object> intermediateResult = (List<Object>)inner.list();\r
+        List<Object> intermediateResult = inner.list();\r
 \r
         if(intermediateResult.isEmpty()) {\r
             return new ArrayList<DescriptionBase>();\r
@@ -492,7 +551,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
 \r
         Integer[] resultIds = new Integer[intermediateResult.size()];\r
         for(int i = 0; i < resultIds.length; i++) {\r
-                resultIds[i] = (Integer)intermediateResult.get(i);\r
+                resultIds[i] = ((Number)intermediateResult.get(i)).intValue();\r
         }\r
 \r
         Criteria outer = null;\r
@@ -513,11 +572,12 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
             }\r
         }\r
 \r
-        List<DescriptionBase> results = (List<DescriptionBase>)outer.list();\r
+        List<DescriptionBase> results = outer.list();\r
         defaultBeanInitializer.initializeAll(results, propertyPaths);\r
         return results;\r
     }\r
 \r
+    @Override\r
     public List<TaxonDescription> searchDescriptionByDistribution(Set<NamedArea> namedAreas, PresenceAbsenceTermBase status, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
         checkNotInPriorView("DescriptionDaoImpl.searchDescriptionByDistribution(Set<NamedArea> namedAreas, PresenceAbsenceTermBase status, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths)");\r
 \r
@@ -548,17 +608,18 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
 \r
         addOrder(criteria,orderHints);\r
 \r
-        List<Object> intermediateResult = (List<Object>)criteria.list();\r
+        List<Object> intermediateResult = criteria.list();\r
 \r
-        if(intermediateResult.isEmpty())\r
+        if(intermediateResult.isEmpty()) {\r
             return new ArrayList<TaxonDescription>();\r
+        }\r
 \r
         Integer[] resultIds = new Integer[intermediateResult.size()];\r
         for(int i = 0; i < resultIds.length; i++) {\r
             if(orderHints == null || orderHints.isEmpty()) {\r
-                resultIds[i] = (Integer)intermediateResult.get(i);\r
+                resultIds[i] = ((Number)intermediateResult.get(i)).intValue();\r
             } else {\r
-              resultIds[i] = (Integer)((Object[])intermediateResult.get(i))[0];\r
+              resultIds[i] = ((Number)((Object[])intermediateResult.get(i))[0]).intValue();\r
             }\r
         }\r
 \r
@@ -566,11 +627,12 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
         criteria.add(Restrictions.in("id", resultIds));\r
         addOrder(criteria,orderHints);\r
 \r
-        List<TaxonDescription> results = (List<TaxonDescription>)criteria.list();\r
+        List<TaxonDescription> results = criteria.list();\r
         defaultBeanInitializer.initializeAll(results, propertyPaths);\r
         return results;\r
     }\r
 \r
+    @Override\r
     public List<CommonTaxonName> searchDescriptionByCommonName(String queryString, MatchMode matchMode, Integer pageSize, Integer pageNumber) {\r
 \r
         Criteria crit = getSession().createCriteria(CommonTaxonName.class);\r
@@ -586,10 +648,11 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
                 crit.setFirstResult(pageNumber * pageSize);\r
             }\r
         }\r
-        List<CommonTaxonName> results = (List<CommonTaxonName>)crit.list();\r
+        List<CommonTaxonName> results = crit.list();\r
         return results;\r
     }\r
 \r
+    @Override\r
     public Integer countDescriptionByCommonName(String queryString, MatchMode matchMode) {\r
         //TODO inprove performance\r
         List<CommonTaxonName> results =  searchDescriptionByCommonName(queryString, matchMode, null, null);\r
@@ -623,15 +686,52 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
     }\r
 \r
 \r
+    @Override\r
     public <T extends DescriptionElementBase> List<T> getDescriptionElementForTaxon(\r
-            Taxon taxon, Set<Feature> features,\r
+            UUID taxonUuid, Set<Feature> features,\r
             Class<T> type, Integer pageSize,\r
             Integer pageNumber, List<String> propertyPaths) {\r
 \r
-        String queryString = "select de" +\r
+        Query query = prepareGetDescriptionElementForTaxon(taxonUuid, features, type, pageSize, pageNumber, false);\r
+\r
+        if (logger.isDebugEnabled()){logger.debug(" dao: get list ...");}\r
+        List<T> results = query.list();\r
+        if (logger.isDebugEnabled()){logger.debug(" dao: initialize ...");}\r
+        defaultBeanInitializer.initializeAll(results, propertyPaths);\r
+        if (logger.isDebugEnabled()){logger.debug(" dao: initialize - DONE");}\r
+        return results;\r
+    }\r
+\r
+    @Override\r
+    public <T extends DescriptionElementBase> long countDescriptionElementForTaxon(\r
+            UUID taxonUuid, Set<Feature> features, Class<T> type) {\r
+\r
+        Query query = prepareGetDescriptionElementForTaxon(taxonUuid, features, type, null, null, true);\r
+\r
+        return (Long)query.uniqueResult();\r
+    }\r
+\r
+    /**\r
+     * @param taxon\r
+     * @param features\r
+     * @param type\r
+     * @param pageSize\r
+     * @param pageNumber\r
+     * @return\r
+     */\r
+    private <T extends DescriptionElementBase> Query prepareGetDescriptionElementForTaxon(UUID taxonUuid,\r
+            Set<Feature> features, Class<T> type, Integer pageSize, Integer pageNumber, boolean asCountQuery) {\r
+\r
+        String listOrCount;\r
+        if(asCountQuery){\r
+            listOrCount = "count(de)";\r
+        } else {\r
+            listOrCount = "de";\r
+        }\r
+        String queryString = "select " + listOrCount +\r
             " from TaxonDescription as td" +\r
             " left join td.descriptionElements as de" +\r
-            " where td.taxon = :taxon ";\r
+            " where td.taxon.uuid = :taxon_uuid ";\r
 \r
         if(type != null){\r
             queryString += " and de.class = :type";\r
@@ -642,7 +742,7 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
 //             System.out.println(queryString);\r
         Query query = getSession().createQuery(queryString);\r
 \r
-        query.setParameter("taxon", taxon);\r
+        query.setParameter("taxon_uuid", taxonUuid);\r
         if(type != null){\r
             query.setParameter("type", type.getSimpleName());\r
         }\r
@@ -656,10 +756,138 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase<DescriptionBase> imp
                 query.setFirstResult(pageNumber * pageSize);\r
             }\r
         }\r
+        return query;\r
+    }\r
+\r
+    /* (non-Javadoc)\r
+     * @see eu.etaxonomy.cdm.persistence.dao.description.IDescriptionDao#listTaxonDescriptionMedia(java.util.UUID, java.lang.Boolean, java.util.Set, java.lang.Integer, java.lang.Integer, java.util.List)\r
+     */\r
+    @Override\r
+    public List<Media> listTaxonDescriptionMedia(UUID taxonUuid,\r
+            Boolean limitToGalleries, Set<MarkerType> markerTypes,\r
+            Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
+\r
+               AuditEvent auditEvent = getAuditEventFromContext();\r
+            if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
+                String queryString = " SELECT media " +\r
+                    getTaxonDescriptionMediaQueryString(\r
+                        taxonUuid, limitToGalleries,  markerTypes);\r
+                queryString +=\r
+                    " GROUP BY media "\r
+//                                                     " ORDER BY index(media) "  //not functional\r
+                    ;\r
+\r
+                Query query = getSession().createQuery(queryString);\r
+\r
+                setTaxonDescriptionMediaParameters(query, taxonUuid, limitToGalleries, markerTypes);\r
+\r
+\r
+//                 addMarkerTypesCriterion(markerTypes, hql);\r
+\r
+                if(pageSize != null) {\r
+                    query.setMaxResults(pageSize);\r
+                    if(pageNumber != null) {\r
+                        query.setFirstResult(pageNumber * pageSize);\r
+                    }\r
+                }\r
+\r
+                List<Media> results = query.list();\r
+\r
+                defaultBeanInitializer.initializeAll(results, propertyPaths);\r
+\r
+                return results;\r
+            } else {\r
+                throw new OperationNotSupportedInPriorViewException("countTaxonDescriptionMedia(UUID taxonUuid, boolean restrictToGalleries)");\r
+            }\r
+    }\r
+\r
+\r
+    /* (non-Javadoc)\r
+     * @see eu.etaxonomy.cdm.persistence.dao.description.IDescriptionDao#countTaxonDescriptionMedia(java.util.UUID, java.lang.Boolean, java.util.Set)\r
+     */\r
+    @Override\r
+    public int countTaxonDescriptionMedia(UUID taxonUuid,\r
+            Boolean limitToGalleries, Set<MarkerType> markerTypes) {\r
+        AuditEvent auditEvent = getAuditEventFromContext();\r
+        if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
+            String queryString = " SELECT count(DISTINCT media) " +\r
+                getTaxonDescriptionMediaQueryString(\r
+                    taxonUuid, limitToGalleries, markerTypes);\r
+\r
+            Query query = getSession().createQuery(queryString);\r
+            setTaxonDescriptionMediaParameters(query, taxonUuid, limitToGalleries, markerTypes);\r
+            return ((Long)query.uniqueResult()).intValue();\r
+        }else{\r
+            throw new OperationNotSupportedInPriorViewException("countTaxonDescriptionMedia(UUID taxonUuid)");\r
+        }\r
+\r
+    }\r
+\r
+    private void setTaxonDescriptionMediaParameters(Query query, UUID taxonUuid, Boolean limitToGalleries, Set<MarkerType> markerTypes) {\r
+        if(taxonUuid != null){\r
+            query.setParameter("uuid", taxonUuid);\r
+        }\r
+\r
+    }\r
+\r
+    /**\r
+     * @param taxonUuid\r
+     * @param restrictToGalleries\r
+     * @param markerTypes\r
+     * @return\r
+     */\r
+    private String getTaxonDescriptionMediaQueryString(UUID taxonUuid,\r
+            Boolean restrictToGalleries, Set<MarkerType> markerTypes) {\r
+        String fromQueryString =\r
+            " FROM DescriptionElementBase as deb INNER JOIN " +\r
+                " deb.inDescription as td "\r
+                + " INNER JOIN td.taxon as t "\r
+                + " JOIN deb.media as media "\r
+                + " LEFT JOIN td.markers marker ";\r
+\r
+        String whereQueryString = " WHERE (1=1) ";\r
+        if (taxonUuid != null){\r
+            whereQueryString += " AND t.uuid = :uuid ";\r
+        }\r
+        if (restrictToGalleries){\r
+            whereQueryString += " AND td.imageGallery is true ";\r
+        }\r
+        if (markerTypes != null && !markerTypes.isEmpty()){\r
+            whereQueryString += " AND (1=0";\r
+            for (MarkerType markerType : markerTypes){\r
+                whereQueryString += " OR ( marker.markerType.id = " + markerType.getId() + " AND marker.flag is true)";\r
+\r
+            }\r
+            whereQueryString += ") ";\r
+        }\r
+\r
+        return fromQueryString + whereQueryString;\r
+\r
+    }\r
+\r
+    /* (non-Javadoc)\r
+     * @see eu.etaxonomy.cdm.persistence.dao.description.IDescriptionDao#listNamedAreasInUse(java.lang.Integer, java.lang.Integer, java.util.List)\r
+     */\r
+    @Override\r
+    public List<NamedArea> listNamedAreasInUse(Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
+\r
+        String queryString = "select distinct d.area from Distribution as d";\r
+        Query query = getSession().createQuery(queryString);\r
+\r
+        if(pageSize != null) {\r
+            query.setMaxResults(pageSize);\r
+            if(pageNumber != null) {\r
+                query.setFirstResult(pageNumber * pageSize);\r
+            }\r
+        }\r
+\r
+        List<NamedArea> results = query.list();\r
 \r
-        List<T> results = (List<T>) query.list();\r
         defaultBeanInitializer.initializeAll(results, propertyPaths);\r
 \r
         return results;\r
     }\r
+\r
+\r
+\r
 }\r