package org.gbif.checklistbank.cli.normalizer;
import org.gbif.api.vocabulary.Origin;
import org.gbif.api.vocabulary.Rank;
import java.util.List;
import java.util.Map;
import com.google.common.base.Objects;
import org.codehaus.jackson.annotate.JsonCreator;
import org.codehaus.jackson.annotate.JsonProperty;
/**
* Statistics of a checklist normalization result.
*/
public class NormalizerStats {
private final int roots;
private final int depth;
private final int synonyms;
private final int ignored;
private final Map<Origin, Integer> countByOrigin;
private final Map<Rank, Integer> countByRank;
private final List<String> cycles;
@JsonCreator
public NormalizerStats(@JsonProperty("roots") int roots, @JsonProperty("depth") int depth,
@JsonProperty("synonyms") int synonyms, @JsonProperty("ignored") int ignored,
@JsonProperty("countByOrigin") Map<Origin, Integer> countByOrigin,
@JsonProperty("countByRank") Map<Rank, Integer> countByRank, @JsonProperty("cycles") List<String> cycles) {
this.roots = roots;
this.depth = depth;
this.synonyms = synonyms;
this.ignored = ignored;
this.countByOrigin = countByOrigin;
this.countByRank = countByRank;
this.cycles = cycles;
}
/**
* @return list of cycles, each given as one taxonID of the loop
*/
public List<String> getCycles() {
return cycles;
}
/**
* @return total count of name usages existing as neo nodes, both accepted and synonyms and regardless of their Origin
*/
public int getCount() {
int total = 0;
for (int x : countByOrigin.values()) {
total += x;
}
return total;
}
/**
* @return the number of root taxa without a parent
*/
public int getRoots() {
return roots;
}
/**
* @return maximum depth of the classification
*/
public int getDepth() {
return depth;
}
/**
* @return the number of synonym nodes in this checklist
*/
public int getSynonyms() {
return synonyms;
}
public int getIgnored() {
return ignored;
}
public int getCountByRank(Rank rank) {
if (countByRank.containsKey(rank)) {
return countByRank.get(rank);
}
return 0;
}
public int getCountByOrigin(Origin o) {
if (countByOrigin.containsKey(o)) {
return countByOrigin.get(o);
}
return 0;
}
public Map<Origin, Integer> getCountByOrigin() {
return countByOrigin;
}
public Map<Rank, Integer> getCountByRank() {
return countByRank;
}
@Override
public String toString() {
return "NormalizerStats{roots=" + roots +
", depth=" + depth +
", synonyms=" + synonyms +
", ignored=" + ignored+
", cycles=" + cycles.size() +
", countByOrigin=" + countByOrigin +
", countByRank=" + countByRank +
'}';
}
@Override
public int hashCode() {
return Objects.hashCode(roots, depth, synonyms, ignored, cycles, countByOrigin, countByRank);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
final NormalizerStats other = (NormalizerStats) obj;
return Objects.equal(this.roots, other.roots)
&& Objects.equal(this.depth, other.depth)
&& Objects.equal(this.synonyms, other.synonyms)
&& Objects.equal(this.ignored, other.ignored)
&& Objects.equal(this.cycles, other.cycles)
&& Objects.equal(this.countByOrigin, other.countByOrigin)
&& Objects.equal(this.countByRank, other.countByRank);
}
}