package org.gbif.checklistbank.neo; import org.gbif.api.model.checklistbank.NameUsage; import org.gbif.api.model.checklistbank.NameUsageContainer; import org.gbif.api.model.checklistbank.VerbatimNameUsage; import org.gbif.api.vocabulary.NameType; import org.gbif.api.vocabulary.Rank; import org.gbif.checklistbank.cli.normalizer.IgnoreNameUsageException; import org.gbif.dwc.terms.DcTerm; import org.gbif.dwc.terms.DwcTerm; import org.gbif.dwc.terms.Term; import org.gbif.dwca.io.ArchiveField; import org.gbif.dwca.record.RecordImpl; import org.gbif.dwca.record.StarRecordImpl; import java.net.URI; import java.util.List; import com.google.common.collect.Lists; import org.junit.Before; import org.junit.Test; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Transaction; import org.neo4j.helpers.collection.Iterators; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; public class NeoInserterTest { NeoInserter ins; List<String> values; List<ArchiveField> fields; UsageDao dao; @Before public void init() throws Exception { values = Lists.newArrayList(); fields = Lists.newArrayList(); dao = UsageDao.temporaryDao(10); ins = dao.createBatchInserter(100); } private void addColumn(Term term, String value) { ArchiveField f = new ArchiveField(fields.size(), term, null, ArchiveField.DataType.string); fields.add(f); values.add(value); } @Test public void testNonDwcProperties() throws Exception { addColumn(DwcTerm.taxonID, "1"); addColumn(DwcTerm.scientificName, "Abies alba Mill., 1982"); addColumn(DwcTerm.scientificNameAuthorship, "Mill."); addColumn(DwcTerm.namePublishedIn, "Führ. Pilzk. (Zwickau) 136 (1871)"); addColumn(DwcTerm.namePublishedInID, "12345678"); addColumn(DwcTerm.namePublishedInYear, "1871"); addColumn(DwcTerm.nameAccordingTo, "Miller"); addColumn(DwcTerm.nameAccordingToID, "123456"); addColumn(DwcTerm.taxonRemarks, "bugger off"); addColumn(DcTerm.references, "http://gbif.org"); StarRecordImpl star = new StarRecordImpl(Lists.<Term>newArrayList()); RecordImpl rec = new RecordImpl(fields.get(0), fields, DwcTerm.Taxon, true, true); rec.setRow(values.toArray(new String[]{})); star.newCoreRecord(rec); ins.insertStarRecord(star); ins.close(); try (Transaction tx = dao.beginTx()) { Node n = dao.getNeo().getNodeById(0); assertEquals("1", n.getProperty(NeoProperties.TAXON_ID)); VerbatimNameUsage v = dao.readVerbatim(n.getId()); assertEquals("1", v.getCoreField(DwcTerm.taxonID)); assertEquals("Abies alba Mill., 1982", v.getCoreField(DwcTerm.scientificName)); assertEquals("Mill.", v.getCoreField(DwcTerm.scientificNameAuthorship)); assertEquals("Führ. Pilzk. (Zwickau) 136 (1871)", v.getCoreField(DwcTerm.namePublishedIn)); assertEquals("12345678", v.getCoreField(DwcTerm.namePublishedInID)); assertEquals("1871", v.getCoreField(DwcTerm.namePublishedInYear)); assertEquals("Miller", v.getCoreField(DwcTerm.nameAccordingTo)); assertEquals("123456", v.getCoreField(DwcTerm.nameAccordingToID)); assertEquals("bugger off", v.getCoreField(DwcTerm.taxonRemarks)); assertEquals("http://gbif.org", v.getCoreField(DcTerm.references)); NameUsage u = dao.readUsage(n, true); assertEquals("1", u.getTaxonID()); assertEquals("Abies alba Mill., 1982", u.getScientificName()); assertEquals("Mill.", u.getAuthorship()); assertEquals("Führ. Pilzk. (Zwickau) 136 (1871)", u.getPublishedIn()); assertEquals("Miller", u.getAccordingTo()); assertEquals("bugger off", u.getRemarks()); assertEquals(URI.create("http://gbif.org"), u.getReferences()); } } @Test public void testTaxonIDUnique() throws Exception { addColumn(DwcTerm.taxonID, "1"); addColumn(DwcTerm.scientificName, "Abies alba Mill., 1982"); StarRecordImpl star = new StarRecordImpl(Lists.<Term>newArrayList()); RecordImpl rec = new RecordImpl(fields.get(0), fields, DwcTerm.Taxon, true, true); rec.setRow(values.toArray(new String[]{})); star.newCoreRecord(rec); ins.insertStarRecord(star); values = Lists.newArrayList(); fields = Lists.newArrayList(); addColumn(DwcTerm.taxonID, "2"); addColumn(DwcTerm.scientificName, "Picea alba"); rec = new RecordImpl(fields.get(0), fields, DwcTerm.Taxon, true, true); rec.setRow(values.toArray(new String[]{})); star.newCoreRecord(rec); ins.insertStarRecord(star); ins.close(); try (Transaction tx = dao.beginTx()) { assertNotNull(Iterators.singleOrNull(dao.getNeo().findNodes(Labels.TAXON, NeoProperties.TAXON_ID, "1"))); } } @Test(expected = NotUniqueRuntimeException.class) public void testTaxonIDNotUnique() throws Exception { addColumn(DwcTerm.taxonID, "1"); addColumn(DwcTerm.scientificName, "Abies alba Mill., 1982"); StarRecordImpl star = new StarRecordImpl(Lists.<Term>newArrayList()); RecordImpl rec = new RecordImpl(fields.get(0), fields, DwcTerm.Taxon, true, true); rec.setRow(values.toArray(new String[]{})); star.newCoreRecord(rec); ins.insertStarRecord(star); values = Lists.newArrayList(); fields = Lists.newArrayList(); addColumn(DwcTerm.taxonID, "1"); addColumn(DwcTerm.scientificName, "Picea alba"); rec = new RecordImpl(fields.get(0), fields, DwcTerm.Taxon, true, true); rec.setRow(values.toArray(new String[]{})); star.newCoreRecord(rec); ins.insertStarRecord(star); ins.close(); } @Test public void testSetScientificName() throws Exception { VerbatimNameUsage v = new VerbatimNameUsage(); v.setCoreField(DwcTerm.scientificName, "Abies alba Mill., 1982"); assertName(v, Rank.SPECIES, "Abies alba Mill., 1982", "Abies alba", NameType.SCIENTIFIC); v = new VerbatimNameUsage(); v.setCoreField(DwcTerm.scientificName, "Abies alba"); assertName(v, Rank.SPECIES, "Abies alba", "Abies alba", NameType.SCIENTIFIC); v = new VerbatimNameUsage(); v.setCoreField(DwcTerm.scientificName, "? alba"); assertName(v, Rank.SPECIES, "? alba", "? alba", NameType.PLACEHOLDER); v = new VerbatimNameUsage(); v.setCoreField(DwcTerm.genus, "Abies"); v.setCoreField(DwcTerm.specificEpithet, "alba"); assertName(v, Rank.SPECIES, "Abies alba", "Abies alba", NameType.SCIENTIFIC); v = new VerbatimNameUsage(); v.setCoreField(DwcTerm.genus, "Abies"); v.setCoreField(DwcTerm.infraspecificEpithet, "alpina"); assertName(v, Rank.SUBSPECIES, "Abies subsp.", "Abies subsp.", NameType.SCIENTIFIC); v = new VerbatimNameUsage(); v.setCoreField(DwcTerm.genus, "Abies"); v.setCoreField(DwcTerm.specificEpithet, "alba"); v.setCoreField(DwcTerm.infraspecificEpithet, "alpina"); assertName(v, Rank.SUBSPECIES, "Abies alba subsp. alpina", "Abies alba alpina", NameType.SCIENTIFIC); v.setCoreField(DwcTerm.scientificNameAuthorship, "Duméril & Bibron"); assertName(v, Rank.SUBSPECIES, "Abies alba subsp. alpina Duméril & Bibron", "Abies alba alpina", NameType.SCIENTIFIC); v.setCoreField(DwcTerm.namePublishedInYear, "1937"); assertName(v, Rank.SUBSPECIES, "Abies alba subsp. alpina Duméril & Bibron, 1937", "Abies alba alpina", NameType.SCIENTIFIC); v.setCoreField(DwcTerm.scientificNameAuthorship, "Duméril & Bibron 1937"); assertName(v, Rank.SUBSPECIES, "Abies alba subsp. alpina Duméril & Bibron 1937", "Abies alba alpina", NameType.SCIENTIFIC); } @Test(expected = IgnoreNameUsageException.class) public void testSetScientificNameExc() throws Exception { VerbatimNameUsage v = new VerbatimNameUsage(); assertName(v, Rank.SPECIES, null, null, NameType.NO_NAME); } private NameUsageContainer assertName(VerbatimNameUsage v, Rank rank, String sciname, String canonical, NameType ntype) throws IgnoreNameUsageException { NameUsageContainer u = new NameUsageContainer(); ins.setScientificName(u, v, rank); if (sciname != null) { assertEquals(sciname, u.getScientificName()); } else { assertNull(u.getScientificName()); } if (canonical != null) { assertEquals(canonical, u.getCanonicalName()); } else { assertNull(u.getCanonicalName()); } if (ntype != null) { assertEquals(ntype, u.getNameType()); } else { assertNull(u.getNameType()); } return u; } @Test public void testClean() throws Exception { assertNull(NeoInserter.clean(null)); assertNull(NeoInserter.clean(" ")); assertNull(NeoInserter.clean(" ")); assertNull(NeoInserter.clean("\\N")); assertNull(NeoInserter.clean("NULL")); assertNull(NeoInserter.clean("\t ")); assertEquals("Abies", NeoInserter.clean("Abies")); assertEquals("öAbies", NeoInserter.clean("öAbies")); assertEquals("Abies mille", NeoInserter.clean(" Abies mille")); } }