merge trunk to hibernate4
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / hibernate / reference / ReferenceDaoHibernateImpl.java
index b2842030362483b790a683a945f8c3d238acbb80..df4035e94835ff99432260c84a8373f3e69a7eaf 100644 (file)
@@ -1,15 +1,17 @@
 /**\r
 * Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
+* European Distributed Institute of Taxonomy\r
 * http://www.e-taxonomy.eu\r
-* \r
+*\r
 * The contents of this file are subject to the Mozilla Public License Version 1.1\r
 * See LICENSE.TXT at the top of this package for the full license terms.\r
 */\r
 package eu.etaxonomy.cdm.persistence.dao.hibernate.reference;\r
 \r
 import java.util.ArrayList;\r
+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
@@ -22,31 +24,19 @@ import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Repository;\r
 \r
 import eu.etaxonomy.cdm.model.common.UuidAndTitleCache;\r
-import eu.etaxonomy.cdm.model.reference.Article;\r
-import eu.etaxonomy.cdm.model.reference.Book;\r
-import eu.etaxonomy.cdm.model.reference.BookSection;\r
-import eu.etaxonomy.cdm.model.reference.CdDvd;\r
-import eu.etaxonomy.cdm.model.reference.Database;\r
-import eu.etaxonomy.cdm.model.reference.Generic;\r
 import eu.etaxonomy.cdm.model.reference.IArticle;\r
 import eu.etaxonomy.cdm.model.reference.IBookSection;\r
 import eu.etaxonomy.cdm.model.reference.IInProceedings;\r
 import eu.etaxonomy.cdm.model.reference.IPrintedUnitBase;\r
 import eu.etaxonomy.cdm.model.reference.IReport;\r
 import eu.etaxonomy.cdm.model.reference.IThesis;\r
-import eu.etaxonomy.cdm.model.reference.InProceedings;\r
-import eu.etaxonomy.cdm.model.reference.Journal;\r
-import eu.etaxonomy.cdm.model.reference.Map;\r
-import eu.etaxonomy.cdm.model.reference.Patent;\r
-import eu.etaxonomy.cdm.model.reference.PersonalCommunication;\r
-import eu.etaxonomy.cdm.model.reference.Proceedings;\r
-import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.reference.Reference;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceType;\r
-import eu.etaxonomy.cdm.model.reference.Report;\r
-import eu.etaxonomy.cdm.model.reference.Thesis;\r
-import eu.etaxonomy.cdm.model.reference.WebPage;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase;\r
 import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
+import eu.etaxonomy.cdm.strategy.cache.reference.ReferenceBaseDefaultCacheStrategy;\r
 \r
 /**\r
  * @author a.mueller\r
@@ -54,38 +44,20 @@ import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao;
  */\r
 @Repository\r
 @Qualifier("referenceDaoHibernateImpl")\r
