package org.gbif.checklistbank.neo.traverse;
import org.gbif.api.vocabulary.Rank;
import org.gbif.checklistbank.neo.Labels;
import java.util.List;
import javax.annotation.Nullable;
import com.google.common.collect.Lists;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Path;
import org.neo4j.graphdb.ResourceIterable;
import org.neo4j.graphdb.traversal.TraversalDescription;
import org.neo4j.helpers.collection.Iterators;
/**
* Utils to persistent Iterables for nodes or paths to traverse a taxonomic tree in taxonomic order with sorted leaf nodes.
*/
public class TreeIterablesSorted {
/**
* Iterates over all nodes in taxonomic hierarchy, but unsorted withing each branch.
*/
public static ResourceIterable<Node> allNodes(GraphDatabaseService db, @Nullable Node root, @Nullable Rank lowestRank, boolean inclProParte) {
return MultiRootNodeIterator.create(findRoot(db, root), filterRank(inclProParte ? Traversals.SORTED_TREE : Traversals.SORTED_TREE_WITHOUT_PRO_PARTE, lowestRank));
}
/**
* Iterates over all paths
*/
public static ResourceIterable<Path> allPath(GraphDatabaseService db, @Nullable Node root, @Nullable Rank lowestRank, boolean inclProParte) {
return MultiRootPathIterator.create(findRoot(db, root), filterRank(inclProParte ? Traversals.SORTED_TREE : Traversals.SORTED_TREE_WITHOUT_PRO_PARTE, lowestRank));
}
/**
* Iterates over all paths ending in an accepted node.
*/
public static ResourceIterable<Path> acceptedPath(GraphDatabaseService db, @Nullable Node root, @Nullable Rank lowestRank) {
return MultiRootPathIterator.create(findRoot(db, root), filterRank(Traversals.SORTED_ACCEPTED_TREE, lowestRank));
}
public static List<Node> findRoot(GraphDatabaseService db) {
return findRoot(db, null);
}
protected static List<Node> findRoot(GraphDatabaseService db, @Nullable Node root) {
if (root != null) {
return Lists.newArrayList(root);
}
return Iterators.asList(db.findNodes(Labels.ROOT));
}
public static TraversalDescription filterRank(TraversalDescription td, @Nullable Rank lowestRank) {
if (lowestRank != null) {
return td.evaluator(new RankEvaluator(lowestRank));
}
return td;
}
}