blob: 5bc962a1308854b18e1bfe273e4c4b13230b8e07 [file] [log] [blame]
package de.ids_mannheim.korap.query;
import java.io.IOException;
import java.util.Map;
import org.apache.lucene.index.AtomicReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermContext;
import org.apache.lucene.search.spans.SpanQuery;
import org.apache.lucene.search.spans.Spans;
import org.apache.lucene.util.Bits;
import de.ids_mannheim.korap.query.spans.FocusSpans;
public class SpanRelationMatchQuery extends SimpleSpanQuery{
private SpanQuery operandQuery;
private SpanQuery operand2Query;
private SpanRelationQuery relationQuery;
public SpanRelationMatchQuery (SpanRelationQuery relation, SpanQuery operand,
boolean collectPayloads) {
checkVariables(relation, operand);
SpanFocusQuery sq = new SpanFocusQuery(new SpanSegmentQuery(
relationQuery, operandQuery, true),
relation.getTempClassNumbers());
sq.setMatchTemporaryClass(true);
sq.setRemoveTemporaryClasses(true);
sq.setSorted(false); // which operand to focus might be
// different from that to match
this.setFirstClause(sq);
this.collectPayloads = collectPayloads;
}
public SpanRelationMatchQuery (SpanRelationQuery relation, SpanQuery source,
SpanQuery target, boolean collectPayloads) {
checkVariables(relation, source, target);
SpanFocusQuery sq = null;
// match source
if (relationQuery.getDirection() == 0) {
sq = new SpanFocusQuery(new SpanSegmentQuery(relationQuery,
operandQuery, true), relation.getTempTargetNum());
}
// match target
else {
sq = new SpanFocusQuery(new SpanSegmentQuery(relationQuery,
operandQuery, true), relation.getTempSourceNum());
}
sq.setSorted(false);
sq.setMatchTemporaryClass(true);
SpanFocusQuery sq2 = new SpanFocusQuery(new SpanSegmentQuery(sq,
operand2Query, true), relation.getTempClassNumbers());
sq2.setMatchTemporaryClass(true);
sq2.setRemoveTemporaryClasses(true);
sq2.setSorted(false);
this.setFirstClause(sq2);
this.collectPayloads = collectPayloads;
}
public void checkVariables(SpanRelationQuery relation, SpanQuery operand) {
if (relation == null) {
throw new IllegalArgumentException(
"The relation query cannot be null.");
}
if (operand == null) {
throw new IllegalArgumentException(
"The operand query cannot be null.");
}
this.field = relation.getField();
if (!operand.getField().equals(field)) {
throw new IllegalArgumentException(
"Clauses must have the same field.");
}
this.relationQuery = relation;
this.operandQuery = operand;
}
public void checkVariables(SpanRelationQuery relation, SpanQuery operand, SpanQuery target) {
checkVariables(relation, operand);
if (target == null) {
if (operand == null) {
throw new IllegalArgumentException(
"The target query cannot be null.");
}
}
if (!target.getField().equals(field)) {
throw new IllegalArgumentException(
"Clauses must have the same field.");
}
this.operand2Query = target;
}
@Override
public SimpleSpanQuery clone() {
if (operand2Query != null) {
return new SpanRelationMatchQuery(
(SpanRelationQuery) relationQuery.clone(),
(SpanQuery) operandQuery.clone(),
(SpanQuery) operand2Query.clone(), collectPayloads);
}
return new SpanRelationMatchQuery(
(SpanRelationQuery) relationQuery.clone(),
(SpanQuery) operandQuery.clone(), collectPayloads);
}
@Override
public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
Map<Term, TermContext> termContexts) throws IOException {
return new FocusSpans((SpanFocusQuery) firstClause, context,
acceptDocs, termContexts);
}
@Override
public String toString(String field) {
return getFirstClause().toString();
}
}