/**
*
*/
package querqy.model;
import querqy.CharSequenceUtil;
import querqy.ComparableCharSequence;
import querqy.ComparableCharSequenceWrapper;
import querqy.CompoundCharSequence;
import querqy.LowerCaseCharSequence;
import querqy.SimpleComparableCharSequence;
/**
* @author René Kriegler, @renekrie
*
*/
public class Term extends AbstractNode<DisjunctionMaxQuery> implements DisjunctionMaxClause, CharSequence, InputSequenceElement {
protected final String field;
protected final ComparableCharSequence value;
public Term(final DisjunctionMaxQuery parentQuery, final String field, final CharSequence value, final boolean generated) {
super(parentQuery, generated);
this.field = field;
this.value = ComparableCharSequence.class.isAssignableFrom(value.getClass())
? (ComparableCharSequence) value
: new ComparableCharSequenceWrapper(value);
}
public Term(final DisjunctionMaxQuery parentQuery, final String field, final CharSequence value) {
this(parentQuery, field, value, false);
}
public Term(final DisjunctionMaxQuery parentQuery, final CharSequence value) {
this(parentQuery, null, value);
}
public Term(final DisjunctionMaxQuery parentQuery, final CharSequence value, final boolean generated) {
this(parentQuery, null, value, generated);
}
public Term(final DisjunctionMaxQuery parentQuery, final String field, final char[] value,
final int start, final int length, final boolean generated) {
this(parentQuery, field, new SimpleComparableCharSequence(value, start, length), generated);
}
@Override
public Term clone(final DisjunctionMaxQuery newParent) {
return clone(newParent, isGenerated());
}
public Term clone(final DisjunctionMaxQuery newParent, final boolean isGenerated) {
return new Term(newParent, field, value, isGenerated);
}
@Override
public <T> T accept(final NodeVisitor<T> visitor) {
return visitor.visit(this);
}
public String getField() {
return field;
}
@Override
public char charAt(final int index) {
return value.charAt(index);
}
public ComparableCharSequence getValue() {
return value;
}
@Override
public String toString() {
return ((field == null) ? "*" : field) + ":" + getValue();
}
@Override
public int length() {
return value.length();
}
@Override
public ComparableCharSequence subSequence(final int start, final int end) {
return value.subSequence(start, end);
}
public ComparableCharSequence toCharSequenceWithField(final boolean lowerCaseValue) {
ComparableCharSequence valueToUse = lowerCaseValue ? new LowerCaseCharSequence(this) : value;
return (field == null) ? valueToUse : new CompoundCharSequence(":", field, valueToUse);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((field == null) ? 0 : field.hashCode());
result = prime * result + ((value == null) ? 0 : CharSequenceUtil.hashCode(value));
return result;
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Term other = (Term) obj;
if (field == null) {
if (other.field != null) {
return false;
}
} else if (!field.equals(other.field)) {
return false;
}
if (value == null) {
if (other.value != null) {
return false;
}
} else if (! CharSequenceUtil.equals(this, value)) {
return false;
}
return true;
}
}