2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.cdm
.api
.service
;
12 import java
.io
.IOException
;
13 import java
.util
.EnumSet
;
14 import java
.util
.List
;
17 import java
.util
.UUID
;
19 import eu
.etaxonomy
.cdm
.api
.service
.config
.IFindTaxaAndNamesConfigurator
;
20 import eu
.etaxonomy
.cdm
.api
.service
.config
.IncludedTaxonConfiguration
;
21 import eu
.etaxonomy
.cdm
.api
.service
.config
.MatchingTaxonConfigurator
;
22 import eu
.etaxonomy
.cdm
.api
.service
.config
.SynonymDeletionConfigurator
;
23 import eu
.etaxonomy
.cdm
.api
.service
.config
.TaxonDeletionConfigurator
;
24 import eu
.etaxonomy
.cdm
.api
.service
.dto
.IdentifiedEntityDTO
;
25 import eu
.etaxonomy
.cdm
.api
.service
.dto
.IncludedTaxaDTO
;
26 import eu
.etaxonomy
.cdm
.api
.service
.dto
.MarkedEntityDTO
;
27 import eu
.etaxonomy
.cdm
.api
.service
.dto
.TaxonRelationshipsDTO
;
28 import eu
.etaxonomy
.cdm
.api
.service
.exception
.DataChangeNoRollbackException
;
29 import eu
.etaxonomy
.cdm
.api
.service
.exception
.HomotypicalGroupChangeException
;
30 import eu
.etaxonomy
.cdm
.api
.service
.pager
.Pager
;
31 import eu
.etaxonomy
.cdm
.api
.service
.search
.LuceneMultiSearchException
;
32 import eu
.etaxonomy
.cdm
.api
.service
.search
.LuceneParseException
;
33 import eu
.etaxonomy
.cdm
.api
.service
.search
.SearchResult
;
34 import eu
.etaxonomy
.cdm
.api
.service
.util
.TaxonRelationshipEdge
;
35 import eu
.etaxonomy
.cdm
.exception
.UnpublishedException
;
36 import eu
.etaxonomy
.cdm
.model
.common
.IdentifiableEntity
;
37 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
38 import eu
.etaxonomy
.cdm
.model
.common
.MarkerType
;
39 import eu
.etaxonomy
.cdm
.model
.common
.RelationshipBase
.Direction
;
40 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
41 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
42 import eu
.etaxonomy
.cdm
.model
.description
.PresenceAbsenceTerm
;
43 import eu
.etaxonomy
.cdm
.model
.location
.NamedArea
;
44 import eu
.etaxonomy
.cdm
.model
.media
.Media
;
45 import eu
.etaxonomy
.cdm
.model
.name
.HomotypicalGroup
;
46 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
47 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
48 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
49 import eu
.etaxonomy
.cdm
.model
.taxon
.Classification
;
50 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
51 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymType
;
52 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
53 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
54 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
55 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationship
;
56 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationshipType
;
57 import eu
.etaxonomy
.cdm
.model
.term
.DefinedTerm
;
58 import eu
.etaxonomy
.cdm
.persistence
.dao
.common
.Restriction
;
59 import eu
.etaxonomy
.cdm
.persistence
.dao
.initializer
.IBeanInitializer
;
60 import eu
.etaxonomy
.cdm
.persistence
.dto
.UuidAndTitleCache
;
61 import eu
.etaxonomy
.cdm
.persistence
.query
.MatchMode
;
62 import eu
.etaxonomy
.cdm
.persistence
.query
.OrderHint
;
63 import eu
.etaxonomy
.cdm
.persistence
.query
.TaxonTitleType
;
66 public interface ITaxonService
67 extends IIdentifiableEntityService
<TaxonBase
>, IPublishableService
<TaxonBase
>{
72 * NOTE: Also taxa with <code>publish=false</code> are returned.
75 public TaxonBase
load(UUID uuid
, List
<String
> propertyPaths
);
78 * Returns a list of taxa that matches the name string and the sec reference
79 * @param name the name string to search for
80 * @param sec the taxons sec reference
81 * @return a list of taxa matching the name and the sec reference
83 public List
<TaxonBase
> searchByName(String name
, boolean includeUnpublished
, Reference sec
);
86 * Swaps given synonym and accepted taxon.
89 * <li>A new accepted taxon with the synonyms name is created</li>
90 * <li>The synonym is deleted from the old accepted taxons synonym list</li>
91 * <li>A new synonym with the name of the old accepted taxon is created</li>
92 * <li>The newly created synonym get related to the newly created accepted taxon</li>
96 * @param acceptedTaxon
97 * @param setNameInSource
100 public UpdateResult
swapSynonymAndAcceptedTaxon(Synonym synonym
, Taxon acceptedTaxon
, boolean setNameInSource
);
103 * Changes a synonym into an accepted taxon and removes
104 * the synonym relationship to the given accepted taxon.
105 * Other synonyms homotypic to the synonym to change are
106 * moved to the same new accepted taxon as homotypic
107 * synonyms. The new accepted taxon has the same name and
108 * the same sec reference as the old synonym.<BR>
109 * If the given accepted taxon and the synonym are homotypic
110 * to each other an exception may be thrown as taxonomically it doesn't
111 * make sense to have two accepted taxa in the same homotypic group
112 * but also it is than difficult to decide how to handle other names
113 * in the homotypic group. It is up to the implementing class to
114 * handle this situation via an exception or in another way.
118 * the synonym to change into an accepted taxon
119 * @param acceptedTaxon
120 * an accepted taxon, the synonym had a relationship to
121 * @param deleteSynonym
122 * if true the method tries to delete the old synonym from the database
124 * the newly created accepted taxon
125 * @throws IllegalArgumentException
126 * if the given accepted taxon and the synonym are homotypic
127 * to each other an exception may be thrown as taxonomically it doesn't
128 * make sense to have two accepted taxa in the same homotypic group
129 * but also it is than difficult to decide how to handle other names
130 * in the homotypic group. It is up to the implementing class to
131 * handle this situation via an exception or in another way.
133 public UpdateResult
changeSynonymToAcceptedTaxon(Synonym synonym
, Taxon acceptedTaxon
, boolean deleteSynonym
) throws HomotypicalGroupChangeException
;
137 * @param acceptedTaxonUuid
138 * @param newParentNodeUuid
139 * @param deleteSynonym
141 * @throws HomotypicalGroupChangeException
143 public UpdateResult
changeSynonymToAcceptedTaxon(UUID synonymUuid
, UUID acceptedTaxonUuid
, UUID newParentNodeUuid
,
144 boolean deleteSynonym
)
145 throws HomotypicalGroupChangeException
;
148 * Change a synonym into a related concept
151 * the synonym to change into the concept taxon
153 * the taxon the newly created concept should be related to
154 * @param taxonRelationshipType
155 * the type of relationship
157 * @param microReference
159 * update result with the newly created concept
161 public UpdateResult
changeSynonymToRelatedTaxon(Synonym synonym
, Taxon toTaxon
, TaxonRelationshipType taxonRelationshipType
, Reference reference
, String microReference
);
165 * Change a related concept into synonym
168 * the concept taxon to change into a synonym
170 * the taxon the newly created synonym should be related to
171 * @param oldRelationshipType
172 * the type of old concept relationship
173 * @param synonymRelationshipType
174 * the type of new synonym relationship
177 * update result with the newly created synonym
178 * @throws DataChangeNoRollbackException
180 public UpdateResult
changeRelatedTaxonToSynonym(Taxon fromTaxon
, Taxon toTaxon
,
181 TaxonRelationshipType oldRelationshipType
,
182 SynonymType synonymType
) throws DataChangeNoRollbackException
;
185 * Changes the homotypic group of a synonym into the new homotypic group.
186 * All relations to taxa are updated correctly depending on the homotypic
187 * group of the accepted taxon. <BR>
188 * All existing basionym relationships to and from this name are removed.<BR>
189 * If the parameter <code>targetTaxon</code> is defined, the synonym is
190 * added to this taxon irrespctive of if it has been related to this
192 * If <code>setBasionymRelationIfApplicable</code> is true a basionym relationship
193 * between the existing basionym(s) of the new homotypic group and the synonyms name
197 * @param newHomotypicalGroup
199 * @param setBasionymRelationIfApplicable
201 public void changeHomotypicalGroupOfSynonym(Synonym synonym
, HomotypicalGroup newHomotypicalGroup
,
202 Taxon targetTaxon
, boolean setBasionymRelationIfApplicable
);
205 * See {@link #moveSynonymToAnotherTaxon(Synonym, Taxon, boolean, SynonymType, Reference, String, boolean)}
208 * @param moveHomotypicGroup
209 * @param newSynonymType
211 * @throws HomotypicalGroupChangeException
213 public UpdateResult
moveSynonymToAnotherTaxon(Synonym oldSynonym
, Taxon newTaxon
, boolean moveHomotypicGroup
,
214 SynonymType newSynonymType
) throws HomotypicalGroupChangeException
;
218 * Moves a synonym to another taxon and removes the old synonym relationship.
220 * @param oldSynonym the old synonym to move.
221 * @param newTaxon the taxon the synonym will be moved to
222 * @param moveHomotypicGroup if the synonym belongs to a homotypic group with other synonyms and
223 * <code>moveHomotypicGroup</code> is <code>true</code> all these synonyms are moved to the new taxon,
224 * if <code>false</code> a {@link HomotypicalGroupChangeException} is thrown.
225 * <code>moveHomotypicGroup</code> has no effect if the synonym is the only synonym in it's homotypic group.
226 * @param newSynonymType the synonym type of the new synonyms. Default is
227 * {@link SynonymType#HETEROTYPIC_SYNONYM_OF() heterotypic}.
228 * @param newSecundum The secundum for the new synonyms).
229 * @param newSecundumDetail The secundum micro reference for the new synonym(s).
230 * @param keepSecundumIfUndefined if no <code>newSecundum</code> and/or no <code>newSecundumDetail</code>
231 * is defined they are taken from the old synonym(s) if <code>keepSecundumIfUndefined</code> is
232 * <code>true</code>. If <code>false</code> the secundum and the secundum detail will be taken
233 * only from the <code>newSecundum</code> and <code>newSecundumDetail</code> even if they are
234 * undefined (<code>null</code>).
235 * @return The new synonym relationship. If <code>moveHomotypicGroup</code> is <code>true</code> additionally
236 * created new synonym relationships must be retrieved separately from the new taxon.
237 * @throws HomotypicalGroupChangeException Exception is thrown if (1) synonym is homotypic to the old accepted taxon or
238 * (2) synonym is in homotypic group with other synonyms and <code>moveHomotypicGroup</code> is false
240 public UpdateResult
moveSynonymToAnotherTaxon(Synonym oldSynonym
, Taxon newTaxon
, boolean moveHomotypicGroup
,
241 SynonymType newSynonymType
, Reference newSecundum
,
242 String newSecundumDetail
, boolean keepSecundumIfUndefined
) throws HomotypicalGroupChangeException
;
247 * @param newTaxonUUID
248 * @param moveHomotypicGroup
249 * @param newSynonymType
251 * @param referenceDetail
252 * @param keepReference
254 * @throws HomotypicalGroupChangeException
256 * @see {@link #moveSynonymToAnotherTaxon(Synonym, Taxon, boolean, SynonymType, Reference, String, boolean)}
258 public UpdateResult
moveSynonymToAnotherTaxon(Synonym oldSynonym
,
259 UUID newTaxonUUID
, boolean moveHomotypicGroup
,
260 SynonymType newSynonymType
,
261 Reference newSecundum
, String newSecundumDetail
, boolean keepSecundumIfUndefined
)
262 throws HomotypicalGroupChangeException
;
265 * Returns the TaxonRelationships (of where relationship.type == type, if this argument is supplied)
266 * where the supplied taxon is relatedTo.
268 * @param taxon The taxon that is relatedTo
269 * @param type The type of TaxonRelationship (can be null)
270 * @param includeUnpublished should unpublished related taxa also be returned?
271 * @param pageSize The maximum number of relationships returned (can be null for all relationships)
272 * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
273 * @param orderHints Properties to order by
274 * @param propertyPaths Properties to initialize in the returned entities, following the syntax described in {@link IBeanInitializer#initialize(Object, List)}
275 * @return a List of TaxonRelationship instances
277 public List
<TaxonRelationship
> listToTaxonRelationships(Taxon taxon
, TaxonRelationshipType type
,
278 boolean includeUnpublished
, Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
);
282 * Returns the TaxonRelationships (of where relationship.type == type, if this arguement is supplied)
283 * where the supplied taxon is relatedTo.
285 * @param taxon The taxon that is relatedTo
286 * @param type The type of TaxonRelationship (can be null)
287 * @param includeUnpublished should unpublished related taxa also be returned?
288 * @param pageSize The maximum number of relationships returned (can be null for all relationships)
289 * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
290 * @param orderHints Properties to order by
291 * @param propertyPaths Properties to initialize in the returned entities, following the syntax described in {@link IBeanInitializer#initialize(Object, List)}
292 * @return a Pager of TaxonRelationship instances
294 public Pager
<TaxonRelationship
> pageToTaxonRelationships(Taxon taxon
, TaxonRelationshipType type
,
295 boolean includeUnpublished
, Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
);
298 * Returns the TaxonRelationships (of where relationship.type == type, if this argument is supplied)
299 * where the supplied taxon is relatedFrom.
301 * @param taxon The taxon that is relatedFrom
302 * @param type The type of TaxonRelationship (can be null)
303 * @param includeUnpublished should unpublished related taxa also be returned?
304 * @param pageSize The maximum number of relationships returned (can be null for all relationships)
305 * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
306 * @param orderHints Properties to order by
307 * @param propertyPaths Properties to initialize in the returned entities, following the syntax described in {@link IBeanInitializer#initialize(Object, List)}
308 * @return a List of TaxonRelationship instances
310 public List
<TaxonRelationship
> listFromTaxonRelationships(Taxon taxon
, TaxonRelationshipType type
,
311 boolean includeUnpublished
, Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
);
315 * Returns the TaxonRelationships (of where relationship.type == type, if this argument is supplied)
316 * where the supplied taxon is relatedFrom.
318 * @param taxon The taxon that is relatedFrom
319 * @param type The type of TaxonRelationship (can be null)
320 * @param includeUnpublished should unpublished related taxa also be returned?
321 * @param pageSize The maximum number of relationships returned (can be null for all relationships)
322 * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
323 * @param orderHints Properties to order by
324 * @param propertyPaths Properties to initialize in the returned entities, following the syntax described in {@link IBeanInitializer#initialize(Object, List)}
325 * @return a Pager of TaxonRelationship instances
327 public Pager
<TaxonRelationship
> pageFromTaxonRelationships(Taxon taxon
, TaxonRelationshipType type
,
328 boolean includeUnpublished
, Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
);
331 * lists all taxa which are related to the <code>taxon</code> given as
335 * @param includeRelationships
337 * <code>1</code> for one level, <code>null</code> for infinite
338 * depth, <code>0</code> will completely omit collecting related taxa.
341 * @param propertyPaths
344 public Set
<Taxon
> listRelatedTaxa(Taxon taxon
, Set
<TaxonRelationshipEdge
> includeRelationships
, Integer maxDepth
,
345 boolean includeUnpublished
, Integer limit
, Integer start
, List
<String
> propertyPaths
);
349 * Returns all or a page of all taxon concept relationships in the database.
350 * The result can be filtered by relationship types.
352 * @param types The taxon relationship type filter, if <code>null</code> no filter is set, if empty the result will also be empty
353 * @param pageSize the page size
354 * @param pageStart the number of the page
355 * @param orderHints the order hints
356 * @param propertyPaths the property path to initialize the resulting objects
357 * @return list of taxon relationships matching the filter criteria
359 public List
<TaxonRelationship
> listTaxonRelationships(Set
<TaxonRelationshipType
> types
,
360 Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
);
363 * Lists all classifications the given taxon/synonym is used in{@link Synonym}
368 * @param propertyPaths
371 public List
<Classification
> listClassifications(TaxonBase taxonBase
, Integer limit
, Integer start
, List
<String
> propertyPaths
);
374 * Returns the Synonyms (with the given synonym relationship type, if this argument is supplied)
375 * that do have the supplied taxon as accepted taxon.
377 * @param taxon The accepted taxon
378 * @param type The type of Synonym (can be null)
379 * @param pageSize The maximum number of synonyms returned (can be null for returning synonyms)
380 * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
381 * * @param orderHints Properties to order by
382 * @param propertyPaths Properties to initialize in the returned entities, following the syntax described in {@link IBeanInitializer#initialize(Object, List)}
383 * @return a Pager of {@link Synonym} instances
385 public Pager
<Synonym
> getSynonyms(Taxon taxon
, SynonymType type
, Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
);
388 * This method returns in the first entry the list of synonyms of the
389 * homotypic group of the accepted taxon. All other entries represent the lists of heterotypic
390 * synonym groups. For detailed information about these 2 groups see
391 * {@link #getHomotypicSynonymsByHomotypicGroup(Taxon, List)} and
392 * {@link #getHeterotypicSynonymyGroups(Taxon, List)}
394 * @see #getSynonyms()
395 * @see SynonymType#HETEROTYPIC_SYNONYM_OF()
396 * @see eu.etaxonomy.cdm.model.name.HomotypicalGroup
398 * @param taxon the accepted taxon
399 * @param propertyPaths the property path
400 * @return the list of groups of synonyms
402 public List
<List
<Synonym
>> getSynonymsByHomotypicGroup(Taxon taxon
, List
<String
> propertyPaths
);
406 * Returns the list of all synonyms that share the same homotypical group with the given taxon.
407 * Only those homotypic synonyms are returned that do have a synonym relationship with the accepted taxon.
409 * @param propertyPaths
412 public List
<Synonym
> getHomotypicSynonymsByHomotypicGroup(Taxon taxon
, List
<String
> propertyPaths
);
415 * Returns the ordered list of all {@link eu.etaxonomy.cdm.model.name.HomotypicalGroup homotypical groups}
416 * that contain {@link Synonym synonyms} that are heterotypic to the given taxon.
417 * {@link eu.etaxonomy.cdm.model.name.TaxonName Taxon names} of heterotypic synonyms
418 * belong to a homotypical group which cannot be the homotypical group to which the
419 * taxon name of the given taxon belongs. This method does not return the homotypic group the given
420 * taxon belongs to.<BR>
421 * This method does neglect the type of synonym relationship that is defined between the given taxon
422 * and the synonym. So the synonym relationship may be homotypic however a synonym is returned
423 * in one of the result lists as long as the synonym does not belong to the same homotypic group as
424 * the given taxon.<BR>
425 * The list returned is ordered according to the date of publication of the
426 * first published name within each homotypical group.
428 * @see #getHeterotypicSynonymyGroups()
429 * @see #getSynonyms()
430 * @see SynonymType#HETEROTYPIC_SYNONYM_OF()
431 * @see eu.etaxonomy.cdm.model.name.HomotypicalGroup
434 * @param propertyPaths
437 public List
<List
<Synonym
>> getHeterotypicSynonymyGroups(Taxon taxon
, List
<String
> propertyPaths
);
440 * Returns a Paged List of TaxonBase instances where the default field matches the String queryString (as interpreted by the Lucene QueryParser)
442 * @param clazz filter the results by class (or pass null to return all TaxonBase instances)
444 * @param pageSize The maximum number of taxa returned (can be null for all matching taxa)
445 * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
447 * Supports path like <code>orderHints.propertyNames</code> which
448 * include *-to-one properties like createdBy.username or
449 * authorTeam.persistentTitleCache
450 * @param propertyPaths properties to be initialized
451 * @return a Pager Taxon instances
452 * @see <a href="http://lucene.apache.org/java/2_4_0/queryparsersyntax.html">Apache Lucene - Query Parser Syntax</a>
455 public Pager
<TaxonBase
> search(Class
<?
extends TaxonBase
> clazz
, String queryString
, Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
);
458 * Returns a list of TaxonBase instances where the
459 * taxon.name properties match the parameters passed. In order to search for any string value, pass '*', passing the string value of
460 * <i>null</i> will search for those taxa with a value of null in that field
462 * @param clazz optionally filter by class (can be null to return all taxa)
464 * @param infragenericEpithet
465 * @param specificEpithet
466 * @param infraspecificEpithet
468 * @param pageSize The maximum number of taxa returned (can be null for all matching taxa)
469 * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
470 * @return a list of TaxonBase instances
472 public Pager
<TaxonBase
> findTaxaByName(Class
<?
extends TaxonBase
> clazz
, String uninomial
, String infragenericEpithet
, String specificEpithet
, String infraspecificEpithet
, String authorship
, Rank rank
, Integer pageSize
, Integer pageNumber
);
475 * Returns a list of TaxonBase instances where the
476 * taxon.name properties match the parameters passed. In order to search for any string value, pass '*', passing the string value of
477 * <i>null</i> will search for those taxa with a value of null in that field
479 * @param clazz optionally filter by class
481 * @param infragenericEpithet
482 * @param specificEpithet
483 * @param infraspecificEpithet
485 * @param pageSize The maximum number of taxa returned (can be null for all matching taxa)
486 * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
487 * @return a List of TaxonBase instances
489 public List
<TaxonBase
> listTaxaByName(Class
<?
extends TaxonBase
> clazz
, String uninomial
, String infragenericEpithet
, String specificEpithet
, String infraspecificEpithet
, String authorship
, Rank rank
, Integer pageSize
, Integer pageNumber
);
492 * Returns a list of IdentifiableEntity instances (in particular, TaxonName and TaxonBase instances)
493 * that match the properties specified in the configurator.
494 * @param configurator
497 public Pager
<IdentifiableEntity
> findTaxaAndNames(IFindTaxaAndNamesConfigurator configurator
);
500 * performes a union searches for TaxonBase instances on all available
501 * free text indexes. At the time of writing this documentation it combines
502 * {@link #findByDescriptionElementFullText(Class, String, Classification, List, List, boolean, Integer, Integer, List, List)}
503 * and {@link #findByFullText(Class, String, Classification, List, boolean, Integer, Integer, List, List)
507 * @param classification
508 * Additional filter criterion: If a taxonomic classification
509 * three is specified here the result set will only contain taxa
510 * of the given classification
512 * Additional filter criterion: Search only in these languages.
513 * Not all text fields in the cdm model are multilingual, thus
514 * this setting will only apply to the multilingiual fields.
515 * Other fields are searched nevertheless if this parameter is
517 * @param highlightFragments
520 * The maximum number of objects returned (can be null for all
523 * The offset (in pageSize chunks) from the start of the result
526 * Supports path like <code>orderHints.propertyNames</code> which
527 * include *-to-one properties like createdBy.username or
528 * authorTeam.persistentTitleCache
529 * @param propertyPaths
530 * properties to initialize - see
531 * {@link IBeanInitializer#initialize(Object, List)}
532 * @return a paged list of instances of type T matching the queryString and
533 * the additional filter criteria
535 * @throws LuceneCorruptIndexException
536 * @throws IOException
537 * @throws LuceneParseException
538 * @throws LuceneMultiSearchException
539 * @deprecated this search should fully be covered by the new method
540 * {@link #findTaxaAndNamesByFullText(EnumSet, String, Classification, Set, List, boolean, Integer, Integer, List, List)}
541 * , maybe we should rename this latter method to give it a more meaningful name
544 public Pager
<SearchResult
<TaxonBase
>> findByEverythingFullText(String queryString
,
545 Classification classification
, TaxonNode subtree
, boolean includeUnpublished
, List
<Language
> languages
, boolean highlightFragments
,
546 Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) throws IOException
, LuceneParseException
, LuceneMultiSearchException
;
549 * Searches for TaxonBase instances using the TaxonBase free text index.
551 * <h4>This is an experimental feature, it may be moved, modified, or even
552 * removed in future releases!!!</h4>
555 * Additional filter criterion: The specific TaxonBase subclass
559 * @param classification
560 * Additional filter criterion: If a taxonomic classification
561 * three is specified here the result set will only contain taxa
562 * of the given classification
564 * Additional filter criterion: Search only in these languages.
565 * Not all text fields in the cdm model are multilingual, thus
566 * this setting will only apply to the multilingiual fields.
567 * Other fields are searched nevertheless if this parameter is
569 * @param highlightFragments
572 * The maximum number of objects returned (can be null for all
575 * The offset (in pageSize chunks) from the start of the result
578 * Supports path like <code>orderHints.propertyNames</code> which
579 * include *-to-one properties like createdBy.username or
580 * authorTeam.persistentTitleCache
581 * @param propertyPaths
582 * properties to initialize - see
583 * {@link IBeanInitializer#initialize(Object, List)}
584 * @return a paged list of instances of type T matching the queryString and
585 * the additional filter criteria
586 * @throws LuceneCorruptIndexException
587 * @throws IOException
588 * @throws LuceneParseException
590 public Pager
<SearchResult
<TaxonBase
>> findByFullText(Class
<?
extends TaxonBase
> clazz
, String queryString
,
591 Classification classification
, TaxonNode subtree
,
592 boolean includeUnpublished
, List
<Language
> languages
,
593 boolean highlightFragments
, Integer pageSize
, Integer pageNumber
,
594 List
<OrderHint
> orderHints
, List
<String
> propertyPaths
)
595 throws IOException
, LuceneParseException
;
600 * @param statusFilter
601 * @param classification
602 * Additional filter criterion: If a taxonomic classification
603 * three is specified here the result set will only contain taxa
604 * of the given classification
605 * @param highlightFragments
607 * The maximum number of objects returned (can be null for all
610 * The offset (in pageSize chunks) from the start of the result
613 * Supports path like <code>orderHints.propertyNames</code> which
614 * include *-to-one properties like createdBy.username or
615 * authorTeam.persistentTitleCache
616 * @param propertyPath
617 * Common properties to initialize the instances of the
618 * CDM types ({@link Taxon} and {@link Synonym}
619 * this method can return - see {@link IBeanInitializer#initialize(Object, List)}
620 * @return a paged list of instances of {@link Taxon} instances
621 * @throws IOException
622 * @throws LuceneParseException
624 //TODO needed? currently only used in test
625 public Pager
<SearchResult
<TaxonBase
>> findByDistribution(List
<NamedArea
> areaFilter
, List
<PresenceAbsenceTerm
> statusFilter
,
626 Classification classification
, TaxonNode subtree
,
627 Integer pageSize
, Integer pageNumber
,
628 List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) throws IOException
, LuceneParseException
;
631 * Searches for TaxonBase instances using the TaxonBase free text index.
635 * <h4>This is an experimental feature, it may be moved, modified, or even
636 * removed in future releases!!!</h4>
638 * Additional filter criterion: defaults to [doTaxa] if set null
641 * @param classification
642 * Additional filter criterion: If a taxonomic classification
643 * three is specified here the result set will only contain taxa
644 * of the given classification
647 * @param distributionStatus
649 * Additional filter criterion: Search only in these languages.
650 * Not all text fields in the cdm model are multilingual, thus
651 * this setting will only apply to the multilingiual fields.
652 * Other fields are searched nevertheless if this parameter is
654 * @param highlightFragments
657 * The maximum number of objects returned (can be null for all
660 * The offset (in pageSize chunks) from the start of the result
663 * Supports path like <code>orderHints.propertyNames</code> which
664 * include *-to-one properties like createdBy.username or
665 * authorTeam.persistentTitleCache
666 * @param propertyPath
667 * Common properties to initialize the instances of the
668 * CDM types ({@link Taxon} and {@link Synonym}
669 * this method can return - see {@link IBeanInitializer#initialize(Object, List)}
670 * @return a paged list of instances of {@link Taxon}, {@link Synonym}, matching the queryString and
671 * the additional filter criteria
672 * @throws LuceneCorruptIndexException
673 * @throws IOException
674 * @throws LuceneParseException
675 * @throws LuceneMultiSearchException
677 public Pager
<SearchResult
<TaxonBase
>> findTaxaAndNamesByFullText(
678 EnumSet
<TaxaAndNamesSearchMode
> searchModes
,
679 String queryString
, Classification classification
, TaxonNode subtree
,
680 Set
<NamedArea
> namedAreas
, Set
<PresenceAbsenceTerm
> distributionStatus
,
681 List
<Language
> languages
, boolean highlightFragments
, Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
,
682 List
<String
> propertyPaths
) throws IOException
, LuceneParseException
, LuceneMultiSearchException
;
685 * Searches for TaxonBase instances by using the DescriptionElement free text index.
687 * <h4>This is an experimental feature, it may be moved, modified, or even
688 * removed in future releases!!!</h4>
691 * Additional filter criterion:
693 * the query string to filter by
694 * @param classification
695 * Additional filter criterion: If a taxonomic classification
696 * tree is specified here the result set will only contain taxa
697 * of the given classification
699 * Additional filter criterion: If a taxonomic classification
700 * subtree is specified here the result set will only contain taxa
701 * of the given subtree
705 * Additional filter criterion: Search only in these languages.
706 * Not all text fields in the CDM model are multi-lingual, thus
707 * this setting will only apply to the multi-lingual fields.
708 * Other fields are searched nevertheless if this parameter is
710 * @param highlightFragments
713 * The maximum number of objects returned (can be null for all
716 * The offset (in pageSize chunks) from the start of the result
719 * Supports path like <code>orderHints.propertyNames</code> which
720 * include *-to-one properties like createdBy.username or
721 * authorTeam.persistentTitleCache
722 * @param propertyPaths
723 * properties to initialize - see
724 * {@link IBeanInitializer#initialize(Object, List)}
725 * @return a paged list of instances of type T matching the queryString and
726 * the additional filter criteria
727 * @throws IOException
728 * @throws LuceneCorruptIndexException
729 * @throws LuceneParseException
731 public Pager
<SearchResult
<TaxonBase
>> findByDescriptionElementFullText(Class
<?
extends DescriptionElementBase
> clazz
,
732 String queryString
, Classification classification
, TaxonNode subtree
, List
<Feature
> features
, List
<Language
> languages
, boolean highlightFragments
, Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) throws IOException
, LuceneParseException
;
735 * Lists all Media found in an any TaxonDescription associated with this
739 * @param includeRelationships
740 * the given list of TaxonRelationshipEdges will be taken into
741 * account when retrieving media associated with the given taxon.
743 * @param limitToGalleries
744 * whether to take only TaxonDescription into account which are
747 * @deprecated use {@link #listMedia(Taxon, Set, boolean, boolean, List)} instead
750 public List
<Media
> listTaxonDescriptionMedia(Taxon taxon
, Set
<TaxonRelationshipEdge
> includeRelationships
, boolean limitToGalleries
, List
<String
> propertyPath
);
753 * Lists all Media found in an any TaxonDescription, NameDescription,
754 * SpecimenOrObservationBase, DnaSample Chromatograms, etc. associated with this taxon.
757 * @param includeRelationships
758 * the given list of TaxonRelationshipEdges will be taken into
759 * account when retrieving media associated with the given taxon.
761 * @param limitToGalleries
762 * whether to take only descriptions into account which are
763 * marked as gallery, can be NULL
764 * @param includeTaxonDescriptions
765 * whether to take TaxonDescriptions into account, can be NULL
766 * @param includeOccurrences
767 * whether to take TaxonDescriptions into account, can be NULL
768 * @param includeTaxonNameDescriptions
769 * whether to take TaxonNameDescriptions into account, can be NULL
770 * @param propertyPath
773 public List
<Media
> listMedia(Taxon taxon
, Set
<TaxonRelationshipEdge
> includeRelationships
,
774 Boolean limitToGalleries
, Boolean includeTaxonDescriptions
, Boolean includeOccurrences
,
775 Boolean includeTaxonNameDescriptions
, List
<String
> propertyPath
);
777 public List
<TaxonBase
> findTaxaByID(Set
<Integer
> listOfIDs
);
780 * Returns the TaxonBase with the given UUID
781 * using the given match mode and initialization strategy
784 * @param propertyPaths
787 public TaxonBase
findTaxonByUuid(UUID uuid
, List
<String
> propertyPaths
);
790 * Counts the number of synonyms
791 * @param onlyAttachedToTaxon if <code>true</code> only those synonyms being attached to
792 * an accepted taxon are counted
793 * @return the number of synonyms
795 public long countSynonyms(boolean onlyAttachedToTaxon
);
799 public Map
<String
, List
<TaxonName
>> findIdenticalTaxonNameIds(Reference sec1
, Reference sec2
, List
<String
> propertyPaths
);
803 * Returns all {@link Taxon taxa} which are {@link TaxonRelationshipType#CONGRUENT_TO() congruent} or
804 * {@link TaxonRelationshipType#INCLUDES() included} in the taxon represented by the given taxon uuid.
805 * The result also returns the path to these taxa represented by the uuids of
806 * the {@link TaxonRelationshipType taxon relationships types} and doubtful information.
807 * If classificationUuids is set only taxa of classifications are returned which are included
808 * in the given {@link Classification classifications}. ALso the path to these taxa may not include
809 * taxa from other classifications.
810 * @param taxonUuid uuid of the original taxon
811 * @param classificationUuids List of uuids of classifications used as a filter
812 * @param includeDoubtful set to <code>true</code> if also doubtfully included taxa should be included in the result
813 * @return a DTO which includes a list of taxa with the pathes from the original taxon to the given taxon as well
814 * as doubtful and date information. The original taxon is included in the result.
816 public IncludedTaxaDTO
listIncludedTaxa(UUID taxonUuid
, IncludedTaxonConfiguration configuration
);
820 * Removes a synonym.<BR><BR>
822 * In detail it removes
823 * <li>the synonym concept</li>
825 * If <code>removeNameIfPossible</code> is true
826 * it also removes the synonym name if it is not used in any other context
827 * (part of a concept, in DescriptionElementSource, part of a name relationship, used inline, ...)<BR><BR>
828 * If <code>newHomotypicGroupIfNeeded</code> is <code>true</code> and the synonym name
829 * is not deleted and the name is homotypic to the taxon
830 * the name is moved to a new homotypic group.<BR><BR>
832 * If synonym is <code>null</code> the method has no effect.
836 * @param removeNameIfPossible
837 * @return deleteResult
840 public DeleteResult
deleteSynonym(Synonym synonym
, SynonymDeletionConfigurator config
);
845 * The method essentially loads the synonym and calls the
846 * {@link #deleteSynonym(Synonym, SynonymDeletionConfigurator) deleteSynonym} method
852 public DeleteResult
deleteSynonym(UUID synonymUuid
, SynonymDeletionConfigurator config
);
858 public Taxon
findBestMatchingTaxon(String taxonName
);
860 public Taxon
findBestMatchingTaxon(MatchingTaxonConfigurator config
);
862 public Synonym
findBestMatchingSynonym(String taxonName
, boolean includeUnpublished
);
864 public List
<UuidAndTitleCache
<?
extends IdentifiableEntity
>> findTaxaAndNamesForEditor(IFindTaxaAndNamesConfigurator configurator
);
867 * Creates the specified inferred synonyms for the taxon in the classification, but do not insert it to the database
870 * @return list of inferred synonyms
872 public List
<Synonym
> createInferredSynonyms(Taxon taxon
, Classification tree
, SynonymType type
, boolean doWithMisappliedNames
);
875 * Creates all inferred synonyms for the taxon in the classification, but do not insert it to the database
879 * @return list of inferred synonyms
881 public List
<Synonym
> createAllInferredSynonyms(Taxon taxon
, Classification tree
, boolean doWithMisappliedNames
);
883 public Taxon
findAcceptedTaxonFor(UUID synonymUuid
, UUID classificationUuid
, boolean includeUnpublished
,
884 List
<String
> propertyPaths
) throws UnpublishedException
;
886 public List
<TaxonBase
> findTaxaByName(MatchingTaxonConfigurator config
);
890 * @param clazz the optional {@link TaxonBase} subclass
891 * @param identifier the identifier string
892 * @param identifierType the identifier type
893 * @param subtreeFilter filter on a classification subtree (TaxonNode)
894 * @param matchmode the match mode for the identifier string
895 * @param includeEntity should the taxon as an object be included in the result
896 * @param pageSize page size
897 * @param pageNumber page number
898 * @param propertyPaths property path for initializing the returned taxon object (requires includeEntity=true)
899 * @return the resulting {@link IdentifiedEntityDTO} pager
900 * @see IIdentifiableEntityService#findByIdentifier(Class, String, DefinedTerm, MatchMode, boolean, Integer, Integer, List)
902 public <S
extends TaxonBase
> Pager
<IdentifiedEntityDTO
<S
>> findByIdentifier(
903 Class
<S
> clazz
, String identifier
, DefinedTerm identifierType
, TaxonNode subtreeFilter
,
904 MatchMode matchmode
, boolean includeEntity
, Integer pageSize
,
905 Integer pageNumber
, List
<String
> propertyPaths
);
908 * Returns a pager for {@link MarkedEntityDTO DTOs} that hold the marker including type, title and uuid
909 * and the according {@link TaxonBase} information (uuid, title and the taxon object itself (optional)).
911 * @param clazz The optional {@link TaxonBase} subclass
912 * @param markerType the obligatory marker type, if not given, the results will always be empty
913 * @param markerValue the optional
914 * @param subtreeFilter filter on a classification subtree (TaxonNode)
915 * @param includeEntity should the taxon as an object be included in the result
916 * @param titleType which label to give the returned entity, taxon.titleCache, name.titleCache or name.nameCache
917 * @param pageSize page size
918 * @param pageNumber page number
919 * @param propertyPaths property path for initializing the returned taxon object (requires includeEntity=true)
920 * @return the resulting {@link MarkedEntityDTO} pager
921 * @see IIdentifiableEntityService#findByMarker(Class, MarkerType, Boolean, boolean, Integer, Integer, List)
923 public <S
extends TaxonBase
> Pager
<MarkedEntityDTO
<S
>> findByMarker(
924 Class
<S
> clazz
, MarkerType markerType
, Boolean markerValue
,
925 TaxonNode subtreeFilter
, boolean includeEntity
, TaxonTitleType titleType
,
926 Integer pageSize
, Integer pageNumber
, List
<String
> propertyPaths
);
930 * @param acceptedTaxonUuid
931 * @param setNameInSource
934 public UpdateResult
swapSynonymAndAcceptedTaxon(UUID synonymUUid
, UUID acceptedTaxonUuid
, boolean setNameInSource
);
939 * @param classificationUuid
942 public DeleteResult
deleteTaxon(UUID taxonUuid
, TaxonDeletionConfigurator config
, UUID classificationUuid
);
945 public UpdateResult
moveFactualDateToAnotherTaxon(UUID fromTaxonUuid
,
952 * @param taxonRelationshipType
954 * @param microcitation
957 public UpdateResult
changeSynonymToRelatedTaxon(UUID synonymUuid
, UUID toTaxonUuid
, TaxonRelationshipType taxonRelationshipType
,
958 Reference citation
, String microcitation
);
961 * @param fromTaxonUuid
963 * @param oldRelationshipType
966 * @throws DataChangeNoRollbackException
968 public UpdateResult
changeRelatedTaxonToSynonym(UUID fromTaxonUuid
, UUID toTaxonUuid
,
969 TaxonRelationshipType oldRelationshipType
, SynonymType synonymType
) throws DataChangeNoRollbackException
;
972 * Returns a list of taxon relationships for a given taxon as DTO.
977 * @param groupMisapplications
978 * @param includeUnpublished
983 public TaxonRelationshipsDTO
listTaxonRelationships(UUID taxonUuid
,
984 Set
<TaxonRelationshipType
> directTypes
,
985 Set
<TaxonRelationshipType
> inversTypes
, Direction direction
, boolean groupMisapplications
,
986 boolean includeUnpublished
, Integer pageSize
, Integer pageNumber
);
990 * @param restrictions
994 * @param propertyPaths
995 * @param includeUnpublished
998 public <S
extends TaxonBase
> Pager
<S
> page(Class
<S
> clazz
, List
<Restriction
<?
>> restrictions
, Integer pageSize
, Integer pageIndex
,
999 List
<OrderHint
> orderHints
, List
<String
> propertyPaths
, boolean includeUnpublished
);