blob: 2d560331b5e38716efe57fc90dbecebcf9500f68 [file] [log] [blame]
package de.ids_mannheim.korap.query;
import java.io.IOException;
import java.util.Map;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermContext;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.spans.SpanQuery;
import org.apache.lucene.search.spans.Spans;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.ToStringUtils;
import de.ids_mannheim.korap.query.spans.ClassSpans;
/**
* Marks spans with a special class payload.
*/
public class SpanClassQuery extends SimpleSpanQuery {
protected byte number = 1;
public SpanClassQuery (SpanQuery operand) {
super(operand, false);
};
public SpanClassQuery (SpanQuery operand, byte number) {
super(operand, false);
this.number = number;
};
@Override
public String toString (String field) {
StringBuffer buffer = new StringBuffer("{");
short classNr = (short) this.number;
buffer.append(classNr & 0xFF).append(": ");
buffer.append(this.firstClause.toString()).append('}');
buffer.append(ToStringUtils.boost(getBoost()));
return buffer.toString();
};
@Override
public Spans getSpans (final LeafReaderContext context, Bits acceptDocs,
Map<Term, TermContext> termContexts) throws IOException {
return (Spans) new ClassSpans(this.firstClause, context, acceptDocs,
termContexts, number);
};
@Override
public Query rewrite (IndexReader reader) throws IOException {
SpanQuery query = (SpanQuery) this.firstClause.rewrite(reader);
if (query != this.firstClause) {
// Rewritten spanquery is empty
if (query.getField() == null) {
// Return the empty child query
return query;
};
SpanClassQuery clone = this.clone();
clone.firstClause = query;
return clone;
};
return this;
};
@Override
public SpanClassQuery clone () {
SpanClassQuery spanClassQuery = new SpanClassQuery(
(SpanQuery) this.firstClause.clone(), this.number);
spanClassQuery.setBoost(getBoost());
return spanClassQuery;
};
/** Returns true iff <code>o</code> is equal to this. */
@Override
public boolean equals (Object o) {
if (this == o)
return true;
if (!(o instanceof SpanClassQuery))
return false;
final SpanClassQuery spanClassQuery = (SpanClassQuery) o;
if (!this.firstClause.equals(spanClassQuery.firstClause))
return false;
if (this.number != spanClassQuery.number)
return false;
return getBoost() == spanClassQuery.getBoost();
};
// I don't know what I am doing here
@Override
public int hashCode () {
int result = 1;
result = firstClause.hashCode();
result += (int) number;
result ^= (result << 15) | (result >>> 18);
result += Float.floatToRawIntBits(getBoost());
return result;
}
public byte getNumber () {
return number;
}
public void setNumber (byte number) {
this.number = number;
};
};