new implementation for Xper data fetching from persistence and some further changes...
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / hibernate / description / WorkingSetDao.java
index 83a83b7ed4570bc26f53121b20de740beda3e8fc..e90999bb8c22be84b4dd6753a081cf80b1f47aca 100644 (file)
@@ -1,35 +1,40 @@
 package eu.etaxonomy.cdm.persistence.dao.hibernate.description;\r
 \r
-import java.util.ArrayList;\r
+import java.awt.datatransfer.StringSelection;\r
+import java.util.Formatter;\r
 import java.util.HashMap;\r
 import java.util.HashSet;\r
 import java.util.List;\r
 import java.util.Map;\r
 import java.util.Set;\r
+import java.util.UUID;\r
 \r
+import org.apache.log4j.Logger;\r
 import org.hibernate.Criteria;\r
+import org.hibernate.HibernateException;\r
 import org.hibernate.Query;\r
 import org.hibernate.criterion.Restrictions;\r
-import org.hibernate.envers.query.AuditEntity;\r
-import org.hibernate.envers.query.AuditQuery;\r
 import org.springframework.beans.factory.annotation.Qualifier;\r
+import org.springframework.dao.DataAccessException;\r
 import org.springframework.stereotype.Repository;\r
 \r
+import eu.etaxonomy.cdm.model.common.UuidAndTitleCache;\r
+import eu.etaxonomy.cdm.model.description.CategoricalData;\r
 import eu.etaxonomy.cdm.model.description.DescriptionBase;\r
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
+import eu.etaxonomy.cdm.model.description.DescriptiveSystemRole;\r
 import eu.etaxonomy.cdm.model.description.Feature;\r
+import eu.etaxonomy.cdm.model.description.QuantitativeData;\r
 import eu.etaxonomy.cdm.model.description.WorkingSet;\r
-import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
-import eu.etaxonomy.cdm.model.view.AuditEvent;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.persistence.dao.description.IWorkingSetDao;\r
 import eu.etaxonomy.cdm.persistence.dao.hibernate.common.AnnotatableDaoImpl;\r
-import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 \r
 @Repository \r
 @Qualifier("workingSetDaoImpl")\r
 public class WorkingSetDao extends AnnotatableDaoImpl<WorkingSet> implements IWorkingSetDao {\r
-\r
+       private static final Logger logger = Logger.getLogger(WorkingSetDao.class);\r
+       \r
        public WorkingSetDao() {\r
                super(WorkingSet.class);\r
        }\r
@@ -61,4 +66,96 @@ public class WorkingSetDao extends AnnotatableDaoImpl<WorkingSet> implements IWo
                }\r
                return result;\r
        }\r
+\r
+//     @Override\r
+       public <T extends DescriptionElementBase> Map<UuidAndTitleCache, Map<UUID, Set<T>>> getTaxonFeatureDescriptionElementMap(Class<T> clazz, UUID workingSetUuid, DescriptiveSystemRole role, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
+               //TODO\r
+               checkNotInPriorView("WorkingSetDao.getTaxonFeatureDescriptionElementMap(WorkingSet workingSet, Set<Feature> features, Integer pageSize,Integer pageNumber, List<OrderHint> orderHints,  List<String> propertyPaths)");\r
+               Map<UuidAndTitleCache, Map<UUID, Set<T>>> result = new HashMap<UuidAndTitleCache, Map<UUID, Set<T>>>();\r
+               try {\r
+                       \r
+                       //for maps see\r
+//                     http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html\r
+//                     Elements of indexed collections (arrays, lists, and maps) can be referred to by index in a where clause only:\r
+//\r
+//                     Example: from Order order where order.items[0].id = 1234\r
+\r
+                       \r
+                       //feature\r
+                       String strQueryTreeId = "SELECT ws.descriptiveSystem.id FROM WorkingSet ws join ws.descriptiveSystem tree WHERE ws.uuid = :workingSetUuid ";\r
+                       Query queryTree = getSession().createQuery(strQueryTreeId);\r
+                       queryTree.setParameter("workingSetUuid", workingSetUuid);\r
+                       List<?> trees = queryTree.list();\r
+\r
+                       \r
+                       String ftSelect = "SELECT feature.id FROM FeatureNode node join node.feature as feature " +\r
+                                       " WHERE node.featureTree.id in (:trees) ";\r
+                       Query ftQuery = getSession().createQuery(ftSelect);\r
+                       ftQuery.setParameterList("trees", trees);\r
+                       List<?> features = ftQuery.list();\r
+\r
+                       String strClass = (clazz == null )? "DescriptionElementBase" : clazz.getSimpleName();\r
+                       \r
+                       String fetch = "";\r
+                       if (clazz.equals(CategoricalData.class)){\r
+                               fetch = " left join fetch el.states stateList join fetch stateList.state ";\r
+                       }else if (clazz.equals(QuantitativeData.class)){\r
+                               fetch = " left join fetch el.statisticalValues valueList join fetch valueList.type ";\r
+                       }\r
+                       \r
+                       String strQuery = " select taxon.uuid, taxon.titleCache, feature.uuid, el "\r
+                               + " from " + strClass + " el " \r
+                               + " join el.feature feature "\r
+                               + " join el.inDescription d " \r
+                               + " join d.taxon taxon "\r
+                               + " join d.workingSets ws "\r
+                               + " join ws.descriptiveSystem ftree "\r
+                               + fetch\r
+                               + " where ws.uuid = :workingSetUuid "\r
+                                       + " and el.class = :clazz "\r
+                                       + " and feature.id in (:features)  "\r
+                               + " order by taxon.uuid asc, feature.uuid asc"\r
+                               ;\r
+//                     System.out.println(strQuery);\r
+                       Query query = getSession().createQuery(strQuery);\r
+                                       \r
+                       \r
+\r
+                       query.setParameter("workingSetUuid", workingSetUuid);\r
+                       query.setParameter("clazz", clazz.getSimpleName());\r
+                       query.setParameterList("features", features);\r
+                       \r
+                       List<Object[]> list = query.list();\r
+                       logger.warn("Retrieved data for " + clazz == null? "Structured Data":clazz.getSimpleName());\r
+                       for (Object[] listEntry : list){\r
+                               UUID taxonUuid = (UUID)listEntry[0];\r
+                               String titleCache = (String)listEntry[1];\r
+                               UuidAndTitleCache taxon = new UuidAndTitleCache(taxonUuid, titleCache);\r
+                               UUID featureUuid = (UUID)listEntry[2];\r
+                               T data = (T)listEntry[3];\r
+                               Map<UUID, Set<T>> taxonMap = result.get(taxon);\r
+                               if (taxonMap == null){\r
+                                       taxonMap = new HashMap<UUID, Set<T>>();\r
+                                       result.put(taxon, taxonMap);\r
+                               }\r
+                               Set<T> featureSet = taxonMap.get(featureUuid);\r
+                               if (featureSet == null){\r
+                                       featureSet = new HashSet<T>();\r
+                                       taxonMap.put(featureUuid, featureSet);\r
+                               }else{\r
+                                       if (logger.isDebugEnabled()){logger.debug("feature set already exists");}\r
+                               }\r
+                               featureSet.add(data);\r
+                               \r
+                       }\r
+                       logger.warn("Filled resultset");\r
+                       \r
+//                     defaultBeanInitializer.initialize(\r
+                                       \r
+                       return result;\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+                       throw new RuntimeException(e);\r
+               } \r
+       }\r
 }\r