Extend step-by-step deletion test
[cdmlib.git] / cdmlib-services / src / test / java / eu / etaxonomy / cdm / api / service / TaxonServiceSearchTest.java
index 01943c2a8fafda8a5d4d9bcaa67fc63ee4ad78d8..16708828875f1bb55626723f9743b17420bb0aaf 100644 (file)
@@ -42,26 +42,26 @@ import eu.etaxonomy.cdm.api.service.pager.Pager;
 import eu.etaxonomy.cdm.api.service.search.ICdmMassIndexer;\r
 import eu.etaxonomy.cdm.api.service.search.LuceneMultiSearchException;\r
 import eu.etaxonomy.cdm.api.service.search.SearchResult;\r
+import eu.etaxonomy.cdm.common.UTF8;\r
 import eu.etaxonomy.cdm.common.monitor.DefaultProgressMonitor;\r
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
-import eu.etaxonomy.cdm.model.description.AbsenceTerm;\r
 import eu.etaxonomy.cdm.model.description.CategoricalData;\r
 import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
 import eu.etaxonomy.cdm.model.description.DescriptionBase;\r
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
 import eu.etaxonomy.cdm.model.description.Distribution;\r
 import eu.etaxonomy.cdm.model.description.Feature;\r
-import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
-import eu.etaxonomy.cdm.model.description.PresenceTerm;\r
+import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;\r
 import eu.etaxonomy.cdm.model.description.State;\r
 import eu.etaxonomy.cdm.model.description.StateData;\r
 import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
 import eu.etaxonomy.cdm.model.description.TextData;\r
+import eu.etaxonomy.cdm.model.location.Country;\r
 import eu.etaxonomy.cdm.model.location.NamedArea;\r
-import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry;\r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
 import eu.etaxonomy.cdm.model.name.NonViralName;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
@@ -76,20 +76,22 @@ import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
+import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;\r
 import eu.etaxonomy.cdm.persistence.query.MatchMode;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;\r
 import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;\r
 \r
