Project

General

Profile

Download (18.5 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 *
3
 */
4
package eu.etaxonomy.cdm.persistence.dao.hibernate.taxon;
5

    
6
import static org.junit.Assert.assertEquals;
7

    
8
import java.io.FileNotFoundException;
9
import java.util.List;
10
import java.util.UUID;
11

    
12
import org.junit.Assert;
13
import org.junit.Before;
14
import org.junit.Test;
15
import org.unitils.dbunit.annotation.DataSet;
16
import org.unitils.dbunit.annotation.DataSets;
17
import org.unitils.spring.annotation.SpringBeanByType;
18

    
19
import eu.etaxonomy.cdm.filter.TaxonNodeFilter;
20
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
21
import eu.etaxonomy.cdm.model.description.Distribution;
22
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
23
import eu.etaxonomy.cdm.model.description.TaxonDescription;
24
import eu.etaxonomy.cdm.model.location.NamedArea;
25
import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
26
import eu.etaxonomy.cdm.model.name.Rank;
27
import eu.etaxonomy.cdm.model.name.TaxonName;
28
import eu.etaxonomy.cdm.model.reference.Reference;
29
import eu.etaxonomy.cdm.model.taxon.Classification;
30
import eu.etaxonomy.cdm.model.taxon.Taxon;
31
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
32
import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao;
33
import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao;
34
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonNodeDao;
35
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonNodeFilterDao;
36
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
37
import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;
38

    
39
/**
40
 * @author a.mueller
41
 * @date 2014/06/13
42
 *
43
 */
44
public class TaxonNodeFilterDaoHibernateImplTest extends CdmTransactionalIntegrationTest {
45

    
46
    @SpringBeanByType
47
    private ITaxonNodeDao taxonNodeDao;
48

    
49
    @SpringBeanByType
50
    private IClassificationDao classificationDao;
51

    
52
    @SpringBeanByType
53
    private ITaxonNodeFilterDao filterDao;
54

    
55
    @SpringBeanByType
56
    private IDefinedTermDao termDao;
57

    
58

    
59
    private final UUID europeUuid = UUID.fromString("e860871c-3a14-4ef2-9367-bbd92586c95b");
60
    private final UUID germanyUuid = UUID.fromString("7b7c2db5-aa44-4302-bdec-6556fd74b0b9");
61
    private final UUID denmarkUuid = UUID.fromString("f818c97e-fd61-42fe-9d75-d433f8cb349c");
62
    private final UUID franceUuid = UUID.fromString("41c5129a-3465-42cc-b016-59ab9ffad71a");
63

    
64
    private final UUID middleEuropeUuid = UUID.fromString("d292f237-da3d-408b-93a1-3257a8c80b97");
65
    private final UUID africaUuid = UUID.fromString("9444016a-b334-4772-8795-ed4019552087");
66

    
67
    private Classification classification1;
68
    private TaxonNode node1;
69
    private TaxonNode node2;
70
    private TaxonNode node3;
71
    private TaxonNode node4;
72
    private TaxonNode node5;
73
    private TaxonNode nodeUnpublished;
74
    private Taxon taxon1;
75
    private Taxon taxon2;
76
    private Taxon taxon3;
77
    private Taxon taxon4;
78
    private Taxon taxon5;
79
    private Taxon taxonUnpublished;
80

    
81
    /**
82
     * @throws java.lang.Exception
83
     */
84
    @Before
85
    public void setUp() throws Exception {
86
        /*
87
         * classification 1
88
         *  - node1 (taxon1, Genus, Europe)
89
         *   - node3 (taxon3, Species, Germany)  //if subspecies exists in Denmark this is not fully correct !!
90
         *    - node4 (taxon4, Subspecies, Denmark)
91
         *    - node5 (taxon5, Subspecies)
92
         *  - node2 (taxon2, Family, France)
93
         */
94
        classification1 = Classification.NewInstance("TestClassification");
95
        Reference citation = null;
96
        String microCitation = null;
97
        taxon1 = Taxon.NewInstance(TaxonName.NewInstance(NomenclaturalCode.ICNAFP, Rank.GENUS(), null, null, null, null, null, null, null, null), null);
98
        taxon2 = Taxon.NewInstance(TaxonName.NewInstance(NomenclaturalCode.ICNAFP, Rank.FAMILY(), null, null, null, null, null, null, null, null), null);
99
        taxon3 = Taxon.NewInstance(TaxonName.NewInstance(NomenclaturalCode.ICNAFP, Rank.SPECIES(), null, null, null, null, null, null, null, null), null);
100
        taxon4 = Taxon.NewInstance(TaxonName.NewInstance(NomenclaturalCode.ICNAFP, Rank.SUBSPECIES(), null, null, null, null, null, null, null, null), null);
101
        taxon5 = Taxon.NewInstance(TaxonName.NewInstance(NomenclaturalCode.ICNAFP, Rank.SUBSPECIES(), null, null, null, null, null, null, null, null), null);
102
        taxonUnpublished = Taxon.NewInstance(TaxonName.NewInstance(NomenclaturalCode.ICNAFP, Rank.SUBSPECIES(), null, null, null, null, null, null, null, null), null);
103
        taxonUnpublished.setPublish(false);
104

    
105
        NamedArea europe = (NamedArea) termDao.load(europeUuid);
106
        NamedArea germany = (NamedArea) termDao.load(germanyUuid);
107
        NamedArea denmark = (NamedArea) termDao.load(denmarkUuid);
108
        NamedArea france = (NamedArea) termDao.load(franceUuid);
109
        TaxonDescription.NewInstance(taxon1).addElement(Distribution.NewInstance(europe, PresenceAbsenceTerm.NATIVE()));
110
        TaxonDescription.NewInstance(taxon3).addElement(Distribution.NewInstance(germany, PresenceAbsenceTerm.NATIVE()));
111
        TaxonDescription.NewInstance(taxon4).addElement(Distribution.NewInstance(denmark, PresenceAbsenceTerm.NATIVE()));
112
        TaxonDescription.NewInstance(taxon2).addElement(Distribution.NewInstance(france, PresenceAbsenceTerm.NATIVE()));
113

    
114
        node1 = classification1.addChildTaxon(taxon1, citation, microCitation);
115
        node1= taxonNodeDao.save(node1);
116

    
117
        node2 = classification1.addChildTaxon(taxon2, citation, microCitation);
118
        node2 = taxonNodeDao.save(node2);
119
        node3 = node1.addChildTaxon(taxon3, citation, microCitation);
120
        taxonNodeDao.save(node3);
121
        node4 = node3.addChildTaxon(taxon4, citation, microCitation);
122
        taxonNodeDao.save(node4);
123
        node5 = node3.addChildTaxon(taxon5, citation, microCitation);
124
        node5 = taxonNodeDao.save(node5);
125
        nodeUnpublished = node3.addChildTaxon(taxonUnpublished, citation, microCitation);
126
        nodeUnpublished = taxonNodeDao.save(nodeUnpublished);
127

    
128
        //MergeResult result = taxonNodeDao.merge(node5, true);
129
        //node5 = (TaxonNode) result.getMergedEntity();
130

    
131
        //taxonNodeDao.save(node5);
132

    
133

    
134

    
135
        classificationDao.save(classification1);
136

    
137

    
138
    }
139

    
140
    @Test
141
    public void testListUuidsByAreas() {
142
        String message = "wrong number of nodes filtered";
143

    
144
        NamedArea europe = HibernateProxyHelper.deproxy(termDao.load(europeUuid), NamedArea.class);
145
        NamedArea middleEurope = HibernateProxyHelper.deproxy(termDao.load(middleEuropeUuid), NamedArea.class);
146
        NamedArea africa = HibernateProxyHelper.deproxy(termDao.load(africaUuid), NamedArea.class);
147
        NamedArea germany = HibernateProxyHelper.deproxy(termDao.load(germanyUuid), NamedArea.class);
148

    
149
        TaxonNodeFilter filter = new TaxonNodeFilter(europe);
150
        List<UUID> listUuid = filterDao.listUuids(filter);
151
        assertEquals(message, 4, listUuid.size());
152
        Assert.assertTrue(listUuid.contains(node1.getUuid()));
153
        Assert.assertTrue(listUuid.contains(node2.getUuid()));
154
        Assert.assertTrue(listUuid.contains(node3.getUuid()));
155
        Assert.assertTrue(listUuid.contains(node4.getUuid()));
156

    
157
        filter = new TaxonNodeFilter(germany);
158
        listUuid = filterDao.listUuids(filter);
159
        assertEquals(message, 1, listUuid.size());
160
        Assert.assertTrue(listUuid.contains(node3.getUuid()));
161

    
162
        filter = new TaxonNodeFilter(middleEurope);
163
        listUuid = filterDao.listUuids(filter);
164
        assertEquals(message, 1, listUuid.size());
165
        Assert.assertTrue(listUuid.contains(node3.getUuid()));
166

    
167
        filter = new TaxonNodeFilter(africa);
168
        listUuid = filterDao.listUuids(filter);
169
        assertEquals(message, 0, listUuid.size());
170
    }
171

    
172
    @Test
173
    @DataSets({
174
        @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="/eu/etaxonomy/cdm/database/ClearDBDataSet.xml")
175
    })
176
    public void testListUuidsByRank() {
177
        String message = "wrong number of nodes filtered";
178
        TaxonNodeFilter filter = new TaxonNodeFilter();
179
        List<UUID> listUuid = filterDao.listUuids(filter);
180
        assertEquals(message, 5, listUuid.size());  //test start condition without rank filter
181

    
182
        filter = new TaxonNodeFilter(Rank.SPECIES(), Rank.GENUS());
183
        listUuid = filterDao.listUuids(filter);
184
        assertEquals(message, 2, listUuid.size());
185
        Assert.assertTrue(listUuid.contains(node1.getUuid()));
186
        Assert.assertTrue(listUuid.contains(node3.getUuid()));
187

    
188
        filter = new TaxonNodeFilter(Rank.SPECIES(), Rank.KINGDOM());
189
        listUuid = filterDao.listUuids(filter);
190
        assertEquals(message, 3, listUuid.size());
191
        Assert.assertTrue(listUuid.contains(node1.getUuid()));
192
        Assert.assertTrue(listUuid.contains(node2.getUuid()));
193
        Assert.assertTrue(listUuid.contains(node3.getUuid()));
194

    
195
        filter = new TaxonNodeFilter(Rank.FAMILY(), Rank.FAMILY());
196
        listUuid = filterDao.listUuids(filter);
197
        assertEquals(message, 1, listUuid.size());
198
        Assert.assertTrue(listUuid.contains(node2.getUuid()));
199

    
200
        filter = new TaxonNodeFilter(Rank.VARIETY(), Rank.SPECIES());
201
        listUuid = filterDao.listUuids(filter);
202
        assertEquals(message, 3, listUuid.size());
203
        Assert.assertTrue(listUuid.contains(node3.getUuid()));
204
        Assert.assertTrue(listUuid.contains(node4.getUuid()));
205
        Assert.assertTrue(listUuid.contains(node5.getUuid()));
206

    
207
        filter = new TaxonNodeFilter(Rank.KINGDOM(), Rank.ORDER());
208
        listUuid = filterDao.listUuids(filter);
209
        assertEquals(message, 0, listUuid.size());
210

    
211
        //reset
212
        Rank nullRank = null;
213
        filter.setRankMax(nullRank).setRankMin(nullRank);
214
        listUuid = filterDao.listUuids(filter);
215
        assertEquals("Reseting the rank filters should work", 5, listUuid.size());
216

    
217
        filter = new TaxonNodeFilter(Rank.KINGDOM(), Rank.ORDER());
218
        UUID nullUuid = null;
219
        filter.setRankMax(nullUuid).setRankMin(nullUuid);
220
        listUuid = filterDao.listUuids(filter);
221
        assertEquals("Reseting the rank filters should work", 5, listUuid.size());
222
    }
223

    
224
    @Test
225
    public void testListUuidsBySubtree() {
226
        Classification classification = classificationDao.findByUuid(classification1.getUuid());
227
        TaxonNodeFilter filter = new TaxonNodeFilter(node1);
228
        List<UUID> listUuid = filterDao.listUuids(filter);
229
//      List<TaxonNode> children = taxonNodeDao.listChildrenOf(node1, null, null, null, true);
230
        Assert.assertEquals("All 4 children should be returned", 4, listUuid.size());
231
        Assert.assertTrue(listUuid.contains(node4.getUuid()));
232
        Assert.assertFalse(listUuid.contains(node2.getUuid()));
233
        Assert.assertFalse(listUuid.contains(classification.getRootNode().getUuid()));
234

    
235
        filter = new TaxonNodeFilter(classification.getRootNode());
236
        listUuid = filterDao.listUuids(filter);
237
        Assert.assertEquals("All 5 children but not root node should be returned", 5, listUuid.size());
238

    
239
        filter.setIncludeRootNodes(true);
240
        listUuid = filterDao.listUuids(filter);
241
        Assert.assertEquals("All 6 children including root node should be returned", 6, listUuid.size());
242

    
243
        filter = new TaxonNodeFilter(node3);
244
        listUuid = filterDao.listUuids(filter);
245
        Assert.assertEquals("All 3 children should be returned", 3, listUuid.size());
246

    
247
        filter.orSubtree(node2);
248
        listUuid = filterDao.listUuids(filter);
249
        Assert.assertEquals("All 3 children and node 2 should be returned", 4, listUuid.size());
250
        Assert.assertTrue(listUuid.contains(node2.getUuid()));
251

    
252
        filter = new TaxonNodeFilter(node1).notSubtree(node4);
253
        listUuid = filterDao.listUuids(filter);
254
        Assert.assertEquals("Node and 2 children but not node4 should be returned", 3, listUuid.size());
255
        Assert.assertFalse(listUuid.contains(node4.getUuid()));
256

    
257
        //uuids
258
        filter = TaxonNodeFilter.NewSubtreeInstance(node3.getUuid());
259
        listUuid = filterDao.listUuids(filter);
260
        Assert.assertEquals("All 3 children should be returned", 3, listUuid.size());
261

    
262

    
263
        filter = TaxonNodeFilter.NewSubtreeInstance(taxon1.getUuid());
264
        listUuid = filterDao.listUuids(filter);
265
        Assert.assertEquals("A NON subtree uuid should not return a result", 0, listUuid.size());
266

    
267
    }
268

    
269
    @Test
270
    public void testIncludeUnpublished(){
271
        Classification classification = classificationDao.findByUuid(classification1.getUuid());
272
        TaxonNodeFilter filter = new TaxonNodeFilter(classification.getRootNode());
273
        List<UUID> listUuid = filterDao.listUuids(filter);
274
        Assert.assertEquals("All 5 children but not root node should be returned", 5, listUuid.size());
275

    
276
        filter.setIncludeUnpublished(true);
277
        listUuid = filterDao.listUuids(filter);
278
        Assert.assertEquals("All 6 children including unpublished should be returned", 6, listUuid.size());
279

    
280

    
281
        filter.setIncludeRootNodes(true);
282
        listUuid = filterDao.listUuids(filter);
283
        Assert.assertEquals("All 7 children including root node should be returned", 7, listUuid.size());
284

    
285
    }
286

    
287
    @Test
288
    public void testListUuidsByClassification() {
289
        Classification classification = classificationDao.findByUuid(classification1.getUuid());
290

    
291
        TaxonNodeFilter filter;
292
        List<UUID> listUuid;
293

    
294
        filter = new TaxonNodeFilter(classification);
295
        listUuid = filterDao.listUuids(filter);
296
        Assert.assertEquals("All 5 children but not root node should be returned", 5, listUuid.size());
297

    
298
        filter.setIncludeRootNodes(true);
299
        listUuid = filterDao.listUuids(filter);
300
        Assert.assertEquals("All 6 children including root node should be returned", 6, listUuid.size());
301

    
302
        filter = TaxonNodeFilter.NewClassificationInstance(classification.getUuid())
303
                .setIncludeRootNodes(true);
304
        listUuid = filterDao.listUuids(filter);
305
        Assert.assertEquals("All 6 children should be returned", 6, listUuid.size());
306

    
307
        filter = TaxonNodeFilter.NewClassificationInstance(taxon1.getUuid());
308
        listUuid = filterDao.listUuids(filter);
309
        Assert.assertEquals("A NON classification uuid should not return a result", 0, listUuid.size());
310

    
311
    }
312

    
313
    @Test
314
    public void testListUuidsByTaxon() {
315

    
316
        TaxonNodeFilter filter;
317
        List<UUID> listUuid;
318

    
319
        filter = TaxonNodeFilter.NewTaxonInstance(taxon1);
320
        listUuid = filterDao.listUuids(filter);
321
        Assert.assertEquals("The 1 taxon should be returned", 1, listUuid.size());
322

    
323
        filter = TaxonNodeFilter.NewTaxonInstance(taxon1.getUuid());
324
        listUuid = filterDao.listUuids(filter);
325
        Assert.assertEquals("The 1 taxon should be returned", 1, listUuid.size());
326

    
327
        filter = TaxonNodeFilter.NewTaxonInstance(taxon1.getUuid()).orTaxon(taxon2.getUuid());
328
        listUuid = filterDao.listUuids(filter);
329
        Assert.assertEquals("The 2 taxa should be returned", 2, listUuid.size());
330

    
331
        filter = TaxonNodeFilter.NewTaxonInstance(node1.getUuid());
332
        listUuid = filterDao.listUuids(filter);
333
        Assert.assertEquals("A NON taxon uuid should not return a result", 0, listUuid.size());
334
    }
335

    
336
    @Test
337
    public void testListUuidsByTaxonNode() {
338

    
339
        TaxonNodeFilter filter;
340
        List<UUID> listUuid;
341

    
342
        filter = TaxonNodeFilter.NewTaxonNodeInstance(node1);
343
        listUuid = filterDao.listUuids(filter);
344
        Assert.assertEquals("The 1 taxon should be returned", 1, listUuid.size());
345

    
346
        filter = TaxonNodeFilter.NewTaxonNodeInstance(node1.getUuid());
347
        listUuid = filterDao.listUuids(filter);
348
        Assert.assertEquals("The 1 nodes should be returned", 1, listUuid.size());
349

    
350
        filter = TaxonNodeFilter.NewTaxonNodeInstance(node1.getUuid())
351
                .orTaxonNode(node2.getUuid());
352
        listUuid = filterDao.listUuids(filter);
353
        Assert.assertEquals("The 2 nodes should be returned", 2, listUuid.size());
354

    
355
        filter = TaxonNodeFilter.NewTaxonNodeInstance(taxon1.getUuid());
356
        listUuid = filterDao.listUuids(filter);
357
        Assert.assertEquals("A NON taxon node uuid should not return a result", 0, listUuid.size());
358

    
359
    }
360

    
361
    @Test
362
    public void testListUuidsCombined() {
363
        Classification classification = classificationDao.findByUuid(classification1.getUuid());
364
        TaxonNodeFilter filter = new TaxonNodeFilter(node1);
365
        List<UUID> listUuid = filterDao.listUuids(filter);
366
        Assert.assertEquals("All 4 children should be returned", 4, listUuid.size());
367

    
368
        filter.orClassification(classification.getUuid());
369
        listUuid = filterDao.listUuids(filter);
370
        Assert.assertEquals("Still 4 children should be returned", 4, listUuid.size());
371

    
372
        filter.orTaxon(taxon3).orTaxon(taxon4);
373
        listUuid = filterDao.listUuids(filter);
374
        Assert.assertEquals("The 2 children should be returned", 2, listUuid.size());
375

    
376
        filter.orTaxonNode(node3.getUuid());
377
        listUuid = filterDao.listUuids(filter);
378
        Assert.assertEquals("1 node should remain", 1, listUuid.size());
379

    
380
        //New
381
        filter = new TaxonNodeFilter(node1);  //4 children, see above
382
        filter.orClassification(classification.getUuid());//4 children, see above
383

    
384
        filter.setRankMax(Rank.uuidSpecies);
385
        listUuid = filterDao.listUuids(filter);
386
        Assert.assertEquals("3 children should be returned", 3, listUuid.size());
387

    
388
        filter.setRankMin(Rank.uuidSpecies);
389
        listUuid = filterDao.listUuids(filter);
390
        Assert.assertEquals("Only species should be returned", 1, listUuid.size());
391

    
392
        Rank nullRank = null;
393
        filter.setRankMin(nullRank);
394
        filter.setIncludeUnpublished(true);
395
        listUuid = filterDao.listUuids(filter);
396
        Assert.assertEquals("4 children should be returned, including unpublished", 4, listUuid.size());
397

    
398
        NamedArea germany = HibernateProxyHelper.deproxy(termDao.load(germanyUuid), NamedArea.class);
399
        filter.orArea(germany);
400
        listUuid = filterDao.listUuids(filter);
401
        Assert.assertEquals("1 child should be returned", 1, listUuid.size());
402
    }
403

    
404
    @Test
405
    public void testCountBySubtree() {
406
        Classification classification = classificationDao.findByUuid(classification1.getUuid());
407
        TaxonNodeFilter filter = new TaxonNodeFilter(node1);
408
        long n = filterDao.count(filter);
409
        Assert.assertEquals("All 4 children should be returned", 4, n);
410

    
411
        filter = new TaxonNodeFilter(classification.getRootNode());
412
        n = filterDao.count(filter);
413
        Assert.assertEquals("All 5 children but not root node should be returned", 5, n);
414

    
415
        filter.setIncludeRootNodes(true);
416
        n = filterDao.count(filter);
417
        Assert.assertEquals("All 6 children including root node should be returned", 6, n);
418

    
419
    }
420

    
421

    
422

    
423
    @Override
424
    public void createTestDataSet() throws FileNotFoundException {}
425

    
426
}
(5-5/5)