explicitely ordering taxa for test ReferenceDaoHibernateImplTest.testListCoveredTaxa()
authorAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Tue, 26 Mar 2013 16:46:15 +0000 (16:46 +0000)
committerAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Tue, 26 Mar 2013 16:46:15 +0000 (16:46 +0000)
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/occurrence/DerivedUnitBase.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/reference/ReferenceDaoHibernateImpl.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/reference/IReferenceDao.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/query/OrderHint.java
cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/reference/ReferenceDaoHibernateImplTest.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ReferenceServiceImpl.java

index 4fe2f6203dd61d09f1d9438b6227422f8f318bea..9c5e4f61c74f389dee3f5dca3c4e5c93b36a15f2 100644 (file)
@@ -1,8 +1,8 @@
 /**
 * Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy 
+* European Distributed Institute of Taxonomy
 * http://www.e-taxonomy.eu
-* 
+*
 * The contents of this file are subject to the Mozilla Public License Version 1.1
 * See LICENSE.TXT at the top of this package for the full license terms.
 */
@@ -76,29 +76,29 @@ public abstract class DerivedUnitBase<S extends IIdentifiableEntityCacheStrategy
        private Collection collection;
 
        @XmlElement(name = "CatalogNumber")
-       @Field(index=Index.YES, analyze = Analyze.NO)   //TODO H42 was UN_TOKENIZED
+       @Field(index=Index.YES, analyze = Analyze.NO)
        @NullOrNotEmpty
        @Length(max = 255)
        private String catalogNumber;
-       
+
        @XmlElement(name = "AccessionNumber")
-       @Field(index=Index.YES, analyze = Analyze.NO)  //TODO H42 was UN_TOKENIZED
+       @Field(index=Index.YES, analyze = Analyze.NO)
        @NullOrNotEmpty
        @Length(max = 255)
        private String accessionNumber;
-       
+
        @XmlElement(name = "CollectorsNumber")
-       @Field(index=Index.YES, analyze = Analyze.NO) //TODO H42 was UN_TOKENIZED
+       @Field(index=Index.YES, analyze = Analyze.NO)
        @NullOrNotEmpty
        @Length(max = 255)
        private String collectorsNumber;
-       
+
        @XmlElement(name = "Barcode")
-       @Field(index=Index.YES, analyze = Analyze.NO) //TODO H42 was UN_TOKENIZED
+       @Field(index=Index.YES, analyze = Analyze.NO)
        @NullOrNotEmpty
        @Length(max = 255)
        private String barcode;
-       
+
        @XmlElement(name = "StoredUnder")
        @XmlIDREF
        @XmlSchemaType(name = "IDREF")
@@ -106,7 +106,7 @@ public abstract class DerivedUnitBase<S extends IIdentifiableEntityCacheStrategy
        @Cascade(CascadeType.SAVE_UPDATE)
        @IndexedEmbedded
        private TaxonNameBase storedUnder;
-       
+
        @XmlElement(name = "DerivedFrom")
        @XmlIDREF
        @XmlSchemaType(name = "IDREF")
@@ -114,12 +114,12 @@ public abstract class DerivedUnitBase<S extends IIdentifiableEntityCacheStrategy
        @Cascade(CascadeType.SAVE_UPDATE)
        @IndexedEmbedded(depth = 4)
        private DerivationEvent derivedFrom;
-       
+
        @XmlElementWrapper(name = "SpecimenTypeDesignations")
        @XmlElement(name = "SpecimenTypeDesignation")
        @OneToMany(fetch = FetchType.LAZY, mappedBy = "typeSpecimen")
        @Cascade({ CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE })
