Added tests for all relation types
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/RelationSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/RelationSpans.java
index 24bbd82..0b0a901 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/RelationSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/RelationSpans.java
@@ -1,7 +1,6 @@
package de.ids_mannheim.korap.query.spans;
import java.io.IOException;
-import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -10,7 +9,6 @@
import org.apache.lucene.index.AtomicReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermContext;
-import org.apache.lucene.search.spans.SpanTermQuery;
import org.apache.lucene.search.spans.Spans;
import org.apache.lucene.search.spans.TermSpans;
import org.apache.lucene.util.Bits;
@@ -19,7 +17,6 @@
import org.slf4j.LoggerFactory;
import de.ids_mannheim.korap.query.SpanRelationQuery;
-import de.ids_mannheim.korap.query.spans.ElementSpans.CandidateElementSpans;
/** Enumeration of spans denoting relations between two tokens/elements. The start and end of
* a RelationSpan always denote the start and end of the source token/element.
@@ -28,7 +25,7 @@
* 1. Token to token relation (1 int & 1 short, length: 6)
* 2. Token to span (2 int & 1 short, length: 10)
* 3. Span to token (int, byte, int, short, length: 11)
- * 4. Span to Span (3 int & 1 short, length: 13)
+ * 4. Span to Span (3 int & 1 short, length: 14)
*
* Every integer value denotes the start/end position of the start/target of a relation,
* in this format: (sourceEndPos?, startTargetPos, endTargetPos?). The end position of a token is
@@ -63,6 +60,11 @@
@Override
public boolean next() throws IOException {
+ isStartEnumeration=false;
+ return advance();
+ }
+
+ private boolean advance() throws IOException{
while(hasMoreSpans || !candidateList.isEmpty()){
if (!candidateList.isEmpty()){
CandidateRelationSpan cs = candidateList.get(0);
@@ -110,7 +112,7 @@
case 6: // Token to token
i = PayloadReader.readInteger(payloadBytesRef,0);
cs.setTargetStart(i);
- cs.setTargetEnd(i);
+ cs.setTargetEnd(i+1);
break;
case 10: // Token to span
@@ -122,10 +124,10 @@
cs.setEnd(PayloadReader.readInteger(payloadBytesRef,0));
i = PayloadReader.readInteger(payloadBytesRef,5);
cs.setTargetStart(i);
- cs.setTargetEnd(i);
+ cs.setTargetEnd(i+1);
break;
- case 13: // Span to span
+ case 14: // Span to span
cs.setEnd(PayloadReader.readInteger(payloadBytesRef,0));
cs.setTargetStart(PayloadReader.readInteger(payloadBytesRef,4));
cs.setTargetEnd(PayloadReader.readInteger(payloadBytesRef,8));
@@ -136,15 +138,22 @@
}
@Override
- public boolean skipTo(int arg0) throws IOException {
- // TODO Auto-generated method stub
- return false;
+ public boolean skipTo(int target) throws IOException {
+ if (hasMoreSpans && (firstSpans.doc() < target)){
+ if (!firstSpans.skipTo(target)){
+ candidateList.clear();
+ return false;
+ }
+ }
+ setCandidateList();
+ matchPayload.clear();
+ isStartEnumeration=false;
+ return advance();
}
@Override
public long cost() {
- // TODO Auto-generated method stub
- return 0;
+ return firstSpans.cost();
}
public short getRelationId() {
@@ -179,12 +188,6 @@
public CandidateRelationSpan(Spans span) throws IOException{
super(span);
}
-
- /*public CandidateRelationSpan(Spans span, int targetStart, int targetEnd) throws IOException{
- super(span);
- setTargetStart(targetStart);
- setTargetEnd(targetEnd);
- }*/
@Override
public int compareTo(CandidateSpan o) {
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java
index 4bbec84..cb7be66 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java
@@ -1,5 +1,7 @@
package de.ids_mannheim.korap.index;
+import static org.junit.Assert.assertEquals;
+
import java.io.IOException;
import org.apache.lucene.index.Term;
@@ -62,28 +64,106 @@
fd.addString("ID", "doc-0");
fd.addTV("base",
"text",
- "[(0-1)s:c|_1#0-1|>:xip/syntax-dep_rel$<i>7<s>1]" +
- "[(1-2)s:e|_2#1-2|<:xip/syntax-dep_rel$<i>10<s>1|>:xip/syntax-dep_rel$<i>5<s>1]" +
+ "[(0-1)s:c|_1#0-1|>:xip/syntax-dep_rel$<i>6<s>1]" +
+ "[(1-2)s:e|_2#1-2|<:xip/syntax-dep_rel$<i>9<s>1|>:xip/syntax-dep_rel$<i>4<s>1]" +
"[(2-3)s:c|_3#2-3]" +
- "[(3-4)s:c|s:b|_4#3-4|<:xip/syntax-dep_rel$<i>10<s>1]" +
- "[(4-5)s:e|s:d|_5#4-5|<:xip/syntax-dep_rel$<i>2<s>1]" +
+ "[(3-4)s:c|s:b|_4#3-4|<:xip/syntax-dep_rel$<i>9<s>1]" +
+ "[(4-5)s:e|s:d|_5#4-5|<:xip/syntax-dep_rel$<i>1<s>1]" +
"[(5-6)s:c|_6#5-6]" +
"[(6-7)s:d|_7#6-7|<:xip/syntax-dep_rel$<i>1<s>1]" +
"[(7-8)s:e|_8#7-8]" +
"[(8-9)s:e|s:b|_9#8-9]" +
- "[(9-10)s:d|_10#9-10|>:xip/syntax-dep_rel$<i>2<s>2|>:xip/syntax-dep_rel$<i>1<s>1]");
+ "[(9-10)s:d|_10#9-10|>:xip/syntax-dep_rel$<i>1<s>2|>:xip/syntax-dep_rel$<i>3<s>1]");
return fd;
}
- /** Test token-token relation
- * */
+ private FieldDocument createFieldDoc1(){
+ FieldDocument fd = new FieldDocument();
+ fd.addString("ID", "doc-1");
+ fd.addTV("base",
+ "text",
+ "[(0-1)s:c|_1#0-1|>:xip/syntax-dep_rel$<i>3<i>6<i>9<s>2|>:xip/syntax-dep_rel$<i>6<i>9<s>1]" +
+ "[(1-2)s:e|_2#1-2]" +
+ "[(2-3)s:c|_3#2-3]" +
+ "[(3-4)s:c|s:b|_4#3-4]" +
+ "[(4-5)s:e|s:d|_5#4-5]" +
+ "[(5-6)s:c|_6#5-6]" +
+ "[(6-7)s:d|_7#6-7|<:xip/syntax-dep_rel$<i>9<b>0<i>0<s>1|>:xip/syntax-dep_rel$<i>9<b>0<i>9<s>3|" +
+ "<:xip/syntax-dep_rel$<i>9<i>1<i>3<s>2]" +
+ "[(7-8)s:e|_8#7-8]" +
+ "[(8-9)s:e|s:b|_9#8-9]" +
+ "[(9-10)s:d|_10#9-10|<:xip/syntax-dep_rel$<i>6<i>9<s>2]");
+ return fd;
+ }
+
+
@Test
public void testCase1() throws IOException {
ki.addDoc(createFieldDoc0());
+ ki.addDoc(createFieldDoc1());
ki.commit();
SpanRelationQuery sq = new SpanRelationQuery(
new SpanTermQuery(new Term("base",">:xip/syntax-dep_rel")),true);
- ki.search(sq,(short) 10);
+ kr = ki.search(sq,(short) 10);
+
+ assertEquals(7, kr.getTotalResults());
+ // token to token
+ assertEquals(0,kr.getMatch(0).getLocalDocID());
+ assertEquals(0,kr.getMatch(0).getStartPos());
+ assertEquals(1,kr.getMatch(0).getEndPos());
+ assertEquals(1,kr.getMatch(1).getStartPos());
+ assertEquals(2,kr.getMatch(1).getEndPos());
+ assertEquals(9,kr.getMatch(2).getStartPos());
+ assertEquals(10,kr.getMatch(2).getEndPos());
+ assertEquals(9,kr.getMatch(3).getStartPos());
+ assertEquals(10,kr.getMatch(3).getEndPos());
+
+ // token to span
+ assertEquals(1,kr.getMatch(4).getLocalDocID());
+ assertEquals(0,kr.getMatch(4).getStartPos());
+ assertEquals(1,kr.getMatch(4).getEndPos());
+ assertEquals(0,kr.getMatch(5).getStartPos());
+ assertEquals(3,kr.getMatch(5).getEndPos());
+
+ // span to span
+ assertEquals(6,kr.getMatch(6).getStartPos());
+ assertEquals(9,kr.getMatch(6).getEndPos());
+
+ // check target
+
+ }
+
+ @Test
+ public void testCase2() throws IOException {
+ ki.addDoc(createFieldDoc0());
+ ki.addDoc(createFieldDoc1());
+ ki.commit();
+
+ SpanRelationQuery sq = new SpanRelationQuery(
+ new SpanTermQuery(new Term("base","<:xip/syntax-dep_rel")),true);
+ kr = ki.search(sq,(short) 10);
+
+ assertEquals(7, kr.getTotalResults());
+ // token to token
+ assertEquals(0,kr.getMatch(0).getLocalDocID());
+ assertEquals(1,kr.getMatch(0).getStartPos());
+ assertEquals(2,kr.getMatch(0).getEndPos());
+ assertEquals(3,kr.getMatch(1).getStartPos());
+ assertEquals(4,kr.getMatch(1).getEndPos());
+ assertEquals(4,kr.getMatch(2).getStartPos());
+ assertEquals(5,kr.getMatch(2).getEndPos());
+ assertEquals(6,kr.getMatch(3).getStartPos());
+ assertEquals(7,kr.getMatch(3).getEndPos());
+
+ assertEquals(1,kr.getMatch(4).getLocalDocID());
+ // span to token
+ assertEquals(6,kr.getMatch(4).getStartPos());
+ assertEquals(9,kr.getMatch(4).getEndPos());
+ assertEquals(6,kr.getMatch(5).getStartPos());
+ assertEquals(9,kr.getMatch(5).getEndPos());
+ // span to span
+ assertEquals(9,kr.getMatch(6).getStartPos());
+ assertEquals(10,kr.getMatch(6).getEndPos());
}
}