Project

General

Profile

« Previous | Next » 

Revision f5295f3f

Added by Andreas Kohlbecker almost 8 years ago

#4366 Transmissionengine aggregation of source references

View differences:

cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/OriginalSourceBase.java
150 150
		}
151 151
	}
152 152

  
153
//*********************************** EQUALS *********************************************************/
154

  
155
	/**
156
     * {@inheritDoc}
157
     */
158
    @Override
159
    public boolean equalsByShallowCompare(ReferencedEntityBase other) {
160

  
161
        if(!super.equalsByShallowCompare(other)) {
162
            return false;
163
        }
164
        OriginalSourceBase<T> theOther = (OriginalSourceBase<T>)other;
165
        if(!StringUtils.equals(this.getIdInSource(), theOther.getIdInSource())
166
                || !StringUtils.equals(this.getIdNamespace(), theOther.getIdNamespace())) {
167
            return false;
168
        }
169

  
170
        return true;
171
    }
172

  
153 173
}
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/ReferencedEntityBase.java
21 21
import javax.xml.bind.annotation.XmlSchemaType;
22 22
import javax.xml.bind.annotation.XmlType;
23 23

  
24
import org.apache.commons.lang.StringUtils;
24 25
import org.apache.log4j.Logger;
25 26
import org.hibernate.annotations.Cascade;
26 27
import org.hibernate.annotations.CascadeType;
......
118 119
		return result;
119 120
	}
120 121

  
122
//*********************************** EQUALS *********************************************************/
123

  
124
	/**
125
	 * Indicates whether some other object is "equal to" this one.
126
	 *
127
	 * Uses a content based compare strategy which avoids bean initialization. This is achieved by
128
	 * comparing the cdm entity ids.
129
	 *
130
	 * @param other
131
	 * @return
132
	 */
133
	public boolean equalsByShallowCompare(ReferencedEntityBase other) {
134

  
135
        if(this.getCitation().getId() != other.getCitation().getId()
136
                || !StringUtils.equals(this.getCitationMicroReference(), other.getCitationMicroReference())
137
                || !StringUtils.equals(this.getOriginalNameString(), other.getOriginalNameString())
138
                        ){
139
            return false;
140
        }
141

  
142
        return true;
143
    }
144

  
145

  
121 146
}
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/description/DescriptionElementSource.java
25 25

  
26 26
import eu.etaxonomy.cdm.model.common.OriginalSourceBase;
27 27
import eu.etaxonomy.cdm.model.common.OriginalSourceType;
28
import eu.etaxonomy.cdm.model.common.ReferencedEntityBase;
28 29
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
29 30
import eu.etaxonomy.cdm.model.reference.Reference;
30 31

  
......
163 164
		return result;
164 165
	}
165 166

  
167
//*********************************** EQUALS *********************************************************/
168

  
169
    /**
170
     * {@inheritDoc}
171
     */
172
    @Override
173
    public boolean equalsByShallowCompare(ReferencedEntityBase other) {
174

  
175
	    if(!super.equalsByShallowCompare(other)) {
176
	        return false;
177
	    }
178

  
179
	    int a = -1;
180
	    int b = -1;
181
	    if(this.getNameUsedInSource() != null) {
182
	        a = this.getNameUsedInSource().getId();
183
	    }
184
	    DescriptionElementSource otherDescriptionElementSource = (DescriptionElementSource)other;
185
        if(otherDescriptionElementSource.getNameUsedInSource() != null) {
186
            b = otherDescriptionElementSource.getNameUsedInSource().getId();
187
        }
188
	    return a == b;
189
	}
166 190

  
167 191

  
168 192
}
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/description/TransmissionEngineDistribution.java
19 19
import java.util.Set;
20 20
import java.util.UUID;
21 21

  
22
import org.apache.log4j.Level;
23 22
import org.apache.log4j.Logger;
24 23
import org.hibernate.FlushMode;
25 24
import org.hibernate.HibernateException;
......
244 243
     *
245 244
     * @param a
246 245
     * @param b
246
     * @param sourcesForWinnerB
247
     *  In the case when <code>b</code> is preferred over <code>a</code> these Set of sources will be added to the sources of <code>b</code>
247 248
     * @return
248 249
     */
249
    private StatusAndSources choosePreferred(StatusAndSources a, StatusAndSources b){
250
    private StatusAndSources choosePreferred(StatusAndSources a, StatusAndSources b, Set<DescriptionElementSource> sourcesForWinnerB){
250 251

  
251 252
        if (statusPriorityMap == null) {
252 253
            initializeStatusPriorityMap();
......
268 269
            return a;
269 270
        }
270 271
        if(statusPriorityMap.get(a.status) < statusPriorityMap.get(b.status)){
272
            if(sourcesForWinnerB != null) {
273
                b.addSources(sourcesForWinnerB);
274
            }
271 275
            return b;
272 276
        } else if (statusPriorityMap.get(a.status) == statusPriorityMap.get(b.status)){
273
            a.sources.addAll(b.sources);
277
            a.addSources(b.sources);
274 278
            return a;
275 279
        } else {
276 280
            return a;
......
335 339

  
336 340

  
337 341
        // only for debugging:
338
        logger.setLevel(Level.DEBUG); // TRACE will slow down a lot since it forces loading all term representations
342
        //logger.setLevel(Level.TRACE); // TRACE will slow down a lot since it forces loading all term representations
339 343
        //Logger.getLogger("org.hibernate.SQL").setLevel(Level.DEBUG);
340 344

  
341 345
        logger.info("Hibernate JDBC Batch size: "
......
481 485
                                    continue;
482 486
                                }
483 487
                                StatusAndSources subStatusAndSources = new StatusAndSources(status, distribution.getSources());
484
                                accumulatedStatusAndSources = choosePreferred(accumulatedStatusAndSources, subStatusAndSources);
488
                                accumulatedStatusAndSources = choosePreferred(accumulatedStatusAndSources, subStatusAndSources, null);
485 489
                            }
486 490
                        }
487 491
                    } // next sub area
......
491 495
                        }
492 496
                        // store new distribution element for superArea in taxon description
493 497
                        Distribution newDistribitionElement = Distribution.NewInstance(superArea, accumulatedStatusAndSources.status);
498
                        newDistribitionElement.getSources().addAll(accumulatedStatusAndSources.sources);
494 499
                        newDistribitionElement.addMarker(Marker.NewInstance(MarkerType.COMPUTED(), true));
495 500
                        description.addElement(newDistribitionElement);
496 501
                    }
......
520 525
    }
521 526

  
522 527
   /**
523
    * Step 2: Accumulate by ranks staring from lower rank to upper rank, the status of all children
528
    * Step 2: Accumulate by ranks starting from lower rank to upper rank, the status of all children
524 529
    * are accumulated on each rank starting from lower rank to upper rank.
525 530
    * <ul>
526 531
    * <li>aggregate distribution of included taxa of the next lower rank for any rank level starting from the lower rank (e.g. sub species)
......
566 571
            while (taxonIdIterator.hasNext()) {
567 572

  
568 573
                if(txStatus == null) {
569
                    // transaction has been comitted at the end of this batch, start a new one
574
                    // transaction has been committed at the end of this batch, start a new one
570 575
                    txStatus = startTransaction(false);
571 576
                }
572 577

  
......
624 629
                                }
625 630

  
626 631
                                StatusAndSources subStatusAndSources = new StatusAndSources(status, distribution.getSources());
627
                                accumulatedStatusMap.put(area, choosePreferred(accumulatedStatusMap.get(area), subStatusAndSources));
632
                                accumulatedStatusMap.put(area, choosePreferred(accumulatedStatusMap.get(area), subStatusAndSources, null));
628 633
                             }
629 634
                        }
630 635

  
631 636
                        if(accumulatedStatusMap.size() > 0) {
632 637
                            TaxonDescription description = findComputedDescription(taxon, doClearDescriptions);
633 638
                            for (NamedArea area : accumulatedStatusMap.keySet()) {
634
                                // store new distribution element in new Description
635
                                Distribution newDistribitionElement = Distribution.NewInstance(area, accumulatedStatusMap.get(area).status);
636
                                newDistribitionElement.addMarker(Marker.NewInstance(MarkerType.COMPUTED(), true));
637
                                description.addElement(newDistribitionElement);
639
                                Distribution distribition = findDistribution(description, area, accumulatedStatusMap.get(area).status);
640
                                if(distribition == null) {
641
                                    // create a new distribution element
642
                                    distribition = Distribution.NewInstance(area, accumulatedStatusMap.get(area).status);
643
                                    distribition.addMarker(Marker.NewInstance(MarkerType.COMPUTED(), true));
644
                                }
645
                                addSourcesDeduplicated(distribition.getSources(), accumulatedStatusMap.get(area).sources);
646

  
647
                                description.addElement(distribition);
638 648
                            }
639 649
                            taxonService.saveOrUpdate(taxon);
640 650
                            descriptionService.saveOrUpdate(description);
......
670 680
        subMonitor.done();
671 681
    }
672 682

  
683
/**
684
 * @param description
685
 * @param area
686
 * @param status
687
 * @return
688
 */