-public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase<ReferenceBase> implements IReferenceDao {\r
-               \r
-       @SuppressWarnings("unused")\r
+public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase<Reference> implements IReferenceDao {\r
        private static final Logger logger = Logger.getLogger(ReferenceDaoHibernateImpl.class);\r
 \r
        public ReferenceDaoHibernateImpl() {\r
-               super(ReferenceBase.class);\r
-               indexedClasses = new Class[15];\r
-               indexedClasses[0] = Article.class;\r
-               indexedClasses[1] = Patent.class;\r
-               indexedClasses[2] = PersonalCommunication.class;\r
-               indexedClasses[3] = BookSection.class;\r
-               indexedClasses[4] = InProceedings.class;\r
-               indexedClasses[5] = CdDvd.class;\r
-               indexedClasses[6] = Database.class;\r
-               indexedClasses[7] = Generic.class;\r
-               indexedClasses[8] = Journal.class;\r
-               indexedClasses[9] = Map.class;\r
-               indexedClasses[10] = WebPage.class;\r
-               indexedClasses[11] = Book.class;\r
-               indexedClasses[12] = Proceedings.class;\r
-               indexedClasses[13] = Report.class;\r
-               indexedClasses[14] = Thesis.class;\r
+               super(Reference.class);\r
        }\r
 \r
        @Override\r
        public void rebuildIndex() {\r
-        FullTextSession fullTextSession = Search.getFullTextSession(getSession());\r
-               \r
-               for(ReferenceBase reference : list(null,null)) { // re-index all agents\r
+               FullTextSession fullTextSession = Search.getFullTextSession(getSession());\r
+\r
+               for(Reference reference : list(null,null)) { // re-index all agents\r
                        Hibernate.initialize(reference.getAuthorTeam());\r
-                       \r
+\r
                        if(reference.getType().equals(ReferenceType.Article)) {\r
                                Hibernate.initialize(((IArticle)reference).getInJournal());\r
                        } else if(reference.getType().equals(ReferenceType.BookSection)) {\r
@@ -96,7 +68,7 @@ public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase<ReferenceBase
                                Hibernate.initialize(((IThesis)reference).getSchool());\r
                        } else if(reference.getType().equals(ReferenceType.Report)) {\r
                                Hibernate.initialize(((IReport)reference).getInstitution());\r
-                       } else if(reference.getType().equals(ReferenceType.PrintedUnitBase)) {\r
+                       } else if(reference.getType().isPrintedUnit()) {\r
                                Hibernate.initialize(((IPrintedUnitBase)reference).getInSeries());\r
                        }\r
                        fullTextSession.index(reference);\r
@@ -104,43 +76,166 @@ public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase<ReferenceBase
                fullTextSession.flushToIndexes();\r
        }\r
 \r
-       public List<UuidAndTitleCache<ReferenceBase>> getUuidAndTitle(){\r
-               List<UuidAndTitleCache<ReferenceBase>> list = new ArrayList<UuidAndTitleCache<ReferenceBase>>();\r
+       @Override\r
+    public List<UuidAndTitleCache<Reference>> getUuidAndTitle(){\r
+               List<UuidAndTitleCache<Reference>> list = new ArrayList<UuidAndTitleCache<Reference>>();\r
                Session session = getSession();\r
-               \r
-               Query query = session.createQuery("select uuid, title from " + type.getSimpleName());\r
-               \r
+\r
+               Query query = session.createQuery("select uuid, titleCache from " + type.getSimpleName());\r
+\r
                List<Object[]> result = query.list();\r
-               \r
+\r
                for(Object[] object : result){\r
-                       list.add(new UuidAndTitleCache<ReferenceBase>(type, (UUID) object[0], (String) object[1]));\r
+                       list.add(new UuidAndTitleCache<Reference>(type, (UUID) object[0], (String) object[1]));\r
                }\r
-               \r
+\r
                return list;\r
        }\r
-       \r
-       public List<ReferenceBase> getAllReferencesForPublishing(){\r
-               List<ReferenceBase> references = getSession().createQuery("Select r from ReferenceBase r "+\r
+\r
+       @Override\r
+       public List<UuidAndTitleCache<Reference>> getUuidAndTitleCache() {\r
+               List<UuidAndTitleCache<Reference>> list = new ArrayList<UuidAndTitleCache<Reference>>();\r
+               Session session = getSession();\r
+\r
+               Query query = session.createQuery("select " +\r
+                               "r.uuid, r.titleCache, ab.titleCache from " + type.getSimpleName() + " as r left outer join r.authorTeam as ab ");//"select uuid, titleCache from " + type.getSimpleName());\r
+\r
+               List<Object[]> result = query.list();\r
+\r
+               for(Object[] object : result){\r
+                       UuidAndTitleCache<Reference> uuidAndTitleCache;\r
+                       String referenceTitle = (String) object[1];\r
+\r
+                       if(referenceTitle != null){\r
+                               String teamTitle = (String) object[2];\r
+                               referenceTitle = ReferenceBaseDefaultCacheStrategy.putAuthorToEndOfString(referenceTitle, teamTitle);\r
+\r
+                               list.add(new UuidAndTitleCache<Reference>(Reference.class, (UUID) object[0], referenceTitle));\r
+                       }else{\r
+                               logger.error("title cache of reference is null. UUID: " + object[0]);\r
+                       }\r
+               }\r
+\r
+               return list;\r
+       }\r
+\r
+       @Override\r
+    public List<Reference> getAllReferencesForPublishing(){\r
+               List<Reference> references = getSession().createQuery("Select r from Reference r "+\r
                                "where r.id IN "+\r
                                        "(Select m.markedObj.id from Marker m where "+\r
                                                "m.markerType.id = "+\r
                                                        "(Select dtb.id from DefinedTermBase dtb, Representation r where r member of dtb.representations and r.text='publish'))").list();\r
                return references;\r
        }\r
-       \r
-       public List<ReferenceBase> getAllNotNomenclaturalReferencesForPublishing(){\r
-               \r
-               List<ReferenceBase> references = getSession().createQuery("select t.nomenclaturalReference from TaxonNameBase t").list();\r
-               String queryString = "from ReferenceBase b where b not in (:referenceList) and b in (:publish)" ;\r
+\r
+       @Override\r
+    public List<Reference> getAllNotNomenclaturalReferencesForPublishing(){\r
+\r
+               List<Reference> references = getSession().createQuery("select t.nomenclaturalReference from TaxonNameBase t").list();\r
+               String queryString = "from Reference b where b not in (:referenceList) and b in (:publish)" ;\r
                Query referenceQuery = getSession().createQuery(queryString).setParameterList("referenceList", references);\r
                referenceQuery.setParameterList("publish", getAllReferencesForPublishing());\r
-               List<ReferenceBase> resultRefernces =referenceQuery.list();\r
-                               \r
+               List<Reference> resultRefernces =referenceQuery.list();\r
+\r
                return resultRefernces;\r
        }\r
-public List<ReferenceBase> getAllNomenclaturalReferences(){\r
-               \r
-               List<ReferenceBase> references = getSession().createQuery("select t.nomenclaturalReference from TaxonNameBase t").list();\r
+\r
+       // the result list held doubles therefore i put a "distinct" in the query string\r
+       @Override\r
+    public List<Reference> getAllNomenclaturalReferences() {\r
+               List<Reference> references = getSession().createQuery(\r
+                               "select distinct t.nomenclaturalReference from TaxonNameBase t").list();\r
                return references;\r
        }\r
+\r
+       @Override\r
+       public List<Reference> getSubordinateReferences(\r
+                       Reference reference) {\r
+\r
+               List<Reference> references = new ArrayList();\r
+               List<Reference> subordinateReferences = new ArrayList();\r
+\r
+               Query query = getSession().createQuery("select r from Reference r where r.inReference = (:reference)");\r
+               query.setParameter("reference", reference);\r
+               references.addAll(query.list());\r
+               for(Reference ref : references){\r
+                       subordinateReferences.addAll(getSubordinateReferences(ref));\r
+               }\r
+               references.addAll(subordinateReferences);\r
+               return references;\r
+       }\r
+\r
+       @Override\r
+       public List<TaxonBase> listCoveredTaxa(Reference reference, boolean includeSubordinateReferences, List<OrderHint> orderHints, List<String> propertyPaths) {\r
+\r
+               /*\r
+                * <li>taxon.name.nomenclaturalreference</li>\r
+                * <li>taxon.descriptions.descriptionElement.sources.citation</li>\r
+                * <li>taxon.descriptions.descriptionSources</li>\r
+                * <li>taxon.name.descriptions.descriptionElement.sources</li>\r
+                * <li>taxon.name.descriptions.descriptionSources</li>\r
+                */\r
+\r
+               //TODO implement search in nameDescriptions\r
+               List<TaxonBase> taxonBaseList = new ArrayList<TaxonBase>();\r
+               Set<Reference> referenceSet = new HashSet<Reference>();\r
+               referenceSet.add(reference);\r
+               if(includeSubordinateReferences){\r
+                       referenceSet.addAll(getSubordinateReferences(reference));\r
+               }\r
+\r
+\r
+               StringBuilder taxonDescriptionSql = new StringBuilder();\r
+               taxonDescriptionSql.append(\r
+                       "select distinct t from Taxon t " +\r
+                       // TaxonDescription\r
+                       "left join t.descriptions td " +\r
+                       "left join td.descriptionSources td_s " +\r
+                       "left join td.descriptionElements td_e " +\r
+                       "left join td_e.sources td_e_s " +\r
+                       // TaxonNameDescription\r
+                       "left join t.name n " +\r
+                       "left join n.descriptions nd " +\r
+                       "left join nd.descriptionSources nd_s " +\r
+                       "left join nd.descriptionElements nd_e " +\r
+                       "left join nd_e.sources nd_e_s " +\r
+\r
+                       "where td_e_s.citation in (:referenceBase_1) " +\r
+                       "or td_s in (:referenceBase_2) " +\r
+                       "or nd_e_s.citation in (:referenceBase_3) " +\r
+                       "or nd_s in (:referenceBase_4) or " +\r
+                       "n.nomenclaturalReference in (:referenceBase_5) or " +\r
+                       "t.sec in (:referenceBase_6)"\r
+                       );\r
+\r
+               if (orderHints != null && orderHints.size() > 0){\r
+                   taxonDescriptionSql.append(" order by ");\r
+                   int i = 0;\r
+                   for (OrderHint hint : orderHints) {\r
+                       if(i > 0) {\r
+                           taxonDescriptionSql.append(", ");\r
+                       }\r
+                       taxonDescriptionSql.append("t.").append(hint.toHql());\r
+            }\r
+               }\r
+\r
+               // TODO include:\r
+               // name relations\r
+               // taxon relations\r
+\r
+               Query query = getSession().createQuery(taxonDescriptionSql.toString());\r
+               query.setParameterList("referenceBase_1", referenceSet);\r
+               query.setParameterList("referenceBase_2", referenceSet);\r
+               query.setParameterList("referenceBase_3", referenceSet);\r
+               query.setParameterList("referenceBase_4", referenceSet);\r
+               query.setParameterList("referenceBase_5", referenceSet);\r
+               query.setParameterList("referenceBase_6", referenceSet);\r
+\r
+               taxonBaseList = query.list();\r
+\r
+               defaultBeanInitializer.initializeAll(taxonBaseList, propertyPaths);\r
+\r
+               return taxonBaseList;\r
+       }\r
 }
\ No newline at end of file