#5852 dao, service and controler for taxonNode sibling retrieval
authorAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Wed, 15 Jun 2016 22:25:47 +0000 (00:25 +0200)
committerAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Wed, 15 Jun 2016 22:28:48 +0000 (00:28 +0200)
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/ClassificationDaoHibernateImpl.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/IClassificationDao.java
cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonNodeDaoHibernateImplTest.java
cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/ClassificationPortalListController.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ClassificationServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IClassificationService.java

index 35a1d3eb51bcc2631dcbc70b2e3489d493ce0660..d47191a8d1a7897910e0d0146605dd4a36c50285 100644 (file)
@@ -175,6 +175,22 @@ public class ClassificationDaoHibernateImpl extends IdentifiableDaoBase<Classifi
          return result;\r
     }\r
 \r
+    @Override\r
+    public List<TaxonNode> listSiblingsOf(Taxon taxon, Classification classification, Integer pageSize, Integer pageIndex, List<String> propertyPaths){\r
+         Query query = prepareListSiblingsOf(taxon, classification, false);\r
+\r
+         setPagingParameter(query, pageSize, pageIndex);\r
+\r
+         @SuppressWarnings("unchecked")\r
+         List<TaxonNode> result = query.list();\r
+         //check if array is "empty" (not containing null objects)\r
+         if(!result.isEmpty() && result.iterator().next()==null){\r
+            return java.util.Collections.emptyList();\r
+         }\r
+         defaultBeanInitializer.initializeAll(result, propertyPaths);\r
+         return result;\r
+    }\r
+\r
 \r
 \r
     @Override\r
@@ -184,11 +200,18 @@ public class ClassificationDaoHibernateImpl extends IdentifiableDaoBase<Classifi
         return count;\r
     }\r
 \r
+    @Override\r
+    public Long countSiblingsOf(Taxon taxon, Classification classification){\r
+        Query query = prepareListSiblingsOf(taxon, classification, true);\r
+        Long count = (Long) query.uniqueResult();\r
+        return count;\r
+    }\r
+\r
     private Query prepareListChildrenOf(Taxon taxon, Classification classification, boolean doCount){\r
 \r
        String selectWhat = doCount ? "count(cn)" : "cn";\r
 \r
-         String hql = "select " + selectWhat + " from TaxonNode as tn left join tn.classification as c left join tn.taxon as t  left join tn.childNodes as cn "\r
+         String hql = "select " + selectWhat + " from TaxonNode as tn JOIN tn.classification as c JOIN tn.taxon as t JOIN tn.childNodes as cn "\r
                  + "where t = :taxon and c = :classification";\r
          Query query = getSession().createQuery(hql);\r
          query.setParameter("taxon", taxon);\r
@@ -196,6 +219,19 @@ public class ClassificationDaoHibernateImpl extends IdentifiableDaoBase<Classifi
          return query;\r
     }\r
 \r