-\r
 /**\r
  * @author a.babadshanjan, a.kohlbecker\r
  * @created 04.02.2009\r
- * @version 1.0\r
  */\r
 public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {\r
 \r
     private static final String ABIES_BALSAMEA_UUID = "f65d47bd-4f49-4ab1-bc4a-bc4551eaa1a8";\r
 \r
+    private static final String ABIES_ALBA_UUID = "7dbd5810-a3e5-44b6-b563-25152b8867f4";\r
+\r
     private static final String CLASSIFICATION_UUID = "2a5ceebb-4830-4524-b330-78461bf8cb6b";\r
 \r
     private static final String CLASSIFICATION_ALT_UUID = "d7c741e3-ae9e-4a7d-a566-9e3a7a0b51ce";\r
@@ -98,6 +100,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
 \r
     private static final String D_ABIES_ALBA_UUID = "ec8bba03-d993-4c85-8472-18b14942464b";\r
 \r
+    private static final String D_ABIES_KAWAKAMII_SEC_KOMAROV_UUID = "e9d8c2fd-6409-46d5-9c2e-14a2bbb1b2b1";\r
     private static final int NUM_OF_NEW_RADOM_ENTITIES = 1000;\r
 \r
     private static Logger logger = Logger.getLogger(TaxonServiceSearchTest.class);\r
@@ -118,15 +121,18 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
     private INameService nameService;\r
     @SpringBeanByType\r
     private ICdmMassIndexer indexer;\r
+    \r
+    @SpringBeanByType\r
+    private ITaxonNodeService nodeService;\r
 \r
     private static final int BENCHMARK_ROUNDS = 300;\r
 \r
     private Set<Class<? extends CdmBase>> typesToIndex = null;\r
 \r
-    NamedArea germany;\r
-    NamedArea france ;\r
-    NamedArea russia ;\r
-    NamedArea canada ;\r
+    private NamedArea germany;\r
+    private NamedArea france ;\r
+    private NamedArea russia ;\r
+    private NamedArea canada ;\r
 \r
     /**\r
      * @throws java.lang.Exception\r
@@ -138,10 +144,11 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         typesToIndex.add(TaxonBase.class);\r
         typesToIndex.add(TaxonRelationship.class);\r
 \r
-        germany =  WaterbodyOrCountry.GERMANY();\r
-        france = WaterbodyOrCountry.FRANCEFRENCHREPUBLIC();\r
-        russia = WaterbodyOrCountry.RUSSIANFEDERATION();\r
-        canada = WaterbodyOrCountry.CANADA();\r
+        germany =  Country.GERMANY();\r
+        france = Country.FRANCEFRENCHREPUBLIC();\r
+        russia = Country.RUSSIANFEDERATION();\r
+        canada = Country.CANADA();\r
+\r
 \r
     }\r
 \r
@@ -188,8 +195,11 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         }\r
 \r
         logger.debug("number of taxa: " + list.size());\r
-        assertEquals(8, list.size());\r
-\r
+        assertEquals(9, list.size());\r
+        configurator.setTitleSearchString("Balsam-Tanne");\r
+        pager = taxonService.findTaxaAndNames(configurator);\r
+        list = pager.getRecords();\r
+        assertEquals(1, list.size());\r
         // pass 2\r
 //        configurator.setDoTaxaByCommonNames(false);\r
 //        configurator.setDoMisappliedNames(true);\r
@@ -208,7 +218,29 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
     @Test\r
     @DataSet\r
     public final void testSearchTaxaByName() {\r
-        logger.warn("testSearchTaxaByName not yet implemented"); // TODO\r
+        IFindTaxaAndNamesConfigurator<?> configurator = new FindTaxaAndNamesConfiguratorImpl();\r
+         configurator.setTitleSearchString("Abies*");\r
+         configurator.setMatchMode(MatchMode.BEGINNING);\r
+         configurator.setDoTaxa(false);\r
+         configurator.setDoSynonyms(false);\r
+         configurator.setDoNamesWithoutTaxa(true);\r
+         configurator.setDoTaxaByCommonNames(false);\r
+\r
+        List<UuidAndTitleCache<IdentifiableEntity>> list = taxonService.findTaxaAndNamesForEditor(configurator);\r
+\r
+         Assert.assertEquals("Expecting one entity", 1, list.size());\r
+         \r
+         configurator.setTitleSearchString("silver fir");\r
+         configurator.setMatchMode(MatchMode.BEGINNING);\r
+         configurator.setDoTaxa(false);\r
+         configurator.setDoSynonyms(false);\r
+         configurator.setDoNamesWithoutTaxa(true);\r
+         configurator.setDoTaxaByCommonNames(true);\r
+\r
+         list = taxonService.findTaxaAndNamesForEditor(configurator);\r
+\r
+         Assert.assertEquals("Expecting one entity", 1, list.size());\r
+         \r
     }\r
 \r
     @SuppressWarnings("rawtypes")\r
@@ -240,7 +272,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
 \r
         Pager<SearchResult<TaxonBase>> pager;\r
 \r
-        pager = taxonService.findByDescriptionElementFullText(CommonTaxonName.class, "Weißtanne", null, null, null,\r
+        pager = taxonService.findByDescriptionElementFullText(CommonTaxonName.class, "Wei"+UTF8.SHARP_S+"tanne", null, null, null,\r
                 false, null, null, null, null);\r
         Assert.assertEquals("Expecting one entity when searching for CommonTaxonName", Integer.valueOf(1),\r
                 pager.getCount());\r
@@ -251,11 +283,11 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
                 false, null, null, null, null);\r
         Assert.assertEquals("Expecting no entity when searching for 'Nulltanne' ", Integer.valueOf(0), pager.getCount());\r
 \r
-        pager = taxonService.findByDescriptionElementFullText(CommonTaxonName.class, "Weißtanne", null, null,\r
+        pager = taxonService.findByDescriptionElementFullText(CommonTaxonName.class, "Wei"+UTF8.SHARP_S+"tanne", null, null,\r
                 Arrays.asList(new Language[] { Language.GERMAN() }), false, null, null, null, null);\r
         Assert.assertEquals("Expecting one entity when searching in German", Integer.valueOf(1), pager.getCount());\r
 \r
-        pager = taxonService.findByDescriptionElementFullText(CommonTaxonName.class, "Weißtanne", null, null,\r
+        pager = taxonService.findByDescriptionElementFullText(CommonTaxonName.class, "Wei"+UTF8.SHARP_S+"tanne", null, null,\r
                 Arrays.asList(new Language[] { Language.RUSSIAN() }), false, null, null, null, null);\r
         Assert.assertEquals("Expecting no entity when searching in Russian", Integer.valueOf(0), pager.getCount());\r
 \r
@@ -286,7 +318,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
 \r
         Pager<SearchResult<TaxonBase>> pager;\r
 \r
-        pager = taxonService.findByDescriptionElementFullText(CommonTaxonName.class, "Weiß*", null, null, null, false, null, null, null, null);\r
+        pager = taxonService.findByDescriptionElementFullText(CommonTaxonName.class, "Wei"+UTF8.SHARP_S+"*", null, null, null, false, null, null, null, null);\r
         Assert.assertEquals("Expecting one entity when searching for CommonTaxonName", Integer.valueOf(1), pager.getCount());\r
     }\r
 \r
@@ -495,7 +527,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
 \r
         // test with findByDescriptionElementFullText\r
         pager = taxonService.findByDescriptionElementFullText(CommonTaxonName.class, "Rot*", null, null, null, highlightFragments, pageSize, null, null, null);\r
-        logPagerRecords(pager, Level.DEBUG);\r
+        logSearchResults(pager, Level.DEBUG, null);\r
         Assert.assertEquals("All matches should be grouped into a single SearchResult element", 1, pager.getRecords().size());\r
         Assert.assertEquals("The count property of the pager must be set correctly", 1, pager.getCount().intValue());\r
         Map<String, String[]> highlightMap = pager.getRecords().get(0).getFieldHighlightMap();\r
@@ -505,7 +537,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
 \r
         // test with findByEverythingFullText\r
         pager = taxonService.findByEverythingFullText( "Rot*", null, null, highlightFragments, pageSize, null, null, null);\r
-        logPagerRecords(pager, Level.DEBUG);\r
+        logSearchResults(pager, Level.DEBUG, null);\r
         Assert.assertEquals("All matches should be grouped into a single SearchResult element", 1, pager.getRecords().size());\r
         Assert.assertEquals("The count property of the pager must be set correctly", 1, pager.getCount().intValue());\r
         highlightMap = pager.getRecords().get(0).getFieldHighlightMap();\r
@@ -524,7 +556,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
 \r
         Pager<SearchResult<TaxonBase>> pager;\r
         pager = taxonService.findByDescriptionElementFullText(TextData.class, "Abies", null, null, null, false, null, null, null, null);\r
-        logPagerRecords(pager, Level.DEBUG);\r
+        logSearchResults(pager, Level.DEBUG, null);\r
         Assert.assertEquals("Expecting one entity when searching for any TextData", Integer.valueOf(1), pager.getCount());\r
         Assert.assertEquals("Abies balsamea sec. Kohlbecker, A., Testcase standart views, 2013", pager.getRecords().get(0).getEntity().getTitleCache());\r
         Assert.assertTrue("Expecting two docs, one for RUSSIAN and one for GERMAN", pager.getRecords().get(0).getDocs().size() == 2);\r
@@ -613,7 +645,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         DescriptionElementBase textData = descriptionService.getDescriptionElementByUuid(UUID.fromString(descriptionElementUuidStr[0]));\r
 \r
         ((TextData)textData).removeText(Language.GERMAN());\r
-        ((TextData)textData).putText(Language.SPANISH_CASTILIAN(), "abeto balsámico");\r
+        ((TextData)textData).putText(Language.SPANISH_CASTILIAN(), "abeto bals"+UTF8.SMALL_A_ACUTE+"mico");\r
 \r
         descriptionService.saveDescriptionElement(textData);\r
         commitAndStartNewTransaction(null);\r
@@ -625,9 +657,9 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         pager = taxonService.findByDescriptionElementFullText(TextData.class, "Balsam-Tanne", null, null, Arrays.asList(new Language[]{Language.GERMAN(), Language.RUSSIAN()}), false, null, null, null, null);\r
         Assert.assertEquals("The german 'Balsam-Tanne' TextData should no longer be indexed", Integer.valueOf(0), pager.getCount());\r
         pager = taxonService.findByDescriptionElementFullText(TextData.class, "abeto", null, null, Arrays.asList(new Language[]{Language.SPANISH_CASTILIAN()}), false, null, null, null, null);\r
-        Assert.assertEquals("expecting to find the SPANISH_CASTILIAN 'abeto balsámico'", Integer.valueOf(1), pager.getCount());\r
-        pager = taxonService.findByDescriptionElementFullText(TextData.class, "balsámico", null, null, null, false, null, null, null, null);\r
-        Assert.assertEquals("expecting to find the SPANISH_CASTILIAN 'abeto balsámico'", Integer.valueOf(1), pager.getCount());\r
+        Assert.assertEquals("expecting to find the SPANISH_CASTILIAN 'abeto bals"+UTF8.SMALL_A_ACUTE+"mico'", Integer.valueOf(1), pager.getCount());\r
+        pager = taxonService.findByDescriptionElementFullText(TextData.class, "bals"+UTF8.SMALL_A_ACUTE+"mico", null, null, null, false, null, null, null, null);\r
+        Assert.assertEquals("expecting to find the SPANISH_CASTILIAN 'abeto bals"+UTF8.SMALL_A_ACUTE+"mico'", Integer.valueOf(1), pager.getCount());\r
 \r
         //\r
         // modify the DescriptionElement via the Description object\r
@@ -636,15 +668,15 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         for( DescriptionElementBase elm : elements){\r
             if(elm.getUuid().toString().equals(descriptionElementUuidStr[0])){\r
                 ((TextData)elm).removeText(Language.SPANISH_CASTILIAN());\r
-                ((TextData)elm).putText(Language.POLISH(), "Jodła balsamiczna");\r
+                ((TextData)elm).putText(Language.POLISH(), "Jod"+UTF8.POLISH_L+"a balsamiczna");\r
             }\r
         }\r
         descriptionService.saveOrUpdate(description);\r
         commitAndStartNewTransaction(null);\r
         pager = taxonService.findByDescriptionElementFullText(TextData.class, "abeto", null, null, Arrays.asList(new Language[]{Language.SPANISH_CASTILIAN()}), false, null, null, null, null);\r
-        Assert.assertEquals("The spanish 'abeto balsámico' TextData should no longer be indexed", Integer.valueOf(0), pager.getCount());\r
+        Assert.assertEquals("The spanish 'abeto bals"+UTF8.SMALL_A_ACUTE+"mico' TextData should no longer be indexed", Integer.valueOf(0), pager.getCount());\r
         pager = taxonService.findByDescriptionElementFullText(TextData.class, "balsamiczna", null, null, Arrays.asList(new Language[]{Language.POLISH()}), false, null, null, null, null);\r
-        Assert.assertEquals("expecting to find the POLISH 'Jodła balsamiczna'", Integer.valueOf(1), pager.getCount());\r
+        Assert.assertEquals("expecting to find the POLISH 'Jod"+UTF8.POLISH_L+"a balsamiczna'", Integer.valueOf(1), pager.getCount());\r
     }\r
 \r
     @SuppressWarnings("rawtypes")\r
@@ -668,6 +700,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         taxonService.saveOrUpdate(t_abies_balsamea);\r
         commitAndStartNewTransaction(null);\r
 \r
+        t_abies_balsamea = (Taxon)taxonService.find(t_abies_balsamea.getUuid());\r
 \r
         pager = taxonService.findByDescriptionElementFullText(TextData.class, "Balsam-Tanne", null, null, Arrays.asList(new Language[]{Language.GERMAN()}), false, null, null, null, null);\r
         Assert.assertEquals("'Balsam-Tanne' should no longer be found", Integer.valueOf(0), pager.getCount());\r
@@ -677,7 +710,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         d_abies_balsamea_new\r
                 .addElement(TextData\r
                         .NewInstance(\r
-                                "Die Balsamtanne ist mit bis zu 30 m Höhe ein mittelgroßer Baum und kann bis zu 200 Jahre alt werden",\r
+                                "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",\r
                                 Language.GERMAN(), null));\r
         t_abies_balsamea.addDescription(d_abies_balsamea_new);\r
         // set authorshipCache to null to avoid validation exception,\r
@@ -691,7 +724,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
                 "DESCRIPTIONBASE"\r
         });\r
 \r
-        pager = taxonService.findByDescriptionElementFullText(TextData.class, "mittelgroßer Baum", null, null, Arrays.asList(new Language[]{Language.GERMAN()}), false, null, null, null, null);\r
+        pager = taxonService.findByDescriptionElementFullText(TextData.class, "mittelgro"+UTF8.SHARP_S+"er Baum", null, null, Arrays.asList(new Language[]{Language.GERMAN()}), false, null, null, null, null);\r
         Assert.assertEquals("the taxon should be found via the new Description", Integer.valueOf(1), pager.getCount());\r
     }\r
 \r
@@ -721,8 +754,10 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         Assert.assertEquals("expecting Abies balsamea sec.", childNode.getTaxon().getUuid().toString(), ABIES_BALSAMEA_UUID);\r
         Assert.assertEquals("expecting default classification", childNode.getClassification().getUuid().toString(), CLASSIFICATION_UUID);\r
 \r
-        // moving the taxon around\r
-        alternateClassification.addChildNode(childNode, null, null, null);\r
+        // moving the taxon around, the rootnode is only a proxy\r
+        alternateClassification.setRootNode(HibernateProxyHelper.deproxy(alternateClassification.getRootNode(), TaxonNode.class));\r
+        alternateClassification.addChildNode(childNode, null, null);\r
+      \r
         classificationService.saveOrUpdate(alternateClassification);\r
         commitAndStartNewTransaction(null);\r
 \r
@@ -756,10 +791,10 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
 \r
         StateData statedata = StateData.NewInstance(state);\r
         statedata.putModifyingText(Language.ENGLISH(), "always, even during winter");\r
-        cdata.addState(statedata);\r
+        cdata.addStateData(statedata);\r
         d_abies_balsamea.addElement(cdata);\r
 \r
-        termService.save(state);\r
+        UUID termUUID = termService.save(state);\r
         descriptionService.save(d_abies_balsamea);\r
 \r
         commitAndStartNewTransaction(null);\r
@@ -786,8 +821,12 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         taxonService.saveOrUpdate(taxon);\r
         commitAndStartNewTransaction(null);\r
 \r
-        taxon = taxonService.load(taxon.getUuid());\r
+        taxon = taxonService.find(taxon.getUuid());\r
         Assert.assertEquals(newName + " sec. ", taxon.getTitleCache());\r
+        DefinedTermBase term = termService.find(termUUID);\r
+\r
+        termService.delete(term);\r
+\r
     }\r
 \r
     @SuppressWarnings("rawtypes")\r
@@ -842,7 +881,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         Pager<SearchResult<TaxonBase>> pager;\r
 \r
         pager = taxonService.findByFullText(null, "Abies", null, null, true, null, null, null, null); // --> 7\r
-        logPagerRecords(pager, Level.DEBUG);\r
+        logSearchResults(pager, Level.DEBUG, null);\r
         Assert.assertEquals("Expecting 8 entities", Integer.valueOf(8), pager.getCount());\r
 \r
         pager = taxonService.findByFullText(Taxon.class, "Abies", null, null, true, null, null, null, null); // --> 6\r
@@ -867,7 +906,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
     @DataSet\r
     public final void testPrepareByAreaSearch() throws IOException, ParseException {\r
 \r
-        List<PresenceAbsenceTermBase<?>> statusFilter = new ArrayList<PresenceAbsenceTermBase<?>>();\r
+        List<PresenceAbsenceTerm> statusFilter = new ArrayList<PresenceAbsenceTerm>();\r
         List<NamedArea> areaFilter = new ArrayList<NamedArea>();\r
         areaFilter.add(germany);\r
         areaFilter.add(canada);\r
@@ -886,21 +925,40 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
 \r
         Pager<SearchResult<TaxonBase>> pager;\r
 \r
+        Classification alternateClassification = classificationService.find(UUID.fromString(CLASSIFICATION_ALT_UUID));\r
+\r
+\r
         pager = taxonService.findTaxaAndNamesByFullText(\r
                 EnumSet.of(TaxaAndNamesSearchMode.doTaxa, TaxaAndNamesSearchMode.doSynonyms),\r
                 "Abies", null, null, null, null, true, null, null, null, null);\r
 //        logPagerRecords(pager, Level.DEBUG);\r
-        Assert.assertEquals("Expecting 8 entities", Integer.valueOf(8), pager.getCount());\r
+        Assert.assertEquals("doTaxa & doSynonyms", Integer.valueOf(8), pager.getCount());\r
+\r
+        pager = taxonService.findTaxaAndNamesByFullText(\r
+                EnumSet.allOf(TaxaAndNamesSearchMode.class),\r
+                "Abies", null, null, null, null, true, null, null, null, null);\r
+//        logPagerRecords(pager, Level.DEBUG);\r
+        Assert.assertEquals("all search modes", Integer.valueOf(8), pager.getCount());\r
+\r
+        pager = taxonService.findTaxaAndNamesByFullText(\r
+                EnumSet.allOf(TaxaAndNamesSearchMode.class),\r
+                "Abies", alternateClassification, null, null, null, true, null, null, null, null);\r
+//        logPagerRecords(pager, Level.DEBUG);\r
+        Assert.assertEquals("all search modes, filtered by alternateClassification", Integer.valueOf(1), pager.getCount());\r
 \r
         pager = taxonService.findTaxaAndNamesByFullText(\r
                 EnumSet.of(TaxaAndNamesSearchMode.doSynonyms),\r
                 "Abies", null, null, null, null, true, null, null, null, null);\r
         Assert.assertEquals("Expecting 1 entity", Integer.valueOf(1), pager.getCount());\r
+        SearchResult<TaxonBase> searchResult = pager.getRecords().get(0);\r
+        Assert.assertEquals(Synonym.class, searchResult.getEntity().getClass());\r
+        // Abies subalpina sec. Kohlbecker, A., Testcase standart views, 2013\r
+\r
 \r
         pager = taxonService.findTaxaAndNamesByFullText(\r
                 EnumSet.of(TaxaAndNamesSearchMode.doTaxaByCommonNames),\r
                 "Abies", null, null, null, null, true, null, null, null, null);\r
-// FIXME       Assert.assertEquals("Expecting 0 entity", Integer.valueOf(0), pager.getCount());\r
+        Assert.assertEquals("Expecting 0 entity", Integer.valueOf(0), pager.getCount());\r
 \r
 \r
         pager = taxonService.findTaxaAndNamesByFullText(\r
@@ -912,11 +970,61 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         pager = taxonService.findTaxaAndNamesByFullText(\r
                 EnumSet.of(TaxaAndNamesSearchMode.doMisappliedNames),\r
                 "kawakamii", null, null, null, null, true, null, null, null, null);\r
-        logPagerRecords(pager, Level.DEBUG);\r
+        logSearchResults(pager, Level.DEBUG, null);\r
         Assert.assertEquals("Expecting 1 entity", Integer.valueOf(1), pager.getCount());\r
 \r
     }\r
 \r
+    @Test\r
+    @DataSet\r
+    public final void testFindTaxaAndNamesByFullText_Sort() throws CorruptIndexException, IOException, ParseException, LuceneMultiSearchException {\r
+\r
+        refreshLuceneIndex();\r
+\r
+        Pager<SearchResult<TaxonBase>> pager;\r
+\r
+        List<OrderHint> orderHints = new ArrayList<OrderHint>();\r
+\r
+        String[] docFields2log = new String[]{"id"};\r
+\r
+        // SortById\r
+        orderHints.addAll(OrderHint.ORDER_BY_ID);\r
+        pager = taxonService.findTaxaAndNamesByFullText(\r
+                EnumSet.of(TaxaAndNamesSearchMode.doTaxa),\r
+                "Abies", null, null, null, null, true, null, null, orderHints, null);\r
+//        logSearchResults(pager, Level.DEBUG, docFields2log);\r
+        int lastId = -1;\r
+        for(SearchResult<TaxonBase> rs : pager.getRecords()){\r
+            if(lastId != -1){\r
+                Assert.assertTrue("results not sorted by id", lastId < rs.getEntity().getId());\r
+            }\r
+            lastId = rs.getEntity().getId();\r
+        }\r
+\r
+        orderHints.addAll(OrderHint.ORDER_BY_ID);\r
+        pager = taxonService.findTaxaAndNamesByFullText(\r
+                EnumSet.of(TaxaAndNamesSearchMode.doTaxa, TaxaAndNamesSearchMode.doSynonyms),\r
+                "Abies", null, null, null, null, true, null, null, orderHints, null);\r
+//        logSearchResults(pager, Level.DEBUG, docFields2log);\r
+\r
+        lastId = -1;\r
+        for(SearchResult<TaxonBase> rs : pager.getRecords()){\r
+            if(lastId != -1){\r
+                Assert.assertTrue("results not sorted by id", lastId < rs.getEntity().getId());\r
+            }\r
+            lastId = rs.getEntity().getId();\r
+        }\r
+\r
+        // Sortby NOMENCLATURAL_SORT_ORDER TODO make assertions !!!\r
+        orderHints.clear();\r
+        orderHints.addAll(OrderHint.NOMENCLATURAL_SORT_ORDER);\r
+        pager = taxonService.findTaxaAndNamesByFullText(\r
+                EnumSet.of(TaxaAndNamesSearchMode.doTaxa, TaxaAndNamesSearchMode.doSynonyms),\r
+                "Abies", null, null, null, null, true, null, null, orderHints, null);\r
+        logSearchResults(pager, Level.DEBUG, null);\r
+\r
+    }\r
+\r
     @Test\r
     @DataSet\r
     public final void testFindTaxaAndNamesByFullText_AreaFilter() throws CorruptIndexException, IOException, ParseException, LuceneMultiSearchException {\r
@@ -933,21 +1041,20 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         Set<NamedArea> a_russia = new HashSet<NamedArea>();\r
         a_russia.add(russia);\r
 \r
-        Set<PresenceAbsenceTermBase<?>> present = new HashSet<PresenceAbsenceTermBase<?>>();\r
-        present.add(PresenceTerm.PRESENT());\r
+        Set<PresenceAbsenceTerm> present = new HashSet<PresenceAbsenceTerm>();\r
+        present.add(PresenceAbsenceTerm.PRESENT());\r
 \r
-        Set<PresenceAbsenceTermBase<?>> present_native = new HashSet<PresenceAbsenceTermBase<?>>();\r
-        present_native.add(PresenceTerm.PRESENT());\r
-        present_native.add(PresenceTerm.NATIVE());\r
+        Set<PresenceAbsenceTerm> present_native = new HashSet<PresenceAbsenceTerm>();\r
+        present_native.add(PresenceAbsenceTerm.PRESENT());\r
+        present_native.add(PresenceAbsenceTerm.NATIVE());\r
 \r
-        /* disabled for debugging ----------\r
-         *\r
-         *         * */\r
+        Set<PresenceAbsenceTerm> absent = new HashSet<PresenceAbsenceTerm>();\r
+        absent.add(PresenceAbsenceTerm.ABSENT());\r
 \r
         pager = taxonService.findTaxaAndNamesByFullText(\r
                 EnumSet.of(TaxaAndNamesSearchMode.doTaxa),\r
                 "Abies", null, a_germany_canada_russia, null, null, true, null, null, null, null);\r
-        logPagerRecords(pager, Level.DEBUG);\r
+        logSearchResults(pager, Level.DEBUG, null);\r
         Assert.assertEquals("taxa with matching area filter", Integer.valueOf(2), pager.getCount());\r
 \r
         // abies_kawakamii_sensu_komarov as missapplied name for t_abies_balsamea\r
@@ -959,7 +1066,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         pager = taxonService.findTaxaAndNamesByFullText(\r
                 EnumSet.of(TaxaAndNamesSearchMode.doTaxa, TaxaAndNamesSearchMode.doSynonyms),\r
                 "Abies", null, a_germany_canada_russia, null, null, true, null, null, null, null);\r
-        logPagerRecords(pager, Level.DEBUG);\r
+        logSearchResults(pager, Level.DEBUG, null);\r
         Assert.assertEquals("taxa and synonyms with matching area filter", Integer.valueOf(3), pager.getCount());\r
 \r
         pager = taxonService.findTaxaAndNamesByFullText(\r
@@ -982,22 +1089,38 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
                 "Tanne", null, a_germany_canada_russia, present_native, null, true, null, null, null, null);\r
         Assert.assertEquals("ByCommonNames with area filter", Integer.valueOf(1), pager.getCount());\r
 \r
+        // abies_kawakamii_sensu_komarov as misapplied name for t_abies_balsamea\r
+        pager = taxonService.findTaxaAndNamesByFullText(\r
+                EnumSet.of(TaxaAndNamesSearchMode.doMisappliedNames),\r
+                "Abies", null, a_germany_canada_russia, present_native, null, true, null, null, null, null);\r
+        Assert.assertEquals("misappliedNames with matching area & status filter", Integer.valueOf(1), pager.getCount());\r
 \r
 \r
+        // 1. remove existing taxon relation\r
+        Taxon t_abies_balsamea = (Taxon)taxonService.find(UUID.fromString(ABIES_BALSAMEA_UUID));\r
+        Set<TaxonRelationship> relsTo = t_abies_balsamea.getRelationsToThisTaxon();\r
+        Assert.assertEquals(Integer.valueOf(1), Integer.valueOf(relsTo.size()));\r
+        TaxonRelationship taxonRelation = relsTo.iterator().next();\r
+        t_abies_balsamea.removeTaxonRelation(taxonRelation);\r
+        taxonService.saveOrUpdate(t_abies_balsamea);\r
+        commitAndStartNewTransaction(null);\r
 \r
-        /* FIXME below ...\r
-\r
-        // abies_kawakamii_sensu_komarov as missapplied name for t_abies_balsamea\r
         pager = taxonService.findTaxaAndNamesByFullText(\r
                 EnumSet.of(TaxaAndNamesSearchMode.doMisappliedNames),\r
                 "Abies", null, a_germany_canada_russia, present_native, null, true, null, null, null, null);\r
-        Assert.assertEquals("misappliedNames with matching area & status filter", Integer.valueOf(1), pager.getCount());\r
-        // FIXME area filter is not working for misapplied names\r
-         * */\r
-\r
+        Assert.assertEquals("misappliedNames with matching area & status filter, should match nothing now", Integer.valueOf(0), pager.getCount());\r
 \r
+        // 2. now add abies_kawakamii_sensu_komarov as misapplied name for t_abies_alba and search for misapplications in russia: ABSENT\r
+        Taxon t_abies_kawakamii_sensu_komarov = (Taxon)taxonService.find(UUID.fromString(D_ABIES_KAWAKAMII_SEC_KOMAROV_UUID));\r
+        Taxon t_abies_alba = (Taxon)taxonService.find(UUID.fromString(ABIES_ALBA_UUID));\r
+        t_abies_alba.addMisappliedName(t_abies_kawakamii_sensu_komarov, null, null);\r
+        taxonService.update(t_abies_alba);\r
+        commitAndStartNewTransaction(null);\r
 \r
-// -->\r
+        pager = taxonService.findTaxaAndNamesByFullText(\r
+                EnumSet.of(TaxaAndNamesSearchMode.doMisappliedNames),\r
+                "Abies", null, a_germany_canada_russia, absent, null, true, null, null, null, null);\r
+        Assert.assertEquals("misappliedNames with matching area & status filter, should find one", Integer.valueOf(1), pager.getCount());\r
 \r
     }\r
 \r
