Project

General

Profile

« Previous | Next » 

Revision 99e4ba58

Added by Anahit Babadshanjan over 15 years ago

Search for vernacular names (ticket #624)

View differences:

cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java
20 20

  
21 21
import org.apache.log4j.Logger;
22 22
import org.springframework.beans.factory.annotation.Autowired;
23
import org.springframework.beans.factory.annotation.Qualifier;
23 24
import org.springframework.stereotype.Service;
24 25
import org.springframework.transaction.TransactionStatus;
25 26
import org.springframework.transaction.annotation.Transactional;
......
27 28
import eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator;
28 29
import eu.etaxonomy.cdm.api.service.pager.Pager;
29 30
import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;
30
import eu.etaxonomy.cdm.model.common.Annotation;
31
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
31 32
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
32 33
import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;
33 34
import eu.etaxonomy.cdm.model.common.RelationshipBase;
34
import eu.etaxonomy.cdm.model.common.TermVocabulary;
35
import eu.etaxonomy.cdm.model.description.CommonTaxonName;
36
import eu.etaxonomy.cdm.model.description.DescriptionBase;
35 37
import eu.etaxonomy.cdm.model.description.TaxonDescription;
36
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
37 38
import eu.etaxonomy.cdm.model.name.Rank;
38 39
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
39 40
import eu.etaxonomy.cdm.model.reference.ReferenceBase;
......
45 46
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
46 47
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
47 48
import eu.etaxonomy.cdm.persistence.dao.common.IOrderedTermVocabularyDao;
48
import eu.etaxonomy.cdm.persistence.dao.name.INomenclaturalStatusDao;
49
import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionDao;
49 50
import eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao;
50 51
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;
51 52
import eu.etaxonomy.cdm.persistence.fetch.CdmFetch;
......
58 59

  
59 60
	@Autowired
60 61
	private ITaxonNameDao nameDao;
62
//	@Autowired
63
//	@Qualifier("nonViralNameDaoHibernateImpl")
64
//	private INonViralNameDao nonViralNameDao;
61 65
	@Autowired
62 66
	private IOrderedTermVocabularyDao orderedVocabularyDao;
67
	@Autowired
68
	private IDescriptionDao descriptionDao;
69
	
70
	/**
71
	 * Constructor
72
	 */
73
	public TaxonServiceImpl(){
74
		if (logger.isDebugEnabled()) { logger.debug("Load TaxonService Bean"); }
75
	}
63 76
	
64 77
	public TaxonBase getTaxonByUuid(UUID uuid) {
65 78
		return super.getCdmObjectByUuid(uuid); 
......
314 327
		List<IdentifiableEntity> results = new ArrayList<IdentifiableEntity>();
315 328
		int numberOfResults = 0;
316 329

  
330
		// TODO: Implement matching count-methods for the search methods
331

  
317 332
		if(configurator.isDoTaxa()) {
318
			int numberTaxaResults = dao.countTaxaByName(configurator.getSearchString(), true, configurator.getSec());
319
			if (logger.isDebugEnabled()) { logger.debug(numberTaxaResults + " taxa counted"); }
320
			if (numberTaxaResults > 0) {
321
				List<TaxonBase> taxa = 
322
					dao.getTaxaByName(configurator.getSearchString(), true, configurator.getSec());
323
				if (!results.addAll(taxa)) {
324
					logger.warn("Problem adding taxa to result");
325
				}
333
			int numberTaxaResults = 0;
334
//			int numberTaxaResults = dao.countTaxaByName(configurator.getSearchString(), true, configurator.getSec());
335
			List<TaxonBase> taxa =  
336
				dao.getTaxaByName(configurator.getSearchString(), configurator.getMatchMode(),
337
						true, configurator.getPageSize(), configurator.getPageNumber());
338
//			dao.getTaxaByName(configurator.getSearchString(), true, configurator.getSec());
339
			if (logger.isDebugEnabled()) { logger.debug(taxa.size() + " matching taxa counted"); }
340
			if (taxa.size() > 0) {
341
				results.addAll(taxa);
326 342
				numberOfResults += numberTaxaResults;
327 343
			}
328 344
		}
329 345

  
330 346
		if(configurator.isDoSynonyms()) {
331
			int numberSynonymResults = dao.countTaxaByName(configurator.getSearchString(), false, configurator.getSec());
332
			if (logger.isDebugEnabled()) { logger.debug(numberSynonymResults + " synonyms counted"); }
333
			if (numberSynonymResults > 0) {
334
				List<TaxonBase> synonyms = 
335
					dao.getTaxaByName(configurator.getSearchString(), false, configurator.getSec());
336
				if (!results.addAll(synonyms)) {
337
					logger.warn("Problem adding synonyms to result");
338
				}
347
			int numberSynonymResults = 0;
348
			List<TaxonBase> synonyms = 
349
				dao.getTaxaByName(configurator.getSearchString(), configurator.getMatchMode(),
350
						false, configurator.getPageSize(), configurator.getPageNumber());
351
//			dao.getTaxaByName(configurator.getSearchString(), false, configurator.getSec());
352
			if (logger.isDebugEnabled()) { logger.debug(synonyms.size() + " matching synonym(s) counted"); }
353
			if (synonyms.size() > 0) {
354
				results.addAll(synonyms);
339 355
				numberOfResults += numberSynonymResults;
340 356
			}
341 357
		}
342 358

  
343 359
		if (configurator.isDoNamesWithoutTaxa()) {
344
			int numberNameResults = nameDao.countNames(configurator.getSearchString());
345
			// TODO: Implement and use a count-method that counts names without taxa
346
			if (logger.isDebugEnabled()) { logger.debug(numberNameResults + " names counted"); }
347
			if (numberNameResults > 0) {
348
				List<TaxonNameBase<?,?>> names = 
349
					nameDao.searchNames(configurator.getSearchString(), null, null);
360
			int numberNameResults = 0;
361
			List<? extends TaxonNameBase<?,?>> names = 
362
				nameDao.findByName(configurator.getSearchString(), configurator.getMatchMode(), 
363
						configurator.getPageSize(), configurator.getPageNumber(), null);
364
			if (logger.isDebugEnabled()) { logger.debug(names.size() + " matching name(s) found"); }
365
			if (names.size() > 0) {
350 366
				for (TaxonNameBase<?,?> taxonName : names) {
351 367
					if (taxonName.getTaxonBases().size() == 0) {
352
						if (!results.add(taxonName)) {
353
							logger.warn("Problem adding taxon name " + taxonName.getTitleCache() + " to result");
354
						} else {
355
							numberNameResults++;
356
						}
368
						results.add(taxonName);
369
						numberNameResults++;
357 370
					}
358 371
				}
372
				if (logger.isDebugEnabled()) { logger.debug(numberNameResults + " matching name(s) without taxa found"); }
359 373
				numberOfResults += numberNameResults;
360 374
			}
361 375
		}
376
		
377
		if (configurator.isDoTaxaByCommonNames()) {
378
			int numberCommonNameResults = 0;
379
			List<CommonTaxonName> commonTaxonNames = 
380
				descriptionDao.searchDescriptionByCommonName(configurator.getSearchString(), 
381
						configurator.getMatchMode(), configurator.getPageSize(), configurator.getPageNumber());
382
			if (logger.isDebugEnabled()) { logger.debug(commonTaxonNames.size() + " matching common name(s) found"); }
383
			if (commonTaxonNames.size() > 0) {
384
				for (CommonTaxonName commonTaxonName : commonTaxonNames) {
385
					DescriptionBase description = commonTaxonName.getInDescription();
386
					description = HibernateProxyHelper.deproxy(description, DescriptionBase.class);
387
					if (description instanceof TaxonDescription) {
388
						Taxon taxon = ((TaxonDescription)description).getTaxon();
389
						results.add(taxon);
390
						numberCommonNameResults++;
391
					} else {
392
						logger.warn("Description of " + commonTaxonName.getName() + " is not an instance of TaxonDescription");
393
					}
394
				}
395
				numberOfResults += numberCommonNameResults;
396
			} 
397
		}
398
		
362 399
		Collections.sort(results);
363 400
		return new DefaultPagerImpl<IdentifiableEntity>
364 401
			(configurator.getPageNumber(), numberOfResults, configurator.getPageSize(), results);
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/config/ITaxonServiceConfigurator.java
10 10
package eu.etaxonomy.cdm.api.service.config;
11 11

  
12 12
import eu.etaxonomy.cdm.model.reference.ReferenceBase;
13
import eu.etaxonomy.cdm.persistence.query.MatchMode;
13 14

  
14 15
/**
15 16
 * @author a.babadshanjan
......
26 27
	
27 28
	public void setDoSynonyms(boolean doSynonyms);
28 29
	
30
	public boolean isDoNamesWithoutTaxa();
31
	
32
	public void setDoNamesWithoutTaxa(boolean doNamesWithoutTaxa);
33

  
34
	public boolean isDoTaxaByCommonNames();
35
	
36
	public void setDoTaxaByCommonNames(boolean doTaxaByCommonNames);
37

  
29 38
	public String getSearchString();
30 39
	
31 40
	public void setSearchString(String searchString);
32 41
	
42
	public MatchMode getMatchMode();
43

  
44
	public void setMatchMode(MatchMode matchMode);
45

  
33 46
	public ReferenceBase getSec();
34 47
	
35 48
	public void setReferenceBase(ReferenceBase sec);
36 49
	
37
	public boolean isDoNamesWithoutTaxa();
38
	
39
	public void setDoNamesWithoutTaxa(boolean doNamesWithoutTaxa);
40

  
41 50
	public Integer getPageSize();
42 51

  
43 52
	public void setPageSize(Integer pageSize);
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/config/impl/TaxonServiceConfiguratorImpl.java
10 10
import eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator;
11 11
import eu.etaxonomy.cdm.api.service.config.IdentifiableServiceConfiguratorBase;
12 12
import eu.etaxonomy.cdm.model.reference.ReferenceBase;
13
import eu.etaxonomy.cdm.persistence.query.MatchMode;
13 14

  
14 15
/**
15 16
 * @author a.babadshanjan
......
21 22
	
22 23
	private boolean doTaxa = true;
23 24
	private boolean doSynonyms = false;
25
	private boolean doTaxaByCommonNames = false;
24 26
	private boolean doNamesWithoutTaxa = false;
25 27
	private String searchString;
28
	private MatchMode matchMode;
26 29
	private ReferenceBase sec = null;
27 30
	
28 31
	public static TaxonServiceConfiguratorImpl NewInstance() {
29 32
		return new TaxonServiceConfiguratorImpl();
30 33
	}
31 34
	
35
	public boolean isDoTaxa() {
36
		return doTaxa;
37
	}
38

  
39
	public void setDoTaxa(boolean doTaxa) {
40
		this.doTaxa = doTaxa;
41
	}
42

  
32 43
	public boolean isDoSynonyms() {
33 44
		return doSynonyms;
34 45
	}
......
37 48
        this.doSynonyms = doSynonyms;
38 49
	}
39 50

  
40
	public boolean isDoTaxa() {
41
		return doTaxa;
51
	/**
52
	 * @return doTaxaByCommonNames
53
	 */
54
	public boolean isDoTaxaByCommonNames() {
55
		return doTaxaByCommonNames;
42 56
	}
43 57

  
44
	public void setDoTaxa(boolean doTaxa) {
45
		this.doTaxa = doTaxa;
58
	/**
59
	 * @param doTaxaByCommonNames
60
	 */
61
	public void setDoTaxaByCommonNames(boolean doTaxaByCommonNames) {
62
		this.doTaxaByCommonNames = doTaxaByCommonNames;
63
	}
64
	
65
	/**
66
	 * @return doNamesWithoutTaxa
67
	 */
68
	public boolean isDoNamesWithoutTaxa() {
69
		return doNamesWithoutTaxa;
46 70
	}
47 71

  
72
	/**
73
	 * @param doNamesWithoutTaxa
74
	 */
75
	public void setDoNamesWithoutTaxa(boolean doNamesWithoutTaxa) {
76
		this.doNamesWithoutTaxa = doNamesWithoutTaxa;
77
	}
78
	
48 79
	public String getSearchString() {
49 80
		return searchString;
50 81
	}
......
53 84
		this.searchString = searchString;
54 85
	}
55 86

  
87
	public MatchMode getMatchMode() {
88
		return matchMode;
89
	}
90

  
91
	public void setMatchMode(MatchMode matchMode) {
92
		this.matchMode = matchMode;
93
	}
94
	
56 95
	public ReferenceBase getSec() {
57 96
		return sec;
58 97
	}
......
60 99
	public void setReferenceBase(ReferenceBase sec) {
61 100
		this.sec = sec;
62 101
	}
63

  
64
	/**
65
	 * @return the doNamesWithoutTaxa
66
	 */
67
	public boolean isDoNamesWithoutTaxa() {
68
		return doNamesWithoutTaxa;
69
	}
70

  
71
	/**
72
	 * @param doNamesWithoutTaxa the doEmptyNames to set
73
	 */
74
	public void setDoNamesWithoutTaxa(boolean doNamesWithoutTaxa) {
75
		this.doNamesWithoutTaxa = doNamesWithoutTaxa;
76
	}
77 102
}
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/TaxonServiceSearchTest.java
34 34
import eu.etaxonomy.cdm.model.taxon.Taxon;
35 35
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
36 36
import eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmEntityDaoBaseTestClass;
37
import eu.etaxonomy.cdm.persistence.query.MatchMode;
37 38
import eu.etaxonomy.cdm.test.integration.CdmIntegrationTest;
38 39

  
39 40
/**
......
54 55
//	private CdmEntityDaoBaseTestClass cdmEntityDaoBase;
55 56

  
56 57

  
57
	//@Ignore
58
	@Ignore
58 59
	@Test
59 60
	public void testDbUnitUsageTest() throws Exception {
60 61
		assertNotNull("taxonService should exist", taxonService);
......
72 73
	public final void testFindTaxaAndNames() {
73 74

  
74 75
		ITaxonServiceConfigurator configurator = new TaxonServiceConfiguratorImpl();
76
		configurator.setSearchString("Abies*");
77
		configurator.setMatchMode(MatchMode.BEGINNING);
78
		configurator.setDoTaxa(true);
75 79
		configurator.setDoSynonyms(true);
76 80
		configurator.setDoNamesWithoutTaxa(true);
81
		configurator.setDoTaxaByCommonNames(true);
77 82
		Pager<IdentifiableEntity> pager = taxonService.findTaxaAndNames(configurator);
78 83
		List<IdentifiableEntity> list = pager.getRecords();
79 84
		if (logger.isDebugEnabled()) {
......
93 98
		assertEquals(list.get(5).getTitleCache(), "Abies alba Mill. sec. ???");
94 99
	}
95 100
	
96
	@Ignore
97
	@Test
98
	@DataSet
99
	public final void testPrintDataSet() {
100
		
101
		printDataSet(System.out);
102
	}
101
//	@Test
102
//	@DataSet
103
//	public final void testPrintDataSet() {
104
//		
105
//		printDataSet(System.out);
106
//	}
103 107
	
104 108
}
cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/TaxonServiceSearchTest.xml
1 1
<dataset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../dataset.xsd">
2 2
  <AGENT DTYPE="Person" ID="1" CREATED="2009-03-12 11:24:58.0" UUID="a598ab3f-b33b-4b4b-b237-d616fcb6b5b1" TITLECACHE="Mill." PROTECTEDTITLECACHE="true"/>
3 3
  <AGENT DTYPE="Person" ID="2" CREATED="2009-03-12 11:24:58.0" UUID="e7206bc5-61ab-468e-a9f5-dec118b46b7f" TITLECACHE="Michx." PROTECTEDTITLECACHE="true"/>
4
  <DESCRIPTIONBASE DTYPE="TaxonDescription" ID="1" CREATED="2008-12-10 09:56:07.0" UUID="5f3265ed-68ad-4ec3-826f-0d29d25986b9" UPDATED="2008-12-10 09:56:07.253" TITLECACHE=" sec. ???" PROTECTEDTITLECACHE="true" TAXON_FK="6"/>
5
  <DESCRIPTIONBASE DTYPE="TaxonDescription" ID="2" CREATED="2008-12-10 09:56:07.0" UUID="d69d6d40-eb98-42f9-8d30-fbeb0a7db33b" UPDATED="2008-12-10 09:56:07.253" TITLECACHE=" sec. ???" PROTECTEDTITLECACHE="true" TAXON_FK="7"/>
6
  <DESCRIPTIONBASE DTYPE="TaxonDescription" ID="3" CREATED="2008-12-10 09:56:07.0" UUID="c6782124-7cf0-4454-880f-c4f16dc03105" UPDATED="2008-12-10 09:56:07.253" TITLECACHE=" sec. ???" PROTECTEDTITLECACHE="true" TAXON_FK="7"/>
7
  <DESCRIPTIONELEMENTBASE DTYPE="CommonTaxonName" ID="1" CREATED="2008-12-10 09:56:07.0" UUID="31a0160a-51b2-4565-85cf-2be58cb561d6" UPDATED="2008-12-10 09:56:07.253" NAME="Abies Ringelblume" LANGUAGE_ID="1" INDESCRIPTION_ID="1"/>
8
  <DESCRIPTIONELEMENTBASE DTYPE="CommonTaxonName" ID="2" CREATED="2008-12-10 09:56:07.0" UUID="50f6b799-3585-40a7-b69d-e7be77b2651a" UPDATED="2008-12-10 09:56:07.253" NAME="Abies Löwenherz" LANGUAGE_ID="1" INDESCRIPTION_ID="2"/>
9
  <DESCRIPTIONELEMENTBASE DTYPE="CommonTaxonName" ID="3" CREATED="2008-12-10 09:56:07.0" UUID="c1e21ed1-4925-4e85-845f-e4b7a8386a33" UPDATED="2008-12-10 09:56:07.253" NAME="Abies aaabbb" LANGUAGE_ID="1" INDESCRIPTION_ID="2"/>
4 10
  <TAXONBASE DTYPE="Taxon" ID="1" CREATED="2009-03-12 11:03:52.0" UUID="9bf290fd-5438-4391-8397-ba28d1243f77" TITLECACHE="Abies sec. ???" PROTECTEDTITLECACHE="false" DOUBTFUL="false" TAXONOMICCHILDRENCOUNT="0" TAXONNAME_FK="1"/>
5 11
  <TAXONBASE DTYPE="Taxon" ID="2" CREATED="2009-03-12 11:03:52.0" UUID="bf6a40e2-38d7-4390-8971-a048ea93c0b0" TITLECACHE="Abies alba sec. ???" PROTECTEDTITLECACHE="false" DOUBTFUL="false" TAXONOMICCHILDRENCOUNT="0" TAXONNAME_FK="5"/>
6 12
  <TAXONBASE DTYPE="Synonym" ID="3" CREATED="2009-03-12 11:03:52.0" UUID="2622fd24-b792-44de-815b-7241b795c4ed" TITLECACHE="Abies alba Michx. sec. ???" PROTECTEDTITLECACHE="false" DOUBTFUL="false" TAXONNAME_FK="4"/>
7 13
  <TAXONBASE DTYPE="Taxon" ID="4" CREATED="2009-03-12 11:03:53.0" UUID="4e53992e-8e34-45b7-afe5-972acb9bb0cc" TITLECACHE="Abies alba Mill. sec. ???" PROTECTEDTITLECACHE="false" DOUBTFUL="false" TAXONOMICCHILDRENCOUNT="0" TAXONNAME_FK="3"/>
8 14
  <TAXONBASE DTYPE="Taxon" ID="5" CREATED="2009-03-12 11:03:53.0" UUID="1942101c-c6c5-4eb1-907b-c901558a0133" TITLECACHE="Abies mill. sec. ???" PROTECTEDTITLECACHE="false" DOUBTFUL="false" TAXONOMICCHILDRENCOUNT="0" TAXONNAME_FK="6"/>
15
  <TAXONBASE DTYPE="Taxon" ID="6" CREATED="2008-12-10 09:56:07.0" UUID="8d77c380-c76a-11dd-ad8b-0800200c9a66" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="Abies sec. ???" PROTECTEDTITLECACHE="true" DOUBTFUL="false" TAXONOMICCHILDRENCOUNT="1" TAXONNAME_FK="8" SEC_ID="1"/>
16
  <TAXONBASE DTYPE="Taxon" ID="7" CREATED="2008-12-10 09:56:07.0" UUID="822d98dc-9ef7-44b7-a870-94573a3bcb46" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="Abies  sec. ???" PROTECTEDTITLECACHE="true" DOUBTFUL="false" TAXONOMICCHILDRENCOUNT="0" TAXONNAME_FK="9" SEC_ID="1" TAXONOMICPARENTCACHE_ID="1"/>
9 17
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="1" CREATED="2009-03-12 11:03:52.0" UUID="a8f13935-daed-45a9-88f2-bb23ce07f6a7" TITLECACHE="Abies" PROTECTEDTITLECACHE="false" HASPROBLEM="false" FULLTITLECACHE="Abies ???" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" GENUSORUNINOMIAL="Abies" NAMECACHE="Abies" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" RANK_ID="774"/>
10 18
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="2" CREATED="2009-03-12 11:03:52.0" UUID="f5b6c282-af1f-461f-a8a3-521a9f8c9f9b" TITLECACHE="Abies Mill." PROTECTEDTITLECACHE="false" HASPROBLEM="false" FULLTITLECACHE="Abies Mill. ???" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" GENUSORUNINOMIAL="Abies" NAMECACHE="Abies" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" SPECIFICEPITHET="alba" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" RANK_ID="774"/>
11 19
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="3" CREATED="2009-03-12 11:03:52.0" UUID="9eb9f192-3029-42b9-8d35-691de8b81ac1" TITLECACHE="Abies alba Mill." PROTECTEDTITLECACHE="true" HASPROBLEM="false" FULLTITLECACHE="Abies alba Mill. ???" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="Mill." GENUSORUNINOMIAL="Abies" NAMECACHE="Abies alba" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" RANK_ID="765" COMBINATIONAUTHORTEAM_ID="1"/>
......
13 21
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="5" CREATED="2009-03-12 11:03:52.0" UUID="d72ad0b8-e9a7-479b-9efe-5a723ab9380b" TITLECACHE="Abies alba" PROTECTEDTITLECACHE="false" HASPROBLEM="false" FULLTITLECACHE="Abies alba ???" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" GENUSORUNINOMIAL="Abies" NAMECACHE="Abies alba" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" SPECIFICEPITHET="alba" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" RANK_ID="765" COMBINATIONAUTHORTEAM_ID="2"/>
14 22
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="6" CREATED="2009-03-12 11:03:52.0" UUID="f5b6c282-af1f-461f-a8a3-521a9f8c9f9b" TITLECACHE="Abies mill." PROTECTEDTITLECACHE="false" HASPROBLEM="false" FULLTITLECACHE="Abies mill. ???" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" GENUSORUNINOMIAL="Abies" NAMECACHE="Abies" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" SPECIFICEPITHET="alba" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" RANK_ID="765"/>
15 23
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="7" CREATED="2009-03-12 11:03:52.0" UUID="f5b6c282-af1f-461f-a8a3-521a9f8c9f9b" TITLECACHE="Aab Mill." PROTECTEDTITLECACHE="false" HASPROBLEM="false" FULLTITLECACHE="Aab Mill. ???" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" GENUSORUNINOMIAL="Abies" NAMECACHE="Aab" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" SPECIFICEPITHET="alba" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" RANK_ID="765"/>
24
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="8" CREATED="2008-12-10 09:56:07.0" UUID="a49a3963-c4ea-4047-8588-2f8f15352730" UPDATED="2008-12-10 09:56:07.238" TITLECACHE="" PROTECTEDTITLECACHE="false" HASPROBLEM="false" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" GENUSORUNINOMIAL="Aus" NAMECACHE="Aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" RANK_ID="774"/>
25
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="9" CREATED="2008-12-10 09:56:07.0" UUID="05a438d6-065f-49ef-84db-c7dc2c259975" UPDATED="2008-12-10 09:56:07.253" TITLECACHE=" " PROTECTEDTITLECACHE="false" HASPROBLEM="false" FULLTITLECACHE=" " PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" GENUSORUNINOMIAL="Aus" NAMECACHE="Aus aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" SPECIFICEPITHET="aus" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" RANK_ID="765"/>
16 26
</dataset>
17 27
 	

Also available in: Unified diff