package org.gbif.checklistbank.neo.traverse; import org.gbif.api.model.checklistbank.NameUsage; import org.gbif.api.model.common.LinneanClassificationKeys; import org.gbif.api.vocabulary.Rank; import org.gbif.checklistbank.cli.BaseTest; import org.gbif.checklistbank.cli.normalizer.NormalizerStats; import org.gbif.checklistbank.neo.Labels; import org.gbif.checklistbank.neo.RelType; import org.gbif.checklistbank.cli.model.NameUsageNode; import org.gbif.checklistbank.cli.model.UsageFacts; import com.google.common.collect.Lists; import org.junit.Test; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Transaction; import static org.junit.Assert.assertEquals; public class UsageMetricsHandlerTest extends BaseTest { @Test public void testClassificationHandler() { initDb(); try (Transaction tx = beginTx()) { Node n = addNode(Rank.KINGDOM, "Animalia", null); n.addLabel(Labels.ROOT); n = addNode(Rank.KINGDOM, "Plantae", null); n.addLabel(Labels.ROOT); n = addNode(Rank.PHYLUM, "Pinophyta", n); n = addNode(Rank.CLASS, "Pinalaea", n); n = addNode(Rank.ORDER, "Pinales", n); addNode(Rank.FAMILY, "Araucariaceae", n); n = addNode(Rank.FAMILY, "Pinaceae", n); n = addNode(Rank.SUBFAMILY, "Abiedea", n); addNode(Rank.GENUS, "Pinus", n); n = addNode(Rank.GENUS, "Abies", n); addNode(Rank.SPECIES, "Abies Alpina DC.", n); addNode(Rank.SPECIES, "Abies balkan L.", n); n =addNode(Rank.SPECIES, "Abies alba Mill.", n); addNode(Rank.SUBSPECIES, "Abies alba Mill. subsp. alba", n); addNode(Rank.SUBSPECIES, "Abies alba subsp. alpina Mill.", n); tx.success(); } UsageMetricsHandler handler = new UsageMetricsHandler(dao); TreeWalker.walkAcceptedTree(dao.getNeo(), handler); NormalizerStats stats = handler.getStats(1, Lists.<String>newArrayList()); System.out.println(stats); assertEquals(2, stats.getRoots()); assertEquals(0, stats.getSynonyms()); assertEquals(1, stats.getIgnored()); assertEquals(2, stats.getCountByRank(Rank.KINGDOM)); assertEquals(1, stats.getCountByRank(Rank.PHYLUM)); assertEquals(1, stats.getCountByRank(Rank.CLASS)); assertEquals(1, stats.getCountByRank(Rank.ORDER)); assertEquals(2, stats.getCountByRank(Rank.FAMILY)); assertEquals(1, stats.getCountByRank(Rank.SUBFAMILY)); assertEquals(2, stats.getCountByRank(Rank.GENUS)); assertEquals(3, stats.getCountByRank(Rank.SPECIES)); assertEquals(2, stats.getCountByRank(Rank.SUBSPECIES)); assertEquals(9, stats.getDepth()); // verify metrics and classification keys LinneanClassificationKeys cl = new NameUsage(); try (Transaction tx = beginTx()) { cl.setKingdomKey(1); assertUsage(1, Rank.KINGDOM, cl); cl.setPhylumKey(2); assertUsage(2, Rank.PHYLUM, cl); cl.setClassKey(3); assertUsage(3, Rank.CLASS, cl); cl.setOrderKey(4); cl.setFamilyKey(6); assertUsage(6, Rank.FAMILY, cl); cl.setGenusKey(9); assertUsage(9, Rank.GENUS, cl); cl.setSpeciesKey(12); assertUsage(12, Rank.SPECIES, cl); assertUsage(13, Rank.SUBSPECIES, cl); assertUsage(14, Rank.SUBSPECIES, cl); } } private void assertUsage(long id, Rank rank, LinneanClassificationKeys expected) { UsageFacts facts = dao.readFacts(id); for (Rank r : Rank.LINNEAN_RANKS) { assertEquals(expected.getHigherRankKey(r), facts.classification.getHigherRankKey(r)); } } private Node addNode(Rank rank, String name, Node parent) { Node n = dao.createTaxon(); NameUsage u = new NameUsage(); u.setRank(rank); u.setCanonicalName(name); u.setScientificName(name); dao.store(new NameUsageNode(n, u, true), true); if (parent != null) { parent.createRelationshipTo(n, RelType.PARENT_OF); } return n; } }