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
import org.springframework.beans.factory.annotation.Qualifier;\r
import org.springframework.stereotype.Repository;\r
\r
-import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;\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.strategy.cache.reference.ReferenceBaseDefaultCacheStrategy;\r
\r
/**\r
* @author a.mueller\r
*/\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
+ FullTextSession fullTextSession = Search.getFullTextSession(getSession());\r
\r
- for(ReferenceBase reference : list(null,null)) { // re-index all agents\r
+ for(Reference reference : list(null,null)) { // re-index all agents\r
Hibernate.initialize(reference.getAuthorTeam());\r
\r
if(reference.getType().equals(ReferenceType.Article)) {\r
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
fullTextSession.flushToIndexes();\r
}\r
\r
- public List<UuidAndTitleCache<ReferenceBase>> getUuidAndTitle(){\r
- List<UuidAndTitleCache<ReferenceBase>> list = new ArrayList<UuidAndTitleCache<ReferenceBase>>();\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, titleCache from " + type.getSimpleName());\r
List<Object[]> result = query.list();\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
return list;\r
}\r
\r
@Override\r
- public List<UuidAndTitleCache<ReferenceBase>> getUuidAndTitleCache() {\r
- List<UuidAndTitleCache<ReferenceBase>> list = new ArrayList<UuidAndTitleCache<ReferenceBase>>();\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.uuid, r.titleCache, ab.titleCache from " + type.getSimpleName() + " as r join r.authorTeam as ab ");//"select uuid, titleCache from " + type.getSimpleName());\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<ReferenceBase> uuidAndTitleCache;\r
+ UuidAndTitleCache<Reference> uuidAndTitleCache;\r
String referenceTitle = (String) object[1];\r
\r
if(referenceTitle != null){ \r
String teamTitle = (String) object[2];\r
- if(teamTitle != null){\r
- referenceTitle = referenceTitle.replace(teamTitle + ", ", "");\r
- referenceTitle += " - " + teamTitle;\r
- }\r
- list.add(new UuidAndTitleCache<ReferenceBase>(ReferenceBase.class, (UUID) object[0], referenceTitle));\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
return list;\r
}\r
\r
- public List<ReferenceBase> getAllReferencesForPublishing(){\r
- List<ReferenceBase> references = getSession().createQuery("Select r from ReferenceBase r "+\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
return references;\r
}\r
\r
- public List<ReferenceBase> getAllNotNomenclaturalReferencesForPublishing(){\r
+ public List<Reference> 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
+ 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
+ List<Reference> resultRefernces =referenceQuery.list();\r
\r
return resultRefernces;\r
}\r
-public List<ReferenceBase> getAllNomenclaturalReferences(){\r
+ \r
+ // the result list held doubles therefore i put a "distinct" in the query string\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
- List<ReferenceBase> references = getSession().createQuery("select t.nomenclaturalReference from TaxonNameBase t").list();\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<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
+ String taxonDescriptionSql = \r
+ \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
+ // TODO include:\r
+ // name relations\r
+ // taxon relations\r
+ \r
+ Query query2 = getSession().createQuery(taxonDescriptionSql);\r
+ query2.setParameterList("referenceBase_1", referenceSet);\r
+ query2.setParameterList("referenceBase_2", referenceSet);\r
+ query2.setParameterList("referenceBase_3", referenceSet);\r
+ query2.setParameterList("referenceBase_4", referenceSet);\r
+ query2.setParameterList("referenceBase_5", referenceSet);\r
+ query2.setParameterList("referenceBase_6", referenceSet);\r
+ \r
+ taxonBaseList = query2.list();\r
+ \r
+ defaultBeanInitializer.initializeAll(taxonBaseList, propertyPaths);\r
+ \r
+ return taxonBaseList;\r
+ }\r
}
\ No newline at end of file