@@ -1019,7 +1142,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
 \r
         // via Taxon\r
         pager = taxonService.findByEverythingFullText("Abies", null, null, true, null, null, null, null);\r
-        logPagerRecords(pager, Level.DEBUG);\r
+        logSearchResults(pager, Level.DEBUG, null);\r
         Assert.assertTrue("Expecting at least 7 entities for 'Abies'", pager.getCount() > 7);\r
         Assert.assertNotNull("Expecting entity", pager.getRecords().get(0).getEntity());\r
         Assert.assertEquals("Expecting Taxon entity", Taxon.class, pager.getRecords().get(0).getEntity().getClass());\r
@@ -1047,7 +1170,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
 \r
         //FIXME FAILS: abies balamea is returned twice, see also testFullText_Grouping()\r
         pager = taxonService.findByEverythingFullText("Balsam-Tanne", null, Arrays.asList(new Language[]{Language.GERMAN()}), false, null, null, null, null);\r
-        logPagerRecords(pager, Level.DEBUG);\r
+        logSearchResults(pager, Level.DEBUG, null);\r
         Assert.assertEquals("expecting to find the Abies balsamea via the GERMAN DescriptionElements", Integer.valueOf(1), pager.getCount());\r
 \r
         pager = taxonService.findByEverythingFullText("Abies", null, null, true, null, null, null, null);\r