-       private Set<SpecimenTypeDesignation> specimenTypeDesignations = new HashSet<SpecimenTypeDesignation>();
+       private final Set<SpecimenTypeDesignation> specimenTypeDesignations = new HashSet<SpecimenTypeDesignation>();
 
        /**
         * Constructor
@@ -141,9 +141,9 @@ public abstract class DerivedUnitBase<S extends IIdentifiableEntityCacheStrategy
                this.setDerivedFrom(derivedFrom);
        }
        /**
-        * create new unit derived from an existing gathering event, 
+        * create new unit derived from an existing gathering event,
         * thereby creating a new empty field observation
-        * @param gatheringEvent the gathering event this unit was collected at 
+        * @param gatheringEvent the gathering event this unit was collected at
         */
        protected DerivedUnitBase(GatheringEvent gatheringEvent) {
                this(new FieldObservation());
@@ -155,7 +155,7 @@ public abstract class DerivedUnitBase<S extends IIdentifiableEntityCacheStrategy
        public DerivationEvent getDerivedFrom() {
                return derivedFrom;
        }
-       
+
        public void setDerivedFrom(DerivationEvent derivedFrom){
                if (getDerivedFrom() != null){
                        getDerivedFrom().getDerivatives().remove(derivedFrom);
@@ -165,11 +165,11 @@ public abstract class DerivedUnitBase<S extends IIdentifiableEntityCacheStrategy
                        derivedFrom.addDerivative(this);
                }
        }
-       
+
        @Transient
        public Set<SpecimenOrObservationBase> getOriginals(){
                if(getDerivedFrom() != null){
-                       return getDerivedFrom().getOriginals();                 
+                       return getDerivedFrom().getOriginals();
                }
                return null;
        }
@@ -177,11 +177,11 @@ public abstract class DerivedUnitBase<S extends IIdentifiableEntityCacheStrategy
        public Collection getCollection(){
                return this.collection;
        }
-       
+
        public void setCollection(Collection collection){
                this.collection = collection;
        }
-       
+
 
        public String getCatalogNumber() {
                return catalogNumber;
@@ -190,30 +190,30 @@ public abstract class DerivedUnitBase<S extends IIdentifiableEntityCacheStrategy
        public void setCatalogNumber(String catalogNumber) {
                this.catalogNumber = catalogNumber;
        }
-       
+
        public void setBarcode(String barcode) {
                this.barcode = barcode;
        }
        public String getBarcode() {
                return barcode;
        }
-       
+
        public void setStoredUnder(TaxonNameBase storedUnder) {
                this.storedUnder = storedUnder;
        }
-       
+
        public String getAccessionNumber() {
                return accessionNumber;
        }
-       
-       
+
+
        public void setAccessionNumber(String accessionNumber) {
                this.accessionNumber = accessionNumber;
        }
-       
+
        /**
         * Will be removed in future versions as semantics is not clear.
-        * For accessing the collecting number use 
+        * For accessing the collecting number use
         * {@link FieldObservation#getFieldNumber()} instead.
         * @return
         */
@@ -221,10 +221,10 @@ public abstract class DerivedUnitBase<S extends IIdentifiableEntityCacheStrategy
        public String getCollectorsNumber() {
                return collectorsNumber;
        }
-       
+
        /**
         * Will be removed in future versions as semantics is not clear.
-        * For editing the collecting number use 
+        * For editing the collecting number use
         * {@link FieldObservation#getFieldNumber()} instead.
         * @return
         */
@@ -232,22 +232,22 @@ public abstract class DerivedUnitBase<S extends IIdentifiableEntityCacheStrategy
        public void setCollectorsNumber(String collectorsNumber) {
                this.collectorsNumber = collectorsNumber;
        }
-       
+
        public TaxonNameBase getStoredUnder() {
                return storedUnder;
        }
-       
+
        public void addSpecimenTypeDesignation(SpecimenTypeDesignation specimenTypeDesignation){
                if (specimenTypeDesignation.getTypeSpecimen() == this){
                        return ;
                }else if (specimenTypeDesignation.getTypeSpecimen() != null){
                        specimenTypeDesignation.getTypeSpecimen().removeSpecimenTypeDesignation(specimenTypeDesignation);
-                       
+
                }
                specimenTypeDesignations.add(specimenTypeDesignation);
                specimenTypeDesignation.setTypeSpecimen(this);
        }
-       
+
        public void removeSpecimenTypeDesignation(SpecimenTypeDesignation specimenTypeDesignation){
                if (specimenTypeDesignation == null){
                        return;
@@ -257,19 +257,19 @@ public abstract class DerivedUnitBase<S extends IIdentifiableEntityCacheStrategy
                        specimenTypeDesignation.setTypeSpecimen(null);
                }
        }
-               
+
        public Set<SpecimenTypeDesignation> getSpecimenTypeDesignations(){
                return specimenTypeDesignations;
        }
-       
-//*********** CLONE **********************************/        
-       
-       /** 
+
+//*********** CLONE **********************************/
+
+       /**
         * Clones <i>this</i> derivedUnitBase. This is a shortcut that enables to
         * create a new instance that differs only slightly from <i>this</i> specimen
         * by modifying only some of the attributes.<BR>
         * This method overrides the clone method from {@link SpecimenOrObservationBase SpecimenOrObservationBase}.
-        * 
+        *
         * @see SpecimenOrObservationBase#clone()
         * @see eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity#clone()
         * @see java.lang.Object#clone()
index 314194ae91c641354fc07a6212aeb1527621232c..df4035e94835ff99432260c84a8373f3e69a7eaf 100644 (file)
@@ -1,8 +1,8 @@
 /**\r
 * Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
+* European Distributed Institute of Taxonomy\r
 * http://www.e-taxonomy.eu\r
-* \r
+*\r
 * The contents of this file are subject to the Mozilla Public License Version 1.1\r
 * See LICENSE.TXT at the top of this package for the full license terms.\r
 */\r
@@ -35,6 +35,7 @@ import eu.etaxonomy.cdm.model.reference.ReferenceType;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase;\r
 import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 import eu.etaxonomy.cdm.strategy.cache.reference.ReferenceBaseDefaultCacheStrategy;\r
 \r
 /**\r
@@ -53,10 +54,10 @@ public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase<Reference> im
        @Override\r
        public void rebuildIndex() {\r
                FullTextSession fullTextSession = Search.getFullTextSession(getSession());\r
-               \r
+\r
                for(Reference reference : list(null,null)) { // re-index all agents\r
                        Hibernate.initialize(reference.getAuthorTeam());\r
-                       \r
+\r
                        if(reference.getType().equals(ReferenceType.Article)) {\r
                                Hibernate.initialize(((IArticle)reference).getInJournal());\r
                        } else if(reference.getType().equals(ReferenceType.BookSection)) {\r
@@ -75,49 +76,51 @@ public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase<Reference> im
                fullTextSession.flushToIndexes();\r
        }\r
 \r
-       public List<UuidAndTitleCache<Reference>> getUuidAndTitle(){\r
+       @Override\r
+    public List<UuidAndTitleCache<Reference>> getUuidAndTitle(){\r
                List<UuidAndTitleCache<Reference>> list = new ArrayList<UuidAndTitleCache<Reference>>();\r
                Session session = getSession();\r
-               \r
+\r
                Query query = session.createQuery("select uuid, titleCache from " + type.getSimpleName());\r
-               \r
+\r
                List<Object[]> result = query.list();\r
-               \r
+\r
                for(Object[] object : result){\r
                        list.add(new UuidAndTitleCache<Reference>(type, (UUID) object[0], (String) object[1]));\r
                }\r
-               \r
+\r
                return list;\r
        }\r
-       \r
+\r
        @Override\r
        public List<UuidAndTitleCache<Reference>> getUuidAndTitleCache() {\r
                List<UuidAndTitleCache<Reference>> list = new ArrayList<UuidAndTitleCache<Reference>>();\r
                Session session = getSession();\r
-               \r
+\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
+\r
                List<Object[]> result = query.list();\r
-               \r
+\r
                for(Object[] object : result){\r
                        UuidAndTitleCache<Reference> uuidAndTitleCache;\r
                        String referenceTitle = (String) object[1];\r
-                       \r
-                       if(referenceTitle != null){                                                     \r
+\r
+                       if(referenceTitle != null){\r
                                String teamTitle = (String) object[2];\r
                                referenceTitle = ReferenceBaseDefaultCacheStrategy.putAuthorToEndOfString(referenceTitle, teamTitle);\r
-                               \r
+\r
                                list.add(new UuidAndTitleCache<Reference>(Reference.class, (UUID) object[0], referenceTitle));\r
                        }else{\r
                                logger.error("title cache of reference is null. UUID: " + object[0]);\r
                        }\r
                }\r
-               \r
+\r
                return list;\r
        }\r
-       \r
-       public List<Reference> getAllReferencesForPublishing(){\r
+\r
+       @Override\r
+    public List<Reference> getAllReferencesForPublishing(){\r
                List<Reference> references = getSession().createQuery("Select r from Reference r "+\r
                                "where r.id IN "+\r
                                        "(Select m.markedObj.id from Marker m where "+\r
@@ -125,20 +128,22 @@ public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase<Reference> im
                                                        "(Select dtb.id from DefinedTermBase dtb, Representation r where r member of dtb.representations and r.text='publish'))").list();\r
                return references;\r
        }\r
-       \r
-       public List<Reference> getAllNotNomenclaturalReferencesForPublishing(){\r
-               \r
+\r
+       @Override\r
+    public List<Reference> getAllNotNomenclaturalReferencesForPublishing(){\r
+\r
                List<Reference> references = getSession().createQuery("select t.nomenclaturalReference from TaxonNameBase t").list();\r
                String queryString = "from Reference b where b not in (:referenceList) and b in (:publish)" ;\r
                Query referenceQuery = getSession().createQuery(queryString).setParameterList("referenceList", references);\r
                referenceQuery.setParameterList("publish", getAllReferencesForPublishing());\r
                List<Reference> resultRefernces =referenceQuery.list();\r
-                               \r
+\r
                return resultRefernces;\r
        }\r
-       \r
+\r
        // the result list held doubles therefore i put a "distinct" in the query string\r
-       public List<Reference> getAllNomenclaturalReferences() {\r
+       @Override\r
+    public List<Reference> getAllNomenclaturalReferences() {\r
                List<Reference> references = getSession().createQuery(\r
                                "select distinct t.nomenclaturalReference from TaxonNameBase t").list();\r
                return references;\r
@@ -147,10 +152,10 @@ public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase<Reference> im
        @Override\r
        public List<Reference> getSubordinateReferences(\r
                        Reference reference) {\r
-               \r
+\r
                List<Reference> references = new ArrayList();\r
                List<Reference> subordinateReferences = new ArrayList();\r
-               \r
+\r
                Query query = getSession().createQuery("select r from Reference r where r.inReference = (:reference)");\r
                query.setParameter("reference", reference);\r
                references.addAll(query.list());\r
@@ -162,8 +167,8 @@ public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase<Reference> im
        }\r
 \r
        @Override\r
-       public List<TaxonBase> listCoveredTaxa(Reference reference, boolean includeSubordinateReferences, List<String> propertyPaths) {\r
-               \r
+       public List<TaxonBase> listCoveredTaxa(Reference reference, boolean includeSubordinateReferences, List<OrderHint> orderHints, List<String> propertyPaths) {\r
+\r
                /*\r
                 * <li>taxon.name.nomenclaturalreference</li>\r
                 * <li>taxon.descriptions.descriptionElement.sources.citation</li>\r
@@ -171,7 +176,7 @@ public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase<Reference> im
                 * <li>taxon.name.descriptions.descriptionElement.sources</li>\r
                 * <li>taxon.name.descriptions.descriptionSources</li>\r
                 */\r
-               \r
+\r
                //TODO implement search in nameDescriptions\r
                List<TaxonBase> taxonBaseList = new ArrayList<TaxonBase>();\r
                Set<Reference> referenceSet = new HashSet<Reference>();\r
@@ -180,9 +185,9 @@ public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase<Reference> im
                        referenceSet.addAll(getSubordinateReferences(reference));\r
                }\r
 \r
-       \r
-               String taxonDescriptionSql = \r
-                       \r
+\r
+               StringBuilder taxonDescriptionSql = new StringBuilder();\r
+               taxonDescriptionSql.append(\r
                        "select distinct t from Taxon t " +\r
                        // TaxonDescription\r
                        "left join t.descriptions td " +\r
@@ -195,31 +200,42 @@ public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase<Reference> im
                        "left join nd.descriptionSources nd_s " +\r
                        "left join nd.descriptionElements nd_e " +\r
                        "left join nd_e.sources nd_e_s " +\r
-                       \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
+                       );\r
+\r
+               if (orderHints != null && orderHints.size() > 0){\r
+                   taxonDescriptionSql.append(" order by ");\r
+                   int i = 0;\r
+                   for (OrderHint hint : orderHints) {\r
+                       if(i > 0) {\r
+                           taxonDescriptionSql.append(", ");\r
+                       }\r
+                       taxonDescriptionSql.append("t.").append(hint.toHql());\r
+            }\r
+               }\r
+\r
+               // TODO include:\r
+               // name relations\r
+               // taxon relations\r
+\r
+               Query query = getSession().createQuery(taxonDescriptionSql.toString());\r
+               query.setParameterList("referenceBase_1", referenceSet);\r
+               query.setParameterList("referenceBase_2", referenceSet);\r
+               query.setParameterList("referenceBase_3", referenceSet);\r
+               query.setParameterList("referenceBase_4", referenceSet);\r
+               query.setParameterList("referenceBase_5", referenceSet);\r
+               query.setParameterList("referenceBase_6", referenceSet);\r
+\r
+               taxonBaseList = query.list();\r
+\r
                defaultBeanInitializer.initializeAll(taxonBaseList, propertyPaths);\r
-               \r
+\r
                return taxonBaseList;\r
        }\r
 }
