import eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao;\r
import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;\r
import eu.etaxonomy.cdm.persistence.dto.SpecimenNodeWrapper;\r
+import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;\r
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;\r
import eu.etaxonomy.cdm.persistence.query.MatchMode;\r
import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
extends IdentifiableDaoBase<SpecimenOrObservationBase>\r
implements IOccurrenceDao {\r
\r
- @SuppressWarnings("unused")\r
private static final Logger logger = Logger.getLogger(TaxonDaoHibernateImpl.class);\r
\r
@Autowired\r
@Override\r
public long countMedia(SpecimenOrObservationBase occurence) {\r
checkNotInPriorView("OccurrenceDaoHibernateImpl.countMedia(SpecimenOrObservationBase occurence)");\r
- Query query = getSession().createQuery("select count(media) from SpecimenOrObservationBase occurence join occurence.media media where occurence = :occurence");\r
+ Query query = getSession().createQuery("SELECT count(media) FROM SpecimenOrObservationBase occurence JOIN occurence.media media WHERE occurence = :occurence");\r
query.setParameter("occurence", occurence);\r
\r
return (Long)query.uniqueResult();\r
@Override\r
public List<DerivationEvent> getDerivationEvents(SpecimenOrObservationBase occurence, Integer pageSize,Integer pageNumber, List<String> propertyPaths) {\r
checkNotInPriorView("OccurrenceDaoHibernateImpl.getDerivationEvents(SpecimenOrObservationBase occurence, Integer pageSize,Integer pageNumber)");\r
- Query query = getSession().createQuery("select distinct derivationEvent from DerivationEvent derivationEvent join derivationEvent.originals occurence where occurence = :occurence");\r
+ Query query = getSession().createQuery("SELECT DISTINCT derivationEvent FROM DerivationEvent derivationEvent JOIN derivationEvent.originals occurence WHERE occurence = :occurence");\r
query.setParameter("occurence", occurence);\r
\r
addPageSizeAndNumber(query, pageSize, pageNumber);\r
}\r
\r
@Override\r
- public List<DeterminationEvent> getDeterminations(SpecimenOrObservationBase occurrence, TaxonBase taxonBase, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
+ public List<DeterminationEvent> getDeterminations(SpecimenOrObservationBase occurrence,\r
+ TaxonBase taxonBase, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
AuditEvent auditEvent = getAuditEventFromContext();\r
if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
Criteria criteria = getSession().createCriteria(DeterminationEvent.class);\r
}\r
\r
@Override\r
- public List<Media> getMedia(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
+ public List<Media> getMedia(SpecimenOrObservationBase occurence,\r
+ Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
checkNotInPriorView("OccurrenceDaoHibernateImpl.getMedia(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber, List<String> propertyPaths)");\r
Query query = getSession().createQuery(\r
" SELECT media "\r
}\r
\r
private <T extends SpecimenOrObservationBase> Criteria createFindOccurrenceCriteria(Class<T> clazz, String queryString,\r
- String significantIdentifier, SpecimenOrObservationType recordBasis, Taxon associatedTaxon, TaxonName associatedTaxonName, MatchMode matchmode, Integer limit,\r
+ String significantIdentifier, SpecimenOrObservationType recordBasis, Taxon associatedTaxon,\r
+ TaxonName associatedTaxonName, MatchMode matchmode, Integer limit,\r
Integer start, List<OrderHint> orderHints, List<String> propertyPaths) {\r
Criteria criteria = null;\r
\r
}\r
\r
//recordBasis/SpecimenOrObservationType\r
- Set<SpecimenOrObservationType> typeAndSubtypes = new HashSet<SpecimenOrObservationType>();\r
+ Set<SpecimenOrObservationType> typeAndSubtypes = new HashSet<>();\r
if(recordBasis==null){\r
//add all types\r
SpecimenOrObservationType[] values = SpecimenOrObservationType.values();\r
}\r
criteria.add(Restrictions.in("recordBasis", typeAndSubtypes));\r
\r
- Set<UUID> associationUuids = new HashSet<UUID>();\r
+ Set<UUID> associationUuids = new HashSet<>();\r
//taxon associations\r
if(associatedTaxon!=null){\r
List<UuidAndTitleCache<SpecimenOrObservationBase>> associatedTaxaList = listUuidAndTitleCacheByAssociatedTaxon(clazz, associatedTaxon, limit, start, orderHints);\r
return results;\r
}\r
\r
- private List<SpecimenNodeWrapper> querySpecimen(\r
- Query query, List<UUID> taxonNodeUuids,\r
+ private List<SpecimenNodeWrapper> querySpecimen(Query query, List<UUID> taxonNodeUuids,\r
Integer limit, Integer start){\r
query.setParameterList("taxonNodeUuids", taxonNodeUuids);\r
\r
@SuppressWarnings("unchecked")\r
List<Object[]> result = query.list();\r
for(Object[] object : result){\r
- list.add(new SpecimenNodeWrapper(\r
+ SpecimenNodeWrapper wrapper = new SpecimenNodeWrapper(\r
new UuidAndTitleCache<>(\r
(UUID) object[0],\r
(Integer) object[1],\r
(String) object[2]),\r
- (TaxonNode)object[3]));\r
+ (SpecimenOrObservationType)object[3],\r
+ new TaxonNodeDto((TaxonNode)object[4]));\r
+ if(object.length>5) {\r
+ wrapper.setTaxonDescriptionUuid((UUID)object[5]);\r
+ }\r
+ list.add(wrapper);\r
}\r
return list;\r
}\r
+ "de.associatedSpecimenOrObservation.uuid, "\r
+ "de.associatedSpecimenOrObservation.id, "\r
+ "de.associatedSpecimenOrObservation.titleCache, "\r
- + "tn "\r
+ + "de.associatedSpecimenOrObservation.recordBasis, "\r
+ + "tn, "\r
+ + "d.uuid "\r
+ "FROM DescriptionElementBase AS de "\r
+ "LEFT JOIN de.inDescription AS d "\r
+ "LEFT JOIN d.taxon AS t "\r
+ "td.typeSpecimen.uuid, "\r
+ "td.typeSpecimen.id, "\r
+ "td.typeSpecimen.titleCache, "\r
+ + "td.typeSpecimen.recordBasis, "\r
+ "tn "\r
+ "FROM SpecimenTypeDesignation AS td "\r
+ "LEFT JOIN td.typifiedNames AS tn "\r
+ "det.identifiedUnit.uuid, "\r
+ "det.identifiedUnit.id, "\r
+ "det.identifiedUnit.titleCache, "\r
+ + "det.identifiedUnit.recordBasis, "\r
+ "tn "\r
+ "FROM DeterminationEvent AS det "\r
+ "LEFT JOIN det.taxon AS t "\r
+ "det.identifiedUnit.uuid, "\r
+ "det.identifiedUnit.id, "\r
+ "det.identifiedUnit.titleCache, "\r
+ + "det.identifiedUnit.recordBasis, "\r
+ "tn "\r
+ "FROM DeterminationEvent AS det "\r
+ "LEFT JOIN det.taxonName AS n "\r
public Collection<SpecimenNodeWrapper> listUuidAndTitleCacheByAssociatedTaxon(List<UUID> taxonNodeUuids,\r
Integer limit, Integer start){\r
\r
- Collection<SpecimenNodeWrapper> wrappers = new HashSet<>();\r
- wrappers.addAll(queryIndividualAssociatedSpecimen(taxonNodeUuids, limit, start));\r
- wrappers.addAll(queryTaxonDeterminations(taxonNodeUuids, limit, start));\r
- wrappers.addAll(queryTaxonNameDeterminations(taxonNodeUuids, limit, start));\r
- wrappers.addAll(queryTypeSpecimen(taxonNodeUuids, limit, start));\r
+ Set<SpecimenNodeWrapper> testSet = new HashSet();\r
+\r
+ testSet.addAll(queryIndividualAssociatedSpecimen(taxonNodeUuids, limit, start));\r
+ testSet.addAll(queryTaxonDeterminations(taxonNodeUuids, limit, start));\r
+ testSet.addAll(queryTaxonNameDeterminations(taxonNodeUuids, limit, start));\r
+ testSet.addAll(queryTypeSpecimen(taxonNodeUuids, limit, start));\r
\r
+ Collection<SpecimenNodeWrapper> wrappers = new HashSet<>();\r
+ wrappers.addAll(testSet);\r
return wrappers;\r
}\r
\r
@Override\r
public <T extends SpecimenOrObservationBase> List<UuidAndTitleCache<SpecimenOrObservationBase>> listUuidAndTitleCacheByAssociatedTaxon(Class<T> clazz, Taxon associatedTaxon,\r
Integer limit, Integer start, List<OrderHint> orderHints){\r
- Query query = createSpecimenQuery("sob.uuid, sob.id, sob.titleCache", clazz, associatedTaxon, limit, start, orderHints, null);\r
+ Query query = createSpecimenQuery("sob.uuid, sob.id, sob.titleCache", clazz, associatedTaxon, limit, start, orderHints);\r
if(query==null){\r
return Collections.emptyList();\r
}\r
@Override\r
public <T extends SpecimenOrObservationBase> List<T> listByAssociatedTaxon(Class<T> clazz,\r
Taxon associatedTaxon, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths) {\r
- Query query = createSpecimenQuery("sob", clazz, associatedTaxon, limit, start, orderHints, propertyPaths);\r
+ Query query = createSpecimenQuery("sob", clazz, associatedTaxon, limit, start, orderHints);\r
if(query==null){\r
return Collections.emptyList();\r
}\r
}\r
\r
private <T extends SpecimenOrObservationBase> Query createSpecimenQuery(String select, Class<T> clazz,\r
- Taxon associatedTaxon, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths){\r
- Set<SpecimenOrObservationBase> setOfAll = new HashSet<>();\r
+ Taxon associatedTaxon, Integer limit, Integer start, List<OrderHint> orderHints){\r
+// Set<SpecimenOrObservationBase> setOfAll = new HashSet<>();\r
Set<Integer> setOfAllIds = new HashSet<>();\r
\r
Criteria criteria = null;\r
for(HomotypicalGroup homotypicalGroup : associatedTaxon.getHomotypicSynonymyGroups()) {\r
List<SpecimenTypeDesignation> byHomotypicalGroup = homotypicalGroupDao.getTypeDesignations(homotypicalGroup, SpecimenTypeDesignation.class, null, null, 0, null);\r
for (SpecimenTypeDesignation specimenTypeDesignation : byHomotypicalGroup) {\r
- setOfAll.add(specimenTypeDesignation.getTypeSpecimen());\r
+ if (specimenTypeDesignation.getTypeSpecimen() != null){\r
+ setOfAllIds.add(specimenTypeDesignation.getTypeSpecimen().getId());\r
+ }\r
}\r
}\r
\r
}\r
\r
/**\r
+ *\r
* {@inheritDoc}\r
*/\r
@Override\r
- public List<DerivedUnit> findByGeneticAccessionNumber(String accessionNumberString, List<String> propertyPaths) {\r
- String queryString = "SELECT dnaSample FROM DnaSample dnaSample join dnaSample.sequences sequence WHERE sequence.geneticAccessionNumber LIKE :accessionNumberString";\r
+ public DnaSample findByGeneticAccessionNumber(String accessionNumberString, List<String> propertyPaths) {\r
+ String queryString = "SELECT dnaSample FROM DnaSample as dnaSample join dnaSample.sequences as sequences WITH sequences.geneticAccessionNumber LIKE :accessionNumberString";\r
Query query = getSession().createQuery(queryString);\r
query.setParameter("accessionNumberString", accessionNumberString);\r
@SuppressWarnings("unchecked")\r
- List<DerivedUnit> results = query.list();\r
- defaultBeanInitializer.initializeAll(results, propertyPaths);\r
- return results;\r
+ List<DnaSample> dnaSamples = query.list();\r
+ defaultBeanInitializer.initializeAll(dnaSamples, propertyPaths);\r
+\r
+\r
+ if (dnaSamples.isEmpty()){\r
+ logger.debug("there is no dnaSample for genetic accession number " + accessionNumberString + " this should not happen.");\r
+ return null;\r
+ }else if (dnaSamples.size() == 1){\r
+ return dnaSamples.get(0);\r
+ } else{\r
+ logger.debug("there are more than one dnaSample for genetic accession number " + accessionNumberString + " this should not happen.");\r
+ return null;\r
+ }\r
+\r
+\r
+ }\r
+\r
+ /**\r
+ *\r
+ * {@inheritDoc}\r
+ */\r
+ @Override\r
+ public long countByGeneticAccessionNumber(String accessionNumberString) {\r
+ String queryString = "SELECT count(dnaSample) FROM DnaSample dnaSample JOIN dnaSample.sequences sequence WHERE sequence.geneticAccessionNumber LIKE :accessionNumberString";\r
+ Query query = getSession().createQuery(queryString);\r
+ query.setParameter("accessionNumberString", accessionNumberString);\r
+ @SuppressWarnings("unchecked")\r
+ List<DerivedUnit> dnaSamples = query.list();\r
+ long result = (long)query.uniqueResult();\r
+\r
+ return result;\r
+ }\r
+\r
+ /**\r
+ * @param dnaSamples\r
+ * @param results\r
+ */\r
+ private void extractDeterminedOriginals(List<DerivedUnit> samples, List<DerivedUnit> results) {\r
+ for (DerivedUnit sample:samples){\r
+ if (sample.getDeterminations() != null && !sample.getDeterminations().isEmpty()){\r
+ results.add(sample);\r
+ }else{\r
+ if (sample instanceof DerivedUnit){\r
+ Set<SpecimenOrObservationBase> originals = sample.getDerivedFrom().getOriginals();\r
+ List<DerivedUnit> originalDerivedUnits = new ArrayList();\r
+ for (SpecimenOrObservationBase original:originals){\r
+ if (original instanceof DerivedUnit){\r
+ originalDerivedUnits.add((DerivedUnit)original);\r
+ }\r
+ }\r
+ if(!originalDerivedUnits.isEmpty()){\r
+ extractDeterminedOriginals(originalDerivedUnits, results);\r
+ }\r
+ }\r
+ }\r
+ }\r
}\r
\r
/**\r