689
private Distribution findDistribution(TaxonDescription description, NamedArea area, PresenceAbsenceTerm status) {
690
    for(DescriptionElementBase item : description.getElements()) {
691
        if(!(item instanceof Distribution)) {
692
            continue;
693
        }
694
        Distribution distribution = ((Distribution)item);
695
        if(distribution.getArea().equals(area) && distribution.getStatus().equals(status)) {
696
            return distribution;
697
        }
698
    }
699
    return null;
700
}
701

  
673 702
/**
674 703
 * @param lowerRank
675 704
 * @param upperRank
......
927 956
        commitTransaction(txStatus);
928 957
    }
929 958

  
959
    public static void addSourcesDeduplicated(Set<DescriptionElementSource> target, Set<DescriptionElementSource> sources) {
960
        for(DescriptionElementSource source : sources) {
961
            boolean contained = false;
962
            for(DescriptionElementSource existingSource: target) {
963
                if(existingSource.equalsByShallowCompare(source)) {
964
                    contained = true;
965
                    break;
966
                }
967
            }
968
            if(!contained) {
969
                try {
970
                    target.add((DescriptionElementSource)source.clone());
971
                } catch (CloneNotSupportedException e) {
972
                    // should never happen
973
                    throw new RuntimeException(e);
974
                }
975
            }
976
        }
977
    }
978

  
930 979
    public enum AggregationMode {
931 980
        byAreas,
932 981
        byRanks,
......
936 985

  
937 986
    private class StatusAndSources {
938 987

  
939
        PresenceAbsenceTerm status;
988
        private final PresenceAbsenceTerm status;
940 989

  
941
        Set<DescriptionElementSource> sources = new HashSet<>();
990
        private final Set<DescriptionElementSource> sources = new HashSet<>();
942 991

  
943 992
        public StatusAndSources(PresenceAbsenceTerm status, Set<DescriptionElementSource> sources) {
944 993
            this.status = status;
945
            this.sources = sources;
994
            addSourcesDeduplicated(this.sources, sources);
946 995
        }
996

  
997
        /**
998
         * @param sources
999
         */
1000
        public void addSources(Set<DescriptionElementSource> sources) {
1001
            addSourcesDeduplicated(this.sources, sources);
1002
        }
1003

  
947 1004
    }
948 1005
}
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/TransmissionEngineDistributionTest.java
12 12
import static org.junit.Assert.assertEquals;
13 13
import static org.junit.Assert.assertNotNull;
14 14
import static org.junit.Assert.assertNull;
15
import static org.junit.Assert.assertTrue;
15 16

  
16 17
import java.io.FileNotFoundException;
17 18
import java.util.Arrays;
19
import java.util.Collection;
20
import java.util.HashSet;
21
import java.util.Iterator;
18 22
import java.util.List;
19 23
import java.util.Set;
20 24
import java.util.UUID;
......
53 57
 */
54 58
public class TransmissionEngineDistributionTest extends CdmTransactionalIntegrationTest {
55 59

  
56
    @SuppressWarnings("unused")
57 60
    private static Logger logger = Logger.getLogger(TransmissionEngineDistributionTest.class);
58 61

  
59 62
    private static final UUID T_LAPSANA_UUID = UUID.fromString("f65d47bd-4f49-4ab1-bc4a-bc4551eaa1a8");
......
105 108

  
106 109
    private Classification classification;
107 110

  
111
    private Reference book_a = null;
112
    private Reference book_b = null;
113

  
108 114

  
109 115
    @Before
110 116
    public void setUp() {
......
124 130
        yug_ma = termService.getAreaByTdwgAbbreviation("YUG-MA");
125 131
        yug_mn = termService.getAreaByTdwgAbbreviation("YUG-MN");
126 132

  
133
        book_a = ReferenceFactory.newBook();
134
        book_a.setTitle("book_a");
135
        book_b = ReferenceFactory.newBook();
136
        book_b.setTitle("book_a");
137

  
127 138
        engine.updatePriorities();
128 139
    }
129 140

  
......
146 157

  
147 158
        addDistributions(
148 159
                T_LAPSANA_COMMUNIS_ALPINA_UUID,
149
                new Distribution[] {
160
                Arrays.asList(new Distribution[] {
150 161
                        // should succeed during area aggregation be ignored by rank aggregation
151 162
                        // => yug will get status ENDEMIC_FOR_THE_RELEVANT_AREA
152 163
                        //    but only for LAPSANA_COMMUNIS_ALPINA
......
154 165
                        // should be ignored by area aggregation
155 166
                        // => LAPSANA_COMMUNIS will wave distribution with yug_ko and INTRODUCED_FORMERLY_INTRODUCED
156 167
                        Distribution.NewInstance(yug_ko, PresenceAbsenceTerm.INTRODUCED_FORMERLY_INTRODUCED()),
157
               }
168
               })
158 169
            );
159 170

  
160 171
        engine.accumulate(AggregationMode.byAreasAndRanks, superAreas, lowerRank, upperRank, null, null);
......
186 197
    })
187 198
    public void testArea_area() {
188 199

  
189
        Distribution[] distributions = new Distribution[4];
190

  
191
        Reference book_LCA_yug_mn = ReferenceFactory.newBook();
192
        book_LCA_yug_mn.setTitle("LCA_yug_mn");
193
        DescriptionElementSource.NewPrimarySourceInstance(book_LCA_yug_mn, "1");
194
        distributions[0] = Distribution.NewInstance(yug_mn, PresenceAbsenceTerm.CULTIVATED());
200
        Set<Distribution> distributions_LCA = new HashSet<>();
195 201

  
196
        Reference book_LCA_yug_ko = ReferenceFactory.newBook();
197
        book_LCA_yug_mn.setTitle("LCA_yug_ko");
198
        DescriptionElementSource.NewPrimarySourceInstance(book_LCA_yug_ko, "2");
199
        distributions[1] = Distribution.NewInstance(yug_ko, PresenceAbsenceTerm.NATIVE()); // NATIVE should succeed
200

  
201
        Reference book_LCA_yug_bh = ReferenceFactory.newBook();
202
        book_LCA_yug_mn.setTitle("LCA_yug_bh");
203
        DescriptionElementSource.NewPrimarySourceInstance(book_LCA_yug_bh, "3");
204
        distributions[2] = Distribution.NewInstance(yug_bh, PresenceAbsenceTerm.INTRODUCED());
205

  
206
        Reference book_LCA_yug_ma = ReferenceFactory.newBook();
207
        book_LCA_yug_mn.setTitle("LCA_yug_ma");
208
        DescriptionElementSource.NewPrimarySourceInstance(book_LCA_yug_ma, "4");
209
        distributions[3] = Distribution.NewInstance(yug_ma, PresenceAbsenceTerm.NATIVE()); // NATIVE should succeed
202
        distributions_LCA.add(newDistribution(book_a, yug_mn, PresenceAbsenceTerm.CULTIVATED(), "1"));
203
        distributions_LCA.add(newDistribution(book_a, yug_ko, PresenceAbsenceTerm.NATIVE(), "2")); // NATIVE should succeed
204
        distributions_LCA.add(newDistribution(book_a, yug_bh, PresenceAbsenceTerm.INTRODUCED(), "3"));
205
        distributions_LCA.add(newDistribution(book_a, yug_ma, PresenceAbsenceTerm.NATIVE(), "4")); // NATIVE should succeed
210 206

  
211 207
        addDistributions(
212 208
                T_LAPSANA_COMMUNIS_ALPINA_UUID,
213
                distributions
209
                distributions_LCA
214 210
            );
215 211

  
216 212
        Taxon lapsana_communis_alpina  = (Taxon) taxonService.load(T_LAPSANA_COMMUNIS_ALPINA_UUID);
......
225 221
        for (TaxonDescription description : lapsana_communis_alpina.getDescriptions()) {
226 222
            if(description.hasMarker(MarkerType.COMPUTED(), true)) {
227 223
                assertNull("only one computed Distribution should exists", accumulatedDistribution);
228
                assertEquals("the computed Decription should have only one element", 1, description.getElements().size());
224
                assertEquals("the computed Decsription should have only one element", 1, description.getElements().size());
229 225
                accumulatedDistribution = (Distribution) description.getElements().iterator().next();
230 226
                assertEquals("Expecting area to be YUG", yug, accumulatedDistribution.getArea());
231 227
                assertEquals("Expecting status to be NATIVE", PresenceAbsenceTerm.NATIVE().getLabel(), accumulatedDistribution.getStatus().getLabel());
232 228
            }
233 229
        }
234 230
        assertNotNull("The area YUG should have been found", accumulatedDistribution);
235
//        assertEquals("Expecting two source references", accumulatedDistribution.getSources().size());
236
//        assertTrue(accumulatedDistribution.getSources().contains(book_LCA_yug_ko));
237
//        assertTrue(accumulatedDistribution.getSources().contains(book_LCA_yug_ma));
231
        assertEquals("Expecting two source references", 2, accumulatedDistribution.getSources().size());
232
        Iterator<DescriptionElementSource> sourceIt = accumulatedDistribution.getSources().iterator();
233
        // should contain source_LCA_yug_ma and source_LCA_yug_ko, testing the microreference which is unique in the tests
234
        assertTrue(" 2  4 ".contains(" " + sourceIt.next().getCitationMicroReference() + " "));
235
        assertTrue(" 2  4 ".contains(" " + sourceIt.next().getCitationMicroReference() + " "));
238 236
    }