\ No newline at end of file
index ae610cfef4ca76a9d2b71fbcc149d3c6acd3ad29..6412ecabfa7171c13f8878b6d6916946bb8f3620 100644 (file)
@@ -1,8 +1,8 @@
 /**\r
 * Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
+* European Distributed Institute of Taxonomy\r
 * http://www.e-taxonomy.eu\r
-* \r
+*\r
 * The contents of this file are subject to the Mozilla Public License Version 1.1\r
 * See LICENSE.TXT at the top of this package for the full license terms.\r
 */\r
@@ -15,27 +15,28 @@ import eu.etaxonomy.cdm.model.reference.Reference;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 import eu.etaxonomy.cdm.persistence.dao.common.IIdentifiableDao;\r
 import eu.etaxonomy.cdm.persistence.dao.common.ITitledDao;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 \r
 /**\r
  * @author a.mueller\r
  *\r
  */\r
 public interface IReferenceDao extends IIdentifiableDao<Reference>, ITitledDao<Reference> {\r
-       \r
+\r
        public List<UuidAndTitleCache<Reference>> getUuidAndTitle();\r
-       \r
+\r
        /**\r
         * TODO candidate for harmonization: rename to listAllReferencesForPublishing\r
         * @return all references marked with publish-flag\r
         */\r
        public List<Reference> getAllReferencesForPublishing();\r
-       \r
+\r
        /**\r
         * TODO candidate for harmonization: rename to listAllNotNomenclaturalReferencesForPublishing\r
         * @return all references not used as nomenclatural reference with publish flag\r
         */\r
        public List<Reference> getAllNotNomenclaturalReferencesForPublishing();\r
-       \r
+\r
        /**\r
         * TODO candidate for harmonization: rename to listNomenclaturalReferences\r
         * @return\r
@@ -43,13 +44,13 @@ public interface IReferenceDao extends IIdentifiableDao<Reference>, ITitledDao<R
        public List<Reference> getAllNomenclaturalReferences();\r
 \r
        /**\r
-        * recursively finds all references where the <code>referenceBase</code> given as parameter \r
+        * recursively finds all references where the <code>referenceBase</code> given as parameter\r
         * is the {@link Reference.getInReference inReference}.\r
         * @param reference\r
         * @return\r
         */\r
        public List<Reference> getSubordinateReferences(Reference reference);\r
-       \r
+\r
        /**\r
         * searches for taxa using the following relations:\r
         * <ul>\r
@@ -59,11 +60,12 @@ public interface IReferenceDao extends IIdentifiableDao<Reference>, ITitledDao<R
         * <li>taxon.name.descriptions.descriptionElement.sources</li>\r
         * <li>taxon.name.descriptions.descriptionSources</li>\r
         * </ul>\r
-        * \r
+        *\r
         * @param reference\r
+        * @param orderHints TODO\r
         * @param propertyPaths TODO\r
         * @return\r
         */\r
-       public List<TaxonBase> listCoveredTaxa(Reference reference, boolean includeSubordinateReferences, List<String> propertyPaths);\r
-       \r
+       public List<TaxonBase> listCoveredTaxa(Reference reference, boolean includeSubordinateReferences, List<OrderHint> orderHints, List<String> propertyPaths);\r
+\r
 }\r
