2 * Copyright (C) 2009 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 static org
.junit
.Assert
.assertNotNull
;
14 import java
.io
.FileNotFoundException
;
15 import java
.io
.IOException
;
16 import java
.util
.ArrayList
;
17 import java
.util
.Arrays
;
18 import java
.util
.EnumSet
;
19 import java
.util
.HashSet
;
20 import java
.util
.List
;
23 import java
.util
.UUID
;
25 import org
.apache
.commons
.lang
.RandomStringUtils
;
26 import org
.apache
.log4j
.Level
;
27 import org
.apache
.log4j
.Logger
;
28 import org
.apache
.lucene
.document
.Document
;
29 import org
.junit
.Assert
;
30 import org
.junit
.Before
;
31 import org
.junit
.Ignore
;
32 import org
.junit
.Test
;
33 import org
.unitils
.dbunit
.annotation
.DataSet
;
34 import org
.unitils
.spring
.annotation
.SpringBeanByType
;
36 import eu
.etaxonomy
.cdm
.api
.service
.config
.FindTaxaAndNamesConfiguratorImpl
;
37 import eu
.etaxonomy
.cdm
.api
.service
.config
.IFindTaxaAndNamesConfigurator
;
38 import eu
.etaxonomy
.cdm
.api
.service
.pager
.Pager
;
39 import eu
.etaxonomy
.cdm
.api
.service
.search
.ICdmMassIndexer
;
40 import eu
.etaxonomy
.cdm
.api
.service
.search
.LuceneMultiSearchException
;
41 import eu
.etaxonomy
.cdm
.api
.service
.search
.LuceneParseException
;
42 import eu
.etaxonomy
.cdm
.api
.service
.search
.SearchResult
;
43 import eu
.etaxonomy
.cdm
.common
.UTF8
;
44 import eu
.etaxonomy
.cdm
.common
.monitor
.DefaultProgressMonitor
;
45 import eu
.etaxonomy
.cdm
.hibernate
.HibernateProxyHelper
;
46 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
47 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
48 import eu
.etaxonomy
.cdm
.model
.common
.IdentifiableEntity
;
49 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
50 import eu
.etaxonomy
.cdm
.model
.description
.CategoricalData
;
51 import eu
.etaxonomy
.cdm
.model
.description
.CommonTaxonName
;
52 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionBase
;
53 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
54 import eu
.etaxonomy
.cdm
.model
.description
.Distribution
;
55 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
56 import eu
.etaxonomy
.cdm
.model
.description
.PresenceAbsenceTerm
;
57 import eu
.etaxonomy
.cdm
.model
.description
.State
;
58 import eu
.etaxonomy
.cdm
.model
.description
.StateData
;
59 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
60 import eu
.etaxonomy
.cdm
.model
.description
.TextData
;
61 import eu
.etaxonomy
.cdm
.model
.location
.Country
;
62 import eu
.etaxonomy
.cdm
.model
.location
.NamedArea
;
63 import eu
.etaxonomy
.cdm
.model
.name
.IBotanicalName
;
64 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
65 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
66 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameFactory
;
67 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
68 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceFactory
;
69 import eu
.etaxonomy
.cdm
.model
.taxon
.Classification
;
70 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
71 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymType
;
72 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
73 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
74 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
75 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationship
;
76 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationshipType
;
77 import eu
.etaxonomy
.cdm
.persistence
.query
.MatchMode
;
78 import eu
.etaxonomy
.cdm
.persistence
.query
.OrderHint
;
79 import eu
.etaxonomy
.cdm
.test
.integration
.CdmTransactionalIntegrationTest
;
80 import eu
.etaxonomy
.cdm
.test
.unitils
.CleanSweepInsertLoadStrategy
;
83 * @author a.babadshanjan, a.kohlbecker
86 public class TaxonServiceSearchTest
extends CdmTransactionalIntegrationTest
{
88 private static Logger logger
= Logger
.getLogger(TaxonServiceSearchTest
.class);
90 private static final String ABIES_BALSAMEA_UUID
= "f65d47bd-4f49-4ab1-bc4a-bc4551eaa1a8";
91 private static final String ABIES_ALBA_UUID
= "7dbd5810-a3e5-44b6-b563-25152b8867f4";
92 private static final String CLASSIFICATION_UUID
= "2a5ceebb-4830-4524-b330-78461bf8cb6b";
93 private static final String CLASSIFICATION_ALT_UUID
= "d7c741e3-ae9e-4a7d-a566-9e3a7a0b51ce";
94 private static final String D_ABIES_BALSAMEA_UUID
= "900108d8-e6ce-495e-b32e-7aad3099135e";
95 private static final String D_ABIES_ALBA_UUID
= "ec8bba03-d993-4c85-8472-18b14942464b";
96 private static final String D_ABIES_KAWAKAMII_SEC_KOMAROV_UUID
= "e9d8c2fd-6409-46d5-9c2e-14a2bbb1b2b1";
97 private static final int NUM_OF_NEW_RADOM_ENTITIES
= 1000;
98 private boolean includeUnpublished
= true;
103 private ITaxonService taxonService
;
105 private ITermService termService
;
107 private IClassificationService classificationService
;
109 private IReferenceService referenceService
;
111 private IDescriptionService descriptionService
;
113 private INameService nameService
;
115 private ICdmMassIndexer indexer
;
118 private ITaxonNodeService nodeService
;
120 private static final int BENCHMARK_ROUNDS
= 300;
122 private Set
<Class
<?
extends CdmBase
>> typesToIndex
= null;
124 private NamedArea germany
;
125 private NamedArea france
;
126 private NamedArea russia
;
127 private NamedArea canada
;
130 public void setUp() throws Exception
{
131 typesToIndex
= new HashSet
<Class
<?
extends CdmBase
>>();
132 typesToIndex
.add(DescriptionElementBase
.class);
133 typesToIndex
.add(TaxonBase
.class);
134 typesToIndex
.add(TaxonRelationship
.class);
136 germany
= Country
.GERMANY();
137 france
= Country
.FRANCEFRENCHREPUBLIC();
138 russia
= Country
.RUSSIANFEDERATION();
139 canada
= Country
.CANADA();
141 includeUnpublished
= true;
145 public void testDbUnitUsageTest() throws Exception
{
146 assertNotNull("taxonService should exist", taxonService
);
147 assertNotNull("nameService should exist", nameService
);
151 @SuppressWarnings("rawtypes")
154 public final void testPurgeAndReindex() throws IOException
, LuceneParseException
{
156 refreshLuceneIndex();
158 Pager
<SearchResult
<TaxonBase
>> pager
;
160 pager
= taxonService
.findByFullText(null, "Abies", null, includeUnpublished
, null, true, null, null, null, null); // --> 8
161 Assert
.assertEquals("Expecting 8 entities", 8, pager
.getCount().intValue());
164 commitAndStartNewTransaction(null);
166 pager
= taxonService
.findByFullText(null, "Abies", null, includeUnpublished
, null, true, null, null, null, null); // --> 0
167 Assert
.assertEquals("Expecting no entities since the index has been purged", 0, pager
.getCount().intValue());
169 indexer
.reindex(indexer
.indexedClasses(), null);
170 commitAndStartNewTransaction(null);
172 pager
= taxonService
.findByFullText(null, "Abies", null, includeUnpublished
, null, true, null, null, null, null); // --> 8
173 Assert
.assertEquals("Expecting 8 entities", 8, pager
.getCount().intValue());
177 @SuppressWarnings("rawtypes")
180 public final void testFindByDescriptionElementFullText_CommonName() throws IOException
,
181 LuceneParseException
{
183 refreshLuceneIndex();
185 Pager
<SearchResult
<TaxonBase
>> pager
;
187 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Wei"+UTF8
.SHARP_S
+"tanne", null, null, null,
188 false, null, null, null, null);
189 Assert
.assertEquals("Expecting one entity when searching for CommonTaxonName", 1,
190 pager
.getCount().intValue());
192 // the description containing the Nulltanne has no taxon attached,
194 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Nulltanne", null, null, null,
195 false, null, null, null, null);
196 Assert
.assertEquals("Expecting no entity when searching for 'Nulltanne' ", 0, pager
.getCount().intValue());
198 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Wei"+UTF8
.SHARP_S
+"tanne", null, null,
199 Arrays
.asList(new Language
[] { Language
.GERMAN() }), false, null, null, null, null);
200 Assert
.assertEquals("Expecting one entity when searching in German", 1, pager
.getCount().intValue());
202 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Wei"+UTF8
.SHARP_S
+"tanne", null, null,
203 Arrays
.asList(new Language
[] { Language
.RUSSIAN() }), false, null, null, null, null);
204 Assert
.assertEquals("Expecting no entity when searching in Russian", 0, pager
.getCount().intValue());
208 @SuppressWarnings("rawtypes")
211 public final void testFindByDescriptionElementFullText_Distribution() throws IOException
, LuceneParseException
{
213 refreshLuceneIndex();
215 Pager
<SearchResult
<TaxonBase
>> pager
;
217 pager
= taxonService
.findByDescriptionElementFullText(null, "Canada", null, null, null, false, null, null, null, null);
218 Assert
.assertEquals("Expecting one entity when searching for arae 'Canada'", 1, pager
.getCount().intValue());
220 pager
= taxonService
.findByDescriptionElementFullText(null, "present", null, null, null, false, null, null, null, null);
221 Assert
.assertEquals("Expecting one entity when searching for status 'present'", 1, pager
.getCount().intValue());
224 @SuppressWarnings("rawtypes")
227 public final void testFindByDescriptionElementFullText_wildcard() throws IOException
, LuceneParseException
{
229 refreshLuceneIndex();
231 Pager
<SearchResult
<TaxonBase
>> pager
;
233 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Wei"+UTF8
.SHARP_S
+"*", null, null, null, false, null, null, null, null);
234 Assert
.assertEquals("Expecting one entity when searching for CommonTaxonName", 1, pager
.getCount().intValue());
238 * Regression test for #3113 (hibernate search: wildcard query can cause BooleanQuery$TooManyClauses: maxClauseCount is set to 1024)
240 * @throws IOException
241 * @throws LuceneParseException
243 @SuppressWarnings("rawtypes")
246 public final void testFindByDescriptionElementFullText_TooManyClauses() throws IOException
, LuceneParseException
{
248 // generate 1024 terms to reproduce the bug
249 TaxonDescription description
= (TaxonDescription
) descriptionService
.find(UUID
.fromString(D_ABIES_ALBA_UUID
));
250 Set
<String
> uniqueRandomStrs
= new HashSet
<String
>(1024);
251 while(uniqueRandomStrs
.size() < 1024){
252 uniqueRandomStrs
.add(RandomStringUtils
.random(10, true, false));
254 for(String rndStr
: uniqueRandomStrs
){
255 description
.addElement(CommonTaxonName
.NewInstance("Rot" + rndStr
, Language
.DEFAULT()));
257 descriptionService
.saveOrUpdate(description
);
258 commitAndStartNewTransaction(null);
260 refreshLuceneIndex();
262 Pager
<SearchResult
<TaxonBase
>> pager
;
264 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Rot*", null, null, null, false, null, null, null, null);
265 Assert
.assertEquals("Expecting all 1024 entities grouped into one SearchResult item when searching for Rot*", 1, pager
.getCount().intValue());
269 * Regression test for #3116 (fulltext search: always only one page of results)
271 * @throws IOException
272 * @throws LuceneParseException
274 @SuppressWarnings("rawtypes")
276 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class)
278 public final void testFullText_Paging() throws IOException
, LuceneParseException
{
280 Reference sec
= ReferenceFactory
.newDatabase();
281 referenceService
.save(sec
);
283 Set
<String
> uniqueRandomStrs
= new HashSet
<String
>(1024);
284 int numOfItems
= 100;
285 while(uniqueRandomStrs
.size() < numOfItems
){
286 uniqueRandomStrs
.add(RandomStringUtils
.random(5, true, false));
289 for(String rndStr
: uniqueRandomStrs
){
291 Taxon taxon
= Taxon
.NewInstance(TaxonNameFactory
.NewBotanicalInstance(Rank
.SERIES()), sec
);
292 taxon
.setTitleCache("Tax" + rndStr
, true);
293 taxonService
.save(taxon
);
295 TaxonDescription description
= TaxonDescription
.NewInstance(taxon
);
296 description
.addElement(CommonTaxonName
.NewInstance("Rot" + rndStr
, Language
.DEFAULT()));
297 descriptionService
.saveOrUpdate(description
);
300 commitAndStartNewTransaction(new String
[]{"TAXONBASE"});
301 refreshLuceneIndex();
305 Pager
<SearchResult
<TaxonBase
>> pager
;
307 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Rot*", null, null, null, false, pageSize
, null, null, null);
308 Assert
.assertEquals("unexpeted number of pages", Integer
.valueOf(numOfItems
/ pageSize
), pager
.getPagesAvailable());
309 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Rot*", null, null, null, false, pageSize
, 9, null, null);
310 Assert
.assertNotNull("last page must have records", pager
.getRecords());
311 Assert
.assertNotNull("last item on last page must exist", pager
.getRecords().get(0));
312 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Rot*", null, null, null, false, pageSize
, 10, null, null);
313 Assert
.assertNotNull("last page + 1 must not have any records", pager
.getRecords());
317 * test for max score and sort by score of hit groups
318 * with all matches per taxon in a single TextData element
319 * see {@link #testFullText_ScoreAndOrder_2()} for the complement
320 * test with matches in multiple TextData per taxon
322 * @throws IOException
323 * @throws LuceneParseException
325 @SuppressWarnings("rawtypes")
328 @Ignore // test fails, maybe the assumptions made here are not compatible with the lucene scoring mechanism see http://lucene.apache.org/core/3_6_1/scoring.html
329 public final void testFullText_ScoreAndOrder_1() throws IOException
, LuceneParseException
{
333 UUID
[] taxonUuids
= new UUID
[numOfTaxa
];
334 StringBuilder text
= new StringBuilder();
336 for(int i
= 0; i
< numOfTaxa
; i
++){
338 Taxon taxon
= Taxon
.NewInstance(TaxonNameFactory
.NewBotanicalInstance(null), null);
339 taxon
.setTitleCache("Taxon_" + i
, true);
340 taxonUuids
[i
] = taxon
.getUuid();
341 taxonService
.save(taxon
);
343 text
.append(" ").append("Rot");
344 TaxonDescription description
= TaxonDescription
.NewInstance(taxon
);
345 description
.addElement(TextData
.NewInstance(text
.toString(), Language
.DEFAULT(), null));
346 descriptionService
.saveOrUpdate(description
);
349 commitAndStartNewTransaction(null);
350 refreshLuceneIndex();
352 Pager
<SearchResult
<TaxonBase
>> pager
;
354 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Rot", null, null, null, false, null, null, null, null);
355 for(int i
= 0; i
< numOfTaxa
; i
++){
356 Assert
.assertEquals("taxa should be orderd by relevance (= score)", taxonUuids
[numOfTaxa
- i
- 1], pager
.getRecords().get(i
).getEntity().getUuid());
358 Assert
.assertEquals("max score should be equal to the score of the first element", pager
.getRecords().get(0).getMaxScore(), pager
.getRecords().get(0).getScore(), 0);
362 * test for max score and sort by score of hit groups
363 * with all matches per taxon in a multiple TextData elements
364 * see {@link #testFullText_ScoreAndOrder_1()} for the complement
365 * test with matches in a single TextData per taxon
367 * @throws IOException
368 * @throws LuceneParseException
370 @SuppressWarnings("rawtypes")
373 @Ignore // test fails, maybe the assumptions made here are not compatible with the lucene scoring mechanism see http://lucene.apache.org/core/3_6_1/scoring.html
374 public final void testFullText_ScoreAndOrder_2() throws IOException
, LuceneParseException
{
378 UUID
[] taxonUuids
= new UUID
[numOfTaxa
];
380 for(int i
= 0; i
< numOfTaxa
; i
++){
382 Taxon taxon
= Taxon
.NewInstance(TaxonNameFactory
.NewBotanicalInstance(null), null);
383 taxon
.setTitleCache("Taxon_" + i
, true);
384 taxonUuids
[i
] = taxon
.getUuid();
385 taxonService
.save(taxon
);
387 TaxonDescription description
= TaxonDescription
.NewInstance(taxon
);
388 for(int k
= 0; k
< i
; k
++){
389 description
.addElement(TextData
.NewInstance("Rot", Language
.DEFAULT(), null));
391 descriptionService
.saveOrUpdate(description
);
394 commitAndStartNewTransaction(null);
395 refreshLuceneIndex();
397 Pager
<SearchResult
<TaxonBase
>> pager
;
399 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Rot", null, null, null, false, null, null, null, null);
400 for(int i
= 0; i
< numOfTaxa
; i
++){
401 Assert
.assertEquals("taxa should be orderd by relevance (= score)", taxonUuids
[numOfTaxa
- i
- 1], pager
.getRecords().get(i
).getEntity().getUuid());
403 Assert
.assertEquals("max score should be equal to the score of the first element", pager
.getRecords().get(0).getMaxScore(), pager
.getRecords().get(0).getScore(), 0);
408 * @throws IOException
409 * @throws LuceneParseException
410 * @throws LuceneMultiSearchException
414 public final void testFullText_Grouping() throws IOException
, LuceneParseException
, LuceneMultiSearchException
{
416 TaxonDescription description
= (TaxonDescription
) descriptionService
.find(UUID
.fromString(D_ABIES_ALBA_UUID
));
417 Set
<String
> uniqueRandomStrs
= new HashSet
<String
>(1024);
418 int numOfItems
= 100;
419 while(uniqueRandomStrs
.size() < numOfItems
){
420 uniqueRandomStrs
.add(RandomStringUtils
.random(5, true, false));
422 for(String rndStr
: uniqueRandomStrs
){
423 description
.addElement(CommonTaxonName
.NewInstance("Rot" + rndStr
, Language
.DEFAULT()));
425 descriptionService
.saveOrUpdate(description
);
427 commitAndStartNewTransaction(new String
[]{"DESCRIPTIONELEMENTBASE"});
429 refreshLuceneIndex();
433 Pager
<SearchResult
<TaxonBase
>> pager
;
434 boolean highlightFragments
= true;
436 // test with findByDescriptionElementFullText
437 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Rot*", null, null, null, highlightFragments
, pageSize
, null, null, null);
438 logFreeTextSearchResults(pager
, Level
.DEBUG
, null);
439 Assert
.assertEquals("All matches should be grouped into a single SearchResult element", 1, pager
.getRecords().size());
440 Assert
.assertEquals("The count property of the pager must be set correctly", 1, pager
.getCount().intValue());
441 Map
<String
, String
[]> highlightMap
= pager
.getRecords().get(0).getFieldHighlightMap();
442 // maxDocsPerGroup is defined in LuceneSearch and defaults to 10
443 int maxDocsPerGroup
= 10;
444 Assert
.assertEquals("expecting 10 highlighted fragments of field 'name'", maxDocsPerGroup
, highlightMap
.get("name").length
);
446 // test with findByEverythingFullText
447 pager
= taxonService
.findByEverythingFullText( "Rot*", null, includeUnpublished
, null, highlightFragments
, pageSize
, null, null, null);
448 logFreeTextSearchResults(pager
, Level
.DEBUG
, null);
449 Assert
.assertEquals("All matches should be grouped into a single SearchResult element", 1, pager
.getRecords().size());
450 Assert
.assertEquals("The count property of the pager must be set correctly", 1, pager
.getCount().intValue());
451 highlightMap
= pager
.getRecords().get(0).getFieldHighlightMap();
452 // maxDocsPerGroup is defined in LuceneSearch and defaults to 10
453 maxDocsPerGroup
= 10;
454 Assert
.assertEquals("expecting 10 highlighted fragments of field 'name'", maxDocsPerGroup
, highlightMap
.get("name").length
);
458 @SuppressWarnings("rawtypes")
462 public final void testFindByDescriptionElementFullText_TextData() throws IOException
, LuceneParseException
{
464 refreshLuceneIndex();
466 Pager
<SearchResult
<TaxonBase
>> pager
;
467 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Abies", null, null, null, false, null, null, null, null);
468 logFreeTextSearchResults(pager
, Level
.DEBUG
, null);
469 Assert
.assertEquals("Expecting one entity when searching for any TextData", 1, pager
.getCount().intValue());
470 Assert
.assertEquals("Abies balsamea sec. Kohlbecker, A., Testcase standart views, 2013", pager
.getRecords().get(0).getEntity().getTitleCache());
471 Assert
.assertTrue("Expecting two docs, one for RUSSIAN and one for GERMAN", pager
.getRecords().get(0).getDocs().size() == 2);
472 Assert
.assertEquals("Abies balsamea sec. Kohlbecker, A., Testcase standart views, 2013", pager
.getRecords().get(0).getDocs().iterator().next().get("inDescription.taxon.titleCache"));
475 pager
= taxonService
.findByDescriptionElementFullText(null, "Abies", null, null, null, false, null, null, null, null);
476 Assert
.assertEquals("Expecting one entity when searching for any type", 1, pager
.getCount().intValue());
478 pager
= taxonService
.findByDescriptionElementFullText(null, "Abies", null, Arrays
.asList(new Feature
[]{Feature
.UNKNOWN()}), null, false, null, null, null, null);
479 Assert
.assertEquals("Expecting one entity when searching for any type and for Feature DESCRIPTION", 1, pager
.getCount().intValue());
481 pager
= taxonService
.findByDescriptionElementFullText(null, "Abies", null, Arrays
.asList(new Feature
[]{Feature
.CHROMOSOME_NUMBER()}), null, false, null, null, null, null);
482 Assert
.assertEquals("Expecting no entity when searching for any type and for Feature CHROMOSOME_NUMBER", 0, pager
.getCount().intValue());
484 pager
= taxonService
.findByDescriptionElementFullText(null, "Abies", null, Arrays
.asList(new Feature
[]{Feature
.CHROMOSOME_NUMBER(), Feature
.UNKNOWN()}), null, false, null, null, null, null);
485 Assert
.assertEquals("Expecting no entity when searching for any type and for Feature DESCRIPTION or CHROMOSOME_NUMBER", 1, pager
.getCount().intValue());
487 pager
= taxonService
.findByDescriptionElementFullText(Distribution
.class, "Abies", null, null, null, false, null, null, null, null);
488 Assert
.assertEquals("Expecting no entity when searching for Distribution", 0, pager
.getCount().intValue());
490 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Бальзам", null, null, Arrays
.asList(new Language
[]{}), false, null, null, null, null);
491 Assert
.assertEquals("Expecting one entity", 1, pager
.getCount().intValue());
492 Assert
.assertEquals("Abies balsamea sec. Kohlbecker, A., Testcase standart views, 2013", pager
.getRecords().get(0).getEntity().getTitleCache());
494 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Бальзам", null, null, Arrays
.asList(new Language
[]{Language
.RUSSIAN()}), false, null, null, null, null);
495 Assert
.assertEquals("Expecting one entity", 1, pager
.getCount().intValue());
496 Assert
.assertEquals("Abies balsamea sec. Kohlbecker, A., Testcase standart views, 2013", pager
.getRecords().get(0).getEntity().getTitleCache());
498 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Бальзам", null, null, Arrays
.asList(new Language
[]{Language
.GERMAN()}), false, null, null, null, null);
499 Assert
.assertEquals("Expecting no entity", 0, pager
.getCount().intValue());
501 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Balsam-Tanne", null, null, Arrays
.asList(new Language
[]{Language
.GERMAN(), Language
.RUSSIAN()}), false, null, null, null, null);
502 Assert
.assertEquals("Expecting one entity", 1, pager
.getCount().intValue());
503 Assert
.assertEquals("Abies balsamea sec. Kohlbecker, A., Testcase standart views, 2013", pager
.getRecords().get(0).getEntity().getTitleCache());
506 @SuppressWarnings("rawtypes")
509 public final void testFindByDescriptionElementFullText_MultipleWords() throws IOException
, LuceneParseException
{
511 refreshLuceneIndex();
513 // Pflanzenart aus der Gattung der Tannen
514 long start
= System
.currentTimeMillis();
516 Pager
<SearchResult
<TaxonBase
>> pager
;
517 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Pflanzenart Tannen", null, null, null, false, null, null, null, null);
518 Assert
.assertEquals("OR search : Expecting one entity", 1, pager
.getCount().intValue());
520 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Pflanzenart Wespen", null, null, null, false, null, null, null, null);
521 Assert
.assertEquals("OR search : Expecting one entity", 1, pager
.getCount().intValue());
523 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "+Pflanzenart +Tannen", null, null, null, false, null, null, null, null);
524 Assert
.assertEquals("AND search : Expecting one entity", 1, pager
.getCount().intValue());
526 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "+Pflanzenart +Wespen", null, null, null, false, null, null, null, null);
527 Assert
.assertEquals("AND search : Expecting no entity", 0, pager
.getCount().intValue());
529 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "\"Pflanzenart aus der Gattung der Tannen\"", null, null, null, false, null, null, null, null);
530 Assert
.assertEquals("Phrase search : Expecting one entity", 1, pager
.getCount().intValue());
532 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "\"Pflanzenart aus der Gattung der Wespen\"", null, null, null, false, null, null, null, null);
533 Assert
.assertEquals("Phrase search : Expecting one entity", 0, pager
.getCount().intValue());
535 logger
.info("testFindByDescriptionElementFullText_MultipleWords() duration: " + (System
.currentTimeMillis() - start
) + "ms");
540 @SuppressWarnings("rawtypes")
542 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class)
543 public final void testFindByDescriptionElementFullText_modify_DescriptionElement() throws IOException
, LuceneParseException
{
545 refreshLuceneIndex();
547 Pager
<SearchResult
<TaxonBase
>> pager
;
549 // modify the DescriptionElement
550 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Balsam-Tanne", null, null, Arrays
.asList(new Language
[]{Language
.GERMAN(), Language
.RUSSIAN()}), false, null, null, null, null);
551 Assert
.assertTrue("Search did not return any results", pager
.getRecords().size() > 0);
552 Assert
.assertTrue("Expecting only one doc", pager
.getRecords().get(0).getDocs().size() == 1);
553 Document indexDocument
= pager
.getRecords().get(0).getDocs().iterator().next();
554 String
[] descriptionElementUuidStr
= indexDocument
.getValues("uuid");
555 String
[] inDescriptionUuidStr
= indexDocument
.getValues("inDescription.uuid");
557 DescriptionElementBase textData
= descriptionService
.getDescriptionElementByUuid(UUID
.fromString(descriptionElementUuidStr
[0]));
559 ((TextData
)textData
).removeText(Language
.GERMAN());
560 ((TextData
)textData
).putText(Language
.SPANISH_CASTILIAN(), "abeto bals"+UTF8
.SMALL_A_ACUTE
+"mico");
562 descriptionService
.saveDescriptionElement(textData
);
563 commitAndStartNewTransaction(null);
564 // printDataSet(System.out, new String[] {
565 // "DESCRIPTIONELEMENTBASE", "LANGUAGESTRING", "DESCRIPTIONELEMENTBASE_LANGUAGESTRING" }
569 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Balsam-Tanne", null, null, Arrays
.asList(new Language
[]{Language
.GERMAN(), Language
.RUSSIAN()}), false, null, null, null, null);
570 Assert
.assertEquals("The german 'Balsam-Tanne' TextData should no longer be indexed", 0, pager
.getCount().intValue());
571 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "abeto", null, null, Arrays
.asList(new Language
[]{Language
.SPANISH_CASTILIAN()}), false, null, null, null, null);
572 Assert
.assertEquals("expecting to find the SPANISH_CASTILIAN 'abeto bals"+UTF8
.SMALL_A_ACUTE
+"mico'", 1, pager
.getCount().intValue());
573 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "bals"+UTF8
.SMALL_A_ACUTE
+"mico", null, null, null, false, null, null, null, null);
574 Assert
.assertEquals("expecting to find the SPANISH_CASTILIAN 'abeto bals"+UTF8
.SMALL_A_ACUTE
+"mico'", 1, pager
.getCount().intValue());
577 // modify the DescriptionElement via the Description object
578 DescriptionBase
<?
> description
= descriptionService
.find(UUID
.fromString(inDescriptionUuidStr
[0]));
579 Set
<DescriptionElementBase
> elements
= description
.getElements();
580 for( DescriptionElementBase elm
: elements
){
581 if(elm
.getUuid().toString().equals(descriptionElementUuidStr
[0])){
582 ((TextData
)elm
).removeText(Language
.SPANISH_CASTILIAN());
583 ((TextData
)elm
).putText(Language
.POLISH(), "Jod"+UTF8
.POLISH_L
+"a balsamiczna");
586 descriptionService
.saveOrUpdate(description
);
587 commitAndStartNewTransaction(null);
588 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "abeto", null, null, Arrays
.asList(new Language
[]{Language
.SPANISH_CASTILIAN()}), false, null, null, null, null);
589 Assert
.assertEquals("The spanish 'abeto bals"+UTF8
.SMALL_A_ACUTE
+"mico' TextData should no longer be indexed", 0, pager
.getCount().intValue());
590 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "balsamiczna", null, null, Arrays
.asList(new Language
[]{Language
.POLISH()}), false, null, null, null, null);
591 Assert
.assertEquals("expecting to find the POLISH 'Jod"+UTF8
.POLISH_L
+"a balsamiczna'", 1, pager
.getCount().intValue());
594 @SuppressWarnings("rawtypes")
596 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class)
597 public final void testFindByDescriptionElementFullText_modify_Taxon() throws IOException
, LuceneParseException
{
599 refreshLuceneIndex();
601 Pager
<SearchResult
<TaxonBase
>> pager
;
602 Taxon t_abies_balsamea
= (Taxon
)taxonService
.find(UUID
.fromString(ABIES_BALSAMEA_UUID
));
603 TaxonDescription d_abies_balsamea
= (TaxonDescription
)descriptionService
.find(UUID
.fromString(D_ABIES_BALSAMEA_UUID
));
605 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Balsam-Tanne", null, null, Arrays
.asList(new Language
[]{Language
.GERMAN()}), false, null, null, null, null);
606 Assert
.assertEquals("expecting to find the GERMAN 'Balsam-Tanne'", 1, pager
.getCount().intValue());
608 // exchange the Taxon with another one via the Taxon object
609 // 1.) remove existing description:
610 t_abies_balsamea
.removeDescription(d_abies_balsamea
);
612 taxonService
.saveOrUpdate(t_abies_balsamea
);
613 commitAndStartNewTransaction(null);
615 t_abies_balsamea
= (Taxon
)taxonService
.find(t_abies_balsamea
.getUuid());
617 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Balsam-Tanne", null, null, Arrays
.asList(new Language
[]{Language
.GERMAN()}), false, null, null, null, null);
618 Assert
.assertEquals("'Balsam-Tanne' should no longer be found", 0, pager
.getCount().intValue());
620 // 2.) create new description and add to taxon:
621 TaxonDescription d_abies_balsamea_new
= TaxonDescription
.NewInstance();
625 "Die Balsamtanne ist mit bis zu 30 m Höhe ein mittelgro"+UTF8
.SHARP_S
+"er Baum und kann bis zu 200 Jahre alt werden",
626 Language
.GERMAN(), null));
627 t_abies_balsamea
.addDescription(d_abies_balsamea_new
);
628 // set authorshipCache to null to avoid validation exception,
629 // this is maybe not needed in future, see ticket #3344
630 IBotanicalName abies_balsamea
= CdmBase
.deproxy(t_abies_balsamea
.getName(), TaxonName
.class);
631 abies_balsamea
.setAuthorshipCache(null);
632 printDataSet(System
.err
, new String
[] {"LANGUAGESTRING_AUD"});
633 taxonService
.saveOrUpdate(t_abies_balsamea
);
634 commitAndStartNewTransaction(null);
636 // printDataSet(System.out, new String[] {
640 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "mittelgro"+UTF8
.SHARP_S
+"er Baum", null, null, Arrays
.asList(new Language
[]{Language
.GERMAN()}), false, null, null, null, null);
641 Assert
.assertEquals("the taxon should be found via the new Description", 1, pager
.getCount().intValue());
644 @SuppressWarnings("rawtypes")
647 public final void testFindByDescriptionElementFullText_modify_Classification() throws IOException
, LuceneParseException
{
649 refreshLuceneIndex();
651 Pager
<SearchResult
<TaxonBase
>> pager
;
653 // put taxon into other classification, new taxon node
654 Classification classification
= classificationService
.find(UUID
.fromString(CLASSIFICATION_UUID
));
655 Classification alternateClassification
= classificationService
.find(UUID
.fromString(CLASSIFICATION_ALT_UUID
));
657 // TODO: why is the test failing when the childNode is already retrieved here, and not after the following four lines?
658 //TaxonNode childNode = classification.getChildNodes().iterator().next();
660 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Balsam-Tanne", null, null, Arrays
.asList(new Language
[]{Language
.GERMAN()}), false, null, null, null, null);
661 Assert
.assertEquals("expecting to find the GERMAN 'Balsam-Tanne' even if filtering by classification", 1, pager
.getCount().intValue());
662 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Balsam-Tanne", alternateClassification
, null, Arrays
.asList(new Language
[]{Language
.GERMAN()}), false, null, null, null, null);
663 Assert
.assertEquals("GERMAN 'Balsam-Tanne' should NOT be found in other classification", 0, pager
.getCount().intValue());
665 // check for the right taxon node
666 TaxonNode childNode
= classification
.getChildNodes().iterator().next();
667 Assert
.assertEquals("expecting Abies balsamea sec.", childNode
.getTaxon().getUuid().toString(), ABIES_BALSAMEA_UUID
);
668 Assert
.assertEquals("expecting default classification", childNode
.getClassification().getUuid().toString(), CLASSIFICATION_UUID
);
670 // moving the taxon around, the rootnode is only a proxy
671 alternateClassification
.setRootNode(HibernateProxyHelper
.deproxy(alternateClassification
.getRootNode(), TaxonNode
.class));
672 alternateClassification
.addChildNode(childNode
, null, null);
674 classificationService
.saveOrUpdate(alternateClassification
);
675 commitAndStartNewTransaction(null);
677 // printDataSet(System.out, new String[] {
678 // "TAXONBASE", "TAXONNODE", "CLASSIFICATION"
681 // reload classification
682 classification
= classificationService
.find(UUID
.fromString(CLASSIFICATION_UUID
));
683 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Balsam-Tanne", alternateClassification
, null, Arrays
.asList(new Language
[]{Language
.GERMAN()}), false, null, null, null, null);
684 Assert
.assertEquals("GERMAN 'Balsam-Tanne' should now be found in other classification", 1, pager
.getCount().intValue());
686 classification
.getChildNodes().clear();
687 classificationService
.saveOrUpdate(classification
);
688 commitAndStartNewTransaction(null);
690 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Balsam-Tanne", classification
, null, Arrays
.asList(new Language
[]{Language
.GERMAN()}), false, null, null, null, null);
691 Assert
.assertEquals("Now the GERMAN 'Balsam-Tanne' should NOT be found in original classification", 0, pager
.getCount().intValue());
695 @SuppressWarnings("rawtypes")
698 public final void testFindByDescriptionElementFullText_CategoricalData() throws IOException
, LuceneParseException
{
700 // add CategoricalData
701 DescriptionBase d_abies_balsamea
= descriptionService
.find(UUID
.fromString(D_ABIES_BALSAMEA_UUID
));
703 CategoricalData cdata
= CategoricalData
.NewInstance();
704 cdata
.setFeature(Feature
.DESCRIPTION());
705 State state
= State
.NewInstance("green", "green", "gn");
707 StateData statedata
= StateData
.NewInstance(state
);
708 statedata
.putModifyingText(Language
.ENGLISH(), "always, even during winter");
709 cdata
.addStateData(statedata
);
710 d_abies_balsamea
.addElement(cdata
);
712 UUID termUUID
= termService
.save(state
).getUuid();
713 descriptionService
.save(d_abies_balsamea
);
715 commitAndStartNewTransaction(null);
717 // printDataSet(System.out, new String[] {
718 // "STATEDATA", "STATEDATA_DEFINEDTERMBASE", "STATEDATA_LANGUAGESTRING", "LANGUAGESTRING"});
720 refreshLuceneIndex();
722 Pager
<SearchResult
<TaxonBase
>> pager
;
723 pager
= taxonService
.findByDescriptionElementFullText(CategoricalData
.class, "green", null, null, null, false, null, null, null, null);
724 Assert
.assertEquals("Expecting one entity", 1, pager
.getCount().intValue());
725 Assert
.assertEquals("Abies balsamea sec. Kohlbecker, A., Testcase standart views, 2013", pager
.getRecords().get(0).getEntity().getTitleCache());
726 Assert
.assertTrue("Expecting only one doc", pager
.getRecords().get(0).getDocs().size() == 1);
727 Assert
.assertEquals("Abies balsamea sec. Kohlbecker, A., Testcase standart views, 2013", pager
.getRecords().get(0).getDocs().iterator().next().get("inDescription.taxon.titleCache"));
730 //TODO modify the StateData
731 TaxonBase taxon
= pager
.getRecords().get(0).getEntity();
733 String newName
= "Quercus robur";
734 taxon
.setTitleCache(newName
+ " sec. ", true);
736 taxonService
.saveOrUpdate(taxon
);
737 commitAndStartNewTransaction(null);
739 taxon
= taxonService
.find(taxon
.getUuid());
740 Assert
.assertEquals(newName
+ " sec. ", taxon
.getTitleCache());
741 DefinedTermBase term
= termService
.find(termUUID
);
743 termService
.delete(term
);
747 @SuppressWarnings("rawtypes")
750 public final void testFindByDescriptionElementFullText_Highlighting() throws IOException
, LuceneParseException
{
752 refreshLuceneIndex();
754 Pager
<SearchResult
<TaxonBase
>> pager
;
755 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Abies", null, null, null, true, null, null, null, null);
756 Assert
.assertEquals("Expecting one entity when searching for any TextData", 1, pager
.getCount().intValue());
757 SearchResult
<TaxonBase
> searchResult
= pager
.getRecords().get(0);
758 Assert
.assertTrue("the map of highlighted fragments should contain at least one item", searchResult
.getFieldHighlightMap().size() > 0);
759 String
[] fragments
= searchResult
.getFieldHighlightMap().values().iterator().next();
760 Assert
.assertTrue("first fragments should contains serch term", fragments
[0].contains("<B>Abies</B>"));
762 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Pflanzenart Tannen", null, null, null, true, null, null, null, null);
763 searchResult
= pager
.getRecords().get(0);
764 Assert
.assertTrue("Phrase search : Expecting at least one item in highlighted fragments", searchResult
.getFieldHighlightMap().size() > 0);
765 fragments
= searchResult
.getFieldHighlightMap().values().iterator().next();
766 Assert
.assertTrue("first fragments should contains serch term", fragments
[0].contains("<B>Pflanzenart</B>") || fragments
[0].contains("<B>Tannen</B>"));
768 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "+Pflanzenart +Tannen", null, null, null, true, null, null, null, null);
769 searchResult
= pager
.getRecords().get(0);
770 Assert
.assertTrue("Phrase search : Expecting at least one item in highlighted fragments", searchResult
.getFieldHighlightMap().size() > 0);
771 fragments
= searchResult
.getFieldHighlightMap().values().iterator().next();
772 Assert
.assertTrue("first fragments should contains serch term", fragments
[0].contains("<B>Pflanzenart</B>") && fragments
[0].contains("<B>Tannen</B>"));
774 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "\"Pflanzenart aus der Gattung der Tannen\"", null, null, null, true, null, null, null, null);
775 searchResult
= pager
.getRecords().get(0);
776 Assert
.assertTrue("Phrase search : Expecting at least one item in highlighted fragments", searchResult
.getFieldHighlightMap().size() > 0);
777 fragments
= searchResult
.getFieldHighlightMap().values().iterator().next();
778 Assert
.assertTrue("first fragments should contains serch term", fragments
[0].contains("<B>Pflanzenart</B> <B>aus</B> <B>der</B> <B>Gattung</B> <B>der</B> <B>Tannen</B>"));
780 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Gatt*", null, null, null, true, null, null, null, null);
781 searchResult
= pager
.getRecords().get(0);
782 Assert
.assertTrue("Wildcard search : Expecting at least one item in highlighted fragments", searchResult
.getFieldHighlightMap().size() > 0);
783 fragments
= searchResult
.getFieldHighlightMap().values().iterator().next();
784 Assert
.assertTrue("first fragments should contains serch term", fragments
[0].contains("<B>Gatt"));
789 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class)
790 public final void testFindByFullText() throws IOException
, LuceneParseException
{
792 refreshLuceneIndex();
794 Classification europeanAbiesClassification
= classificationService
.find(UUID
.fromString(CLASSIFICATION_UUID
));
796 Pager
<SearchResult
<TaxonBase
>> pager
;
798 pager
= taxonService
.findByFullText(null, "Abies", null, includeUnpublished
, null, true, null, null, null, null); // --> 7
799 logFreeTextSearchResults(pager
, Level
.DEBUG
, null);
800 Assert
.assertEquals("Expecting 8 entities", 8, pager
.getCount().intValue());
802 pager
= taxonService
.findByFullText(Taxon
.class, "Abies", null, includeUnpublished
, null, true, null, null, null, null); // --> 6
803 Assert
.assertEquals("Expecting 7 entities", 7, pager
.getCount().intValue());
805 pager
= taxonService
.findByFullText(Synonym
.class, "Abies", null, includeUnpublished
, null, true, null, null, null, null); // --> 1
806 Assert
.assertEquals("Expecting 1 entity", 1, pager
.getCount().intValue());
808 pager
= taxonService
.findByFullText(TaxonBase
.class, "sec", null, includeUnpublished
, null, true, null, null, null, null); // --> 7
809 Assert
.assertEquals("Expecting 8 entities", 9, pager
.getCount().intValue());
811 pager
= taxonService
.findByFullText(null, "genus", null, includeUnpublished
, null, true, null, null, null, null); // --> 1
812 Assert
.assertEquals("Expecting 1 entity", 1, pager
.getCount().intValue());
814 pager
= taxonService
.findByFullText(Taxon
.class, "subalpina", null, includeUnpublished
, null, true, null, null, null, null); // --> 0
815 Assert
.assertEquals("Expecting 0 entities", 0, pager
.getCount().intValue());
817 // synonym in classification ???
822 public final void testPrepareByAreaSearch() throws IOException
, LuceneParseException
{
824 List
<PresenceAbsenceTerm
> statusFilter
= new ArrayList
<PresenceAbsenceTerm
>();
825 List
<NamedArea
> areaFilter
= new ArrayList
<NamedArea
>();
826 areaFilter
.add(germany
);
827 areaFilter
.add(canada
);
828 areaFilter
.add(russia
);
830 Pager
<SearchResult
<TaxonBase
>> pager
= taxonService
.findByDistribution(areaFilter
, statusFilter
, null, 20, 0, null, null);
831 Assert
.assertEquals("Expecting 2 entities", Integer
.valueOf(2), Integer
.valueOf(pager
.getRecords().size()));
837 public final void testFindTaxaAndNamesByFullText() throws IOException
, LuceneParseException
, LuceneMultiSearchException
{
839 refreshLuceneIndex();
841 Pager
<SearchResult
<TaxonBase
>> pager
;
843 Classification alternateClassification
= classificationService
.find(UUID
.fromString(CLASSIFICATION_ALT_UUID
));
846 pager
= taxonService
.findTaxaAndNamesByFullText(
847 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxa
, TaxaAndNamesSearchMode
.doSynonyms
),
848 "Abies", null, null, null, null, true, null, null, null, null);
849 // logPagerRecords(pager, Level.DEBUG);
850 Assert
.assertEquals("doTaxa & doSynonyms", 8, pager
.getCount().intValue());
852 pager
= taxonService
.findTaxaAndNamesByFullText(
853 EnumSet
.allOf(TaxaAndNamesSearchMode
.class),
854 "Abies", null, null, null, null, true, null, null, null, null);
855 // logPagerRecords(pager, Level.DEBUG);
856 Assert
.assertEquals("all search modes", 8, pager
.getCount().intValue());
858 pager
= taxonService
.findTaxaAndNamesByFullText(
859 EnumSet
.allOf(TaxaAndNamesSearchMode
.class),
860 "Abies", alternateClassification
, null, null, null, true, null, null, null, null);
861 // logPagerRecords(pager, Level.DEBUG);
862 Assert
.assertEquals("all search modes, filtered by alternateClassification", 1, pager
.getCount().intValue());
864 pager
= taxonService
.findTaxaAndNamesByFullText(
865 EnumSet
.of(TaxaAndNamesSearchMode
.doSynonyms
),
866 "Abies", null, null, null, null, true, null, null, null, null);
867 Assert
.assertEquals("Expecting 1 entity", 1, pager
.getCount().intValue());
868 SearchResult
<TaxonBase
> searchResult
= pager
.getRecords().get(0);
869 Assert
.assertEquals(Synonym
.class, searchResult
.getEntity().getClass());
870 // Abies subalpina sec. Kohlbecker, A., Testcase standart views, 2013
873 pager
= taxonService
.findTaxaAndNamesByFullText(
874 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxaByCommonNames
),
875 "Abies", null, null, null, null, true, null, null, null, null);
876 Assert
.assertEquals("Expecting 0 entity", 0, pager
.getCount().intValue());
879 pager
= taxonService
.findTaxaAndNamesByFullText(
880 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxaByCommonNames
),
881 "Tanne", null, null, null, null, true, null, null, null, null);
882 Assert
.assertEquals("Expecting 1 entity", 1, pager
.getRecords().size());
883 Assert
.assertEquals("Expecting 1 entity", 1, pager
.getCount().intValue());
885 pager
= taxonService
.findTaxaAndNamesByFullText(
886 EnumSet
.of(TaxaAndNamesSearchMode
.doMisappliedNames
),
887 "kawakamii", null, null, null, null, true, null, null, null, null);
888 logFreeTextSearchResults(pager
, Level
.DEBUG
, null);
889 Assert
.assertEquals("Expecting 1 entity", 1, pager
.getCount().intValue());
895 public final void testFindTaxaAndNamesByFullText_PhraseQuery() throws IOException
, LuceneParseException
, LuceneMultiSearchException
{
897 refreshLuceneIndex();
899 Pager
<SearchResult
<TaxonBase
>> pager
;
902 pager
= taxonService
.findTaxaAndNamesByFullText(
903 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxa
, TaxaAndNamesSearchMode
.doSynonyms
),
904 "\"Abies alba\"", null, null, null, null, true, null, null, null, null);
905 // logPagerRecords(pager, Level.DEBUG);
906 Assert
.assertEquals("doTaxa & doSynonyms with simple phrase query", 1, pager
.getCount().intValue());
908 pager
= taxonService
.findTaxaAndNamesByFullText(
909 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxa
, TaxaAndNamesSearchMode
.doSynonyms
),
910 "\"Abies al*\"", null, null, null, null, true, null, null, null, null);
911 // logPagerRecords(pager, Level.DEBUG);
912 Assert
.assertEquals("doTaxa & doSynonyms with complex phrase query", 1, pager
.getCount().intValue());
914 pager
= taxonService
.findTaxaAndNamesByFullText(
915 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxa
, TaxaAndNamesSearchMode
.doSynonyms
),
916 "\"Abies*\"", null, null, null, null, true, null, null, null, null);
917 // logPagerRecords(pager, Level.DEBUG);
918 Assert
.assertEquals("doTaxa & doSynonyms with simple phrase query", 8, pager
.getCount().intValue());
924 public final void testFindTaxaAndNamesByFullText_Sort() throws IOException
, LuceneParseException
, LuceneMultiSearchException
{
926 refreshLuceneIndex();
928 Pager
<SearchResult
<TaxonBase
>> pager
;
930 List
<OrderHint
> orderHints
= new ArrayList
<OrderHint
>();
932 String
[] docFields2log
= new String
[]{"id"};
935 orderHints
.addAll(OrderHint
.ORDER_BY_ID
.asList());
936 pager
= taxonService
.findTaxaAndNamesByFullText(
937 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxa
),
938 "Abies", null, null, null, null, true, null, null, orderHints
, null);
939 // logSearchResults(pager, Level.DEBUG, docFields2log);
941 for(SearchResult
<TaxonBase
> rs
: pager
.getRecords()){
943 Assert
.assertTrue("results not sorted by id", lastId
< rs
.getEntity().getId());
945 lastId
= rs
.getEntity().getId();
948 orderHints
.addAll(OrderHint
.ORDER_BY_ID
.asList());
949 pager
= taxonService
.findTaxaAndNamesByFullText(
950 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxa
, TaxaAndNamesSearchMode
.doSynonyms
),
951 "Abies", null, null, null, null, true, null, null, orderHints
, null);
952 // logSearchResults(pager, Level.DEBUG, docFields2log);
955 for(SearchResult
<TaxonBase
> rs
: pager
.getRecords()){
957 Assert
.assertTrue("results not sorted by id", lastId
< rs
.getEntity().getId());
959 lastId
= rs
.getEntity().getId();
962 // Sortby NOMENCLATURAL_SORT_ORDER TODO make assertions !!!
964 orderHints
.addAll(OrderHint
.NOMENCLATURAL_SORT_ORDER
.asList());
965 pager
= taxonService
.findTaxaAndNamesByFullText(
966 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxa
, TaxaAndNamesSearchMode
.doSynonyms
),
967 "Abies", null, null, null, null, true, null, null, orderHints
, null);
968 logFreeTextSearchResults(pager
, Level
.DEBUG
, null);
974 public final void testFindTaxaAndNamesByFullText_AreaFilter() throws IOException
, LuceneParseException
, LuceneMultiSearchException
{
976 refreshLuceneIndex();
978 Pager
<SearchResult
<TaxonBase
>> pager
;
980 Set
<NamedArea
> a_germany_canada_russia
= new HashSet
<>();
981 a_germany_canada_russia
.add(germany
);
982 a_germany_canada_russia
.add(canada
);
983 a_germany_canada_russia
.add(russia
);
985 Set
<NamedArea
> a_russia
= new HashSet
<>();
986 a_russia
.add(russia
);
988 Set
<PresenceAbsenceTerm
> present
= new HashSet
<>();
989 present
.add(PresenceAbsenceTerm
.PRESENT());
991 Set
<PresenceAbsenceTerm
> present_native
= new HashSet
<>();
992 present_native
.add(PresenceAbsenceTerm
.PRESENT());
993 present_native
.add(PresenceAbsenceTerm
.NATIVE());
995 Set
<PresenceAbsenceTerm
> absent
= new HashSet
<>();
996 absent
.add(PresenceAbsenceTerm
.ABSENT());
998 pager
= taxonService
.findTaxaAndNamesByFullText(
999 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxa
),
1000 "Abies", null, a_germany_canada_russia
, null, null, true, null, null, null, null);
1001 logFreeTextSearchResults(pager
, Level
.DEBUG
, null);
1003 // abies_kawakamii_sensu_komarov as missapplied name for t_abies_balsamea
1004 pager
= taxonService
.findTaxaAndNamesByFullText(
1005 EnumSet
.of(TaxaAndNamesSearchMode
.doSynonyms
),
1006 "Abies", null, a_germany_canada_russia
, present_native
, null, true, null, null, null, null);
1007 Assert
.assertEquals("synonyms with matching area filter", 1, pager
.getCount().intValue());
1009 pager
= taxonService
.findTaxaAndNamesByFullText(
1010 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxa
, TaxaAndNamesSearchMode
.doSynonyms
),
1011 "Abies", null, a_germany_canada_russia
, null, null, true, null, null, null, null);
1012 logFreeTextSearchResults(pager
, Level
.DEBUG
, null);
1013 Assert
.assertEquals("taxa and synonyms with matching area filter", 3, pager
.getCount().intValue());
1015 pager
= taxonService
.findTaxaAndNamesByFullText(
1016 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxa
, TaxaAndNamesSearchMode
.doSynonyms
),
1017 "Abies", null, a_germany_canada_russia
, present_native
, null, true, null, null, null, null);
1018 Assert
.assertEquals("taxa and synonyms with matching area & status filter 1", 3, pager
.getCount().intValue());
1020 pager
= taxonService
.findTaxaAndNamesByFullText(
1021 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxa
, TaxaAndNamesSearchMode
.doSynonyms
),
1022 "Abies", null, a_germany_canada_russia
, present
, null, true, null, null, null, null);
1023 Assert
.assertEquals("taxa and synonyms with matching area & status filter 2", 2, pager
.getCount().intValue());
1025 pager
= taxonService
.findTaxaAndNamesByFullText(
1026 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxa
, TaxaAndNamesSearchMode
.doSynonyms
),
1027 "Abies", null, a_russia
, present
, null, true, null, null, null, null);
1028 Assert
.assertEquals("taxa and synonyms with non matching area & status filter", 0, pager
.getCount().intValue());
1030 pager
= taxonService
.findTaxaAndNamesByFullText(
1031 EnumSet
.of(TaxaAndNamesSearchMode
.doTaxaByCommonNames
),
1032 "Tanne", null, a_germany_canada_russia
, present_native
, null, true, null, null, null, null);
1033 Assert
.assertEquals("ByCommonNames with area filter", 1, pager
.getCount().intValue());
1035 // abies_kawakamii_sensu_komarov as misapplied name for t_abies_balsamea
1036 pager
= taxonService
.findTaxaAndNamesByFullText(
1037 EnumSet
.of(TaxaAndNamesSearchMode
.doMisappliedNames
),
1038 "Abies", null, a_germany_canada_russia
, present_native
, null, true, null, null, null, null);
1039 Assert
.assertEquals("misappliedNames with matching area & status filter", 1, pager
.getCount().intValue());
1042 // 1. remove existing taxon relation
1043 Taxon t_abies_balsamea
= (Taxon
)taxonService
.find(UUID
.fromString(ABIES_BALSAMEA_UUID
));
1044 Set
<TaxonRelationship
> relsTo
= t_abies_balsamea
.getRelationsToThisTaxon();
1045 Assert
.assertEquals(1, relsTo
.size());
1046 TaxonRelationship taxonRelation
= relsTo
.iterator().next();
1047 t_abies_balsamea
.removeTaxonRelation(taxonRelation
);
1048 taxonService
.saveOrUpdate(t_abies_balsamea
);
1049 commitAndStartNewTransaction(null);
1051 pager
= taxonService
.findTaxaAndNamesByFullText(
1052 EnumSet
.of(TaxaAndNamesSearchMode
.doMisappliedNames
),
1053 "Abies", null, a_germany_canada_russia
, present_native
, null, true, null, null, null, null);
1054 Assert
.assertEquals("misappliedNames with matching area & status filter, should match nothing now", 0, pager
.getCount().intValue());
1056 // 2. now add abies_kawakamii_sensu_komarov as misapplied name for t_abies_alba and search for misapplications in russia: ABSENT
1057 Taxon t_abies_kawakamii_sensu_komarov
= (Taxon
)taxonService
.find(UUID
.fromString(D_ABIES_KAWAKAMII_SEC_KOMAROV_UUID
));
1058 Taxon t_abies_alba
= (Taxon
)taxonService
.find(UUID
.fromString(ABIES_ALBA_UUID
));
1059 t_abies_alba
.addMisappliedName(t_abies_kawakamii_sensu_komarov
, null, null);
1061 taxonService
.update(t_abies_kawakamii_sensu_komarov
);
1063 commitAndStartNewTransaction(null);
1065 pager
= taxonService
.findTaxaAndNamesByFullText(
1066 EnumSet
.of(TaxaAndNamesSearchMode
.doMisappliedNames
),
1067 "Abies", null, a_germany_canada_russia
, absent
, null, true, null, null, null, null);
1068 Assert
.assertEquals("misappliedNames with matching area & status filter, should find one", 1, pager
.getCount().intValue());
1074 @Ignore // remove once http://dev.e-taxonomy.eu/trac/ticket/5477 is solved
1075 public final void testFindTaxaAndNamesByFullText_AreaFilter_issue5477() throws IOException
, LuceneParseException
, LuceneMultiSearchException
{
1077 Set
<NamedArea
> a_germany_canada_russia
= new HashSet
<>();
1078 a_germany_canada_russia
.add(germany
);
1079 a_germany_canada_russia
.add(canada
);
1080 a_germany_canada_russia
.add(russia
);
1083 Set
<PresenceAbsenceTerm
> absent
= new HashSet
<PresenceAbsenceTerm
>();
1084 absent
.add(PresenceAbsenceTerm
.ABSENT());
1086 Taxon t_abies_kawakamii_sensu_komarov
= (Taxon
)taxonService
.find(UUID
.fromString(D_ABIES_KAWAKAMII_SEC_KOMAROV_UUID
));
1087 Taxon t_abies_alba
= (Taxon
)taxonService
.find(UUID
.fromString(ABIES_ALBA_UUID
));
1088 t_abies_alba
.addMisappliedName(t_abies_kawakamii_sensu_komarov
, null, null);
1090 /* Since the upgrade from hibernate search 4 to 5.5
1091 * triggering an update of t_abies_alba is no longer sufficient to also update the
1092 * document of t_abies_kawakamii_sensu_komarov in the lucene index.
1093 * the last test in testFindTaxaAndNamesByFullText_AreaFilter() failed in this case.
1094 * This situation is reproduced here:
1096 taxonService
.update(t_abies_alba
);
1098 commitAndStartNewTransaction(null);
1100 Pager pager
= taxonService
.findTaxaAndNamesByFullText(
1101 EnumSet
.of(TaxaAndNamesSearchMode
.doMisappliedNames
),
1102 "Abies", null, a_germany_canada_russia
, absent
, null, true, null, null, null, null);
1103 Assert
.assertEquals("misappliedNames with matching area & status filter, should find one", 1, pager
.getCount().intValue());
1108 * Regression test for #3119: fulltext search: Entity always null whatever search
1110 * @throws IOException
1111 * @throws LuceneParseException
1112 * @throws LuceneMultiSearchException
1116 public final void testFindByEverythingFullText() throws IOException
, LuceneParseException
, LuceneMultiSearchException
{
1118 refreshLuceneIndex();
1120 Pager
<SearchResult
<TaxonBase
>> pager
;
1123 pager
= taxonService
.findByEverythingFullText("Abies", null, includeUnpublished
, null, true, null, null, null, null);
1124 logFreeTextSearchResults(pager
, Level
.DEBUG
, null);
1125 Assert
.assertTrue("Expecting at least 7 entities for 'Abies'", pager
.getCount() > 7);
1126 Assert
.assertNotNull("Expecting entity", pager
.getRecords().get(0).getEntity());
1127 Assert
.assertEquals("Expecting Taxon entity", Taxon
.class, pager
.getRecords().get(0).getEntity().getClass());
1129 // via DescriptionElement
1130 pager
= taxonService
.findByEverythingFullText("present", null, includeUnpublished
, null, true, null, null, null, null);
1131 Assert
.assertEquals("Expecting one entity when searching for area 'present'", 1, pager
.getCount().intValue());
1132 Assert
.assertNotNull("Expecting entity", pager
.getRecords().get(0).getEntity());
1133 Assert
.assertEquals("Expecting Taxon entity", Taxon
.class, CdmBase
.deproxy(pager
.getRecords().get(0).getEntity()).getClass());
1134 Assert
.assertEquals("Expecting Taxon ", ABIES_BALSAMEA_UUID
, pager
.getRecords().get(0).getEntity().getUuid().toString());
1141 public final void findByEveryThingFullText() throws IOException
, LuceneParseException
, LuceneMultiSearchException
{
1143 refreshLuceneIndex();
1145 Pager
<SearchResult
<TaxonBase
>> pager
;
1147 pager
= taxonService
.findByEverythingFullText("genus", null, includeUnpublished
, null, false, null, null, null, null); // --> 1
1148 Assert
.assertEquals("Expecting 1 entity", 1, pager
.getCount().intValue());
1150 //FIXME FAILS: abies balamea is returned twice, see also testFullText_Grouping()
1151 pager
= taxonService
.findByEverythingFullText("Balsam", null, includeUnpublished
, Arrays
.asList(new Language
[]{Language
.GERMAN()}), false, null, null, null, null);
1152 logFreeTextSearchResults(pager
, Level
.DEBUG
, null);
1153 Assert
.assertEquals("expecting to find the Abies balsamea via the GERMAN DescriptionElements", 1, pager
.getCount().intValue());
1155 pager
= taxonService
.findByEverythingFullText("Abies", null, includeUnpublished
, null, true, null, null, null, null);
1156 Assert
.assertEquals("Expecting 8 entities", 8, pager
.getCount().intValue());
1157 SearchResult
<TaxonBase
> searchResult
= pager
.getRecords().get(0);
1158 Assert
.assertTrue("the map of highlighted fragments should contain at least one item", searchResult
.getFieldHighlightMap().size() > 0);
1159 String
[] fragments
= searchResult
.getFieldHighlightMap().values().iterator().next();
1160 Assert
.assertTrue("first fragments should contains serch term", fragments
[0].toLowerCase().contains("<b>abies</b>"));
1163 // @SuppressWarnings("rawtypes")
1166 // public final void benchmarkFindTaxaAndNamesHql() throws IOException, LuceneParseException {
1168 // createRandomTaxonWithCommonName(NUM_OF_NEW_RADOM_ENTITIES);
1170 // IFindTaxaAndNamesConfigurator configurator = new FindTaxaAndNamesConfiguratorImpl();
1171 // configurator.setTitleSearchString("Wei"+UTF8.SHARP_S+"%");
1172 // configurator.setMatchMode(MatchMode.BEGINNING);
1173 // configurator.setDoTaxa(false);
1174 // configurator.setDoSynonyms(false);
1175 // configurator.setDoNamesWithoutTaxa(false);
1176 // configurator.setDoTaxaByCommonNames(true);
1178 // Pager<IdentifiableEntity> pager;
1180 // long startMillis = System.currentTimeMillis();
1181 // for (int indx = 0; indx < BENCHMARK_ROUNDS; indx++) {
1182 // pager = taxonService.findTaxaAndNames(configurator);
1183 // if (logger.isDebugEnabled()) {
1184 // logger.debug("[" + indx + "]" + pager.getRecords().get(0).getTitleCache());
1187 // double duration = ((double) (System.currentTimeMillis() - startMillis)) / BENCHMARK_ROUNDS;
1188 // logger.info("Benchmark result - [find taxon by CommonName via HQL] : " + duration + "ms (" + BENCHMARK_ROUNDS + " benchmark rounds )");
1191 @SuppressWarnings("rawtypes")
1194 public final void benchmarkFindByCommonNameHql() {
1196 // printDataSet(System.err, new String[] { "TaxonBase" });
1198 createRandomTaxonWithCommonName(NUM_OF_NEW_RADOM_ENTITIES
);
1200 IFindTaxaAndNamesConfigurator configurator
= FindTaxaAndNamesConfiguratorImpl
.NewInstance();
1201 configurator
.setTitleSearchString("Wei"+UTF8
.SHARP_S
+"%");
1202 configurator
.setMatchMode(MatchMode
.BEGINNING
);
1203 configurator
.setDoTaxa(false);
1204 configurator
.setDoSynonyms(false);
1205 configurator
.setDoNamesWithoutTaxa(false);
1206 configurator
.setDoTaxaByCommonNames(true);
1208 Pager
<IdentifiableEntity
> pager
;
1210 long startMillis
= System
.currentTimeMillis();
1211 for (int indx
= 0; indx
< BENCHMARK_ROUNDS
; indx
++) {
1212 pager
= taxonService
.findTaxaAndNames(configurator
);
1213 if (logger
.isDebugEnabled()) {
1214 logger
.debug("[" + indx
+ "]" + pager
.getRecords().get(0).getTitleCache());
1217 double duration
= ((double) (System
.currentTimeMillis() - startMillis
)) / BENCHMARK_ROUNDS
;
1218 logger
.info("Benchmark result - [find taxon by CommonName via HQL] : " + duration
+ "ms (" + BENCHMARK_ROUNDS
+ " benchmark rounds )");
1221 @SuppressWarnings("rawtypes")
1224 public final void benchmarkFindByCommonNameLucene() throws IOException
, LuceneParseException
{
1226 createRandomTaxonWithCommonName(NUM_OF_NEW_RADOM_ENTITIES
);
1228 refreshLuceneIndex();
1230 Pager
<SearchResult
<TaxonBase
>> pager
;
1232 long startMillis
= System
.currentTimeMillis();
1233 for (int indx
= 0; indx
< BENCHMARK_ROUNDS
; indx
++) {
1234 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Wei"+UTF8
.SHARP_S
+"*", null, null, null, false, null, null, null, null);
1235 if (logger
.isDebugEnabled()) {
1236 logger
.debug("[" + indx
+ "]" + pager
.getRecords().get(0).getEntity().getTitleCache());
1239 double duration
= ((double) (System
.currentTimeMillis() - startMillis
)) / BENCHMARK_ROUNDS
;
1240 logger
.info("Benchmark result - [find taxon by CommonName via lucene] : " + duration
+ "ms (" + BENCHMARK_ROUNDS
+ " benchmark rounds )");
1244 * uncomment @Test annotation to create the dataset for this test
1248 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class, value
="BlankDataSet.xml")
1249 public final void createTestDataSet() throws FileNotFoundException
{
1251 Classification europeanAbiesClassification
= Classification
.NewInstance("European Abies");
1252 europeanAbiesClassification
.setUuid(UUID
.fromString(CLASSIFICATION_UUID
));
1253 classificationService
.save(europeanAbiesClassification
);
1255 Classification alternativeClassification
= Classification
.NewInstance("Abies alternative");
1256 alternativeClassification
.setUuid(UUID
.fromString(CLASSIFICATION_ALT_UUID
));
1257 classificationService
.save(alternativeClassification
);
1259 Reference sec
= ReferenceFactory
.newBook();
1260 sec
.setTitleCache("Kohlbecker, A., Testcase standart views, 2013", true);
1261 Reference sec_sensu
= ReferenceFactory
.newBook();
1262 sec_sensu
.setTitleCache("Komarov, V. L., Flora SSSR 29", true);
1263 referenceService
.save(sec
);
1264 referenceService
.save(sec_sensu
);
1266 IBotanicalName n_abies
= TaxonNameFactory
.NewBotanicalInstance(Rank
.GENUS());
1267 n_abies
.setNameCache("Abies", true);
1268 Taxon t_abies
= Taxon
.NewInstance(n_abies
, sec
);
1269 taxonService
.save(t_abies
);
1271 IBotanicalName n_abies_alba
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
1272 n_abies_alba
.setNameCache("Abies alba", true);
1273 Taxon t_abies_alba
= Taxon
.NewInstance(n_abies_alba
, sec
);
1274 t_abies_alba
.setUuid(UUID
.fromString(ABIES_ALBA_UUID
));
1275 taxonService
.save(t_abies_alba
);
1277 IBotanicalName n_abies_subalpina
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
1278 n_abies_subalpina
.setNameCache("Abies subalpina", true);
1279 Synonym s_abies_subalpina
= Synonym
.NewInstance(n_abies_subalpina
, sec
);
1280 taxonService
.save(s_abies_subalpina
);
1282 IBotanicalName n_abies_balsamea
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
1283 n_abies_balsamea
.setNameCache("Abies balsamea", true);
1284 Taxon t_abies_balsamea
= Taxon
.NewInstance(n_abies_balsamea
, sec
);
1285 t_abies_balsamea
.setUuid(UUID
.fromString(ABIES_BALSAMEA_UUID
));
1286 t_abies_balsamea
.addSynonym(s_abies_subalpina
, SynonymType
.SYNONYM_OF());
1287 taxonService
.save(t_abies_balsamea
);
1289 IBotanicalName n_abies_grandis
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
1290 n_abies_grandis
.setNameCache("Abies grandis", true);
1291 Taxon t_abies_grandis
= Taxon
.NewInstance(n_abies_grandis
, sec
);
1292 taxonService
.save(t_abies_grandis
);
1294 IBotanicalName n_abies_kawakamii
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
1295 n_abies_kawakamii
.setNameCache("Abies kawakamii", true);
1296 Taxon t_abies_kawakamii
= Taxon
.NewInstance(n_abies_kawakamii
, sec
);
1297 t_abies_kawakamii
.getTitleCache();
1298 taxonService
.save(t_abies_kawakamii
);
1300 // abies_kawakamii_sensu_komarov as missapplied name for t_abies_balsamea
1301 Taxon t_abies_kawakamii_sensu_komarov
= Taxon
.NewInstance(n_abies_kawakamii
, sec_sensu
);
1302 taxonService
.save(t_abies_kawakamii_sensu_komarov
);
1303 t_abies_kawakamii_sensu_komarov
.addTaxonRelation(t_abies_balsamea
, TaxonRelationshipType
.MISAPPLIED_NAME_FOR(), null, null);
1304 taxonService
.saveOrUpdate(t_abies_kawakamii_sensu_komarov
);
1306 IBotanicalName n_abies_lasiocarpa
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
1307 n_abies_lasiocarpa
.setNameCache("Abies lasiocarpa", true);
1308 Taxon t_abies_lasiocarpa
= Taxon
.NewInstance(n_abies_lasiocarpa
, sec
);
1309 taxonService
.save(t_abies_lasiocarpa
);
1311 // add taxa to classifications
1312 europeanAbiesClassification
.addChildTaxon(t_abies_balsamea
, null, null);
1313 alternativeClassification
.addChildTaxon(t_abies_lasiocarpa
, null, null);
1314 classificationService
.saveOrUpdate(europeanAbiesClassification
);
1315 classificationService
.saveOrUpdate(alternativeClassification
);
1320 TaxonDescription d_abies_alba
= TaxonDescription
.NewInstance(t_abies_alba
);
1321 TaxonDescription d_abies_balsamea
= TaxonDescription
.NewInstance(t_abies_balsamea
);
1323 d_abies_alba
.setUuid(UUID
.fromString(D_ABIES_ALBA_UUID
));
1324 d_abies_balsamea
.setUuid(UUID
.fromString(D_ABIES_BALSAMEA_UUID
));
1328 d_abies_alba
.addElement(CommonTaxonName
.NewInstance("Wei"+UTF8
.SHARP_S
+"tanne", Language
.GERMAN()));
1329 d_abies_alba
.addElement(CommonTaxonName
.NewInstance("silver fir", Language
.ENGLISH()));
1330 d_abies_alba
.addElement(Distribution
1333 PresenceAbsenceTerm
.NATIVE()));
1334 d_abies_alba
.addElement(Distribution
1337 PresenceAbsenceTerm
.ABSENT()));
1341 .addElement(TextData
1343 "Die Balsam-Tanne (Abies balsamea) ist eine Pflanzenart aus der Gattung der Tannen (Abies). Sie wächst im nordöstlichen Nordamerika, wo sie sowohl Tief- als auch Bergland besiedelt. Sie gilt als relativ anspruchslos gegenüber dem Standort und ist frosthart. In vielen Teilen des natürlichen Verbreitungsgebietes stellt sie die Klimaxbaumart dar.",
1344 Language
.GERMAN(), null));
1346 .addElement(CommonTaxonName
1349 Language
.GERMAN(), null));
1352 .addElement(Distribution
1355 PresenceAbsenceTerm
.PRESENT()));
1358 .addElement(Distribution
1361 PresenceAbsenceTerm
.NATIVE()));
1364 .addElement(TextData
1366 TaxonServiceSearchTestUtf8Constants
.RUSSIAN_ABIES_ALBA_LONG
,
1367 Language
.RUSSIAN(), null));
1369 .addElement(CommonTaxonName
1371 TaxonServiceSearchTestUtf8Constants
.RUSSIAN_ABIES_ALBA_SHORT
,
1372 Language
.RUSSIAN(), null));
1373 descriptionService
.saveOrUpdate(d_abies_balsamea
);
1379 writeDbUnitDataSetFile(new String
[] {
1380 "TAXONBASE", "TAXONNAME",
1381 "TAXONRELATIONSHIP",
1382 "REFERENCE", "DESCRIPTIONELEMENTBASE", "DESCRIPTIONBASE",
1383 "AGENTBASE", "HOMOTYPICALGROUP",
1384 "CLASSIFICATION", "TAXONNODE",
1385 "LANGUAGESTRING", "DESCRIPTIONELEMENTBASE_LANGUAGESTRING",
1386 "HIBERNATE_SEQUENCES" // IMPORTANT!!!
1394 private void refreshLuceneIndex() {
1396 // commitAndStartNewTransaction(null);
1399 indexer
.purge(DefaultProgressMonitor
.NewInstance());
1400 indexer
.reindex(typesToIndex
, DefaultProgressMonitor
.NewInstance());
1401 startNewTransaction();
1402 // commitAndStartNewTransaction(null);
1406 * @param numberOfNew
1409 private void createRandomTaxonWithCommonName(int numberOfNew
) {
1411 logger
.debug(String
.format("creating %1$s random taxan with CommonName", numberOfNew
));
1413 commitAndStartNewTransaction(null);
1415 Reference sec
= ReferenceFactory
.newBook();
1416 referenceService
.save(sec
);
1418 for (int i
= numberOfNew
; i
< numberOfNew
; i
++) {
1419 RandomStringUtils
.randomAlphabetic(10);
1420 String radomName
= RandomStringUtils
.randomAlphabetic(5) + " " + RandomStringUtils
.randomAlphabetic(10);
1421 String radomCommonName
= RandomStringUtils
.randomAlphabetic(10);
1423 IBotanicalName name
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
1424 name
.setNameCache(radomName
, true);
1425 Taxon taxon
= Taxon
.NewInstance(name
, sec
);
1426 taxonService
.save(taxon
);
1428 TaxonDescription description
= TaxonDescription
.NewInstance(taxon
);
1429 description
.addElement(CommonTaxonName
.NewInstance(radomCommonName
, Language
.GERMAN()));
1430 descriptionService
.save(description
);
1433 commitAndStartNewTransaction(null);
1436 private <T
extends CdmBase
> void logFreeTextSearchResults(Pager
<SearchResult
<T
>> pager
, Level level
, String
[] docFields
){
1438 level
= Level
.DEBUG
;
1440 if(logger
.isEnabledFor(level
)){
1441 StringBuilder b
= new StringBuilder();
1444 for(SearchResult sr
: pager
.getRecords()){
1446 b
.append(" ").append(i
++).append(" - ");
1447 b
.append("score:").append(sr
.getScore()).append(", ");
1449 if(docFields
!= null){
1450 b
.append("docs : ");
1451 for(Document doc
: sr
.getDocs()) {
1453 for(String f
: docFields
){
1454 b
.append(f
).append(":").append(Arrays
.toString(doc
.getValues(f
)));
1460 CdmBase entity
= sr
.getEntity();
1464 b
.append(entity
.getClass().getSimpleName()).
1465 append(" [").append(entity
.getId()).
1466 append(" | ").append(entity
.getUuid()).append("] : ").
1467 append(entity
.toString());
1472 logger
.log(level
, b
);