239 237

  
240 238
    @Test
241 239
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
242
    public void testArea_rank_and_area() {
240
    public void testArea_rank_and_area_1() {
241

  
242
        Set<Distribution> distributions_LCA = new HashSet<>();
243
        distributions_LCA.add(newDistribution(book_a, yug_mn, PresenceAbsenceTerm.CULTIVATED(), "1"));
244
        distributions_LCA.add(newDistribution(book_a, yug_ko, PresenceAbsenceTerm.NATIVE(), "2")); // NATIVE should succeed
243 245

  
244 246
        addDistributions(
245 247
                T_LAPSANA_COMMUNIS_ALPINA_UUID,
246
                new Distribution[] {
247
                        Distribution.NewInstance(yug_mn, PresenceAbsenceTerm.CULTIVATED()),
248
                        Distribution.NewInstance(yug_ko, PresenceAbsenceTerm.NATIVE()), // should succeed
249
               }
248
                distributions_LCA
250 249
            );
250

  
251
        Set<Distribution> distributions_LC = new HashSet<>();
252
        distributions_LC.add(newDistribution(book_a, yug_mn, PresenceAbsenceTerm.CULTIVATED(), "3"));
253
        distributions_LC.add(newDistribution(book_a, yug_ko, PresenceAbsenceTerm.NATIVE(), "4")); // NATIVE should succeed
254

  
255
        commitAndStartNewTransaction(null);
256

  
251 257
        addDistributions(
252 258
                T_LAPSANA_COMMUNIS_UUID,
253
                new Distribution[] {
254
                        Distribution.NewInstance(yug_mn, PresenceAbsenceTerm.INTRODUCED_UNCERTAIN_DEGREE_OF_NATURALISATION()),
255
                        Distribution.NewInstance(yug_ko, PresenceAbsenceTerm.CULTIVATED()),
256
               }
259
                distributions_LC
257 260
            );
258 261

  
259 262
        engine.accumulate(AggregationMode.byAreasAndRanks, superAreas, lowerRank, upperRank, null, null);
260 263

  
261 264
        Taxon lapsana_communis  = (Taxon) taxonService.load(T_LAPSANA_COMMUNIS_UUID);
262
        assertEquals(2, lapsana_communis.getDescriptions().size());
265
        assertEquals("Lapsana communis alpina must only have 2 Descriptions", 2, lapsana_communis.getDescriptions().size());
263 266

  
264 267
        Taxon lapsana = (Taxon) taxonService.load(T_LAPSANA_UUID);
265
        assertEquals(1, lapsana.getDescriptions().size());
268
        assertEquals("Lapsana communis must only have 1 Description", 1, lapsana.getDescriptions().size());
266 269
        TaxonDescription description = lapsana.getDescriptions().iterator().next();
270
        assertTrue(description.hasMarker(MarkerType.COMPUTED(), true));
267 271
        assertEquals(3, description.getElements().size());
268 272
        int numExpectedFound = 0;
269 273
        for (DescriptionElementBase element : description.getElements()){
......
271 275
            if(distribution.getArea().equals(yug)){
272 276
                numExpectedFound++;
273 277
                assertEquals("aggregated status of area YUG is wrong", PresenceAbsenceTerm.NATIVE().getLabel(), distribution.getStatus().getLabel());
278
                assertEquals(2, distribution.getSources().size());
279
                Iterator<DescriptionElementSource> sourceIt = distribution.getSources().iterator();
280
                // should contain source_LCA_yug_ma and source_LCA_yug_ko, testing the microreference which is unique in the tests
281
                assertTrue(" 2  4 ".contains(" " + sourceIt.next().getCitationMicroReference() + " "));
282
                assertTrue(" 2  4 ".contains(" " + sourceIt.next().getCitationMicroReference() + " "));
274 283
            }
275 284
            if(distribution.getArea().equals(yug_mn)){
276 285
                numExpectedFound++;
277 286
                assertEquals("aggregated status of area YUG-MN is wrong", PresenceAbsenceTerm.CULTIVATED().getLabel(), distribution.getStatus().getLabel());
287
                assertEquals(2, distribution.getSources().size());
288
                Iterator<DescriptionElementSource> sourceIt = distribution.getSources().iterator();
289
                // should contain source_LCA_yug_ma and source_LCA_yug_ko, testing the microreference which is unique in the tests
290
                assertTrue(" 1  3 ".contains(" " + sourceIt.next().getCitationMicroReference() + " "));
291
                assertTrue(" 1  3 ".contains(" " + sourceIt.next().getCitationMicroReference() + " "));
278 292
            }
279 293
            if(distribution.getArea().equals(yug_ko)){
280 294
                numExpectedFound++;
281 295
                assertEquals("aggregated status of area YUG-KO wrong", PresenceAbsenceTerm.NATIVE().getLabel(), distribution.getStatus().getLabel());
296
                assertEquals(2, distribution.getSources().size());
297
                Iterator<DescriptionElementSource> sourceIt = distribution.getSources().iterator();
298
                // should contain source_LCA_yug_ma and source_LCA_yug_ko, testing the microreference which is unique in the tests
299
                assertTrue(" 2  4 ".contains(" " + sourceIt.next().getCitationMicroReference() + " "));
300
                assertTrue(" 2  4 ".contains(" " + sourceIt.next().getCitationMicroReference() + " "));
282 301
            }
283 302
        }
284 303
        assertEquals("All three expected areas should have been found before", numExpectedFound, 3);
285 304
    }
286 305

  
306
    /**
307
     * Variant of {@link #testArea_rank_and_area_1()} with alternate source references to check the
308
     * suppression of duplicates.
309
     *
310
     * This test relies on {@link #testArea_rank_and_area_1()}
311
     * an makes assertions only on the alternative source references
312
     */
313
    @Test
314
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
315
    public void testArea_rank_and_area_2() {
316

  
317
        Set<Distribution> distributions_LCA = new HashSet<Distribution>();
318
        distributions_LCA.add(newDistribution(book_a, yug_ko, PresenceAbsenceTerm.NATIVE(), "1"));
319
        distributions_LCA.add(newDistribution(book_b, yug_ko, PresenceAbsenceTerm.NATIVE(), "2"));
320

  
321
        addDistributions(
322
                T_LAPSANA_COMMUNIS_ALPINA_UUID,
323
                distributions_LCA
324
            );
325

  
326

  
327
        engine.accumulate(AggregationMode.byAreasAndRanks, superAreas, lowerRank, upperRank, null, null);
328

  
329
        Taxon lapsana_communis = (Taxon) taxonService.load(T_LAPSANA_COMMUNIS_UUID);
330
        int computedDescriptionsCnt = 0;
331
        for(TaxonDescription description : lapsana_communis.getDescriptions()) {
332
            if(description.hasMarker(MarkerType.COMPUTED(), true)) {
333
                computedDescriptionsCnt++;
334
                assertEquals(2, description.getElements().size()); // yug, yug_ko
335
                for(DescriptionElementBase distribution : description.getElements()) {
336
                    logger.debug(((Distribution)distribution).getArea() + " " + sourcesToString(distribution));
337
                    if(((Distribution)distribution).getArea().equals(yug_ko)){
338
                        assertEquals(2, distribution.getSources().size());
339
                    }
340
                    if(((Distribution)distribution).getArea().equals(yug)){
341
                        assertEquals(2, distribution.getSources().size());
342
                    }
343
                }
344
            }
345
        }
346
        assertEquals(1, computedDescriptionsCnt);
347
    }
348

  
349

  
350
    /**
351
     * Variant of {@link #testArea_rank_and_area_1()} with alternate source references to check the
352
     * suppression of duplicates.
353
     *
354
     * This test relies on {@link #testArea_rank_and_area_1()}
355
     * an makes assertions only on the alternative source references
356
     */
357
    @Test
358
    @DataSets({
359
        @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="/eu/etaxonomy/cdm/database/ClearDB_with_Terms_DataSet.xml"),
360
        @DataSet(value="/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml"),
361
        @DataSet(value="TransmissionEngineDistributionTest.xml"),
362
    })
