From 4532d825c697caf5e98bec67a777495349bf28a9 Mon Sep 17 00:00:00 2001 From: "ben.clark" Date: Fri, 18 Dec 2009 10:33:28 +0000 Subject: [PATCH] Refactored free text search to re-use the same code for all identifiable entities. Switched to StandardAnalyzer to include indexing of numbers. Removed redundant code from taxonDao.delete() method (as included entities deleted using hibernate's cascade method) --- .../cdm/persistence/dao/agent/IAgentDao.java | 3 +- .../dao/common/IIdentifiableDao.java | 2 +- .../dao/common/IVersionableDao.java | 4 +- .../dao/hibernate/agent/AgentDaoImpl.java | 105 --------- .../hibernate/common/CdmEntityDaoBase.java | 28 ++- .../hibernate/common/DefinedTermDaoImpl.java | 62 ++++++ .../hibernate/common/IdentifiableDaoBase.java | 102 ++++++++- .../common/TermVocabularyDaoImpl.java | 5 +- .../hibernate/common/VersionableDaoBase.java | 12 +- .../description/DescriptionDaoImpl.java | 5 + .../DescriptionElementDaoImpl.java | 12 +- .../description/FeatureTreeDaoImpl.java | 4 + .../media/MediaDaoHibernateImpl.java | 97 +-------- .../name/TaxonNameDaoHibernateImpl.java | 104 --------- .../CollectionDaoHibernateImpl.java | 89 +------- .../OccurrenceDaoHibernateImpl.java | 99 +-------- .../reference/ReferenceDaoHibernateImpl.java | 119 ++-------- .../taxon/TaxonDaoHibernateImpl.java | 203 +----------------- .../taxon/TaxonomicTreeDaoHibernateImpl.java | 2 + .../cdm/persistence/dao/media/IMediaDao.java | 7 +- .../persistence/dao/name/ITaxonNameDao.java | 8 +- .../dao/occurrence/ICollectionDao.java | 3 +- .../dao/occurrence/IOccurrenceDao.java | 3 +- .../dao/reference/IReferenceDao.java | 3 +- .../cdm/persistence/dao/taxon/ITaxonDao.java | 26 +-- .../cdm/persistence/query/OrderHint.java | 56 +++-- .../cdm/persistence/query/RandomOrder.java | 4 +- .../dao/hibernate/agent/AgentDaoImplTest.java | 6 + .../taxon/TaxonDaoHibernateImplTest.java | 6 +- .../hibernate/CdmDeleteListenerTest.java | 33 +-- .../hibernate/CdmDeleteListenerTest.xml | 1 - 31 files changed, 327 insertions(+), 886 deletions(-) diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/agent/IAgentDao.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/agent/IAgentDao.java index 1873f49819..8c2c11be53 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/agent/IAgentDao.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/agent/IAgentDao.java @@ -20,9 +20,8 @@ import eu.etaxonomy.cdm.model.agent.Team; import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase; import eu.etaxonomy.cdm.model.common.UuidAndTitleCache; import eu.etaxonomy.cdm.persistence.dao.common.IIdentifiableDao; -import eu.etaxonomy.cdm.persistence.dao.common.ISearchableDao; -public interface IAgentDao extends IIdentifiableDao, ISearchableDao { +public interface IAgentDao extends IIdentifiableDao { public List getInstitutionByCode(String code); diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/common/IIdentifiableDao.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/common/IIdentifiableDao.java index 122a6034ce..0f62514efc 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/common/IIdentifiableDao.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/common/IIdentifiableDao.java @@ -22,7 +22,7 @@ import eu.etaxonomy.cdm.persistence.dao.BeanInitializer; import eu.etaxonomy.cdm.persistence.query.MatchMode; import eu.etaxonomy.cdm.persistence.query.OrderHint; -public interface IIdentifiableDao extends IAnnotatableDao, ITitledDao{ +public interface IIdentifiableDao extends IAnnotatableDao, ITitledDao, ISearchableDao{ /** * Return an object by LSID. NOTE: Because of the fact that LSIDs are supposed to diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/common/IVersionableDao.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/common/IVersionableDao.java index a72f05349b..6d44fc43f4 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/common/IVersionableDao.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/common/IVersionableDao.java @@ -46,7 +46,7 @@ public interface IVersionableDao extends ICdmEntity * @param sort should the events considered start now and go forward in time (AuditEventSort.FORWARDS) or backwards (AuditEventSort.BACKWARDS) * @return a count of audit events */ - public Integer countAuditEvents(T t, AuditEventSort sort); + public int countAuditEvents(T t, AuditEventSort sort); /** * A convenience method which returns a record of the next (relative to the audit event in context) @@ -76,7 +76,7 @@ public interface IVersionableDao extends ICdmEntity * @param criteria Extra criteria to filter by * @return the count of audit events */ - public Integer countAuditEvents(Class clazz,AuditEvent from,AuditEvent to,List criteria); + public int countAuditEvents(Class clazz,AuditEvent from,AuditEvent to,List criteria); /** * Returns a list of all audit events occurring to objects of type T, optionally restricted to objects of type clazz diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/agent/AgentDaoImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/agent/AgentDaoImpl.java index e3897d3a7d..97861cf4e2 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/agent/AgentDaoImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/agent/AgentDaoImpl.java @@ -14,18 +14,12 @@ import java.util.List; import java.util.UUID; import org.apache.log4j.Logger; -import org.apache.lucene.analysis.SimpleAnalyzer; -import org.apache.lucene.queryParser.ParseException; -import org.apache.lucene.queryParser.QueryParser; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.query.AuditQuery; -import org.hibernate.search.FullTextSession; -import org.hibernate.search.Search; -import org.hibernate.search.SearchFactory; import org.springframework.stereotype.Repository; import eu.etaxonomy.cdm.model.agent.Address; @@ -37,19 +31,13 @@ import eu.etaxonomy.cdm.model.agent.Team; import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase; import eu.etaxonomy.cdm.model.common.UuidAndTitleCache; import eu.etaxonomy.cdm.model.view.AuditEvent; -import eu.etaxonomy.cdm.persistence.dao.QueryParseException; import eu.etaxonomy.cdm.persistence.dao.agent.IAgentDao; import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase; -import eu.etaxonomy.cdm.persistence.query.OrderHint; @Repository public class AgentDaoImpl extends IdentifiableDaoBase implements IAgentDao{ - private String defaultField = "titleCache"; - private Class indexedClasses[]; - - @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(AgentDaoImpl.class); @@ -134,99 +122,6 @@ public class AgentDaoImpl extends IdentifiableDaoBase implements IAge return (List
)query.list(); } - - - public int count(Class clazz, String queryString) { - checkNotInPriorView("AgentDaoHibernateImpl.count(String queryString, Boolean accepted)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); - - try { - org.apache.lucene.search.Query query = queryParser.parse(queryString); - - FullTextSession fullTextSession = Search.getFullTextSession(this.getSession()); - org.hibernate.search.FullTextQuery fullTextQuery = null; - - if(clazz == null) { - fullTextQuery = fullTextSession.createFullTextQuery(query, type); - } else { - fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); - } - - Integer result = fullTextQuery.getResultSize(); - return result; - - } catch (ParseException e) { - throw new QueryParseException(e, queryString); - } - } - - public void purgeIndex() { - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - for(Class clazz : indexedClasses) { - fullTextSession.purgeAll(clazz); // remove all taxon base from indexes - } - fullTextSession.flushToIndexes(); - } - - public void rebuildIndex() { - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - - for(AgentBase agentBase : list(null,null)) { // re-index all agents - fullTextSession.index(agentBase); - } - fullTextSession.flushToIndexes(); - } - - public List search(Class clazz, String queryString, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { - checkNotInPriorView("AgentDaoHibernateImpl.searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); - List results = new ArrayList(); - - try { - org.apache.lucene.search.Query query = queryParser.parse(queryString); - - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - org.hibernate.search.FullTextQuery fullTextQuery = null; - - if(clazz == null) { - fullTextQuery = fullTextSession.createFullTextQuery(query, type); - } else { - fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); - } - - addOrder(fullTextQuery,orderHints); - - if(pageSize != null) { - fullTextQuery.setMaxResults(pageSize); - if(pageNumber != null) { - fullTextQuery.setFirstResult(pageNumber * pageSize); - } else { - fullTextQuery.setFirstResult(0); - } - } - - List result = (List)fullTextQuery.list(); - defaultBeanInitializer.initializeAll(result, propertyPaths); - return result; - - } catch (ParseException e) { - throw new QueryParseException(e, queryString); - } - } - - public String suggestQuery(String string) { - throw new UnsupportedOperationException("suggestQuery is not supported for AgentBase"); - } - - public void optimizeIndex() { - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - SearchFactory searchFactory = fullTextSession.getSearchFactory(); - for(Class clazz : indexedClasses) { - searchFactory.optimize(clazz); // optimize the indices () - } - fullTextSession.flushToIndexes(); - } - /* (non-Javadoc) * @see eu.etaxonomy.cdm.persistence.dao.agent.IAgentDao#getTeamOrPersonBaseUuidAndNomenclaturalTitle() */ diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/CdmEntityDaoBase.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/CdmEntityDaoBase.java index b53405350a..db654df204 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/CdmEntityDaoBase.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/CdmEntityDaoBase.java @@ -11,6 +11,8 @@ package eu.etaxonomy.cdm.persistence.dao.hibernate.common; import java.lang.reflect.Field; import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -188,6 +190,17 @@ public abstract class CdmEntityDaoBase extends DaoBase implem } public UUID delete(T persistentObject) throws DataAccessException { + if (persistentObject == null){ + logger.warn(type.getName() + " was 'null'"); + return null; + } + + // Merge the object in if it is detached + // + // I think this is preferable to catching lazy initialization errors + // as that solution only swallows and hides the exception, but doesn't + // actually solve it. + getSession().merge(persistentObject); getSession().delete(persistentObject); return persistentObject.getUuid(); } @@ -367,10 +380,23 @@ public abstract class CdmEntityDaoBase extends DaoBase implem } + private class OrderHintComparator implements Comparator { + + public int compare(OrderHint o1, OrderHint o2) { + return o1.getPropertyName().compareTo(o2.getPropertyName()); + } + + } + protected void addOrder(Criteria criteria, List orderHints) { + if(orderHints != null){ + Collections.sort(orderHints, new OrderHintComparator()); + + Map criteriaMap = new HashMap(); for(OrderHint orderHint : orderHints){ - orderHint.add(criteria); + System.out.println("Adding OrderHint " + orderHint.getPropertyName()); + orderHint.add(criteria,criteriaMap); } } } diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/DefinedTermDaoImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/DefinedTermDaoImpl.java index 3a789f7029..8249515bde 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/DefinedTermDaoImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/DefinedTermDaoImpl.java @@ -26,16 +26,43 @@ import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.query.AuditQuery; import org.springframework.stereotype.Repository; +import eu.etaxonomy.cdm.model.agent.InstitutionType; +import eu.etaxonomy.cdm.model.common.AnnotationType; +import eu.etaxonomy.cdm.model.common.ExtensionType; import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.common.DefinedTermBase; import eu.etaxonomy.cdm.model.common.Language; +import eu.etaxonomy.cdm.model.common.MarkerType; import eu.etaxonomy.cdm.model.description.AbsenceTerm; +import eu.etaxonomy.cdm.model.description.MeasurementUnit; +import eu.etaxonomy.cdm.model.description.Modifier; import eu.etaxonomy.cdm.model.description.PresenceTerm; +import eu.etaxonomy.cdm.model.description.Scope; +import eu.etaxonomy.cdm.model.description.Sex; +import eu.etaxonomy.cdm.model.description.Stage; +import eu.etaxonomy.cdm.model.description.State; +import eu.etaxonomy.cdm.model.description.StatisticalMeasure; +import eu.etaxonomy.cdm.model.description.TextFormat; +import eu.etaxonomy.cdm.model.location.Continent; import eu.etaxonomy.cdm.model.location.NamedArea; import eu.etaxonomy.cdm.model.location.NamedAreaLevel; import eu.etaxonomy.cdm.model.location.NamedAreaType; +import eu.etaxonomy.cdm.model.location.ReferenceSystem; +import eu.etaxonomy.cdm.model.location.TdwgArea; import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry; import eu.etaxonomy.cdm.model.media.Media; +import eu.etaxonomy.cdm.model.media.RightsTerm; +import eu.etaxonomy.cdm.model.name.HybridRelationshipType; +import eu.etaxonomy.cdm.model.name.NameRelationshipType; +import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus; +import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType; +import eu.etaxonomy.cdm.model.name.Rank; +import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus; +import eu.etaxonomy.cdm.model.occurrence.DerivationEventType; +import eu.etaxonomy.cdm.model.occurrence.DeterminationModifier; +import eu.etaxonomy.cdm.model.occurrence.PreservationMethod; +import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType; +import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType; import eu.etaxonomy.cdm.model.view.AuditEvent; import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao; import eu.etaxonomy.cdm.persistence.query.MatchMode; @@ -52,6 +79,41 @@ public class DefinedTermDaoImpl extends IdentifiableDaoBase imp public DefinedTermDaoImpl() { super(DefinedTermBase.class); + indexedClasses = new Class[34]; + indexedClasses[0] = InstitutionType.class; + indexedClasses[1] = AnnotationType.class; + indexedClasses[2] = ExtensionType.class; + indexedClasses[3] = Language.class; + indexedClasses[4] = MarkerType.class; + indexedClasses[5] = AbsenceTerm.class; + indexedClasses[6] = MeasurementUnit.class; + indexedClasses[7] = Modifier.class; + indexedClasses[8] = PresenceTerm.class; + indexedClasses[9] = Scope.class; + indexedClasses[10] = Sex.class; + indexedClasses[11] = Stage.class; + indexedClasses[12] = State.class; + indexedClasses[13] = StatisticalMeasure.class; + indexedClasses[14] = TextFormat.class; + indexedClasses[15] = Continent.class; + indexedClasses[16] = NamedArea.class; + indexedClasses[17] = NamedAreaLevel.class; + indexedClasses[18] = NamedAreaType.class; + indexedClasses[19] = ReferenceSystem.class; + indexedClasses[20] = TdwgArea.class; + indexedClasses[21] = WaterbodyOrCountry.class; + indexedClasses[22] = RightsTerm.class; + indexedClasses[23] = HybridRelationshipType.class; + indexedClasses[24] = NameRelationshipType.class; + indexedClasses[25] = NameTypeDesignationStatus.class; + indexedClasses[26] = NomenclaturalStatusType.class; + indexedClasses[27] = Rank.class; + indexedClasses[28] = SpecimenTypeDesignationStatus.class; + indexedClasses[29] = DerivationEventType.class; + indexedClasses[30] = DeterminationModifier.class; + indexedClasses[31] = PreservationMethod.class; + indexedClasses[32] = SynonymRelationshipType.class; + indexedClasses[33] = TaxonRelationshipType.class; } /** diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/IdentifiableDaoBase.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/IdentifiableDaoBase.java index 4b68a21a41..2bed58f5b1 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/IdentifiableDaoBase.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/IdentifiableDaoBase.java @@ -11,10 +11,12 @@ package eu.etaxonomy.cdm.persistence.dao.hibernate.common; import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.UUID; import org.apache.log4j.Logger; +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.queryParser.ParseException; +import org.apache.lucene.queryParser.QueryParser; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; @@ -24,6 +26,9 @@ import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.query.AuditQuery; +import org.hibernate.search.FullTextSession; +import org.hibernate.search.Search; +import org.hibernate.search.SearchFactory; import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.common.Credit; @@ -32,6 +37,7 @@ import eu.etaxonomy.cdm.model.common.IdentifiableSource; import eu.etaxonomy.cdm.model.common.LSID; import eu.etaxonomy.cdm.model.common.UuidAndTitleCache; import eu.etaxonomy.cdm.model.media.Rights; +import eu.etaxonomy.cdm.persistence.dao.QueryParseException; import eu.etaxonomy.cdm.persistence.dao.common.IIdentifiableDao; import eu.etaxonomy.cdm.persistence.query.MatchMode; import eu.etaxonomy.cdm.persistence.query.OrderHint; @@ -40,7 +46,8 @@ import eu.etaxonomy.cdm.persistence.query.OrderHint; public class IdentifiableDaoBase extends AnnotatableDaoImpl implements IIdentifiableDao{ @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(IdentifiableDaoBase.class); - + protected String defaultField = "titleCache"; + protected Class indexedClasses[]; public IdentifiableDaoBase(Class type) { super(type); @@ -299,4 +306,95 @@ public class IdentifiableDaoBase extends Annotatab return (Integer)criteria.uniqueResult(); } + public int count(Class clazz, String queryString) { + checkNotInPriorView("IdentifiableDaoBase.count(Class clazz, String queryString)"); + QueryParser queryParser = new QueryParser(defaultField , new StandardAnalyzer()); + + try { + org.apache.lucene.search.Query query = queryParser.parse(queryString); + + FullTextSession fullTextSession = Search.getFullTextSession(this.getSession()); + org.hibernate.search.FullTextQuery fullTextQuery = null; + + if(clazz == null) { + fullTextQuery = fullTextSession.createFullTextQuery(query, type); + } else { + fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); + } + + Integer result = fullTextQuery.getResultSize(); + return result; + + } catch (ParseException e) { + throw new QueryParseException(e, queryString); + } + } + + public void optimizeIndex() { + FullTextSession fullTextSession = Search.getFullTextSession(getSession()); + SearchFactory searchFactory = fullTextSession.getSearchFactory(); + for(Class clazz : indexedClasses) { + searchFactory.optimize(clazz); // optimize the indices () + } + fullTextSession.flushToIndexes(); + } + + public void purgeIndex() { + FullTextSession fullTextSession = Search.getFullTextSession(getSession()); + for(Class clazz : indexedClasses) { + fullTextSession.purgeAll(clazz); // remove all objects of type t from indexes + } + fullTextSession.flushToIndexes(); + } + + public void rebuildIndex() { + FullTextSession fullTextSession = Search.getFullTextSession(getSession()); + + for(T t : list(null,null)) { // re-index all objects + fullTextSession.index(t); + } + fullTextSession.flushToIndexes(); + } + + public List search(Class clazz, String queryString, Integer pageSize, Integer pageNumber, List orderHints,List propertyPaths) { + checkNotInPriorView("IdentifiableDaoBase.search(Class clazz, String queryString, Integer pageSize, Integer pageNumber, List orderHints,List propertyPaths)"); + QueryParser queryParser = new QueryParser(defaultField, new StandardAnalyzer()); + List results = new ArrayList(); + + try { + org.apache.lucene.search.Query query = queryParser.parse(queryString); + + FullTextSession fullTextSession = Search.getFullTextSession(getSession()); + org.hibernate.search.FullTextQuery fullTextQuery = null; + + if(clazz == null) { + fullTextQuery = fullTextSession.createFullTextQuery(query, type); + } else { + fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); + } + + addOrder(fullTextQuery,orderHints); + + if(pageSize != null) { + fullTextQuery.setMaxResults(pageSize); + if(pageNumber != null) { + fullTextQuery.setFirstResult(pageNumber * pageSize); + } else { + fullTextQuery.setFirstResult(0); + } + } + + List result = (List)fullTextQuery.list(); + defaultBeanInitializer.initializeAll(result, propertyPaths); + return result; + + } catch (ParseException e) { + throw new QueryParseException(e, queryString); + } + } + + public String suggestQuery(String string) { + throw new UnsupportedOperationException("suggestQuery is not supported for objects of class " + type.getName()); + } + } diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/TermVocabularyDaoImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/TermVocabularyDaoImpl.java index 91e6710f81..d3d9e7e98d 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/TermVocabularyDaoImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/TermVocabularyDaoImpl.java @@ -14,7 +14,6 @@ import java.util.List; import org.hibernate.Criteria; import org.hibernate.Query; -import org.hibernate.criterion.ProjectionList; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.envers.query.AuditEntity; @@ -22,6 +21,7 @@ import org.hibernate.envers.query.AuditQuery; import org.springframework.stereotype.Repository; import eu.etaxonomy.cdm.model.common.DefinedTermBase; +import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary; import eu.etaxonomy.cdm.model.common.TermVocabulary; import eu.etaxonomy.cdm.model.view.AuditEvent; import eu.etaxonomy.cdm.persistence.dao.common.ITermVocabularyDao; @@ -39,6 +39,9 @@ public class TermVocabularyDaoImpl extends IdentifiableDaoBase i */ public TermVocabularyDaoImpl() { super(TermVocabulary.class); + indexedClasses = new Class[2]; + indexedClasses[0] = TermVocabulary.class; + indexedClasses[1] = OrderedTermVocabulary.class; } public int countTerms(TermVocabulary termVocabulary) { diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/VersionableDaoBase.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/VersionableDaoBase.java index 8761bb685e..a22252591f 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/VersionableDaoBase.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/VersionableDaoBase.java @@ -246,7 +246,7 @@ public abstract class VersionableDaoBase extends Cd return records; } - public Integer countAuditEvents(T t, AuditEventSort sort) { + public int countAuditEvents(T t, AuditEventSort sort) { AuditEvent auditEvent = getAuditEventFromContext(); AuditQuery query = getAuditReader().createQuery().forRevisionsOfEntity(type, false, true); @@ -287,7 +287,7 @@ public abstract class VersionableDaoBase extends Cd } } - public Integer countAuditEvents(Class clazz, AuditEvent from, AuditEvent to, List criteria) { + public int countAuditEvents(Class clazz, AuditEvent from, AuditEvent to, List criteria) { AuditQuery query = null; if(clazz == null) { @@ -306,7 +306,7 @@ public abstract class VersionableDaoBase extends Cd addCriteria(query,criteria); - query.addProjection(AuditEntity.property("id").count()); + query.addProjection(AuditEntity.revisionNumber().count()); return ((Long)query.getSingleResult()).intValue(); } @@ -336,6 +336,12 @@ public abstract class VersionableDaoBase extends Cd query.add(AuditEntity.revisionNumber().lt(to.getRevisionNumber())); } + if(sort.equals(AuditEventSort.BACKWARDS)) { + query.addOrder(AuditEntity.revisionNumber().desc()); + } else { + query.addOrder(AuditEntity.revisionNumber().asc()); + } + addCriteria(query,criteria); if(pageSize != null) { diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/description/DescriptionDaoImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/description/DescriptionDaoImpl.java index d0f2ed469c..542d00c651 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/description/DescriptionDaoImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/description/DescriptionDaoImpl.java @@ -32,6 +32,7 @@ import eu.etaxonomy.cdm.model.description.DescriptionElementBase; import eu.etaxonomy.cdm.model.description.Feature; import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase; import eu.etaxonomy.cdm.model.description.Scope; +import eu.etaxonomy.cdm.model.description.SpecimenDescription; import eu.etaxonomy.cdm.model.description.TaxonDescription; import eu.etaxonomy.cdm.model.description.TaxonNameDescription; import eu.etaxonomy.cdm.model.location.NamedArea; @@ -53,6 +54,10 @@ public class DescriptionDaoImpl extends IdentifiableDaoBase imp public DescriptionDaoImpl() { super(DescriptionBase.class); + indexedClasses = new Class[3]; + indexedClasses[0] = TaxonDescription.class; + indexedClasses[1] = TaxonNameDescription.class; + indexedClasses[2] = SpecimenDescription.class; } public int countDescriptionByDistribution(Set namedAreas, PresenceAbsenceTermBase status) { diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/description/DescriptionElementDaoImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/description/DescriptionElementDaoImpl.java index 475231faa4..e0c68d61cb 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/description/DescriptionElementDaoImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/description/DescriptionElementDaoImpl.java @@ -3,14 +3,11 @@ package eu.etaxonomy.cdm.persistence.dao.hibernate.description; import java.util.ArrayList; import java.util.List; -import org.apache.lucene.analysis.SimpleAnalyzer; +import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; -import org.apache.lucene.search.Sort; -import org.apache.lucene.search.SortField; import org.hibernate.Hibernate; import org.hibernate.Query; -import org.hibernate.envers.query.AuditQuery; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.hibernate.search.SearchFactory; @@ -19,7 +16,6 @@ import org.springframework.stereotype.Repository; import eu.etaxonomy.cdm.model.description.DescriptionElementBase; import eu.etaxonomy.cdm.model.description.TextData; import eu.etaxonomy.cdm.model.media.Media; -import eu.etaxonomy.cdm.model.taxon.TaxonBase; import eu.etaxonomy.cdm.model.view.AuditEvent; import eu.etaxonomy.cdm.persistence.dao.QueryParseException; import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionElementDao; @@ -58,7 +54,7 @@ public class DescriptionElementDaoImpl extends AnnotatableDaoImpl clazz, String queryString) { checkNotInPriorView("DescriptionElementDaoImpl.countTextData(String queryString)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); + QueryParser queryParser = new QueryParser(defaultField, new StandardAnalyzer()); try { org.apache.lucene.search.Query query = queryParser.parse(queryString); @@ -123,7 +119,7 @@ public class DescriptionElementDaoImpl extends AnnotatableDaoImpl search(Class clazz, String queryString, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { checkNotInPriorView("DescriptionElementDaoImpl.searchTextData(String queryString, Integer pageSize, Integer pageNumber)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); + QueryParser queryParser = new QueryParser(defaultField, new StandardAnalyzer()); try { org.apache.lucene.search.Query query = queryParser.parse(queryString); @@ -184,7 +180,7 @@ public class DescriptionElementDaoImpl extends AnnotatableDaoImpl impleme public FeatureTreeDaoImpl() { super(FeatureTree.class); + indexedClasses = new Class[2]; + indexedClasses[0] = FeatureTree.class; + indexedClasses[1] = PolytomousKey.class; } public List list() { diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/media/MediaDaoHibernateImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/media/MediaDaoHibernateImpl.java index 425770bbdf..b82dcb673c 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/media/MediaDaoHibernateImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/media/MediaDaoHibernateImpl.java @@ -7,16 +7,12 @@ package eu.etaxonomy.cdm.persistence.dao.hibernate.media; import java.net.URI; -import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.lucene.analysis.SimpleAnalyzer; -import org.apache.lucene.queryParser.ParseException; -import org.apache.lucene.queryParser.QueryParser; import org.hibernate.Criteria; import org.hibernate.Hibernate; import org.hibernate.Query; @@ -26,11 +22,9 @@ import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.query.AuditQuery; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; -import org.hibernate.search.SearchFactory; import org.springframework.stereotype.Repository; import eu.etaxonomy.cdm.common.mediaMetaData.ImageMetaData; -import eu.etaxonomy.cdm.model.agent.AgentBase; import eu.etaxonomy.cdm.model.description.MediaKey; import eu.etaxonomy.cdm.model.location.NamedArea; import eu.etaxonomy.cdm.model.media.Media; @@ -38,12 +32,9 @@ import eu.etaxonomy.cdm.model.media.Rights; import eu.etaxonomy.cdm.model.molecular.PhylogeneticTree; import eu.etaxonomy.cdm.model.taxon.Taxon; import eu.etaxonomy.cdm.model.view.AuditEvent; -import eu.etaxonomy.cdm.persistence.dao.QueryParseException; import eu.etaxonomy.cdm.persistence.dao.common.OperationNotSupportedInPriorViewException; -import eu.etaxonomy.cdm.persistence.dao.hibernate.common.AnnotatableDaoImpl; import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase; import eu.etaxonomy.cdm.persistence.dao.media.IMediaDao; -import eu.etaxonomy.cdm.persistence.query.OrderHint; /** * @author a.babadshanjan @@ -52,8 +43,9 @@ import eu.etaxonomy.cdm.persistence.query.OrderHint; @Repository public class MediaDaoHibernateImpl extends IdentifiableDaoBase implements IMediaDao { - private String defaultField = "title.text"; - private Class indexedClasses[]; + protected String getDefaultField() { + return "title.text"; + } public MediaDaoHibernateImpl() { super(Media.class); @@ -174,47 +166,9 @@ public class MediaDaoHibernateImpl extends IdentifiableDaoBase implements return ((Long)query.uniqueResult()).intValue(); } - public int count(Class clazz, String queryString) { - checkNotInPriorView("MediaDaoHibernateImpl.count(String queryString, Boolean accepted)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); - - try { - org.apache.lucene.search.Query query = queryParser.parse(queryString); - - FullTextSession fullTextSession = Search.getFullTextSession(this.getSession()); - org.hibernate.search.FullTextQuery fullTextQuery = null; - - if(clazz == null) { - fullTextQuery = fullTextSession.createFullTextQuery(query, type); - } else { - fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); - } - - Integer result = fullTextQuery.getResultSize(); - return result; - - } catch (ParseException e) { - throw new QueryParseException(e, queryString); - } - } - - public void optimizeIndex() { - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - SearchFactory searchFactory = fullTextSession.getSearchFactory(); - for(Class clazz : indexedClasses) { - searchFactory.optimize(clazz); // optimize the indices () - } - fullTextSession.flushToIndexes(); - } - - public void purgeIndex() { - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - for(Class clazz : indexedClasses) { - fullTextSession.purgeAll(clazz); // remove all taxon base from indexes - } - fullTextSession.flushToIndexes(); - } + + @Override public void rebuildIndex() { FullTextSession fullTextSession = Search.getFullTextSession(getSession()); @@ -226,47 +180,6 @@ public class MediaDaoHibernateImpl extends IdentifiableDaoBase implements } fullTextSession.flushToIndexes(); } - - public List search(Class clazz, String queryString, Integer pageSize, Integer pageNumber, List orderHints,List propertyPaths) { - checkNotInPriorView("MediaDaoHibernateImpl.searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); - List results = new ArrayList(); - - try { - org.apache.lucene.search.Query query = queryParser.parse(queryString); - - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - org.hibernate.search.FullTextQuery fullTextQuery = null; - - if(clazz == null) { - fullTextQuery = fullTextSession.createFullTextQuery(query, type); - } else { - fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); - } - - addOrder(fullTextQuery,orderHints); - - if(pageSize != null) { - fullTextQuery.setMaxResults(pageSize); - if(pageNumber != null) { - fullTextQuery.setFirstResult(pageNumber * pageSize); - } else { - fullTextQuery.setFirstResult(0); - } - } - - List result = (List)fullTextQuery.list(); - defaultBeanInitializer.initializeAll(result, propertyPaths); - return result; - - } catch (ParseException e) { - throw new QueryParseException(e, queryString); - } - } - - public String suggestQuery(String string) { - throw new UnsupportedOperationException("suggestQuery is not supported for Media"); - } public Map getMediaMetaData(URI uri, Integer timeOut){ diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/name/TaxonNameDaoHibernateImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/name/TaxonNameDaoHibernateImpl.java index 26fb8b5e04..1558de49f9 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/name/TaxonNameDaoHibernateImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/name/TaxonNameDaoHibernateImpl.java @@ -10,15 +10,10 @@ package eu.etaxonomy.cdm.persistence.dao.hibernate.name; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.UUID; import org.apache.log4j.Logger; -import org.apache.lucene.analysis.SimpleAnalyzer; -import org.apache.lucene.queryParser.ParseException; -import org.apache.lucene.queryParser.QueryParser; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.criterion.Criterion; @@ -27,9 +22,6 @@ import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.query.AuditQuery; -import org.hibernate.search.FullTextSession; -import org.hibernate.search.Search; -import org.hibernate.search.SearchFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Repository; @@ -51,7 +43,6 @@ import eu.etaxonomy.cdm.model.name.TypeDesignationStatusBase; import eu.etaxonomy.cdm.model.name.ViralName; import eu.etaxonomy.cdm.model.name.ZoologicalName; import eu.etaxonomy.cdm.model.view.AuditEvent; -import eu.etaxonomy.cdm.persistence.dao.QueryParseException; import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase; import eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao; import eu.etaxonomy.cdm.persistence.query.MatchMode; @@ -79,9 +70,6 @@ extends IdentifiableDaoBase implements ITaxonNameDao { indexedClasses[4] = ViralName.class; indexedClasses[5] = ZoologicalName.class; } - - private String defaultField = "titleCache"; - private Class indexedClasses[]; public int countHybridNames(NonViralName name, HybridRelationshipType type) { AuditEvent auditEvent = getAuditEventFromContext(); @@ -546,98 +534,6 @@ extends IdentifiableDaoBase implements ITaxonNameDao { } - - public int count(Class clazz, String queryString) { - checkNotInPriorView("TaxonNameDaoHibernateImpl.count(String queryString, Boolean accepted)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); - - try { - org.apache.lucene.search.Query query = queryParser.parse(queryString); - - FullTextSession fullTextSession = Search.getFullTextSession(this.getSession()); - org.hibernate.search.FullTextQuery fullTextQuery = null; - - if(clazz == null) { - fullTextQuery = fullTextSession.createFullTextQuery(query, type); - } else { - fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); - } - - Integer result = fullTextQuery.getResultSize(); - return result; - - } catch (ParseException e) { - throw new QueryParseException(e, queryString); - } - } - - public void optimizeIndex() { - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - SearchFactory searchFactory = fullTextSession.getSearchFactory(); - for(Class clazz : indexedClasses) { - searchFactory.optimize(clazz); // optimize the indices () - } - fullTextSession.flushToIndexes(); - } - - public void purgeIndex() { - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - for(Class clazz : indexedClasses) { - fullTextSession.purgeAll(clazz); // remove all taxon base from indexes - } - fullTextSession.flushToIndexes(); - } - - public void rebuildIndex() { - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - - for(TaxonNameBase name : list(null,null)) { // re-index all taxon base - fullTextSession.index(name); - } - fullTextSession.flushToIndexes(); - } - - public List search(Class clazz, String queryString, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { - checkNotInPriorView("TaxonNameDaoHibernateImpl.searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); - List results = new ArrayList(); - - try { - org.apache.lucene.search.Query query = queryParser.parse(queryString); - - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - org.hibernate.search.FullTextQuery fullTextQuery = null; - - if(clazz == null) { - fullTextQuery = fullTextSession.createFullTextQuery(query, TaxonNameBase.class); - } else { - fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); - } - - addOrder(fullTextQuery,orderHints); - - if(pageSize != null) { - fullTextQuery.setMaxResults(pageSize); - if(pageNumber != null) { - fullTextQuery.setFirstResult(pageNumber * pageSize); - } else { - fullTextQuery.setFirstResult(0); - } - } - - List result = (List)fullTextQuery.list(); - defaultBeanInitializer.initializeAll(result, propertyPaths); - return result; - - } catch (ParseException e) { - throw new QueryParseException(e, queryString); - } - } - - public String suggestQuery(String string) { - throw new UnsupportedOperationException("suggestQuery is not supported for TaxonNameBase"); - } - /* (non-Javadoc) * @see eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao#getUuidAndTitleCacheOfNames() */ diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/CollectionDaoHibernateImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/CollectionDaoHibernateImpl.java index 0185d5fc13..4937994430 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/CollectionDaoHibernateImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/CollectionDaoHibernateImpl.java @@ -9,12 +9,8 @@ package eu.etaxonomy.cdm.persistence.dao.hibernate.occurrence; -import java.util.ArrayList; import java.util.List; -import org.apache.lucene.analysis.SimpleAnalyzer; -import org.apache.lucene.queryParser.ParseException; -import org.apache.lucene.queryParser.QueryParser; import org.hibernate.Criteria; import org.hibernate.Hibernate; import org.hibernate.criterion.Restrictions; @@ -22,16 +18,12 @@ import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.query.AuditQuery; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; -import org.hibernate.search.SearchFactory; import org.springframework.stereotype.Repository; import eu.etaxonomy.cdm.model.occurrence.Collection; -import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; import eu.etaxonomy.cdm.model.view.AuditEvent; -import eu.etaxonomy.cdm.persistence.dao.QueryParseException; import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase; import eu.etaxonomy.cdm.persistence.dao.occurrence.ICollectionDao; -import eu.etaxonomy.cdm.persistence.query.OrderHint; @Repository public class CollectionDaoHibernateImpl extends IdentifiableDaoBase implements @@ -41,6 +33,8 @@ public class CollectionDaoHibernateImpl extends IdentifiableDaoBase public CollectionDaoHibernateImpl() { super(Collection.class); + indexedClasses = new Class[1]; + indexedClasses[0] = Collection.class; } public List getCollectionByCode(String code) { @@ -57,43 +51,7 @@ public class CollectionDaoHibernateImpl extends IdentifiableDaoBase } } - public int count(Class clazz, String queryString) { - checkNotInPriorView("CollectionDaoHibernateImpl.count(Class clazz, String queryString)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); - - try { - org.apache.lucene.search.Query query = queryParser.parse(queryString); - - FullTextSession fullTextSession = Search.getFullTextSession(this.getSession()); - org.hibernate.search.FullTextQuery fullTextQuery = null; - - if(clazz == null) { - fullTextQuery = fullTextSession.createFullTextQuery(query, type); - } else { - fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); - } - - Integer result = fullTextQuery.getResultSize(); - return result; - - } catch (ParseException e) { - throw new QueryParseException(e, queryString); - } - } - - public void optimizeIndex() { - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - SearchFactory searchFactory = fullTextSession.getSearchFactory(); - searchFactory.optimize(Collection.class); // optimize the indices () - fullTextSession.flushToIndexes(); - } - - public void purgeIndex() { - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - fullTextSession.purgeAll(Collection.class); // remove all taxon base from indexes - fullTextSession.flushToIndexes(); - } - + @Override public void rebuildIndex() { FullTextSession fullTextSession = Search.getFullTextSession(getSession()); @@ -105,45 +63,4 @@ public class CollectionDaoHibernateImpl extends IdentifiableDaoBase } fullTextSession.flushToIndexes(); } - - public List search(Class clazz, String queryString, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { - checkNotInPriorView("CollectionDaoHibernateImpl.search(Class clazz, String queryString, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); - List results = new ArrayList(); - - try { - org.apache.lucene.search.Query query = queryParser.parse(queryString); - - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - org.hibernate.search.FullTextQuery fullTextQuery = null; - - if(clazz == null) { - fullTextQuery = fullTextSession.createFullTextQuery(query, SpecimenOrObservationBase.class); - } else { - fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); - } - - addOrder(fullTextQuery,orderHints); - - if(pageSize != null) { - fullTextQuery.setMaxResults(pageSize); - if(pageNumber != null) { - fullTextQuery.setFirstResult(pageNumber * pageSize); - } else { - fullTextQuery.setFirstResult(0); - } - } - - List result = (List)fullTextQuery.list(); - defaultBeanInitializer.initializeAll(result, propertyPaths); - return result; - - } catch (ParseException e) { - throw new QueryParseException(e, queryString); - } - } - - public String suggestQuery(String string) { - throw new UnsupportedOperationException("suggestQuery is not supported for Collection"); - } } \ No newline at end of file diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImpl.java index a3b21e86fc..aa48b165d6 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImpl.java @@ -6,21 +6,16 @@ package eu.etaxonomy.cdm.persistence.dao.hibernate.occurrence; -import java.util.ArrayList; import java.util.List; import java.util.Set; import org.apache.log4j.Logger; -import org.apache.lucene.analysis.SimpleAnalyzer; -import org.apache.lucene.queryParser.ParseException; -import org.apache.lucene.queryParser.QueryParser; import org.hibernate.Hibernate; import org.hibernate.Query; import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.query.AuditQuery; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; -import org.hibernate.search.SearchFactory; import org.springframework.stereotype.Repository; import eu.etaxonomy.cdm.model.media.Media; @@ -30,21 +25,15 @@ import eu.etaxonomy.cdm.model.occurrence.DerivedUnit; import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase; import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent; import eu.etaxonomy.cdm.model.occurrence.FieldObservation; +import eu.etaxonomy.cdm.model.occurrence.Fossil; import eu.etaxonomy.cdm.model.occurrence.LivingBeing; import eu.etaxonomy.cdm.model.occurrence.Observation; import eu.etaxonomy.cdm.model.occurrence.Specimen; -import eu.etaxonomy.cdm.model.occurrence.Fossil; import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; -import eu.etaxonomy.cdm.model.taxon.Synonym; -import eu.etaxonomy.cdm.model.taxon.Taxon; -import eu.etaxonomy.cdm.model.taxon.TaxonBase; import eu.etaxonomy.cdm.model.view.AuditEvent; -import eu.etaxonomy.cdm.persistence.dao.QueryParseException; -import eu.etaxonomy.cdm.persistence.dao.common.ISearchableDao; import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase; import eu.etaxonomy.cdm.persistence.dao.hibernate.taxon.TaxonDaoHibernateImpl; import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao; -import eu.etaxonomy.cdm.persistence.query.OrderHint; /** * @author a.babadshanjan @@ -55,9 +44,6 @@ public class OccurrenceDaoHibernateImpl extends IdentifiableDaoBase indexedClasses[]; public OccurrenceDaoHibernateImpl() { super(SpecimenOrObservationBase.class); @@ -174,47 +160,7 @@ public class OccurrenceDaoHibernateImpl extends IdentifiableDaoBase search(Class clazz, String queryString,Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { - checkNotInPriorView("OccurrenceDaoHibernateImpl.searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); - List results = new ArrayList(); - - try { - org.apache.lucene.search.Query query = queryParser.parse(queryString); - - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - org.hibernate.search.FullTextQuery fullTextQuery = null; - - if(clazz == null) { - fullTextQuery = fullTextSession.createFullTextQuery(query, SpecimenOrObservationBase.class); - } else { - fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); - } - - addOrder(fullTextQuery,orderHints); - - if(pageSize != null) { - fullTextQuery.setMaxResults(pageSize); - if(pageNumber != null) { - fullTextQuery.setFirstResult(pageNumber * pageSize); - } else { - fullTextQuery.setFirstResult(0); - } - } - - List result = (List)fullTextQuery.list(); - defaultBeanInitializer.initializeAll(result, propertyPaths); - return result; - - } catch (ParseException e) { - throw new QueryParseException(e, queryString); - } - } - - public String suggestQuery(String string) { - throw new UnsupportedOperationException("suggestQuery is not supported for SpecimenOrObservationBase"); - } } \ No newline at end of file diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/reference/ReferenceDaoHibernateImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/reference/ReferenceDaoHibernateImpl.java index b57e6af0c6..b284203036 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/reference/ReferenceDaoHibernateImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/reference/ReferenceDaoHibernateImpl.java @@ -13,49 +13,40 @@ import java.util.List; import java.util.UUID; import org.apache.log4j.Logger; -import org.apache.lucene.analysis.SimpleAnalyzer; -import org.apache.lucene.queryParser.ParseException; -import org.apache.lucene.queryParser.QueryParser; import org.hibernate.Hibernate; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; -import org.hibernate.search.SearchFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Repository; import eu.etaxonomy.cdm.model.common.UuidAndTitleCache; -/*import eu.etaxonomy.cdm.model.reference.Article; +import eu.etaxonomy.cdm.model.reference.Article; import eu.etaxonomy.cdm.model.reference.Book; import eu.etaxonomy.cdm.model.reference.BookSection; import eu.etaxonomy.cdm.model.reference.CdDvd; import eu.etaxonomy.cdm.model.reference.Database; import eu.etaxonomy.cdm.model.reference.Generic; -import eu.etaxonomy.cdm.model.reference.InProceedings; -import eu.etaxonomy.cdm.model.reference.Journal; -import eu.etaxonomy.cdm.model.reference.Map; -import eu.etaxonomy.cdm.model.reference.Patent; -import eu.etaxonomy.cdm.model.reference.PersonalCommunication; -import eu.etaxonomy.cdm.model.reference.PrintedUnitBase; -import eu.etaxonomy.cdm.model.reference.Proceedings; -import eu.etaxonomy.cdm.model.reference.PublicationBase;*/ import eu.etaxonomy.cdm.model.reference.IArticle; import eu.etaxonomy.cdm.model.reference.IBookSection; import eu.etaxonomy.cdm.model.reference.IInProceedings; import eu.etaxonomy.cdm.model.reference.IPrintedUnitBase; import eu.etaxonomy.cdm.model.reference.IReport; import eu.etaxonomy.cdm.model.reference.IThesis; +import eu.etaxonomy.cdm.model.reference.InProceedings; +import eu.etaxonomy.cdm.model.reference.Journal; +import eu.etaxonomy.cdm.model.reference.Map; +import eu.etaxonomy.cdm.model.reference.Patent; +import eu.etaxonomy.cdm.model.reference.PersonalCommunication; +import eu.etaxonomy.cdm.model.reference.Proceedings; import eu.etaxonomy.cdm.model.reference.ReferenceBase; import eu.etaxonomy.cdm.model.reference.ReferenceType; -/*import eu.etaxonomy.cdm.model.reference.Report; -import eu.etaxonomy.cdm.model.reference.SectionBase; +import eu.etaxonomy.cdm.model.reference.Report; import eu.etaxonomy.cdm.model.reference.Thesis; -import eu.etaxonomy.cdm.model.reference.WebPage;*/ -import eu.etaxonomy.cdm.persistence.dao.QueryParseException; +import eu.etaxonomy.cdm.model.reference.WebPage; import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase; import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao; -import eu.etaxonomy.cdm.persistence.query.OrderHint; /** * @author a.mueller @@ -64,16 +55,13 @@ import eu.etaxonomy.cdm.persistence.query.OrderHint; @Repository @Qualifier("referenceDaoHibernateImpl") public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase implements IReferenceDao { - - private String defaultField = "titleCache"; - private Class indexedClasses[]; - + @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(ReferenceDaoHibernateImpl.class); public ReferenceDaoHibernateImpl() { super(ReferenceBase.class); - /*indexedClasses = new Class[15]; + indexedClasses = new Class[15]; indexedClasses[0] = Article.class; indexedClasses[1] = Patent.class; indexedClasses[2] = PersonalCommunication.class; @@ -88,50 +76,10 @@ public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase clazz, String queryString) { - checkNotInPriorView("ReferenceDaoHibernateImpl.count(String queryString, Boolean accepted)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); - - try { - org.apache.lucene.search.Query query = queryParser.parse(queryString); - - FullTextSession fullTextSession = Search.getFullTextSession(this.getSession()); - org.hibernate.search.FullTextQuery fullTextQuery = null; - - if(clazz == null) { - fullTextQuery = fullTextSession.createFullTextQuery(query, type); - } else { - fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); - } - - Integer result = fullTextQuery.getResultSize(); - return result; - - } catch (ParseException e) { - throw new QueryParseException(e, queryString); - } - } - - public void optimizeIndex() { - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - SearchFactory searchFactory = fullTextSession.getSearchFactory(); - for(Class clazz : indexedClasses) { - searchFactory.optimize(clazz); // optimize the indices () - } - fullTextSession.flushToIndexes(); - } - - public void purgeIndex() { - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - for(Class clazz : indexedClasses) { - fullTextSession.purgeAll(clazz); // remove all taxon base from indexes - } - fullTextSession.flushToIndexes(); + indexedClasses[14] = Thesis.class; } + @Override public void rebuildIndex() { FullTextSession fullTextSession = Search.getFullTextSession(getSession()); @@ -156,47 +104,6 @@ public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase search(Class clazz, String queryString, Integer pageSize, Integer pageNumber,List orderHints, List propertyPaths) { - checkNotInPriorView("ReferenceDaoHibernateImpl.searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); - List results = new ArrayList(); - - try { - org.apache.lucene.search.Query query = queryParser.parse(queryString); - - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - org.hibernate.search.FullTextQuery fullTextQuery = null; - - if(clazz == null) { - fullTextQuery = fullTextSession.createFullTextQuery(query, type); - } else { - fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); - } - - addOrder(fullTextQuery,orderHints); - - if(pageSize != null) { - fullTextQuery.setMaxResults(pageSize); - if(pageNumber != null) { - fullTextQuery.setFirstResult(pageNumber * pageSize); - } else { - fullTextQuery.setFirstResult(0); - } - } - - List result = (List)fullTextQuery.list(); - defaultBeanInitializer.initializeAll(result, propertyPaths); - return result; - - } catch (ParseException e) { - throw new QueryParseException(e, queryString); - } - } - - public String suggestQuery(String string) { - throw new UnsupportedOperationException("suggestQuery is not supported for ReferenceBase"); - } - public List> getUuidAndTitle(){ List> list = new ArrayList>(); Session session = getSession(); diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java index c26859516c..b4eaed2845 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java @@ -8,7 +8,6 @@ */ package eu.etaxonomy.cdm.persistence.dao.hibernate.taxon; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; @@ -21,9 +20,7 @@ import java.util.TreeSet; import java.util.UUID; import org.apache.log4j.Logger; -import org.apache.lucene.analysis.SimpleAnalyzer; import org.apache.lucene.queryParser.ParseException; -import org.apache.lucene.queryParser.QueryParser; import org.hibernate.Criteria; import org.hibernate.FetchMode; import org.hibernate.Hibernate; @@ -35,25 +32,16 @@ import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.query.AuditQuery; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; -import org.hibernate.search.SearchFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Repository; -import org.springframework.util.ReflectionUtils; -import eu.etaxonomy.cdm.model.common.Annotation; -import eu.etaxonomy.cdm.model.common.Extension; -import eu.etaxonomy.cdm.model.common.IdentifiableSource; import eu.etaxonomy.cdm.model.common.LSID; -import eu.etaxonomy.cdm.model.common.Marker; import eu.etaxonomy.cdm.model.common.RelationshipBase; import eu.etaxonomy.cdm.model.common.UuidAndTitleCache; import eu.etaxonomy.cdm.model.common.RelationshipBase.Direction; -import eu.etaxonomy.cdm.model.description.DescriptionElementBase; -import eu.etaxonomy.cdm.model.description.TaxonDescription; import eu.etaxonomy.cdm.model.location.NamedArea; -import eu.etaxonomy.cdm.model.media.Rights; import eu.etaxonomy.cdm.model.name.Rank; import eu.etaxonomy.cdm.model.reference.ReferenceBase; import eu.etaxonomy.cdm.model.taxon.Synonym; @@ -85,15 +73,13 @@ import eu.etaxonomy.cdm.persistence.query.OrderHint; public class TaxonDaoHibernateImpl extends IdentifiableDaoBase implements ITaxonDao { private AlternativeSpellingSuggestionParser alternativeSpellingSuggestionParser; private static final Logger logger = Logger.getLogger(TaxonDaoHibernateImpl.class); - - private String defaultField = "name.titleCache"; - private Class indexedClasses[]; public TaxonDaoHibernateImpl() { super(TaxonBase.class); indexedClasses = new Class[2]; indexedClasses[0] = Taxon.class; indexedClasses[1] = Synonym.class; + super.defaultField = "name.titleCache"; } @Autowired(required = false) //TODO switched of because it caused problems when starting CdmApplicationController @@ -673,47 +659,9 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase implem // actually solve it. getSession().merge(taxonBase); - for(Iterator iterator = taxonBase.getAnnotations().iterator(); iterator.hasNext();) { - Annotation annotation = iterator.next(); - annotation.setAnnotatedObj(null); - iterator.remove(); - getSession().delete(annotation); - } - - for(Iterator iterator = taxonBase.getMarkers().iterator(); iterator.hasNext();) { - Marker marker = iterator.next(); - marker.setMarkedObj(null); - iterator.remove(); - getSession().delete(marker); - } - - for(Iterator iterator = taxonBase.getExtensions().iterator(); iterator.hasNext();) { - Extension extension = iterator.next(); - extension.setExtendedObj(null); - iterator.remove(); - getSession().delete(extension); - } - - for(Iterator iterator = taxonBase.getSources().iterator(); iterator.hasNext();) { - IdentifiableSource source = iterator.next(); - source.setSourcedObj(null); - iterator.remove(); - getSession().delete(source); - } - - for(Iterator iterator = taxonBase.getRights().iterator(); iterator.hasNext();) { - Rights rights = iterator.next(); - iterator.remove(); - getSession().delete(rights); - } - if (taxonBase instanceof Taxon){ // is Taxon - //taxonRelationships - Taxon taxon = (Taxon)taxonBase; - - for (Iterator iterator = taxon.getRelationsFromThisTaxon().iterator(); iterator.hasNext();){ + for (Iterator iterator = ((Taxon)taxonBase).getRelationsFromThisTaxon().iterator(); iterator.hasNext();){ TaxonRelationship relationFromThisTaxon = iterator.next(); - iterator.remove(); // decrease children count of taxonomic parent by one if (relationFromThisTaxon.getType().equals(TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN())) { @@ -722,64 +670,9 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase implem toTaxon.setTaxonomicChildrenCount(toTaxon.getTaxonomicChildrenCount() - 1); } } - relationFromThisTaxon.setToTaxon(null); - relationFromThisTaxon.setFromTaxon(null); - getSession().delete(relationFromThisTaxon); - } - - for (Iterator iterator = taxon.getRelationsToThisTaxon().iterator(); iterator.hasNext();){ - TaxonRelationship relationToThisTaxon = iterator.next(); - iterator.remove(); - - // set parent cache of child to null - if (relationToThisTaxon.getType().equals(TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN())) { - Taxon fromTaxon = relationToThisTaxon.getFromTaxon(); // child - if (fromTaxon != null) { - fromTaxon.nullifyTaxonomicParent(); - } - } - relationToThisTaxon.setFromTaxon(null); - relationToThisTaxon.setToTaxon(null); - getSession().delete(relationToThisTaxon); } - - //SynonymRelationships - for (Iterator iterator = taxon.getSynonymRelations().iterator(); iterator.hasNext();){ - SynonymRelationship synonymRelation = iterator.next(); - iterator.remove(); - synonymRelation.setAcceptedTaxon(null); - synonymRelation.setSynonym(null); - getSession().delete(synonymRelation); - } - - // Descriptions - for (Iterator iterDesc = taxon.getDescriptions().iterator(); iterDesc.hasNext();) { - TaxonDescription taxonDescription = iterDesc.next(); - iterDesc.remove(); - //taxonDescription.setTaxon(null); - Field field = ReflectionUtils.findField(TaxonDescription.class, "taxon", Taxon.class); - ReflectionUtils.makeAccessible(field); - ReflectionUtils.setField(field, taxonDescription, null); - for (Iterator iterDescElem = - taxonDescription.getElements().iterator(); iterDescElem.hasNext();) { - DescriptionElementBase descriptionElement = iterDescElem.next(); - iterDescElem.remove(); - getSession().delete(descriptionElement); - } - getSession().delete(taxonDescription); - } - - taxon.nullifyTaxonomicParent(); - - } else { //is Synonym - Synonym synonym = (Synonym)taxonBase; - for (Iterator iterator = synonym.getSynonymRelations().iterator(); iterator.hasNext();){ - SynonymRelationship synonymRelation = iterator.next(); - iterator.remove(); - synonymRelation.setAcceptedTaxon(null); - synonymRelation.setSynonym(null); - } ; } + return super.delete(taxonBase); } @@ -892,38 +785,6 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase implem } } - public int count(Class clazz, String queryString) { - checkNotInPriorView("TaxonDaoHibernateImpl.count(String queryString, Boolean accepted)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); - - try { - org.apache.lucene.search.Query query = queryParser.parse(queryString); - - FullTextSession fullTextSession = Search.getFullTextSession(this.getSession()); - org.hibernate.search.FullTextQuery fullTextQuery = null; - - if(clazz == null) { - fullTextQuery = fullTextSession.createFullTextQuery(query, type); - } else { - fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); - } - - Integer result = fullTextQuery.getResultSize(); - return result; - - } catch (ParseException e) { - throw new QueryParseException(e, queryString); - } - } - -// public int countTaxaByName(String queryString, Boolean accepted, ReferenceBase sec) { -// -// SelectMode selectMode = (accepted ? SelectMode.TAXA : SelectMode.SYNONYMS); -// Long count = countTaxaByName(queryString, MatchMode.ANYWHERE, selectMode , sec, null); -// -// return count.intValue(); -// } - public int countTaxaByName(Class clazz, String genusOrUninomial, String infraGenericEpithet, String specificEpithet, String infraSpecificEpithet, Rank rank) { checkNotInPriorView("TaxonDaoHibernateImpl.countTaxaByName(Boolean accepted, String genusOrUninomial, String infraGenericEpithet, String specificEpithet, String infraSpecificEpithet, Rank rank)"); Criteria criteria = null; @@ -1179,52 +1040,8 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase implem return result; } } - - public List search(Class clazz, String queryString,Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { - checkNotInPriorView("TaxonDaoHibernateImpl.searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber)"); - QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer()); - List results = new ArrayList(); - - try { - org.apache.lucene.search.Query query = queryParser.parse(queryString); - - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - org.hibernate.search.FullTextQuery fullTextQuery = null; - - if(clazz == null) { - fullTextQuery = fullTextSession.createFullTextQuery(query, TaxonBase.class); - } else { - fullTextQuery = fullTextSession.createFullTextQuery(query, clazz); - } - - addOrder(fullTextQuery,orderHints); - - if(pageSize != null) { - fullTextQuery.setMaxResults(pageSize); - if(pageNumber != null) { - fullTextQuery.setFirstResult(pageNumber * pageSize); - } else { - fullTextQuery.setFirstResult(0); - } - } - - List result = (List)fullTextQuery.list(); - defaultBeanInitializer.initializeAll(result, propertyPaths); - return result; - - } catch (ParseException e) { - throw new QueryParseException(e, queryString); - } - } - public void purgeIndex() { - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - for(Class clazz : indexedClasses) { - fullTextSession.purgeAll(clazz); // remove all taxon base from indexes - } - fullTextSession.flushToIndexes(); - } - + @Override public void rebuildIndex() { FullTextSession fullTextSession = Search.getFullTextSession(getSession()); @@ -1235,15 +1052,7 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase implem fullTextSession.flushToIndexes(); } - public void optimizeIndex() { - FullTextSession fullTextSession = Search.getFullTextSession(getSession()); - SearchFactory searchFactory = fullTextSession.getSearchFactory(); - for(Class clazz : indexedClasses) { - searchFactory.optimize(clazz); // optimize the indices () - } - fullTextSession.flushToIndexes(); - } - + @Override public String suggestQuery(String queryString) { checkNotInPriorView("TaxonDaoHibernateImpl.suggestQuery(String queryString)"); String alternativeQueryString = null; @@ -1354,6 +1163,4 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase implem // TODO Auto-generated method stub return null; } - - } diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonomicTreeDaoHibernateImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonomicTreeDaoHibernateImpl.java index b638040ca6..e1af5d15af 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonomicTreeDaoHibernateImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonomicTreeDaoHibernateImpl.java @@ -32,6 +32,8 @@ public class TaxonomicTreeDaoHibernateImpl extends IdentifiableDaoBase, ISearchableDao { +public interface IMediaDao extends IIdentifiableDao { /** * Return a count of MediaKeys, optionally filtered by the parameters passed. diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/name/ITaxonNameDao.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/name/ITaxonNameDao.java index a562af13da..f1362db3bb 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/name/ITaxonNameDao.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/name/ITaxonNameDao.java @@ -9,27 +9,23 @@ package eu.etaxonomy.cdm.persistence.dao.name; import java.util.List; -import java.util.Map; -import java.util.UUID; import org.hibernate.criterion.Criterion; import eu.etaxonomy.cdm.model.common.RelationshipBase; import eu.etaxonomy.cdm.model.common.UuidAndTitleCache; -import eu.etaxonomy.cdm.model.name.BotanicalName; import eu.etaxonomy.cdm.model.name.HybridRelationship; import eu.etaxonomy.cdm.model.name.HybridRelationshipType; import eu.etaxonomy.cdm.model.name.NameRelationship; import eu.etaxonomy.cdm.model.name.NameRelationshipType; import eu.etaxonomy.cdm.model.name.NonViralName; import eu.etaxonomy.cdm.model.name.Rank; +import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus; import eu.etaxonomy.cdm.model.name.TaxonNameBase; import eu.etaxonomy.cdm.model.name.TypeDesignationBase; -import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus; import eu.etaxonomy.cdm.model.name.TypeDesignationStatusBase; import eu.etaxonomy.cdm.persistence.dao.BeanInitializer; import eu.etaxonomy.cdm.persistence.dao.common.IIdentifiableDao; -import eu.etaxonomy.cdm.persistence.dao.common.ISearchableDao; import eu.etaxonomy.cdm.persistence.query.MatchMode; import eu.etaxonomy.cdm.persistence.query.OrderHint; @@ -37,7 +33,7 @@ import eu.etaxonomy.cdm.persistence.query.OrderHint; * @author a.mueller * */ -public interface ITaxonNameDao extends IIdentifiableDao, ISearchableDao { +public interface ITaxonNameDao extends IIdentifiableDao { /** * Return a count of names related to or from this name, optionally filtered diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/occurrence/ICollectionDao.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/occurrence/ICollectionDao.java index 73688468b3..ddd93aecff 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/occurrence/ICollectionDao.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/occurrence/ICollectionDao.java @@ -13,9 +13,8 @@ import java.util.List; import eu.etaxonomy.cdm.model.occurrence.Collection; import eu.etaxonomy.cdm.persistence.dao.common.IIdentifiableDao; -import eu.etaxonomy.cdm.persistence.dao.common.ISearchableDao; -public interface ICollectionDao extends IIdentifiableDao, ISearchableDao { +public interface ICollectionDao extends IIdentifiableDao { /** * Returns a list of Collection instances matching the code supplied diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/occurrence/IOccurrenceDao.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/occurrence/IOccurrenceDao.java index ebd6bc2665..ca06f691b1 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/occurrence/IOccurrenceDao.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/occurrence/IOccurrenceDao.java @@ -14,13 +14,12 @@ import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent; import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; import eu.etaxonomy.cdm.persistence.dao.BeanInitializer; import eu.etaxonomy.cdm.persistence.dao.common.IIdentifiableDao; -import eu.etaxonomy.cdm.persistence.dao.common.ISearchableDao; /** * @author a.babadshanjan * @created 01.09.2008 */ -public interface IOccurrenceDao extends IIdentifiableDao, ISearchableDao { +public interface IOccurrenceDao extends IIdentifiableDao { /** * Returns a count of Media that are associated with a given occurence diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/reference/IReferenceDao.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/reference/IReferenceDao.java index 41ae81526f..95b645e4a4 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/reference/IReferenceDao.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/reference/IReferenceDao.java @@ -13,14 +13,13 @@ import java.util.List; import eu.etaxonomy.cdm.model.common.UuidAndTitleCache; import eu.etaxonomy.cdm.model.reference.ReferenceBase; import eu.etaxonomy.cdm.persistence.dao.common.IIdentifiableDao; -import eu.etaxonomy.cdm.persistence.dao.common.ISearchableDao; import eu.etaxonomy.cdm.persistence.dao.common.ITitledDao; /** * @author a.mueller * */ -public interface IReferenceDao extends IIdentifiableDao, ITitledDao, ISearchableDao { +public interface IReferenceDao extends IIdentifiableDao, ITitledDao { public List> getUuidAndTitle(); /** * @return all references marked with publish-flag diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonDao.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonDao.java index be0bfe2fdb..57384be268 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonDao.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonDao.java @@ -31,7 +31,6 @@ import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType; import eu.etaxonomy.cdm.model.taxon.TaxonomicTree; import eu.etaxonomy.cdm.persistence.dao.BeanInitializer; import eu.etaxonomy.cdm.persistence.dao.common.IIdentifiableDao; -import eu.etaxonomy.cdm.persistence.dao.common.ISearchableDao; import eu.etaxonomy.cdm.persistence.dao.common.ITitledDao; import eu.etaxonomy.cdm.persistence.fetch.CdmFetch; import eu.etaxonomy.cdm.persistence.query.MatchMode; @@ -41,30 +40,7 @@ import eu.etaxonomy.cdm.persistence.query.OrderHint; * @author a.mueller * */ -public interface ITaxonDao extends IIdentifiableDao, ITitledDao, ISearchableDao { - -// /** -// * Returns a count of TaxonBase instances (or Taxon instances, if accepted == true, or Synonym instance, if accepted == false) -// * where the taxonBase.name.nameCache property matches the String queryString -// * -// * @param queryString -// * @param accepted -// * @param sec -// * @return a count of the matching taxa -// */ -// public int countTaxaByName(String queryString, Boolean accepted, ReferenceBase sec); - -// /** -// * Returns a count of TaxonBase instances where the -// * taxon.name properties match the parameters passed. -// * -// * @param queryString search string -// * @param matchMode way how search string shall be matched: exact, beginning, or anywhere -// * @param selectMode either all taxon bases, or all taxa, or all synonyms -// * @param sec reference -// */ -// public Integer countTaxaByName(String queryString, -// MatchMode matchMode, SelectMode selectMode, ReferenceBase sec); +public interface ITaxonDao extends IIdentifiableDao, ITitledDao { /** * Returns a list of TaxonBase instances where the taxon.titleCache property matches the name parameter, diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/query/OrderHint.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/query/OrderHint.java index 208be2a7a4..1b2d1aade8 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/query/OrderHint.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/query/OrderHint.java @@ -9,10 +9,14 @@ package eu.etaxonomy.cdm.persistence.query; +import java.util.List; +import java.util.Map; + import org.hibernate.Criteria; import org.hibernate.criterion.Order; import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.query.AuditQuery; +import org.hibernate.search.FullTextQuery; import eu.etaxonomy.cdm.persistence.dao.common.OperationNotSupportedInPriorViewException; @@ -62,25 +66,41 @@ public class OrderHint { return sortOrder.equals(SortOrder.ASCENDING); } - public void add(Criteria criteria) { - Order order; - String assocObj = null, propname; - int pos; - if((pos = getPropertyName().indexOf('.', 0)) >= 0){ - assocObj = getPropertyName().substring(0, pos); - propname = getPropertyName().substring(pos + 1); - } else { - propname = getPropertyName(); - } - if(isAscending()){ - order = Order.asc(propname); - } else { - order = Order.desc(propname); - } - if(assocObj != null){ - criteria.createCriteria(assocObj).addOrder(order); + public void add(Criteria criteria, Map criteriaMap) { + if(getPropertyName().indexOf(".") != -1) { + /** + * Here we have to work a bit of magic as currently hibernate will + * throw an error if we attempt to join the same association twice. + * + * http://opensource.atlassian.com/projects/hibernate/browse/HHH-879 + */ + Order order; + + String[] assocObjs = getPropertyName().split("\\."); + String path = ""; + Criteria c = criteria; + for(int i = 0; i < assocObjs.length - 1; i++) { + path = path + assocObjs[i]; + if(criteriaMap.get(path) == null) { + c = c.createCriteria(assocObjs[i]); + criteriaMap.put(path, c); + } else { + c = criteriaMap.get(path); + } + path = path + '.'; + } + String propname = assocObjs[assocObjs.length - 1]; + if(isAscending()){ + c.addOrder(Order.asc(propname)); + } else { + c.addOrder(Order.desc(propname)); + } } else { - criteria.addOrder(order); + if(isAscending()){ + criteria.addOrder(Order.asc(getPropertyName())); + } else { + criteria.addOrder(Order.desc(getPropertyName())); + } } } diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/query/RandomOrder.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/query/RandomOrder.java index f4c2884d04..0743381fb4 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/query/RandomOrder.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/query/RandomOrder.java @@ -1,5 +1,7 @@ package eu.etaxonomy.cdm.persistence.query; +import java.util.Map; + import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.criterion.CriteriaQuery; @@ -18,7 +20,7 @@ public class RandomOrder extends OrderHint { } @Override - public void add(Criteria criteria) { + public void add(Criteria criteria, Map criteriaMap) { criteria.addOrder(new RandomHibernateOrder()); } diff --git a/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/agent/AgentDaoImplTest.java b/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/agent/AgentDaoImplTest.java index 91aaf93e38..4f54ab51db 100644 --- a/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/agent/AgentDaoImplTest.java +++ b/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/agent/AgentDaoImplTest.java @@ -186,6 +186,12 @@ public class AgentDaoImplTest extends CdmTransactionalIntegrationTest { Assert.assertEquals("There should be nine agents in the previous view",9, agentDao.count()); } + @Test + @DataSet("AgentDaoImplTest.testExists.xml") + public void testCountAuditEvents() { + Assert.assertEquals("There should be eleven AuditEvents",11, agentDao.countAuditEvents(null, null, null, null)); + } + @Test @DataSet("AgentDaoImplTest.testExists.xml") public void testList() { diff --git a/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImplTest.java b/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImplTest.java index 30ce611c08..262b026863 100644 --- a/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImplTest.java +++ b/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImplTest.java @@ -370,8 +370,10 @@ public class TaxonDaoHibernateImplTest extends CdmTransactionalIntegrationTest { propertyPaths.add("fromTaxon"); propertyPaths.add("fromTaxon.name"); List orderHints = new ArrayList(); - orderHints.add(new OrderHint("relatedFrom.titleCache", SortOrder.ASCENDING)); - + orderHints.add(new OrderHint("relatedFrom.name.genusOrUninomial", SortOrder.ASCENDING)); + orderHints.add(new OrderHint("relatedFrom.name.specificEpithet", SortOrder.ASCENDING)); + orderHints.add(new OrderHint("relatedFrom.name.infraSpecificEpithet", SortOrder.ASCENDING)); + List relatedTaxa = taxonDao.getTaxonRelationships(taxon, TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN(), null, null, orderHints,propertyPaths, TaxonRelationship.Direction.relatedTo); assertNotNull("getRelatedTaxa should return a List",relatedTaxa); assertEquals("getRelatedTaxa should return all 23 related taxa",relatedTaxa.size(),23); diff --git a/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/hibernate/CdmDeleteListenerTest.java b/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/hibernate/CdmDeleteListenerTest.java index 90a710472f..af081b7f1f 100644 --- a/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/hibernate/CdmDeleteListenerTest.java +++ b/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/hibernate/CdmDeleteListenerTest.java @@ -17,6 +17,7 @@ import java.util.UUID; import org.apache.log4j.Logger; import org.junit.Assert; +import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.unitils.dbunit.annotation.DataSet; @@ -26,28 +27,30 @@ import org.unitils.spring.annotation.SpringBeanByType; import eu.etaxonomy.cdm.model.name.HybridRelationship; import eu.etaxonomy.cdm.model.name.NameRelationship; import eu.etaxonomy.cdm.model.name.NonViralName; +import eu.etaxonomy.cdm.model.taxon.Taxon; import eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao; -import eu.etaxonomy.cdm.test.integration.CdmIntegrationTest; +import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest; /** * @author a.mueller * @created 17.09.2009 * @version 1.0 */ -public class CdmDeleteListenerTest extends CdmIntegrationTest { +public class CdmDeleteListenerTest extends CdmTransactionalIntegrationTest { @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(CdmDeleteListenerTest.class); @SpringBeanByType private ITaxonNameDao taxonNameDao; - private UUID name1Uuid = UUID.fromString("a49a3963-c4ea-4047-8588-2f8f15352730"); + private UUID uuid; - @Ignore - @Test - @DataSet("CdmDeleteListenerTest.xml") - public void testTaxonNameDao() throws Exception { - assertNotNull("taxonNameDao should exist",taxonNameDao); + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + uuid = UUID.fromString("a49a3963-c4ea-4047-8588-2f8f15352730"); } /** @@ -57,15 +60,17 @@ public class CdmDeleteListenerTest extends CdmIntegrationTest { @DataSet("CdmDeleteListenerTest.xml") @ExpectedDataSet public void testOnDelete() { - NonViralName name1 = (NonViralName)taxonNameDao.findByUuid(name1Uuid); - assertNotNull(name1); - Set relations = name1.getNameRelations(); + NonViralName name = (NonViralName)taxonNameDao.findByUuid(uuid); + assertNotNull(name); + Set relations = name.getNameRelations(); Assert.assertEquals("There must be 1 name relationship", 1, relations.size()); - name1.removeNameRelationship(relations.iterator().next()); + name.removeNameRelationship(relations.iterator().next()); - Set hybridRels = name1.getParentRelationships(); + Set hybridRels = name.getParentRelationships(); Assert.assertEquals("There must be 1 parent relationship", 1, hybridRels.size()); - taxonNameDao.saveOrUpdate(name1); + taxonNameDao.saveOrUpdate(name); + setComplete(); + endTransaction(); } } diff --git a/cdmlib-persistence/src/test/resources/eu/etaxonomy/cdm/persistence/hibernate/CdmDeleteListenerTest.xml b/cdmlib-persistence/src/test/resources/eu/etaxonomy/cdm/persistence/hibernate/CdmDeleteListenerTest.xml index 6ade66b05e..2770b64675 100644 --- a/cdmlib-persistence/src/test/resources/eu/etaxonomy/cdm/persistence/hibernate/CdmDeleteListenerTest.xml +++ b/cdmlib-persistence/src/test/resources/eu/etaxonomy/cdm/persistence/hibernate/CdmDeleteListenerTest.xml @@ -18,5 +18,4 @@ - \ No newline at end of file -- 2.34.1