package org.gbif.checklistbank.neo.printer; import org.gbif.api.vocabulary.Rank; import org.gbif.api.vocabulary.TaxonomicStatus; import org.gbif.checklistbank.neo.Labels; import org.gbif.checklistbank.neo.NeoProperties; import org.gbif.checklistbank.neo.RelType; import org.gbif.io.TabWriter; import java.io.IOException; import java.io.Writer; import java.util.Set; import com.beust.jcommander.internal.Sets; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.base.Throwables; import org.neo4j.graphdb.Direction; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Relationship; /** * Dumps a neo db in a simple tab delimited format used by the nub integration tests. * Expects no pro parte relations in the walker! */ public class TabPrinter implements TreePrinter { private final Function<Node, String> getTitle; private final TabWriter writer; private static final Joiner ID_CONCAT = Joiner.on(";").skipNulls(); public TabPrinter(Writer writer, Function<Node, String> getTitle) { this.writer = new TabWriter(writer); this.getTitle = getTitle; } @Override public void close() { } @Override public void start(Node n) { try { String[] row = new String[7]; row[0] = String.valueOf(n.getId()); if (n.hasLabel(Labels.SYNONYM)) { // we can have multiple accepted parents for pro parte synonyms Set<Long> parentKeys = Sets.newHashSet(); for (Relationship synRel : n.getRelationships(RelType.SYNONYM_OF, Direction.OUTGOING)) { parentKeys.add(synRel.getOtherNode(n).getId()); } for (Relationship synRel : n.getRelationships(RelType.PROPARTE_SYNONYM_OF, Direction.OUTGOING)) { parentKeys.add(synRel.getOtherNode(n).getId()); } row[1] = ID_CONCAT.join(parentKeys); } else { if (n.hasRelationship(RelType.PARENT_OF, Direction.INCOMING)) { row[1] = String.valueOf(n.getSingleRelationship(RelType.PARENT_OF, Direction.INCOMING).getOtherNode(n).getId()); } } if (n.hasRelationship(RelType.BASIONYM_OF, Direction.INCOMING)) { row[2] = String.valueOf(n.getSingleRelationship(RelType.BASIONYM_OF, Direction.INCOMING).getOtherNode(n).getId()); } if (n.hasProperty(NeoProperties.RANK)) { row[3] = Rank.values()[(Integer) n.getProperty(NeoProperties.RANK)].name(); } row[4] = n.hasLabel(Labels.SYNONYM) ? TaxonomicStatus.SYNONYM.name() : TaxonomicStatus.ACCEPTED.name(); row[6] = getTitle.apply(n); writer.write(row); } catch (IOException e) { Throwables.propagate(e); } } @Override public void end(Node n) { } }