363
    public void testArea_rank_and_area_3() {
364

  
365
        Set<Distribution> distributions_LCA = new HashSet<Distribution>();
366
        distributions_LCA.add(newDistribution(book_a, yug_ko, PresenceAbsenceTerm.NATIVE(), "1"));
367
        distributions_LCA.add(newDistribution(book_a, yug_ko, PresenceAbsenceTerm.NATIVE(), "3"));
368

  
369
        addDistributions(
370
                T_LAPSANA_COMMUNIS_ALPINA_UUID,
371
                distributions_LCA
372
            );
373

  
374
        Set<Distribution> distributions_LC = new HashSet<>();
375
        distributions_LC.add(newDistribution(book_a, yug_ko, PresenceAbsenceTerm.NATIVE(), "1"));
376
        distributions_LC.add(newDistribution(book_b, yug_ko, PresenceAbsenceTerm.NATIVE(), "2"));
377

  
378
        commitAndStartNewTransaction(null);
379

  
380
        addDistributions(
381
                T_LAPSANA_COMMUNIS_UUID,
382
                distributions_LC
383
            );
384

  
385
        engine.accumulate(AggregationMode.byAreasAndRanks, superAreas, lowerRank, upperRank, null, null);
386

  
387
        Taxon lapsana_communis = (Taxon) taxonService.load(T_LAPSANA_COMMUNIS_UUID);
388
        int computedDescriptionsCnt = 0;
389
        for(TaxonDescription description : lapsana_communis.getDescriptions()) {
390
            if(description.hasMarker(MarkerType.COMPUTED(), true)) {
391
                computedDescriptionsCnt++;
392
                assertEquals(2, description.getElements().size());
393
                for(DescriptionElementBase distribution : description.getElements()) {
394
                    logger.debug(((Distribution)distribution).getArea() + " " + sourcesToString(distribution));
395
                    if(((Distribution)distribution).getArea().equals(yug_ko)){
396
                        assertEquals(2, distribution.getSources().size());
397
                    }
398
                    if(((Distribution)distribution).getArea().equals(yug)){
399
                        assertEquals(3, distribution.getSources().size());
400
                    }
401
                }
402
            }
403
        }
404
        assertEquals(1, computedDescriptionsCnt);
405
    }
406

  
407
    /**
408
     * Variant of {@link #testArea_rank_and_area_1()} with alternate source references to
409
     * check the handling of the case where the target taxon already has the distribution which is the
410
     * result of the aggregation (see http://dev.e-taxonomy.eu/trac/ticket/4366#comment:12)
411
     *
412
     * This test relies on {@link #testArea_rank_and_area_1()}
413
     * an makes assertions only on the alternative source references
414
     */
415
    @Test
416
    @DataSets({
417
        @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="/eu/etaxonomy/cdm/database/ClearDB_with_Terms_DataSet.xml"),
418
        @DataSet(value="/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml"),
419
        @DataSet(value="TransmissionEngineDistributionTest.xml"),
420
    })
421
    public void testArea_rank_and_area_4() {
422

  
423
        Set<Distribution> distributions_LCA = new HashSet<>();
424
        distributions_LCA.add(newDistribution(book_a, yug_ko, PresenceAbsenceTerm.NATIVE(), "1"));
425

  
426
        addDistributions(
427
                T_LAPSANA_COMMUNIS_ALPINA_UUID,
428
                distributions_LCA
429
            );
430

  
431
        Set<Distribution> distributions_LC = new HashSet<>();
432
        distributions_LC.add(newDistribution(book_a, yug, PresenceAbsenceTerm.NATIVE(), "2")); //  should succeed
433

  
434
        commitAndStartNewTransaction(null);
435

  
436
        addDistributions(
437
                T_LAPSANA_COMMUNIS_UUID,
438
                distributions_LC
439
            );
440

  
441
        engine.accumulate(AggregationMode.byAreasAndRanks, superAreas, lowerRank, upperRank, null, null);
442

  
443
        Taxon lapsana_communis = (Taxon) taxonService.load(T_LAPSANA_COMMUNIS_UUID);
444
        int computedDescriptionsCnt = 0;
445
        for(TaxonDescription description : lapsana_communis.getDescriptions()) {
446
            if(description.hasMarker(MarkerType.COMPUTED(), true)) {
447
                computedDescriptionsCnt++;
448
                assertEquals(2, description.getElements().size());
449
                Distribution distribution = (Distribution)description.getElements().iterator().next();
450
                if(distribution.getArea().equals(yug_ko)){
451
                    assertEquals(2, distribution.getSources().size());
452
                    DescriptionElementSource source = distribution.getSources().iterator().next();
453
                    assertEquals("2", source.getCitationMicroReference());
454
                }
455
            }
456
        }
457
        assertEquals(1, computedDescriptionsCnt);
458
    }
459

  
460
    /**
461
     * @param referenceTitle
462
     * @param area
463
     * @param status
464
     * @param microCitation
465
     * @return
466
     */
467
    private Distribution newDistribution(Reference reference, NamedArea area, PresenceAbsenceTerm status,
468
            String microCitation) {
469
        DescriptionElementSource source = DescriptionElementSource.NewPrimarySourceInstance(reference, microCitation);
470
        Distribution distribution = Distribution.NewInstance(area, status);
471
        distribution.getSources().add(source);
472
        return distribution;
473
    }
474

  
287 475
    /**
288 476
     * creates a new description for the taxon identified by the UUIDs
289 477
     * @param taxonUuid
290 478
     * @param distributions
291 479
     */
292
    private void addDistributions(UUID taxonUuid, Distribution[] distributions) {
480
    private void addDistributions(UUID taxonUuid, Collection<Distribution> distributions) {
293 481
        Taxon taxon = (Taxon) taxonService.load(taxonUuid);
294 482
        if(taxon == null) {
295 483
            throw new NullPointerException("No taxon found for " + taxonUuid);
......
304 492
        commitAndStartNewTransaction(null);
305 493
    }
306 494

  
495
    private String sourcesToString(DescriptionElementBase deb) {
496
        StringBuffer out = new StringBuffer();
497
        for ( DescriptionElementSource source : deb.getSources()) {
498
            out.append(source.getCitation().getTitle() + " : " + source.getCitationMicroReference() + ", ");
499
        }
500
        return out.toString();
501
    }
502

  
307 503

  
308 504
    //@Test //  uncomment to create test data file//
309 505
    @Override
......
393 589
                "REFERENCE", "DESCRIPTIONELEMENTBASE", "DESCRIPTIONBASE",
394 590
                "AGENTBASE", "CLASSIFICATION",  "TAXONNODE",
395 591
                "HOMOTYPICALGROUP", "LANGUAGESTRING",
592
                "HIBERNATE_SEQUENCES"
396 593
         });
397 594

  
398 595
    }
cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/TransmissionEngineDistributionTest.xml
1 1
<?xml version='1.0' encoding='UTF-8'?>
2 2
<dataset>
3
  <TAXONBASE DTYPE="Taxon" ID="5000" CREATED="2016-06-22 15:19:53.0" UUID="f65d47bd-4f49-4ab1-bc4a-bc4551eaa1a8" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" SECMICROREFERENCE="[null]" PROTECTEDTITLECACHE="false" TITLECACHE="Lapsana sec. Sp.Pl." APPENDEDPHRASE="[null]" DOUBTFUL="false" PUBLISH="true" USENAMECACHE="false" EXCLUDED="false" TAXONSTATUSUNKNOWN="false" TAXONOMICCHILDRENCOUNT="0" UNPLACED="false" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" NAME_ID="5000" SEC_ID="5000" TAXONOMICPARENTCACHE_ID="[null]"/>
4
  <TAXONBASE DTYPE="Taxon" ID="5001" CREATED="2016-06-22 15:19:53.0" UUID="2a5ceebb-4830-4524-b330-78461bf8cb6b" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" SECMICROREFERENCE="[null]" PROTECTEDTITLECACHE="false" TITLECACHE="L. communis sec. Sp.Pl." APPENDEDPHRASE="[null]" DOUBTFUL="false" PUBLISH="true" USENAMECACHE="false" EXCLUDED="false" TAXONSTATUSUNKNOWN="false" TAXONOMICCHILDRENCOUNT="0" UNPLACED="false" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" NAME_ID="5001" SEC_ID="5000" TAXONOMICPARENTCACHE_ID="[null]"/>
5
  <TAXONBASE DTYPE="Taxon" ID="5002" CREATED="2016-06-22 15:19:53.0" UUID="441a3c40-0c84-11de-8c30-0800200c9a66" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" SECMICROREFERENCE="[null]" PROTECTEDTITLECACHE="false" TITLECACHE="L. communis subsp. communis sec. Sp.Pl." APPENDEDPHRASE="[null]" DOUBTFUL="false" PUBLISH="true" USENAMECACHE="false" EXCLUDED="false" TAXONSTATUSUNKNOWN="false" TAXONOMICCHILDRENCOUNT="0" UNPLACED="false" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" NAME_ID="5002" SEC_ID="5000" TAXONOMICPARENTCACHE_ID="[null]"/>
6
  <TAXONBASE DTYPE="Taxon" ID="5003" CREATED="2016-06-22 15:19:53.0" UUID="e4acf200-63b6-11dd-ad8b-0800200c9a66" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" SECMICROREFERENCE="[null]" PROTECTEDTITLECACHE="false" TITLECACHE="L. communis subsp. adenophora sec. Sp.Pl." APPENDEDPHRASE="[null]" DOUBTFUL="false" PUBLISH="true" USENAMECACHE="false" EXCLUDED="false" TAXONSTATUSUNKNOWN="false" TAXONOMICCHILDRENCOUNT="0" UNPLACED="false" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" NAME_ID="5003" SEC_ID="5000" TAXONOMICPARENTCACHE_ID="[null]"/>