@@ -1066,7 +1189,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
 //        createRandomTaxonWithCommonName(NUM_OF_NEW_RADOM_ENTITIES);\r
 //\r
 //        IFindTaxaAndNamesConfigurator configurator = new FindTaxaAndNamesConfiguratorImpl();\r
-//        configurator.setTitleSearchString("Weiß%");\r
+//        configurator.setTitleSearchString("Wei"+UTF8.SHARP_S+"%");\r
 //        configurator.setMatchMode(MatchMode.BEGINNING);\r
 //        configurator.setDoTaxa(false);\r
 //        configurator.setDoSynonyms(false);\r
@@ -1096,7 +1219,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         createRandomTaxonWithCommonName(NUM_OF_NEW_RADOM_ENTITIES);\r
 \r
         IFindTaxaAndNamesConfigurator configurator = new FindTaxaAndNamesConfiguratorImpl();\r
-        configurator.setTitleSearchString("Weiß%");\r
+        configurator.setTitleSearchString("Wei"+UTF8.SHARP_S+"%");\r
         configurator.setMatchMode(MatchMode.BEGINNING);\r
         configurator.setDoTaxa(false);\r
         configurator.setDoSynonyms(false);\r
@@ -1129,7 +1252,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
 \r
         long startMillis = System.currentTimeMillis();\r
         for (int indx = 0; indx < BENCHMARK_ROUNDS; indx++) {\r
-            pager = taxonService.findByDescriptionElementFullText(CommonTaxonName.class, "Weiß*", null, null, null, false, null, null, null, null);\r
+            pager = taxonService.findByDescriptionElementFullText(CommonTaxonName.class, "Wei"+UTF8.SHARP_S+"*", null, null, null, false, null, null, null, null);\r
             if (logger.isDebugEnabled()) {\r
                 logger.debug("[" + indx + "]" + pager.getRecords().get(0).getEntity().getTitleCache());\r
             }\r
@@ -1141,9 +1264,10 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
     /**\r
      * uncomment @Test annotation to create the dataset for this test\r
      */\r
-//    @Test\r
+    @Override\r
+    //    @Test\r
     @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="BlankDataSet.xml")\r
