//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.uima.grammar;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import uk.gov.dstl.baleen.types.language.WordToken;
/**
* A word and its distance in dependency graph space.
*/
public class WordDistance implements Comparable<WordDistance> {
private final WordToken word;
private final WordDistance previous;
private final int distance;
/**
* Instantiates a new word distance.
*
* @param word
* the word
*/
public WordDistance(WordToken word) {
this.word = word;
this.previous = null;
this.distance = 0;
}
/**
* Instantiates a new word distance.
*
* @param word
* the word
* @param wordDistance
* the word distance parent / previous edge
*/
public WordDistance(WordToken word, WordDistance wordDistance) {
this.word = word;
this.previous = wordDistance;
this.distance = wordDistance.getDistance() + 1;
}
/**
* Gets the word.
*
* @return the word
*/
public WordToken getWord() {
return word;
}
/**
* Gets the distance.
*
* @return the distance
*/
public int getDistance() {
return distance;
}
/**
* Gets the word distance.
*
* @return the word distance
*/
public WordDistance getWordDistance() {
return previous;
}
/**
* Gets the words.
*
* @return the words
*/
public List<WordToken> getWords() {
if (previous == null) {
return Collections.singletonList(word);
} else {
return collate(new ArrayList<>(distance));
}
}
/**
* Collate all the words in the stack into the list.
*
* @param list
* the list to add words to
* @return the (same as param) list
*/
protected List<WordToken> collate(List<WordToken> list) {
List<WordToken> result = list;
if (previous != null) {
result = previous.collate(list);
}
result.add(word);
return result;
}
@Override
public int compareTo(WordDistance o) {
return Integer.compare(getDistance(), o.getDistance());
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + distance;
result = prime * result + (word == null ? 0 : word.hashCode());
result = prime * result + (previous == null ? 0 : previous.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
WordDistance other = (WordDistance) obj;
if (distance != other.distance) {
return false;
}
if (word == null) {
if (other.word != null) {
return false;
}
} else if (!word.equals(other.word)) {
return false;
}
if (previous == null) {
if (other.previous != null) {
return false;
}
} else if (!previous.equals(other.previous)) {
return false;
}
return true;
}
@Override
public String toString() {
return word.getCoveredText() + " " + distance;
}
}