7
  <TAXONBASE DTYPE="Taxon" ID="5004" CREATED="2016-06-22 15:19:53.0" UUID="596b1325-be50-4b0a-9aa2-3ecd610215f2" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" SECMICROREFERENCE="[null]" PROTECTEDTITLECACHE="false" TITLECACHE="L. communis subsp. alpina sec. Sp.Pl." APPENDEDPHRASE="[null]" DOUBTFUL="false" PUBLISH="true" USENAMECACHE="false" EXCLUDED="false" TAXONSTATUSUNKNOWN="false" TAXONOMICCHILDRENCOUNT="0" UNPLACED="false" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" NAME_ID="5004" SEC_ID="5000" TAXONOMICPARENTCACHE_ID="[null]"/>
8
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="5000" CREATED="2016-06-22 15:19:53.0" UUID="a5daa719-3552-4829-86e1-f4d4ec14d336" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="true" TITLECACHE="Lapsana" APPENDEDPHRASE="[null]" FULLTITLECACHE="Lapsana" NOMENCLATURALMICROREFERENCE="[null]" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" BINOMHYBRID="false" GENUSORUNINOMIAL="[null]" HYBRIDFORMULA="false" INFRAGENERICEPITHET="[null]" INFRASPECIFICEPITHET="[null]" MONOMHYBRID="false" NAMECACHE="" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" SPECIFICEPITHET="[null]" TRINOMHYBRID="false" NAMEAPPROBATION="[null]" SUBGENUSAUTHORSHIP="[null]" ANAMORPHIC="false" CULTIVARNAME="[null]" ACRONYM="[null]" BREED="[null]" ORIGINALPUBLICATIONYEAR="[null]" PUBLICATIONYEAR="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" HOMOTYPICALGROUP_ID="5000" NOMENCLATURALREFERENCE_ID="[null]" RANK_ID="774" BASIONYMAUTHORSHIP_ID="[null]" COMBINATIONAUTHORSHIP_ID="[null]" EXBASIONYMAUTHORSHIP_ID="[null]" EXCOMBINATIONAUTHORSHIP_ID="[null]"/>
9
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="5001" CREATED="2016-06-22 15:19:53.0" UUID="db6e0607-58f0-448c-849a-26441563689d" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="true" TITLECACHE="L. communis" APPENDEDPHRASE="[null]" FULLTITLECACHE="L. communis" NOMENCLATURALMICROREFERENCE="[null]" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" BINOMHYBRID="false" GENUSORUNINOMIAL="[null]" HYBRIDFORMULA="false" INFRAGENERICEPITHET="[null]" INFRASPECIFICEPITHET="[null]" MONOMHYBRID="false" NAMECACHE="" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" SPECIFICEPITHET="[null]" TRINOMHYBRID="false" NAMEAPPROBATION="[null]" SUBGENUSAUTHORSHIP="[null]" ANAMORPHIC="false" CULTIVARNAME="[null]" ACRONYM="[null]" BREED="[null]" ORIGINALPUBLICATIONYEAR="[null]" PUBLICATIONYEAR="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" HOMOTYPICALGROUP_ID="5001" NOMENCLATURALREFERENCE_ID="[null]" RANK_ID="765" BASIONYMAUTHORSHIP_ID="[null]" COMBINATIONAUTHORSHIP_ID="[null]" EXBASIONYMAUTHORSHIP_ID="[null]" EXCOMBINATIONAUTHORSHIP_ID="[null]"/>
10
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="5002" CREATED="2016-06-22 15:19:53.0" UUID="7f122843-b7db-45ce-abe4-81dd1cd37f19" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="true" TITLECACHE="L. communis subsp. communis" APPENDEDPHRASE="[null]" FULLTITLECACHE="L. communis subsp. communis" NOMENCLATURALMICROREFERENCE="[null]" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" BINOMHYBRID="false" GENUSORUNINOMIAL="[null]" HYBRIDFORMULA="false" INFRAGENERICEPITHET="[null]" INFRASPECIFICEPITHET="[null]" MONOMHYBRID="false" NAMECACHE="subsp." PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" SPECIFICEPITHET="[null]" TRINOMHYBRID="false" NAMEAPPROBATION="[null]" SUBGENUSAUTHORSHIP="[null]" ANAMORPHIC="false" CULTIVARNAME="[null]" ACRONYM="[null]" BREED="[null]" ORIGINALPUBLICATIONYEAR="[null]" PUBLICATIONYEAR="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" HOMOTYPICALGROUP_ID="5002" NOMENCLATURALREFERENCE_ID="[null]" RANK_ID="763" BASIONYMAUTHORSHIP_ID="[null]" COMBINATIONAUTHORSHIP_ID="[null]" EXBASIONYMAUTHORSHIP_ID="[null]" EXCOMBINATIONAUTHORSHIP_ID="[null]"/>
11
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="5003" CREATED="2016-06-22 15:19:53.0" UUID="b6a9cdb3-69b8-44ae-b2c9-f0d2360d7083" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="true" TITLECACHE="L. communis subsp. adenophora" APPENDEDPHRASE="[null]" FULLTITLECACHE="L. communis subsp. adenophora" NOMENCLATURALMICROREFERENCE="[null]" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" BINOMHYBRID="false" GENUSORUNINOMIAL="[null]" HYBRIDFORMULA="false" INFRAGENERICEPITHET="[null]" INFRASPECIFICEPITHET="[null]" MONOMHYBRID="false" NAMECACHE="subsp." PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" SPECIFICEPITHET="[null]" TRINOMHYBRID="false" NAMEAPPROBATION="[null]" SUBGENUSAUTHORSHIP="[null]" ANAMORPHIC="false" CULTIVARNAME="[null]" ACRONYM="[null]" BREED="[null]" ORIGINALPUBLICATIONYEAR="[null]" PUBLICATIONYEAR="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" HOMOTYPICALGROUP_ID="5003" NOMENCLATURALREFERENCE_ID="[null]" RANK_ID="763" BASIONYMAUTHORSHIP_ID="[null]" COMBINATIONAUTHORSHIP_ID="[null]" EXBASIONYMAUTHORSHIP_ID="[null]" EXCOMBINATIONAUTHORSHIP_ID="[null]"/>
12
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="5004" CREATED="2016-06-22 15:19:53.0" UUID="62ca2164-cbd2-4e0d-b99c-6b6cf258c622" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="true" TITLECACHE="L. communis subsp. alpina" APPENDEDPHRASE="[null]" FULLTITLECACHE="L. communis subsp. alpina" NOMENCLATURALMICROREFERENCE="[null]" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" BINOMHYBRID="false" GENUSORUNINOMIAL="[null]" HYBRIDFORMULA="false" INFRAGENERICEPITHET="[null]" INFRASPECIFICEPITHET="[null]" MONOMHYBRID="false" NAMECACHE="subsp." PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" SPECIFICEPITHET="[null]" TRINOMHYBRID="false" NAMEAPPROBATION="[null]" SUBGENUSAUTHORSHIP="[null]" ANAMORPHIC="false" CULTIVARNAME="[null]" ACRONYM="[null]" BREED="[null]" ORIGINALPUBLICATIONYEAR="[null]" PUBLICATIONYEAR="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" HOMOTYPICALGROUP_ID="5004" NOMENCLATURALREFERENCE_ID="[null]" RANK_ID="763" BASIONYMAUTHORSHIP_ID="[null]" COMBINATIONAUTHORSHIP_ID="[null]" EXBASIONYMAUTHORSHIP_ID="[null]" EXCOMBINATIONAUTHORSHIP_ID="[null]"/>
13
  <REFERENCE DTYPE="[null]" ID="5000" CREATED="2016-06-22 15:19:53.0" UUID="fa41cb1f-1404-41e9-a777-f4b01eaa9ae0" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="true" TITLECACHE="Sp.Pl." DATEPUBLISHED_END="[null]" DATEPUBLISHED_FREETEXT="[null]" DATEPUBLISHED_START="[null]" EDITION="[null]" EDITOR="[null]" ISBN="[null]" ISSN="[null]" DOI="[null]" NOMENCLATURALLYRELEVANT="false" ORGANIZATION="[null]" PAGES="[null]" PARSINGPROBLEM="0" PLACEPUBLISHED="[null]" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PUBLISHER="[null]" REFERENCEABSTRACT="[null]" SERIESPART="[null]" TITLE="[null]" ABBREVTITLE="[null]" ABBREVTITLECACHE="" PROTECTEDABBREVTITLECACHE="false" REFTYPE="DB" URI="[null]" VOLUME="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" AUTHORSHIP_ID="[null]" INREFERENCE_ID="[null]" INSTITUTION_ID="[null]" SCHOOL_ID="[null]"/>