+    private Query prepareListSiblingsOf(Taxon taxon, Classification classification, boolean doCount){\r
+\r
+        String selectWhat = doCount ? "count(tn)" : "tn";\r
+\r
+         String subSelect = "SELECT tn.parent FROM TaxonNode as tn JOIN tn.classification as c JOIN tn.taxon as t "\r
+                 + "WHERE t = :taxon AND c = :classification";\r
+         String hql = "SELECT " + selectWhat + " FROM TaxonNode as tn WHERE tn.parent IN ( " + subSelect + ")";\r
+         Query query = getSession().createQuery(hql);\r
+         query.setParameter("taxon", taxon);\r
+         query.setParameter("classification", classification);\r
+         return query;\r
+    }\r
+\r
 \r
     @Override\r
     public UUID delete(Classification persistentObject){\r
index d99f6a635e67d116cebfdf62dfd47e7b54a659c9..b26c886d9eb95b2a31a52ffb0fc4253bf69bbb22 100644 (file)
@@ -65,5 +65,23 @@ public interface IClassificationDao extends IIdentifiableDao<Classification> {
 \r
     public abstract Long countChildrenOf(Taxon taxon, Classification classification);\r
 \r
+    /**\r
+     * @param taxon\r
+     * @param classification\r
+     * @param pageSize\r
+     * @param pageIndex\r
+     * @param propertyPaths\r
+     * @return\r
+     */\r
+    List<TaxonNode> listSiblingsOf(Taxon taxon, Classification classification, Integer pageSize, Integer pageIndex,\r
+            List<String> propertyPaths);\r
+\r
+    /**\r
+     * @param taxon\r
+     * @param classification\r
+     * @return\r
+     */\r
+    Long countSiblingsOf(Taxon taxon, Classification classification);\r
+\r
 \r
 }\r
index 467bde5625ddd1d085253b1841cd1883b9066532..79a9d8d4d3a8faf5c0083a673b9113c24f6bed2a 100644 (file)
@@ -65,6 +65,7 @@ public class TaxonNodeDaoHibernateImplTest extends CdmTransactionalIntegrationTe
     private UUID uuid3;
 
     private static final UUID ACHERONTIA_UUID = UUID.fromString("3b2b3e17-5c4a-4d1b-aa39-349f63100d6b");
+    private static final UUID ACHERONTIA_LACHESIS = UUID.fromString("bc09aca6-06fd-4905-b1e7-cbf7cc65d783");
     private static final UUID NODE_ACHERONTIA_UUID = UUID.fromString("20c8f083-5870-4cbd-bf56-c5b2b98ab6a7");
 
     private static final List<String> CLASSIFICATION_INIT_STRATEGY = Arrays.asList(new String[]{
@@ -157,6 +158,19 @@ public class TaxonNodeDaoHibernateImplTest extends CdmTransactionalIntegrationTe
         assertEquals(3, children.size());
     }
 
+    @Test
+    @DataSet
+    public void testListSiblings(){
+        Taxon t_acherontia_lachesis = (Taxon) taxonDao.load(ACHERONTIA_LACHESIS);
+
+        Classification classification =  classificationDao.load(ClassificationUuid);
+        long count = classificationDao.countSiblingsOf(t_acherontia_lachesis, classification);
+        assertEquals(2, count);
+        List<TaxonNode> siblings = classificationDao.listSiblingsOf(t_acherontia_lachesis, classification, null, null, null);
+        assertNotNull(siblings);
+        assertEquals(2, siblings.size());
+    }
+
     @Test
     @DataSet
     public void testGetAllTaxaByClassification(){
index 04f8462c313f3263c5d2dcc3ce9cba2c2975ec1a..50299870913653de59a2bff78c77df8df337289b 100644 (file)
@@ -193,6 +193,22 @@ public class ClassificationPortalListController extends IdentifiableListControll
 \r
     }\r
 \r
+    @RequestMapping(\r
+            value = {"{treeUuid}/siblingsOf/{taxonUuid}"},\r
+            method = RequestMethod.GET)\r
+    public List<TaxonNode> getSiblingsOfTaxon(\r
+            @PathVariable("treeUuid") UUID treeUuid,\r
+            @PathVariable("taxonUuid") UUID taxonUuid,\r
+            HttpServletRequest request,\r
+            HttpServletResponse response) throws IOException {\r
+        logger.info("getSiblingsOfTaxon() " + request.getRequestURI());\r
+\r
+        //FIXME return pager\r
+        List<TaxonNode> childs = service.listSiblingsOfTaxon(taxonUuid, treeUuid, null, null, NODE_INIT_STRATEGY);\r
+        return childs;\r
+\r
+    }\r
+\r
     /**\r
      * Provides path of {@link TaxonNode}s from the base node to the node of the specified taxon.\r
      * <p>\r
index 3538bba3cad7ac335789494d1585f69ad8b993b5..1d8731d6b7e76281405d7b3d5060384f9856b0a6 100644 (file)
@@ -234,6 +234,34 @@ public class ClassificationServiceImpl extends IdentifiableServiceBase<Classific
         return results;
     }
 
+    @Override
+    public Pager<TaxonNode> pageSiblingsOfTaxon(UUID taxonUuid, UUID classificationUuid, Integer pageSize,
+            Integer pageIndex, List<String> propertyPaths){
+
+        Classification classification = dao.load(classificationUuid);
+        Taxon taxon = (Taxon) taxonDao.load(taxonUuid);
+
+        long numberOfResults = dao.countSiblingsOf(taxon, classification);
+
+        List<TaxonNode> results;
+        if(PagerUtils.hasResultsInRange(numberOfResults, pageIndex, pageSize)) {
+            results = dao.listSiblingsOf(taxon, classification, pageSize, pageIndex, propertyPaths);
+            Collections.sort(results, taxonNodeComparator); // FIXME this is only a HACK, order during the hibernate query in the dao
+        } else {
+            results = new ArrayList<>();
+        }
+
+        return new DefaultPagerImpl<TaxonNode>(pageIndex, numberOfResults, pageSize, results);
+    }
+
+    @Override
+    public List<TaxonNode> listSiblingsOfTaxon(UUID taxonUuid, UUID classificationUuid, Integer pageSize,
+            Integer pageIndex, List<String> propertyPaths){
+
+        Pager<TaxonNode> pager = pageSiblingsOfTaxon(taxonUuid, classificationUuid, pageSize, pageIndex, propertyPaths);
+        return pager.getRecords();
+    }
+
     @Override
     public TaxonNode getTaxonNodeByUuid(UUID uuid) {
         return taxonNodeDao.findByUuid(uuid);
index 9de31f6d5f78c3aa3e4ef8223e35eb8edc439c8f..96e32f7af52e341d018f40e71acfee8111475683 100644 (file)
@@ -280,5 +280,27 @@ public interface IClassificationService extends IIdentifiableEntityService<Class
     List<UuidAndTitleCache<TaxonNode>> getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByClassification(
             Classification classification, List<UUID> excludeTaxa, Integer limit, String pattern);
 
+    /**
+     * @param taxonUuid
+     * @param classificationUuid
+     * @param pageSize
+     * @param pageIndex
+     * @param propertyPaths
+     * @return
+     */
+    List<TaxonNode> listSiblingsOfTaxon(UUID taxonUuid, UUID classificationUuid, Integer pageSize, Integer pageIndex,
+            List<String> propertyPaths);
+
+    /**
+     * @param taxonUuid
+     * @param classificationUuid
+     * @param pageSize
+     * @param pageIndex
+     * @param propertyPaths
+     * @return
+     */
+    Pager<TaxonNode> pageSiblingsOfTaxon(UUID taxonUuid, UUID classificationUuid, Integer pageSize, Integer pageIndex,
+            List<String> propertyPaths);
+
 
 }