-    public final void createDataSet() throws FileNotFoundException {\r
+    public final void createTestDataSet() throws FileNotFoundException {\r
 \r
         Classification europeanAbiesClassification = Classification.NewInstance("European Abies");\r
         europeanAbiesClassification.setUuid(UUID.fromString(CLASSIFICATION_UUID));\r
@@ -1168,6 +1292,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         BotanicalName n_abies_alba = BotanicalName.NewInstance(Rank.SPECIES());\r
         n_abies_alba.setNameCache("Abies alba", true);\r
         Taxon t_abies_alba = Taxon.NewInstance(n_abies_alba, sec);\r
+        t_abies_alba.setUuid(UUID.fromString(ABIES_ALBA_UUID));\r
         taxonService.save(t_abies_alba);\r
 \r
         BotanicalName n_abies_subalpina = BotanicalName.NewInstance(Rank.SPECIES());\r
@@ -1205,8 +1330,8 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         taxonService.save(t_abies_lasiocarpa);\r
 \r
         // add taxa to classifications\r
-        europeanAbiesClassification.addChildTaxon(t_abies_balsamea, null, null, null);\r
-        alternativeClassification.addChildTaxon(t_abies_lasiocarpa, null, null, null);\r
+        europeanAbiesClassification.addChildTaxon(t_abies_balsamea, null, null);\r
+        alternativeClassification.addChildTaxon(t_abies_lasiocarpa, null, null);\r
         classificationService.saveOrUpdate(europeanAbiesClassification);\r
         classificationService.saveOrUpdate(alternativeClassification);\r
 \r
@@ -1221,22 +1346,22 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
 \r
 \r
         // CommonTaxonName\r
-        d_abies_alba.addElement(CommonTaxonName.NewInstance("Weißtanne", Language.GERMAN()));\r
+        d_abies_alba.addElement(CommonTaxonName.NewInstance("Wei"+UTF8.SHARP_S+"tanne", Language.GERMAN()));\r
         d_abies_alba.addElement(CommonTaxonName.NewInstance("silver fir", Language.ENGLISH()));\r
         d_abies_alba.addElement(Distribution\r
                 .NewInstance(\r
                         germany,\r
-                        PresenceTerm.NATIVE()));\r
+                        PresenceAbsenceTerm.NATIVE()));\r
         d_abies_alba.addElement(Distribution\r
                 .NewInstance(\r
                         russia,\r
-                        AbsenceTerm.ABSENT()));\r
+                        PresenceAbsenceTerm.ABSENT()));\r
 \r
         // TextData\r
         d_abies_balsamea\r
             .addElement(TextData\r
                     .NewInstance(\r
-                            "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.",\r
+                            "Die Balsam-Tanne (Abies balsamea) ist eine Pflanzenart aus der Gattung der Tannen (Abies). Sie wÃ\83¤chst im nordÃ\83¶stlichen Nordamerika, wo sie sowohl Tief- als auch Bergland besiedelt. Sie gilt als relativ anspruchslos gegenÃ\83¼ber dem Standort und ist frosthart. In vielen Teilen des natÃ\83¼rlichen Verbreitungsgebietes stellt sie die Klimaxbaumart dar.",\r
                             Language.GERMAN(), null));\r
         d_abies_balsamea\r
         .addElement(CommonTaxonName\r
@@ -1248,23 +1373,23 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         .addElement(Distribution\r
                 .NewInstance(\r
                         canada,\r
-                        PresenceTerm.PRESENT()));\r
+                        PresenceAbsenceTerm.PRESENT()));\r
 \r
         d_abies_balsamea\r
         .addElement(Distribution\r
                 .NewInstance(\r
                         germany,\r
-                        PresenceTerm.NATIVE()));\r
+                        PresenceAbsenceTerm.NATIVE()));\r
 \r
         d_abies_balsamea\r
                 .addElement(TextData\r
                         .NewInstance(\r
-                                "Бальзам ньыв (лат. Abies balsamea) – быдмассэзлӧн пожум котырись ньыв увтырын торья вид. Ньывпуыс быдмӧ 14–20 метра вылына да овлӧ 10–60 см кыза диаметрын. Ньывпу пантасьӧ Ойвыв Америкаын.",\r
+                                       TaxonServiceSearchTestUtf8Constants.RUSSIAN_ABIES_ALBA_LONG,\r
                                 Language.RUSSIAN(), null));\r
         d_abies_balsamea\r
         .addElement(CommonTaxonName\r
                 .NewInstance(\r
-                        "Бальзам ньыв",\r
+                               TaxonServiceSearchTestUtf8Constants.RUSSIAN_ABIES_ALBA_SHORT,\r
                         Language.RUSSIAN(), null));\r
         descriptionService.saveOrUpdate(d_abies_balsamea);\r
 \r