14
  <REFERENCE DTYPE="[null]" ID="5001" CREATED="2016-06-22 15:19:53.0" UUID="ea67d687-b338-4877-8852-b81c4f57f774" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="false" TITLECACHE="Reference [type=Book, id= 0, uuid=ea67d687-b338-4877-8852-b81c4f57f774]" DATEPUBLISHED_END="[null]" DATEPUBLISHED_FREETEXT="[null]" DATEPUBLISHED_START="[null]" EDITION="[null]" EDITOR="[null]" ISBN="[null]" ISSN="[null]" DOI="[null]" NOMENCLATURALLYRELEVANT="false" ORGANIZATION="[null]" PAGES="[null]" PARSINGPROBLEM="0" PLACEPUBLISHED="[null]" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PUBLISHER="[null]" REFERENCEABSTRACT="[null]" SERIESPART="[null]" TITLE="[null]" ABBREVTITLE="[null]" ABBREVTITLECACHE="" PROTECTEDABBREVTITLECACHE="false" REFTYPE="BK" URI="[null]" VOLUME="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" AUTHORSHIP_ID="[null]" INREFERENCE_ID="[null]" INSTITUTION_ID="[null]" SCHOOL_ID="[null]"/>
15
  <CLASSIFICATION ID="5000" CREATED="2016-06-22 15:19:53.0" UUID="4b266053-a841-4980-b548-3f21d8d7d712" UPDATED="2016-06-22 15:19:53.097" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="false" TITLECACHE="TestClassification" MICROREFERENCE="[null]" TIMEPERIOD_START="[null]" TIMEPERIOD_FREETEXT="[null]" TIMEPERIOD_END="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" NAME_ID="5000" REFERENCE_ID="[null]" ROOTNODE_ID="5000"/>
16
  <TAXONNODE ID="5000" CREATED="2016-06-22 15:19:53.0" UUID="fcdb08a7-3a53-4126-ba5c-532188cc0d65" UPDATED="2016-06-22 15:19:53.098" SORTINDEX="-1" TREEINDEX="#t5000#5000#" COUNTCHILDREN="1" MICROREFERENCEFORPARENTCHILDRELATION="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" CLASSIFICATION_ID="5000" PARENT_ID="[null]" REFERENCEFORPARENTCHILDRELATION_ID="[null]" SYNONYMTOBEUSED_ID="[null]" TAXON_ID="[null]"/>
17
  <TAXONNODE ID="5001" CREATED="2016-06-22 15:19:53.0" UUID="ae4704b7-0e33-421f-b8a2-2a7e17b9fde1" UPDATED="[null]" SORTINDEX="0" TREEINDEX="#t5000#5000#5001#" COUNTCHILDREN="1" MICROREFERENCEFORPARENTCHILDRELATION="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" CLASSIFICATION_ID="5000" PARENT_ID="5000" REFERENCEFORPARENTCHILDRELATION_ID="5000" SYNONYMTOBEUSED_ID="[null]" TAXON_ID="5000"/>
18
  <TAXONNODE ID="5002" CREATED="2016-06-22 15:19:53.0" UUID="68a9e8ac-3ae1-4d83-96d3-63b056e42de1" UPDATED="2016-06-22 15:19:53.098" SORTINDEX="0" TREEINDEX="#t5000#5000#5001#5002#" COUNTCHILDREN="3" MICROREFERENCEFORPARENTCHILDRELATION="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" CLASSIFICATION_ID="5000" PARENT_ID="5001" REFERENCEFORPARENTCHILDRELATION_ID="5000" SYNONYMTOBEUSED_ID="[null]" TAXON_ID="5001"/>
19
  <TAXONNODE ID="5003" CREATED="2016-06-22 15:19:53.0" UUID="88eed5b8-0a41-4b4a-8ded-6a6a0d8dd673" UPDATED="[null]" SORTINDEX="0" TREEINDEX="#t5000#5000#5001#5002#5003#" COUNTCHILDREN="0" MICROREFERENCEFORPARENTCHILDRELATION="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" CLASSIFICATION_ID="5000" PARENT_ID="5002" REFERENCEFORPARENTCHILDRELATION_ID="5000" SYNONYMTOBEUSED_ID="[null]" TAXON_ID="5002"/>
20
  <TAXONNODE ID="5004" CREATED="2016-06-22 15:19:53.0" UUID="c6df76dc-3dcf-4034-bf86-9f4a6c23b870" UPDATED="2016-06-22 15:19:53.098" SORTINDEX="1" TREEINDEX="#t5000#5000#5001#5002#5004#" COUNTCHILDREN="0" MICROREFERENCEFORPARENTCHILDRELATION="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" CLASSIFICATION_ID="5000" PARENT_ID="5002" REFERENCEFORPARENTCHILDRELATION_ID="5000" SYNONYMTOBEUSED_ID="[null]" TAXON_ID="5003"/>
21
  <TAXONNODE ID="5005" CREATED="2016-06-22 15:19:53.0" UUID="c39e7750-9d0f-4901-92a4-6043ef7ff524" UPDATED="2016-06-22 15:19:53.099" SORTINDEX="2" TREEINDEX="#t5000#5000#5001#5002#5005#" COUNTCHILDREN="0" MICROREFERENCEFORPARENTCHILDRELATION="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" CLASSIFICATION_ID="5000" PARENT_ID="5002" REFERENCEFORPARENTCHILDRELATION_ID="5000" SYNONYMTOBEUSED_ID="[null]" TAXON_ID="5004"/>
22
  <HOMOTYPICALGROUP ID="5000" CREATED="2016-06-22 15:19:53.0" UUID="8063b8c6-73a3-4f20-8109-93ffe6d101da" UPDATED="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]"/>
23
  <HOMOTYPICALGROUP ID="5001" CREATED="2016-06-22 15:19:53.0" UUID="5c066a04-b5ae-4537-bc47-5803569daaa4" UPDATED="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]"/>
24
  <HOMOTYPICALGROUP ID="5002" CREATED="2016-06-22 15:19:53.0" UUID="13527861-46cc-48bb-aa30-9c72b956e890" UPDATED="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]"/>
25
  <HOMOTYPICALGROUP ID="5003" CREATED="2016-06-22 15:19:53.0" UUID="1f75856b-e970-4432-a86e-b2747ad8e16e" UPDATED="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]"/>
26
  <HOMOTYPICALGROUP ID="5004" CREATED="2016-06-22 15:19:53.0" UUID="2da2c603-923f-4433-a9c3-66196da96f68" UPDATED="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]"/>
27
  <LANGUAGESTRING ID="5000" CREATED="2016-06-22 15:19:53.0" UUID="c49ddee1-fe7b-48f1-8f81-71f0b1584e71" UPDATED="[null]" TEXT="TestClassification" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" LANGUAGE_ID="406"/>
3
  <TAXONBASE DTYPE="Taxon" ID="5000" CREATED="2016-06-27 14:26:11.0" UUID="f65d47bd-4f49-4ab1-bc4a-bc4551eaa1a8" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" SECMICROREFERENCE="[null]" PROTECTEDTITLECACHE="false" TITLECACHE="Lapsana sec. Sp.Pl." APPENDEDPHRASE="[null]" DOUBTFUL="false" PUBLISH="true" USENAMECACHE="false" EXCLUDED="false" TAXONSTATUSUNKNOWN="false" TAXONOMICCHILDRENCOUNT="0" UNPLACED="false" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" NAME_ID="5000" SEC_ID="5000" TAXONOMICPARENTCACHE_ID="[null]"/>
4
  <TAXONBASE DTYPE="Taxon" ID="5001" CREATED="2016-06-27 14:26:11.0" UUID="2a5ceebb-4830-4524-b330-78461bf8cb6b" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" SECMICROREFERENCE="[null]" PROTECTEDTITLECACHE="false" TITLECACHE="L. communis sec. Sp.Pl." APPENDEDPHRASE="[null]" DOUBTFUL="false" PUBLISH="true" USENAMECACHE="false" EXCLUDED="false" TAXONSTATUSUNKNOWN="false" TAXONOMICCHILDRENCOUNT="0" UNPLACED="false" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" NAME_ID="5001" SEC_ID="5000" TAXONOMICPARENTCACHE_ID="[null]"/>
5
  <TAXONBASE DTYPE="Taxon" ID="5002" CREATED="2016-06-27 14:26:11.0" UUID="441a3c40-0c84-11de-8c30-0800200c9a66" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" SECMICROREFERENCE="[null]" PROTECTEDTITLECACHE="false" TITLECACHE="L. communis subsp. communis sec. Sp.Pl." APPENDEDPHRASE="[null]" DOUBTFUL="false" PUBLISH="true" USENAMECACHE="false" EXCLUDED="false" TAXONSTATUSUNKNOWN="false" TAXONOMICCHILDRENCOUNT="0" UNPLACED="false" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" NAME_ID="5002" SEC_ID="5000" TAXONOMICPARENTCACHE_ID="[null]"/>
