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
}\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