@@ -1277,7 +1402,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
             "SYNONYMRELATIONSHIP", "TAXONRELATIONSHIP",\r
             "REFERENCE", "DESCRIPTIONELEMENTBASE", "DESCRIPTIONBASE",\r
             "AGENTBASE", "HOMOTYPICALGROUP",\r
-            "CLASSIFICATION", "CLASSIFICATION_TAXONNODE","TAXONNODE",\r
+            "CLASSIFICATION", "TAXONNODE",\r
             "LANGUAGESTRING", "DESCRIPTIONELEMENTBASE_LANGUAGESTRING",\r
             "HIBERNATE_SEQUENCES" // IMPORTANT!!!\r
             });\r
@@ -1329,7 +1454,7 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
         commitAndStartNewTransaction(null);\r
     }\r
 \r
-    private <T extends CdmBase> void logPagerRecords(Pager<SearchResult<T>> pager, Level level){\r
+    private <T extends CdmBase> void logSearchResults(Pager<SearchResult<T>> pager, Level level, String[] docFields){\r
         if(level == null){\r
             level = Level.DEBUG;\r
         }\r
@@ -1338,13 +1463,30 @@ public class TaxonServiceSearchTest extends CdmTransactionalIntegrationTest {
             b.append("\n");\r
             int i = 0;\r
             for(SearchResult sr : pager.getRecords()){\r
-                CdmBase entity = sr.getEntity();\r
+\r
                 b.append(" ").append(i++).append(" - ");\r
+                b.append("score:").append(sr.getScore()).append(", ");\r
+\r
+                if(docFields != null){\r
+                    b.append("docs : ");\r
+                    for(Document doc : sr.getDocs()) {\r
+                        b.append("<");\r
+                        for(String f : docFields){\r
+                            b.append(f).append(":").append(Arrays.toString(doc.getValues(f)));\r
+                        }\r
+                        b.append(">");\r
+                    }\r
+                }\r
+\r
+                CdmBase entity = sr.getEntity();\r
                 if(entity == null){\r
                     b.append("NULL");\r
                 } else {\r
-                    b.append(entity.getClass().getSimpleName()).append(" : ").append(entity.toString());\r
-                    b.append(" [").append(entity.getUuid()).append("]");\r
+                    b.append(entity.getClass().getSimpleName()).\r
+                        append(" [").append(entity.getId()).\r
+                        append(" | ").append(entity.getUuid()).append("] : ").\r
+                        append(entity.toString());\r
+\r
                 }\r
                 b.append("\n");\r
             }\r