package eu.etaxonomy.cdm.persistence.dao.hibernate.taxon;\r
\r
import java.util.ArrayList;\r
+import java.util.Iterator;\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.Query;\r
+import org.hibernate.Session;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
import org.springframework.beans.factory.annotation.Qualifier;\r
import org.springframework.stereotype.Repository;\r
\r
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
import eu.etaxonomy.cdm.model.name.Rank;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;\r
import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase;\r
+import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;\r
+import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonNodeDao;\r
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonomicTreeDao;\r
\r
/**\r
@SuppressWarnings("unused")\r
private static final Logger logger = Logger.getLogger(TaxonomicTreeDaoHibernateImpl.class);\r
\r
+ @Autowired\r
+ private ITaxonNodeDao taxonNodeDao;\r
+ \r
public TaxonomicTreeDaoHibernateImpl() {\r
super(TaxonomicTree.class);\r
indexedClasses = new Class[1];\r
indexedClasses[0] = TaxonomicTree.class;\r
}\r
\r
+ @SuppressWarnings("unchecked")\r
public List<TaxonNode> loadRankSpecificRootNodes(TaxonomicTree taxonomicTree, Rank rank, List<String> propertyPaths){\r
- String hql = "SELECT tn FROM TaxonNode tn LEFT JOIN tn.childNodes as ctn" +\r
+ List<TaxonNode> results;\r
+ if(rank == null){\r
+ taxonomicTree = load(taxonomicTree.getUuid());\r
+ results = new ArrayList(); \r
+ results.addAll(taxonomicTree.getChildNodes());\r
+ } else {\r
+ String hql = "SELECT DISTINCT tn FROM TaxonNode tn LEFT JOIN tn.childNodes as ctn" +\r
" WHERE tn.taxonomicTree = :tree AND (" +\r
" tn.taxon.name.rank = :rank" +\r
- " OR (tn.taxon.name.rank < :rank AND tn.parent = null)" +\r
- " OR (tn.taxon.name.rank > :rank AND ctn.taxon.name.rank < :rank)" +\r
+ " OR (tn.taxon.name.rank.orderIndex > :rankOrderIndex AND tn.parent = null)" +\r
+ " OR (tn.taxon.name.rank.orderIndex < :rankOrderIndex AND ctn.taxon.name.rank.orderIndex > :rankOrderIndex)" +\r
" )";\r
- Query query = getSession().createQuery(hql);\r
- query.setParameter("rank", rank);\r
- query.setParameter("tree", taxonomicTree);\r
- List<TaxonNode> results = query.list();\r
+ Query query = getSession().createQuery(hql);\r
+ query.setParameter("rank", rank);\r
+ query.setParameter("rankOrderIndex", rank.getOrderIndex());\r
+ query.setParameter("tree", taxonomicTree);\r
+ results = query.list();\r
+ }\r
defaultBeanInitializer.initializeAll(results, propertyPaths);\r
return results;\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public UUID delete(TaxonomicTree persistentObject){\r
+ //delete all childnodes, then delete the tree\r
+ \r
+ Set<TaxonNode> nodes = persistentObject.getChildNodes();\r
+ Iterator<TaxonNode> nodesIterator = nodes.iterator();\r
+ \r
+ while(nodesIterator.hasNext()){\r
+ TaxonNode node = nodesIterator.next();\r
+ taxonNodeDao.delete(node);\r
+ }\r
+ \r
+ super.delete(persistentObject);\r
+ \r
+ return persistentObject.getUuid();\r
}\r
+\r
\r
\r
}\r