6
  <TAXONBASE DTYPE="Taxon" ID="5003" CREATED="2016-06-27 14:26:11.0" UUID="e4acf200-63b6-11dd-ad8b-0800200c9a66" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" SECMICROREFERENCE="[null]" PROTECTEDTITLECACHE="false" TITLECACHE="L. communis subsp. adenophora sec. Sp.Pl." APPENDEDPHRASE="[null]" DOUBTFUL="false" PUBLISH="true" USENAMECACHE="false" EXCLUDED="false" TAXONSTATUSUNKNOWN="false" TAXONOMICCHILDRENCOUNT="0" UNPLACED="false" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" NAME_ID="5003" SEC_ID="5000" TAXONOMICPARENTCACHE_ID="[null]"/>
7
  <TAXONBASE DTYPE="Taxon" ID="5004" CREATED="2016-06-27 14:26:11.0" UUID="596b1325-be50-4b0a-9aa2-3ecd610215f2" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" SECMICROREFERENCE="[null]" PROTECTEDTITLECACHE="false" TITLECACHE="L. communis subsp. alpina sec. Sp.Pl." APPENDEDPHRASE="[null]" DOUBTFUL="false" PUBLISH="true" USENAMECACHE="false" EXCLUDED="false" TAXONSTATUSUNKNOWN="false" TAXONOMICCHILDRENCOUNT="0" UNPLACED="false" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" NAME_ID="5004" SEC_ID="5000" TAXONOMICPARENTCACHE_ID="[null]"/>
8
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="5000" CREATED="2016-06-27 14:26:11.0" UUID="463d06e3-2665-43cc-8c70-cb658c81a738" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="true" TITLECACHE="Lapsana" APPENDEDPHRASE="[null]" FULLTITLECACHE="Lapsana" NOMENCLATURALMICROREFERENCE="[null]" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" BINOMHYBRID="false" GENUSORUNINOMIAL="[null]" HYBRIDFORMULA="false" INFRAGENERICEPITHET="[null]" INFRASPECIFICEPITHET="[null]" MONOMHYBRID="false" NAMECACHE="" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" SPECIFICEPITHET="[null]" TRINOMHYBRID="false" NAMEAPPROBATION="[null]" SUBGENUSAUTHORSHIP="[null]" ANAMORPHIC="false" CULTIVARNAME="[null]" ACRONYM="[null]" BREED="[null]" ORIGINALPUBLICATIONYEAR="[null]" PUBLICATIONYEAR="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" HOMOTYPICALGROUP_ID="5000" NOMENCLATURALREFERENCE_ID="[null]" RANK_ID="774" BASIONYMAUTHORSHIP_ID="[null]" COMBINATIONAUTHORSHIP_ID="[null]" EXBASIONYMAUTHORSHIP_ID="[null]" EXCOMBINATIONAUTHORSHIP_ID="[null]"/>
9
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="5001" CREATED="2016-06-27 14:26:11.0" UUID="2b718c66-1853-45c9-9f8e-e03057194349" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="true" TITLECACHE="L. communis" APPENDEDPHRASE="[null]" FULLTITLECACHE="L. communis" NOMENCLATURALMICROREFERENCE="[null]" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" BINOMHYBRID="false" GENUSORUNINOMIAL="[null]" HYBRIDFORMULA="false" INFRAGENERICEPITHET="[null]" INFRASPECIFICEPITHET="[null]" MONOMHYBRID="false" NAMECACHE="" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" SPECIFICEPITHET="[null]" TRINOMHYBRID="false" NAMEAPPROBATION="[null]" SUBGENUSAUTHORSHIP="[null]" ANAMORPHIC="false" CULTIVARNAME="[null]" ACRONYM="[null]" BREED="[null]" ORIGINALPUBLICATIONYEAR="[null]" PUBLICATIONYEAR="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" HOMOTYPICALGROUP_ID="5001" NOMENCLATURALREFERENCE_ID="[null]" RANK_ID="765" BASIONYMAUTHORSHIP_ID="[null]" COMBINATIONAUTHORSHIP_ID="[null]" EXBASIONYMAUTHORSHIP_ID="[null]" EXCOMBINATIONAUTHORSHIP_ID="[null]"/>
10
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="5002" CREATED="2016-06-27 14:26:11.0" UUID="06a6a0fd-048e-45e5-aa32-1c7f2dc75421" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="true" TITLECACHE="L. communis subsp. communis" APPENDEDPHRASE="[null]" FULLTITLECACHE="L. communis subsp. communis" NOMENCLATURALMICROREFERENCE="[null]" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" BINOMHYBRID="false" GENUSORUNINOMIAL="[null]" HYBRIDFORMULA="false" INFRAGENERICEPITHET="[null]" INFRASPECIFICEPITHET="[null]" MONOMHYBRID="false" NAMECACHE="subsp." PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" SPECIFICEPITHET="[null]" TRINOMHYBRID="false" NAMEAPPROBATION="[null]" SUBGENUSAUTHORSHIP="[null]" ANAMORPHIC="false" CULTIVARNAME="[null]" ACRONYM="[null]" BREED="[null]" ORIGINALPUBLICATIONYEAR="[null]" PUBLICATIONYEAR="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" HOMOTYPICALGROUP_ID="5002" NOMENCLATURALREFERENCE_ID="[null]" RANK_ID="763" BASIONYMAUTHORSHIP_ID="[null]" COMBINATIONAUTHORSHIP_ID="[null]" EXBASIONYMAUTHORSHIP_ID="[null]" EXCOMBINATIONAUTHORSHIP_ID="[null]"/>
11
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="5003" CREATED="2016-06-27 14:26:11.0" UUID="6ce4f911-4932-4cfb-9793-2e45aaef59aa" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="true" TITLECACHE="L. communis subsp. adenophora" APPENDEDPHRASE="[null]" FULLTITLECACHE="L. communis subsp. adenophora" NOMENCLATURALMICROREFERENCE="[null]" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" BINOMHYBRID="false" GENUSORUNINOMIAL="[null]" HYBRIDFORMULA="false" INFRAGENERICEPITHET="[null]" INFRASPECIFICEPITHET="[null]" MONOMHYBRID="false" NAMECACHE="subsp." PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" SPECIFICEPITHET="[null]" TRINOMHYBRID="false" NAMEAPPROBATION="[null]" SUBGENUSAUTHORSHIP="[null]" ANAMORPHIC="false" CULTIVARNAME="[null]" ACRONYM="[null]" BREED="[null]" ORIGINALPUBLICATIONYEAR="[null]" PUBLICATIONYEAR="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" HOMOTYPICALGROUP_ID="5003" NOMENCLATURALREFERENCE_ID="[null]" RANK_ID="763" BASIONYMAUTHORSHIP_ID="[null]" COMBINATIONAUTHORSHIP_ID="[null]" EXBASIONYMAUTHORSHIP_ID="[null]" EXCOMBINATIONAUTHORSHIP_ID="[null]"/>
12
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="5004" CREATED="2016-06-27 14:26:11.0" UUID="1621acc6-142b-4987-a1d1-475aa01489dc" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="true" TITLECACHE="L. communis subsp. alpina" APPENDEDPHRASE="[null]" FULLTITLECACHE="L. communis subsp. alpina" NOMENCLATURALMICROREFERENCE="[null]" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" BINOMHYBRID="false" GENUSORUNINOMIAL="[null]" HYBRIDFORMULA="false" INFRAGENERICEPITHET="[null]" INFRASPECIFICEPITHET="[null]" MONOMHYBRID="false" NAMECACHE="subsp." PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" SPECIFICEPITHET="[null]" TRINOMHYBRID="false" NAMEAPPROBATION="[null]" SUBGENUSAUTHORSHIP="[null]" ANAMORPHIC="false" CULTIVARNAME="[null]" ACRONYM="[null]" BREED="[null]" ORIGINALPUBLICATIONYEAR="[null]" PUBLICATIONYEAR="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" HOMOTYPICALGROUP_ID="5004" NOMENCLATURALREFERENCE_ID="[null]" RANK_ID="763" BASIONYMAUTHORSHIP_ID="[null]" COMBINATIONAUTHORSHIP_ID="[null]" EXBASIONYMAUTHORSHIP_ID="[null]" EXCOMBINATIONAUTHORSHIP_ID="[null]"/>
13
  <REFERENCE DTYPE="[null]" ID="5000" CREATED="2016-06-27 14:26:11.0" UUID="b59c0842-fba3-4255-8e32-5a064303b8a2" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="true" TITLECACHE="Sp.Pl." DATEPUBLISHED_END="[null]" DATEPUBLISHED_FREETEXT="[null]" DATEPUBLISHED_START="[null]" EDITION="[null]" EDITOR="[null]" ISBN="[null]" ISSN="[null]" DOI="[null]" NOMENCLATURALLYRELEVANT="false" ORGANIZATION="[null]" PAGES="[null]" PARSINGPROBLEM="0" PLACEPUBLISHED="[null]" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PUBLISHER="[null]" REFERENCEABSTRACT="[null]" SERIESPART="[null]" TITLE="[null]" ABBREVTITLE="[null]" ABBREVTITLECACHE="" PROTECTEDABBREVTITLECACHE="false" REFTYPE="DB" URI="[null]" VOLUME="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" AUTHORSHIP_ID="[null]" INREFERENCE_ID="[null]" INSTITUTION_ID="[null]" SCHOOL_ID="[null]"/>