index c8a9d712436575a6e22db570662eda62ee2d588c..68fc357e75bb8df210a275779ad21ec049c521ec 100644 (file)
@@ -48,9 +48,9 @@ public class OrderHint {
         }\r
     }\r
 \r
-    private String propertyName;\r
+    private final String propertyName;\r
 \r
-    private SortOrder sortOrder;\r
+    private final SortOrder sortOrder;\r
 \r
     public static final List<OrderHint> ORDER_BY_ID = Arrays.asList(new OrderHint[]{new OrderHint("id", SortOrder.ASCENDING)});\r
 \r
@@ -94,6 +94,12 @@ public class OrderHint {
         return sortOrder.equals(SortOrder.ASCENDING);\r
     }\r
 \r
+    /**\r
+     * FIXME document this\r
+     *\r
+     * @param criteria\r
+     * @param criteriaMap\r
+     */\r
     public void add(Criteria criteria, Map<String, Criteria> criteriaMap) {\r
         if(getPropertyName().indexOf(".") != -1) {\r
             /**\r
@@ -132,6 +138,11 @@ public class OrderHint {
         }\r
     }\r
 \r
+    /**\r
+     * FIXME document this\r
+     *\r
+     * @param query\r
+     */\r
     public void add(AuditQuery query) {\r
 \r
         if(getPropertyName().indexOf('.', 0) >= 0){\r
@@ -145,6 +156,17 @@ public class OrderHint {
         }\r
     }\r
 \r
+    /**\r
+     * Returns a hql order by clause element which can directly be used in hql queries.\r
+     *\r
+     * e.g.: "titleCache ASC"\r
+     *\r
+     * @return an hql order by clause element\r
+     */\r
+    public String toHql(){\r
+        return propertyName + " " + sortOrder.toHql();\r
+    }\r
+\r
     @Override\r
     public boolean equals(Object obj) {\r
         if (obj == this){\r
index 0e423c57c6b7e9ad59e2a292e62fedd629a40687..5392e80897aa25371859341b8983f789f86f91ad 100644 (file)
@@ -5,12 +5,13 @@
 *\r
 * The contents of this file are subject to the Mozilla Public License Version 1.1\r
 * See LICENSE.TXT at the top of this package for the full license terms.\r
-*/ \r
+*/\r
 \r
 package eu.etaxonomy.cdm.persistence.dao.hibernate.reference;\r
 \r
 import static org.junit.Assert.assertEquals;\r
 \r
+import java.util.Arrays;\r
 import java.util.HashSet;\r
 import java.util.List;\r
 import java.util.Set;\r
@@ -26,27 +27,28 @@ import eu.etaxonomy.cdm.model.reference.IJournal;
 import eu.etaxonomy.cdm.model.reference.Reference;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 import eu.etaxonomy.cdm.test.integration.CdmIntegrationTest;\r
 \r
 @DataSet\r
 public class ReferenceDaoHibernateImplTest extends CdmIntegrationTest {\r
-       \r
+\r
        @SpringBeanByType\r
        IReferenceDao referenceDao;\r
-       \r
+\r
        private UUID firstBookUuid;\r
        private UUID firstJournalUuid;\r
        private UUID genericUuid;\r
        private UUID proceedingsUuid;\r
        private UUID bookSectionUuid;\r
        private UUID nomenclaturalReferenceBookUuid;\r
-       \r
-       private String firstPublisherName ="First Publisher";\r
-       private String secondPublisherName ="Second Publisher";\r
-       private String thirdPublisherName ="Third Publisher";\r
-       private String fourthPublisherName ="Fourth Publisher";\r
-       \r
-       \r
+\r
+       private final String firstPublisherName ="First Publisher";\r
+       private final String secondPublisherName ="Second Publisher";\r
+       private final String thirdPublisherName ="Third Publisher";\r
+       private final String fourthPublisherName ="Fourth Publisher";\r
+\r
+\r
        @Before\r
        public void setUp() {\r
                firstBookUuid = UUID.fromString("596b1325-be50-4b0a-9aa2-3ecd610215f2");\r
@@ -60,14 +62,14 @@ public class ReferenceDaoHibernateImplTest extends CdmIntegrationTest {
        @Test\r
        public void testDummy() {\r
        }\r
-       \r
+\r
        @Test\r
        public void testGetPublishers() {\r
-               IJournal firstJournal = (IJournal)referenceDao.findByUuid(firstJournalUuid);\r
+               IJournal firstJournal = referenceDao.findByUuid(firstJournalUuid);\r
                assert firstJournal!= null : "journal must exist";\r
-               \r
+\r
 //             List<Publisher> publishers = firstJournal.getPublishers();\r
-//             \r
+//\r
 //             assertNotNull("getPublishers should return a list", publishers);\r
 //             assertFalse("the list should not be empty", publishers.isEmpty());\r
 //             assertEquals("getPublishers should return 4 Publisher instances",4,publishers.size());\r
@@ -75,23 +77,23 @@ public class ReferenceDaoHibernateImplTest extends CdmIntegrationTest {
 //             assertEquals("second publisher should come second",secondPublisherName,publishers.get(1).getPublisherName());\r
 //             assertEquals("third publisher should come third",thirdPublisherName,publishers.get(2).getPublisherName());\r
 //             assertEquals("fourth publisher should come fourth",fourthPublisherName,publishers.get(3).getPublisherName());\r
-               \r
-               \r
+\r
+\r
        }\r
-       \r
+\r
        @Test\r
        public void testGetSubordinateReferences() {\r
-               \r
-           Reference book = referenceDao.findByUuid(firstBookUuid);        \r
+\r
+           Reference book = referenceDao.findByUuid(firstBookUuid);\r
            Reference proceedings = referenceDao.findByUuid(proceedingsUuid);\r
-           \r
+\r
            // 1.)\r
                List<Reference> book_subordinateReferences = referenceDao.getSubordinateReferences(book);\r
                assertEquals("expecting one subordinate reference", book_subordinateReferences.size(), 1);\r
                Reference sub_1 = book_subordinateReferences.get(0);\r
                assertEquals("expecting BookSection as first subordinateReferences", "Better Testing made easy", sub_1.getTitleCache());\r
                assertEquals("first subordinateReferences matches uuid", bookSectionUuid, sub_1.getUuid());\r
-               \r
+\r
                // 2.)\r
                List<Reference> proceedings_subordinateReferences = referenceDao.getSubordinateReferences(proceedings);\r
                assertEquals("expecting one subordinate reference",2 ,proceedings_subordinateReferences.size());\r
@@ -102,41 +104,43 @@ public class ReferenceDaoHibernateImplTest extends CdmIntegrationTest {
                assertEquals("first subordinateReferences matches uuid", firstBookUuid, sub_1.getUuid());\r
                assertEquals("second subordinateReferences matches uuid", bookSectionUuid, sub_2.getUuid());\r
        }\r
-       \r
+\r
        @Test\r
        public void testListCoveredTaxa() {\r
 \r
                Reference<?> book = referenceDao.findByUuid(firstBookUuid);\r
-               List<TaxonBase> coveredTaxa = referenceDao.listCoveredTaxa(book, false, null);\r
+               List<OrderHint> orderHints = Arrays.asList(new OrderHint[]{new OrderHint("titleCache", OrderHint.SortOrder.DESCENDING)});\r
+\r
+               List<TaxonBase> coveredTaxa = referenceDao.listCoveredTaxa(book, false, orderHints, null);\r
                assertEquals("expecting one Taxa covered by this book", 1, coveredTaxa.size());\r
                assertEquals("covered taxon is 'Lactuca perennis'", "Lactuca perennis", coveredTaxa.get(0).getName().getTitleCache() );\r
-               \r
-               coveredTaxa = referenceDao.listCoveredTaxa(book, true, null);\r
+\r
+               coveredTaxa = referenceDao.listCoveredTaxa(book, true, orderHints, null);\r
                assertEquals("expecting 2 Taxa covered by this book", 2, coveredTaxa.size());\r
                Set<String> titles = makeTitleCacheSet(coveredTaxa);\r
                Assert.assertTrue("covered taxa must contain 'Lactuca perennis'", titles.contains("Lactuca perennis"));\r
                Assert.assertTrue("covered taxon must contain 'Lactuca virosa'", titles.contains("Lactuca virosa"));\r
-//             assertEquals("2nd covered taxon is 'Lactuca virosa'", "Lactuca virosa", coveredTaxa.get(1).getName().getTitleCache() );\r
-               \r
+               assertEquals("2nd covered taxon is 'Lactuca virosa'", "Lactuca virosa", coveredTaxa.get(1).getName().getTitleCache() );\r
+\r
                Reference bookSection = referenceDao.findByUuid(bookSectionUuid);\r
-               coveredTaxa = referenceDao.listCoveredTaxa(bookSection, false, null);\r
+               coveredTaxa = referenceDao.listCoveredTaxa(bookSection, false, orderHints, null);\r
                assertEquals("expecting two Taxa covered by this bookSection", 2, coveredTaxa.size());\r
                titles = makeTitleCacheSet(coveredTaxa);\r
                Assert.assertTrue("covered taxa must contain 'Lactuca perennis'", titles.contains("Lactuca perennis"));\r
                Assert.assertTrue("covered taxon must contain 'Lactuca virosa'", titles.contains("Lactuca virosa"));\r
-//             assertEquals("1st covered taxon is 'Lactuca perennis'", "Lactuca perennis", coveredTaxa.get(0).getName().getTitleCache() );\r
-//             assertEquals("2nd covered taxon is 'Lactuca virosa'", "Lactuca virosa", coveredTaxa.get(1).getName().getTitleCache() );\r
-               \r
+               assertEquals("1st covered taxon is 'Lactuca perennis'", "Lactuca perennis", coveredTaxa.get(0).getName().getTitleCache() );\r
+               assertEquals("2nd covered taxon is 'Lactuca virosa'", "Lactuca virosa", coveredTaxa.get(1).getName().getTitleCache() );\r
+\r
                // by nomenclaturalReference\r
                Reference nomRef = referenceDao.findByUuid(nomenclaturalReferenceBookUuid);\r
-               coveredTaxa = referenceDao.listCoveredTaxa(nomRef, false, null);\r
+               coveredTaxa = referenceDao.listCoveredTaxa(nomRef, false, orderHints, null);\r
                assertEquals("expecting two Taxa covered nomenclaturalReference", 2, coveredTaxa.size());\r
                titles = makeTitleCacheSet(coveredTaxa);\r
                Assert.assertTrue("covered taxa must contain 'Lactuca perennis'", titles.contains("Lactuca perennis"));\r
                Assert.assertTrue("covered taxon must contain 'Lactuca virosa'", titles.contains("Lactuca virosa"));\r
-//             assertEquals("covered taxon is 'Lactuca perennis'", "Lactuca perennis", coveredTaxa.get(0).getName().getTitleCache() );\r
-//             assertEquals("2nd covered taxon is 'Lactuca virosa'", "Lactuca virosa", coveredTaxa.get(1).getName().getTitleCache() );\r
-       \r
+               assertEquals("covered taxon is 'Lactuca perennis'", "Lactuca perennis", coveredTaxa.get(0).getName().getTitleCache() );\r
+               assertEquals("2nd covered taxon is 'Lactuca virosa'", "Lactuca virosa", coveredTaxa.get(1).getName().getTitleCache() );\r
+\r
        }\r
 \r
        private Set<String> makeTitleCacheSet(List<TaxonBase> coveredTaxa) {\r
index 3709c0f38b12461eb528eed769d2a5866c9e2458..e5de27ec2ee18bd3a72d65e07dd38028bcb6ce9e 100644 (file)
@@ -76,7 +76,7 @@ public class ReferenceServiceImpl extends IdentifiableServiceBase<Reference,IRef
        @Override\r
        public List<TaxonBase> listCoveredTaxa(Reference reference, boolean includeSubordinateReferences, List<String> propertyPaths) {\r
                \r
-               List<TaxonBase> taxonList = dao.listCoveredTaxa(reference, includeSubordinateReferences, propertyPaths);\r
+               List<TaxonBase> taxonList = dao.listCoveredTaxa(reference, includeSubordinateReferences, null, propertyPaths);\r
                \r
                return taxonList;\r
        }\r