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
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
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
\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
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[]{
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(){
\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
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);
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);
+
}