14
  <REFERENCE DTYPE="[null]" ID="5001" CREATED="2016-06-27 14:26:11.0" UUID="3268a382-f51a-495e-8de6-763854944c7d" UPDATED="[null]" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="false" TITLECACHE="Reference [type=Book, id= 0, uuid=3268a382-f51a-495e-8de6-763854944c7d]" DATEPUBLISHED_END="[null]" DATEPUBLISHED_FREETEXT="[null]" DATEPUBLISHED_START="[null]" EDITION="[null]" EDITOR="[null]" ISBN="[null]" ISSN="[null]" DOI="[null]" NOMENCLATURALLYRELEVANT="false" ORGANIZATION="[null]" PAGES="[null]" PARSINGPROBLEM="0" PLACEPUBLISHED="[null]" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PUBLISHER="[null]" REFERENCEABSTRACT="[null]" SERIESPART="[null]" TITLE="[null]" ABBREVTITLE="[null]" ABBREVTITLECACHE="" PROTECTEDABBREVTITLECACHE="false" REFTYPE="BK" URI="[null]" VOLUME="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" AUTHORSHIP_ID="[null]" INREFERENCE_ID="[null]" INSTITUTION_ID="[null]" SCHOOL_ID="[null]"/>
15
  <CLASSIFICATION ID="5000" CREATED="2016-06-27 14:26:11.0" UUID="4b266053-a841-4980-b548-3f21d8d7d712" UPDATED="2016-06-27 14:26:11.88" LSID_AUTHORITY="[null]" LSID_LSID="[null]" LSID_NAMESPACE="[null]" LSID_OBJECT="[null]" LSID_REVISION="[null]" PROTECTEDTITLECACHE="false" TITLECACHE="TestClassification" MICROREFERENCE="[null]" TIMEPERIOD_START="[null]" TIMEPERIOD_FREETEXT="[null]" TIMEPERIOD_END="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" NAME_ID="5000" REFERENCE_ID="[null]" ROOTNODE_ID="5000"/>
16
  <TAXONNODE ID="5000" CREATED="2016-06-27 14:26:11.0" UUID="06512abd-edf9-435b-a3d9-6cd6ede5aec8" UPDATED="2016-06-27 14:26:11.881" SORTINDEX="-1" TREEINDEX="#t5000#5000#" COUNTCHILDREN="1" MICROREFERENCEFORPARENTCHILDRELATION="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" CLASSIFICATION_ID="5000" PARENT_ID="[null]" REFERENCEFORPARENTCHILDRELATION_ID="[null]" SYNONYMTOBEUSED_ID="[null]" TAXON_ID="[null]"/>
17
  <TAXONNODE ID="5001" CREATED="2016-06-27 14:26:11.0" UUID="dcf4f891-c486-4d36-b1d1-39fae7a5df2a" UPDATED="[null]" SORTINDEX="0" TREEINDEX="#t5000#5000#5001#" COUNTCHILDREN="1" MICROREFERENCEFORPARENTCHILDRELATION="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" CLASSIFICATION_ID="5000" PARENT_ID="5000" REFERENCEFORPARENTCHILDRELATION_ID="5000" SYNONYMTOBEUSED_ID="[null]" TAXON_ID="5000"/>
18
  <TAXONNODE ID="5002" CREATED="2016-06-27 14:26:11.0" UUID="7dbe5319-ae7d-4140-bb3b-c34dc320d134" UPDATED="2016-06-27 14:26:11.882" SORTINDEX="0" TREEINDEX="#t5000#5000#5001#5002#" COUNTCHILDREN="3" MICROREFERENCEFORPARENTCHILDRELATION="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" CLASSIFICATION_ID="5000" PARENT_ID="5001" REFERENCEFORPARENTCHILDRELATION_ID="5000" SYNONYMTOBEUSED_ID="[null]" TAXON_ID="5001"/>
19
  <TAXONNODE ID="5003" CREATED="2016-06-27 14:26:11.0" UUID="4fd6c300-54b7-4f48-bad2-3126ab72a6d0" UPDATED="[null]" SORTINDEX="0" TREEINDEX="#t5000#5000#5001#5002#5003#" COUNTCHILDREN="0" MICROREFERENCEFORPARENTCHILDRELATION="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" CLASSIFICATION_ID="5000" PARENT_ID="5002" REFERENCEFORPARENTCHILDRELATION_ID="5000" SYNONYMTOBEUSED_ID="[null]" TAXON_ID="5002"/>
20
  <TAXONNODE ID="5004" CREATED="2016-06-27 14:26:11.0" UUID="5523c20c-bbc2-4c89-8b36-e00e8314d252" UPDATED="2016-06-27 14:26:11.883" SORTINDEX="1" TREEINDEX="#t5000#5000#5001#5002#5004#" COUNTCHILDREN="0" MICROREFERENCEFORPARENTCHILDRELATION="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" CLASSIFICATION_ID="5000" PARENT_ID="5002" REFERENCEFORPARENTCHILDRELATION_ID="5000" SYNONYMTOBEUSED_ID="[null]" TAXON_ID="5003"/>
21
  <TAXONNODE ID="5005" CREATED="2016-06-27 14:26:11.0" UUID="65671bba-0373-4998-8a7b-410a67a2ddcf" UPDATED="2016-06-27 14:26:11.884" SORTINDEX="2" TREEINDEX="#t5000#5000#5001#5002#5005#" COUNTCHILDREN="0" MICROREFERENCEFORPARENTCHILDRELATION="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" CLASSIFICATION_ID="5000" PARENT_ID="5002" REFERENCEFORPARENTCHILDRELATION_ID="5000" SYNONYMTOBEUSED_ID="[null]" TAXON_ID="5004"/>
22
  <HOMOTYPICALGROUP ID="5000" CREATED="2016-06-27 14:26:11.0" UUID="207c1e0c-ce60-4516-adf7-0ba5a61ee62f" UPDATED="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]"/>
23
  <HOMOTYPICALGROUP ID="5001" CREATED="2016-06-27 14:26:11.0" UUID="e18238ce-8d2c-4ac6-bf33-8f019012dfac" UPDATED="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]"/>
24
  <HOMOTYPICALGROUP ID="5002" CREATED="2016-06-27 14:26:11.0" UUID="85c073ca-bde7-4bdd-be40-e1783132f45e" UPDATED="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]"/>
25
  <HOMOTYPICALGROUP ID="5003" CREATED="2016-06-27 14:26:11.0" UUID="b2f33aa8-fb6e-4ca3-9ae4-6c6d49b08a71" UPDATED="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]"/>
26
  <HOMOTYPICALGROUP ID="5004" CREATED="2016-06-27 14:26:11.0" UUID="8ccf2a95-d355-4de1-8eda-ebd4b90e691d" UPDATED="[null]" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]"/>
27
  <LANGUAGESTRING ID="5000" CREATED="2016-06-27 14:26:11.0" UUID="57a6a64a-59e5-41ed-92ab-f53c03b29b14" UPDATED="[null]" TEXT="TestClassification" CREATEDBY_ID="[null]" UPDATEDBY_ID="[null]" LANGUAGE_ID="406"/>
28
  <HIBERNATE_SEQUENCES SEQUENCE_NAME="AuditEvent" NEXT_VAL="5003"/>
29
  <HIBERNATE_SEQUENCES SEQUENCE_NAME="CdmMetaData" NEXT_VAL="5003"/>
30
  <HIBERNATE_SEQUENCES SEQUENCE_NAME="Classification" NEXT_VAL="5001"/>
31
  <HIBERNATE_SEQUENCES SEQUENCE_NAME="Extension" NEXT_VAL="5016"/>
32
  <HIBERNATE_SEQUENCES SEQUENCE_NAME="GrantedAuthorityImpl" NEXT_VAL="5011"/>
33
  <HIBERNATE_SEQUENCES SEQUENCE_NAME="HomotypicalGroup" NEXT_VAL="5005"/>
34
  <HIBERNATE_SEQUENCES SEQUENCE_NAME="LanguageString" NEXT_VAL="5001"/>
35
  <HIBERNATE_SEQUENCES SEQUENCE_NAME="PermissionGroup" NEXT_VAL="5002"/>
36
  <HIBERNATE_SEQUENCES SEQUENCE_NAME="Reference" NEXT_VAL="5002"/>
37
  <HIBERNATE_SEQUENCES SEQUENCE_NAME="TaxonBase" NEXT_VAL="5005"/>
38
  <HIBERNATE_SEQUENCES SEQUENCE_NAME="TaxonNameBase" NEXT_VAL="5005"/>
39
  <HIBERNATE_SEQUENCES SEQUENCE_NAME="TaxonNode" NEXT_VAL="5006"/>
40
  <HIBERNATE_SEQUENCES SEQUENCE_NAME="UserAccount" NEXT_VAL="5001"/>
28 41
</dataset>

Also available in: Unified diff