Added a query function for retrieving relationspans with attribute(s)
diff --git a/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java b/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
index 6bc3370..5f0dd9d 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
@@ -17,7 +17,7 @@
implements Cloneable{
protected SpanQuery firstClause, secondClause;
- protected List<SpanQuery> clauseList;
+ protected List<SpanQuery> clauseList=null;
private String field;
protected boolean collectPayloads;
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanElementAttributeQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanElementAttributeQuery.java
index 1c30699..a825ec3 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanElementAttributeQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanElementAttributeQuery.java
@@ -62,7 +62,7 @@
@Override
public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
Map<Term, TermContext> termContexts) throws IOException {
- return new ElementAttributeSpans(this, context, acceptDocs, termContexts);
+ return null; //new ElementAttributeSpans(this, context, acceptDocs, termContexts);
}
@Override
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanWithAttributeQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanWithAttributeQuery.java
new file mode 100644
index 0000000..7352efc
--- /dev/null
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanWithAttributeQuery.java
@@ -0,0 +1,139 @@
+package de.ids_mannheim.korap.query;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+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.ElementAttributeSpans;
+import de.ids_mannheim.korap.query.spans.ElementSpans;
+import de.ids_mannheim.korap.query.spans.RelationSpans;
+
+/** Enumeration of spans (e.g. element or relation spans) having some specific attribute(s) or
+ * <em>not</em> having some attribute(s).
+ *
+ * @author margaretha
+ */
+public class SpanWithAttributeQuery extends SimpleSpanQuery{
+
+ private boolean isMultipleAttributes;
+ private String type;
+
+ public SpanWithAttributeQuery(SpanElementQuery firstClause,
+ SpanAttributeQuery secondClause, boolean collectPayloads) {
+ super(firstClause, secondClause, collectPayloads);
+ type = "spanElementWithAttribute";
+ }
+
+ public SpanWithAttributeQuery(SpanElementQuery firstClause,
+ List<SpanQuery> secondClauses, boolean collectPayloads) {
+ super(firstClause, secondClauses, collectPayloads);
+ isMultipleAttributes = true;
+ type = "spanElementWithAttribute";
+ }
+
+ public SpanWithAttributeQuery(SpanRelationQuery firstClause,
+ SpanAttributeQuery secondClause, boolean collectPayloads) {
+ super(firstClause, secondClause, collectPayloads);
+ type = "spanRelationWithAttribute";
+ }
+
+ public SpanWithAttributeQuery(SpanRelationQuery firstClause,
+ List<SpanQuery> secondClauses, boolean collectPayloads) {
+ super(firstClause, secondClauses, collectPayloads);
+ isMultipleAttributes = true;
+ type = "spanRelationWithAttribute";
+ }
+
+ @Override
+ public SimpleSpanQuery clone() {
+ SpanWithAttributeQuery sq;
+ if (!isMultipleAttributes){
+ if (type.equals("spanElementWithAttribute")){
+ sq = new SpanWithAttributeQuery(
+ (SpanElementQuery) firstClause.clone(),
+ (SpanAttributeQuery) secondClause.clone(),
+ collectPayloads);
+ }
+ else {
+ sq = new SpanWithAttributeQuery(
+ (SpanRelationQuery) firstClause.clone(),
+ (SpanAttributeQuery) secondClause.clone(),
+ collectPayloads);
+ }
+ }
+ else {
+ List<SpanQuery> clauseList = new ArrayList<SpanQuery>();
+ SpanAttributeQuery saq;
+ for (SpanQuery q : this.clauseList ){
+ saq = (SpanAttributeQuery) q;
+ clauseList.add(saq.clone());
+ }
+
+ if (type.equals("spanElementWithAttribute")){
+ sq = new SpanWithAttributeQuery(
+ (SpanElementQuery) firstClause.clone(),
+ clauseList,
+ collectPayloads);
+ }
+ else {
+ sq = new SpanWithAttributeQuery(
+ (SpanRelationQuery) firstClause.clone(),
+ clauseList,
+ collectPayloads);
+ }
+ }
+ return sq;
+ }
+
+ @Override
+ public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+ Map<Term, TermContext> termContexts) throws IOException {
+
+ Spans spans = this.getFirstClause().getSpans(context, acceptDocs, termContexts);
+
+ if (type.equals("spanElementWithAttribute")){
+ return new ElementAttributeSpans(this, (ElementSpans) spans,
+ context, acceptDocs, termContexts);
+ }
+
+ return new ElementAttributeSpans(this, (RelationSpans) spans,
+ context, acceptDocs, termContexts);
+ }
+
+ @Override
+ public String toString(String field) {
+
+ StringBuilder sb = new StringBuilder();
+ sb.append(type);
+ sb.append("(");
+ sb.append(firstClause.toString(field));
+ sb.append(", ");
+ if (isMultipleAttributes){
+ sb.append("[");
+
+ SpanQuery sq;
+ for (int i=0; i < clauseList.size(); i++){
+ sq = clauseList.get(i);
+ sb.append(sq.toString(field));
+
+ if (i < clauseList.size() -1)
+ sb.append(", ");
+ }
+
+ sb.append("]");
+ }
+ else {
+ sb.append(secondClause.toString(field));
+ }
+ sb.append(")");
+ return sb.toString();
+ }
+}
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java
index 66b16f3..13fa867 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java
@@ -33,7 +33,7 @@
private List<CandidateAttributeSpan> candidateList;
private int currentDoc, currentPosition;
- private short elementRef;
+ private short spanId;
private boolean isFinish;
protected Logger logger = LoggerFactory.getLogger(AttributeSpans.class);
@@ -71,7 +71,7 @@
this.matchDocNumber = cs.getDoc();
this.matchStartPosition = cs.getStart();
this.matchEndPosition = cs.getEnd();
- this.setElementRef(cs.getElementRef());
+ this.setSpanId(cs.getSpanId());
candidateList.remove(0);
return true;
}
@@ -98,10 +98,9 @@
while (hasMoreSpans && firstSpans.doc() == currentDoc &&
firstSpans.start() == currentPosition){
- short elementRef = retrieveElementRef(firstSpans);
- if (DEBUG)
- logger.info("ElementRef: "+elementRef);
- candidateList.add(new CandidateAttributeSpan(firstSpans,elementRef));
+ short spanId = retrieveSpanId(firstSpans);
+ //logger.info("ElementRef: "+elementRef);
+ candidateList.add(new CandidateAttributeSpan(firstSpans,spanId));
hasMoreSpans = firstSpans.next();
}
@@ -111,7 +110,7 @@
/** Get the elementRef from payload
* */
- private short retrieveElementRef(Spans firstSpans) throws IOException {
+ private short retrieveSpanId(Spans firstSpans) throws IOException {
List<byte[]> payload = (List<byte[]>) firstSpans.getPayload();
long s = System.nanoTime();
ByteBuffer wrapper = ByteBuffer.wrap(payload.get(0));
@@ -122,12 +121,12 @@
return num;
}
- public short getElementRef(){
- return this.elementRef;
+ public short getSpanId(){
+ return this.spanId;
}
- public void setElementRef(short elementRef) {
- this.elementRef = elementRef;
+ public void setSpanId(short spanId) {
+ this.spanId = spanId;
}
public boolean isFinish() {
@@ -162,27 +161,27 @@
class CandidateAttributeSpan extends CandidateSpan
implements Comparable<CandidateSpan>{
- private short elementRef;
+ private short spanId;
- public CandidateAttributeSpan(Spans span, short elementRef)
+ public CandidateAttributeSpan(Spans span, short spanId)
throws IOException {
super(span);
- setElementRef(elementRef);
+ setSpanId(spanId);
}
- public void setElementRef(short elementRef) {
- this.elementRef = elementRef;
+ public void setSpanId(short spanId) {
+ this.spanId = spanId;
}
- public short getElementRef() {
- return elementRef;
+ public short getSpanId() {
+ return spanId;
}
@Override
public int compareTo(CandidateSpan o) {
CandidateAttributeSpan cs = (CandidateAttributeSpan) o;
- if (this.elementRef == cs.elementRef)
+ if (this.spanId == cs.spanId)
return 0;
- else if (this.elementRef > cs.elementRef )
+ else if (this.spanId > cs.spanId )
return 1;
return -1;
}
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/CandidateSpan.java b/src/main/java/de/ids_mannheim/korap/query/spans/CandidateSpan.java
index 269fc5d..48fdd90 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/CandidateSpan.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/CandidateSpan.java
@@ -107,11 +107,11 @@
this.childSpan = childSpan;
}
- public short getElementRef() {
+ public short getSpanId() {
return elementRef;
}
- public void setElementRef(short elementRef) {
+ public void setSpanId(short elementRef) {
this.elementRef = elementRef;
}
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ElementAttributeSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ElementAttributeSpans.java
index a378e1a..31fc6c7 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ElementAttributeSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ElementAttributeSpans.java
@@ -14,7 +14,7 @@
import org.slf4j.LoggerFactory;
import de.ids_mannheim.korap.query.SpanAttributeQuery;
-import de.ids_mannheim.korap.query.SpanElementAttributeQuery;
+import de.ids_mannheim.korap.query.SpanWithAttributeQuery;
/** Span enumeration of elements that have some attribute and/or do <em>not</em>
* have some attributes. This class handles <em>and</em> operation on attributes.
@@ -27,7 +27,7 @@
* */
public class ElementAttributeSpans extends SimpleSpans{
- private ElementSpans elements;
+ private WithIdSpans withAttributeSpans;
private List<AttributeSpans> attributeList;
private List<AttributeSpans> notAttributeList;
@@ -36,30 +36,41 @@
// This advices the java compiler to ignore all loggings
public static final boolean DEBUG = false;
- public ElementAttributeSpans(SpanElementAttributeQuery simpleSpanQuery,
+ public ElementAttributeSpans(SpanWithAttributeQuery spanWithAttributeQuery,
+ WithIdSpans withIdSpans,
AtomicReaderContext context, Bits acceptDocs,
Map<Term, TermContext> termContexts) throws IOException {
- super(simpleSpanQuery, context, acceptDocs, termContexts);
- elements = (ElementSpans) firstSpans;
- elements.isElementRef = true; // dummy setting enabling reading elementRef
- hasMoreSpans = elements.next();
+ super(spanWithAttributeQuery, context, acceptDocs, termContexts);
+ withAttributeSpans = withIdSpans;
+ withAttributeSpans.hasSpanId = true; // dummy setting enabling reading elementRef
+ hasMoreSpans = withAttributeSpans.next();
attributeList = new ArrayList<AttributeSpans>();
- notAttributeList = new ArrayList<AttributeSpans>();
+ notAttributeList = new ArrayList<AttributeSpans>();
- List<SpanQuery> sqs = simpleSpanQuery.getClauseList();
- AttributeSpans as;
- for (SpanQuery sq: sqs){
- as = (AttributeSpans) sq.getSpans(context, acceptDocs, termContexts);
- if (((SpanAttributeQuery) sq).isNegation()){
- notAttributeList.add(as);
- as.next();
+ List<SpanQuery> sqs = spanWithAttributeQuery.getClauseList();
+ if (sqs != null){
+ for (SpanQuery sq: sqs){
+ addAttributes(sq, context, acceptDocs, termContexts);
}
- else {
- attributeList.add(as);
- hasMoreSpans &= as.next();
- }
- }
+ }
+ else {
+ addAttributes(spanWithAttributeQuery.getSecondClause(),
+ context, acceptDocs, termContexts);
+ }
+ }
+
+ private void addAttributes(SpanQuery sq, AtomicReaderContext context, Bits acceptDocs,
+ Map<Term, TermContext> termContexts) throws IOException {
+ AttributeSpans as = (AttributeSpans) sq.getSpans(context, acceptDocs, termContexts);
+ if (((SpanAttributeQuery) sq).isNegation()){
+ notAttributeList.add(as);
+ as.next();
+ }
+ else {
+ attributeList.add(as);
+ hasMoreSpans &= as.next();
+ }
}
@Override
@@ -76,20 +87,19 @@
private boolean advance() throws IOException {
while (hasMoreSpans && computeElementPosition()){
- if (DEBUG)
- logger.info("element: " + elements.start() + ","+ elements.end() +
- " ref:"+elements.getElementRef());
+ logger.info("element: " + withAttributeSpans.start() + ","+ withAttributeSpans.end() +
+ " ref:"+withAttributeSpans.getSpanId());
if (checkElementRef() && checkNotElementRef()){
- this.matchDocNumber = elements.doc();
- this.matchStartPosition = elements.start();
- this.matchEndPosition = elements.end();
- this.matchPayload = elements.getPayload();
+ this.matchDocNumber = withAttributeSpans.doc();
+ this.matchStartPosition = withAttributeSpans.start();
+ this.matchEndPosition = withAttributeSpans.end();
+ this.matchPayload = withAttributeSpans.getPayload();
hasMoreSpans = attributeList.get(0).next();
- if (DEBUG)
- logger.info("MATCH "+matchDocNumber);
- hasMoreSpans = elements.next();
+ logger.info("MATCH "+matchDocNumber);
+
+ hasMoreSpans = withAttributeSpans.next();
return true;
}
}
@@ -102,13 +112,13 @@
private boolean checkElementRef() throws IOException{
for (AttributeSpans attribute: attributeList){
- if (elements.getElementRef() != attribute.getElementRef()){
+ if (withAttributeSpans.getSpanId() != attribute.getSpanId()){
if (DEBUG)
logger.info("attribute ref doesn't match");
- if (elements.getElementRef() < attribute.getElementRef())
+ if (withAttributeSpans.getSpanId() < attribute.getSpanId())
hasMoreSpans = attribute.next();
else {
- hasMoreSpans = elements.next();
+ hasMoreSpans = withAttributeSpans.next();
}
return false;
@@ -123,11 +133,11 @@
private boolean checkNotElementRef() throws IOException{
for (AttributeSpans notAttribute: notAttributeList){
if (!notAttribute.isFinish() &&
- elements.start() == notAttribute.start() &&
- elements.getElementRef() == notAttribute.getElementRef()){
+ withAttributeSpans.start() == notAttribute.start() &&
+ withAttributeSpans.getSpanId() == notAttribute.getSpanId()){
if (DEBUG)
logger.info("not attribute ref exists");
- hasMoreSpans = elements.next();
+ hasMoreSpans = withAttributeSpans.next();
return false;
}
}
@@ -141,9 +151,9 @@
while (hasMoreSpans){
- if (elements.getElementRef() < 1){ // the element does not have an attribute
- elements.isElementRef = true; // dummy setting enabling reading elementRef
- hasMoreSpans = elements.next();
+ if (withAttributeSpans.getSpanId() < 1){ // the element does not have an attribute
+ withAttributeSpans.hasSpanId = true; // dummy setting enabling reading elementRef
+ hasMoreSpans = withAttributeSpans.next();
if (DEBUG)
logger.info("skip");
continue;
@@ -152,7 +162,7 @@
if (checkAttributeListPosition() &&
checkNotAttributeListPosition()){
if (DEBUG)
- logger.info("element is found: "+ elements.start());
+ logger.info("element is found: "+ withAttributeSpans.start());
return true;
}
}
@@ -171,10 +181,10 @@
// advance the doc# of not AttributeSpans
if (DEBUG)
logger.info("a "+a.start());
- while (!a.isFinish() && a.doc() <= elements.doc()){
+ while (!a.isFinish() && a.doc() <= withAttributeSpans.doc()){
- if (a.doc() == elements.doc() &&
- a.start() >= elements.start())
+ if (a.doc() == withAttributeSpans.doc() &&
+ a.start() >= withAttributeSpans.start())
break;
if (!a.next()) a.setFinish(true);
@@ -188,40 +198,40 @@
* as the element.
* */
private boolean checkAttributeListPosition() throws IOException{
- int currentPosition = elements.start();
+ int currentPosition = withAttributeSpans.start();
boolean isSame = true;
boolean isFirst = true;
for (AttributeSpans a : attributeList){
- if(!ensureSamePosition(elements, a)) return false;
+ if(!ensureSamePosition(withAttributeSpans, a)) return false;
if (DEBUG)
- logger.info("pos:" + elements.start());
+ logger.info("pos:" + withAttributeSpans.start());
if (isFirst){
isFirst = false;
- currentPosition = elements.start();
+ currentPosition = withAttributeSpans.start();
}
- else if (currentPosition != elements.start()){
- currentPosition = elements.start();
+ else if (currentPosition != withAttributeSpans.start()){
+ currentPosition = withAttributeSpans.start();
isSame = false;
}
}
if (DEBUG)
- logger.info("same pos: "+isSame+ ", pos "+elements.start());
+ logger.info("same pos: "+isSame+ ", pos "+withAttributeSpans.start());
return isSame;
}
/** Advance the element or attribute spans to be in the same doc
* and start position.
* */
- private boolean ensureSamePosition(ElementSpans elements,
+ private boolean ensureSamePosition(WithIdSpans spans,
AttributeSpans attributes) throws IOException {
- while (hasMoreSpans && ensureSameDoc(elements, attributes)){
- if (attributes.start() == elements.start())
+ while (hasMoreSpans && ensureSameDoc(spans, attributes)){
+ if (attributes.start() == spans.start())
return true;
- else if (attributes.start() > elements.start())
- hasMoreSpans = elements.next();
+ else if (attributes.start() > spans.start())
+ hasMoreSpans = spans.next();
else
hasMoreSpans= attributes.next();
}
@@ -231,8 +241,8 @@
@Override
public boolean skipTo(int target) throws IOException {
- if (hasMoreSpans && (elements.doc() < target)){
- if (!elements.skipTo(target)){
+ if (hasMoreSpans && (withAttributeSpans.doc() < target)){
+ if (!withAttributeSpans.skipTo(target)){
return false;
}
}
@@ -250,7 +260,7 @@
for (AttributeSpans as: notAttributeList){
cost += as.cost();
}
- return elements.cost() + cost;
+ return withAttributeSpans.cost() + cost;
}
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ElementSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ElementSpans.java
index 31bc8a9..45774b9 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ElementSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ElementSpans.java
@@ -24,14 +24,12 @@
*
* Use copyFrom instead of clone
*/
-public class ElementSpans extends SimpleSpans {
+public class ElementSpans extends WithIdSpans {
private List<CandidateElementSpans> candidateList;
private int currentDoc, currentPosition;
- private short elementRef;
- private TermSpans termSpans;
-
- public boolean isElementRef = false; // A dummy flag
+ //private short elementRef;
+ private TermSpans termSpans;
protected Logger logger = LoggerFactory.getLogger(ElementSpans.class);
@@ -68,7 +66,8 @@
this.matchStartPosition = cs.getStart();
this.matchEndPosition = cs.getEnd();
this.matchPayload = cs.getPayloads();
- this.setElementRef(cs.getElementRef());
+ //this.setElementRef(cs.getSpanId());
+ this.setSpanId(cs.getSpanId());
candidateList.remove(0);
return true;
}
@@ -90,7 +89,8 @@
while (hasMoreSpans && termSpans.doc() == currentDoc &&
termSpans.start() == currentPosition){
CandidateElementSpans cs = new CandidateElementSpans(termSpans,
- elementRef);
+ spanId);
+ //elementRef);
readPayload(cs);
candidateList.add(cs);
hasMoreSpans = termSpans.next();
@@ -120,15 +120,15 @@
cs.setEnd(PayloadReader.readInteger(payload,8));
- if (isElementRef ){
+ if (hasSpanId){
// Copy rest of payloads after the end position and elementref
//payloadBuffer.put(payload.bytes, payload.offset + 14, payload.length - 14);
- cs.setElementRef(PayloadReader.readShort(payload,12));
+ cs.setSpanId(PayloadReader.readShort(payload,12));
}
else{
// Copy rest of payloads after the end position
//payloadBuffer.put(payload.bytes, payload.offset + 12, payload.length - 12);
- cs.setElementRef((short) -1);
+ cs.setSpanId((short) -1);
}
//byte[] offsetCharacters = new byte[8];
@@ -138,7 +138,7 @@
}
else {
cs.setEnd(cs.getStart());
- cs.setElementRef((short) -1);
+ cs.setSpanId((short) -1);
cs.setPayloads(null);
}
}
@@ -162,13 +162,13 @@
return termSpans.cost();
}
- public short getElementRef() {
- return elementRef;
- }
-
- public void setElementRef(short elementRef) {
- this.elementRef = elementRef;
- }
+// public short getElementRef() {
+// return elementRef;
+// }
+//
+// public void setElementRef(short elementRef) {
+// this.elementRef = elementRef;
+// }
/** Match candidate for element spans.
* */
@@ -179,13 +179,13 @@
public CandidateElementSpans(Spans span, short elementRef)
throws IOException {
super(span);
- setElementRef(elementRef);
+ setSpanId(elementRef);
}
- public void setElementRef(short elementRef) {
+ public void setSpanId(short elementRef) {
this.elementRef = elementRef;
}
- public short getElementRef() {
+ public short getSpanId() {
return elementRef;
}
}
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 0b0a901..375c840 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
@@ -38,9 +38,9 @@
*
* @author margaretha
* */
-public class RelationSpans extends SimpleSpans{
+public class RelationSpans extends WithIdSpans{
- short relationId;
+ //short relationId;
int targetStart, targetEnd;
int currentDoc, currentPosition;
@@ -71,7 +71,8 @@
this.matchDocNumber = cs.getDoc();
this.matchStartPosition = cs.getStart();
this.matchEndPosition = cs.getEnd();
- this.matchPayload = cs.getPayloads();
+ this.matchPayload = cs.getPayloads();
+ this.spanId = cs.getSpanId(); // relation id
candidateList.remove(0);
return true;
}
@@ -96,7 +97,7 @@
Collections.sort(candidateList);
/*for (CandidateRelationSpan cs:candidateList){
- System.out.println(cs.getStart()+","+cs.getEnd() //+" <size:" +payload.get(0).length
+ System.out.println(cs.getStart()+","+cs.getEnd() //+" <size:" +payload.get(0).length
+" target "+cs.getTargetStart()+","+cs.getTargetEnd() +" id:"+cs.getRelationId());
}*/
}
@@ -112,7 +113,7 @@
case 6: // Token to token
i = PayloadReader.readInteger(payloadBytesRef,0);
cs.setTargetStart(i);
- cs.setTargetEnd(i+1);
+ cs.setTargetEnd(i);
break;
case 10: // Token to span
@@ -124,7 +125,7 @@
cs.setEnd(PayloadReader.readInteger(payloadBytesRef,0));
i = PayloadReader.readInteger(payloadBytesRef,5);
cs.setTargetStart(i);
- cs.setTargetEnd(i+1);
+ cs.setTargetEnd(i);
break;
case 14: // Span to span
@@ -134,7 +135,7 @@
break;
}
- cs.setRelationId(PayloadReader.readShort(payloadBytesRef, length-2));
+ cs.setSpanId(PayloadReader.readShort(payloadBytesRef, length-2)); //relation id
}
@Override
@@ -155,14 +156,14 @@
public long cost() {
return firstSpans.cost();
}
-
+/*
public short getRelationId() {
return relationId;
}
public void setRelationId(short relationId) {
this.relationId = relationId;
- }
+ }*/
public int getTargetStart() {
return targetStart;
@@ -183,7 +184,7 @@
class CandidateRelationSpan extends CandidateSpan implements Comparable<CandidateSpan>{
- private int targetStart, targetEnd, relationId;
+ private int targetStart, targetEnd;
public CandidateRelationSpan(Spans span) throws IOException{
super(span);
@@ -226,14 +227,6 @@
public void setTargetStart(int targetStart) {
this.targetStart = targetStart;
}
-
- public int getRelationId() {
- return relationId;
- }
-
- public void setRelationId(int relationId) {
- this.relationId = relationId;
- }
}
}
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/WithIdSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/WithIdSpans.java
new file mode 100644
index 0000000..76ee1cc
--- /dev/null
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/WithIdSpans.java
@@ -0,0 +1,40 @@
+package de.ids_mannheim.korap.query.spans;
+
+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.util.Bits;
+
+import de.ids_mannheim.korap.query.SpanElementQuery;
+import de.ids_mannheim.korap.query.SpanRelationQuery;
+
+public abstract class WithIdSpans extends SimpleSpans{
+
+ protected short spanId;
+ protected boolean hasSpanId = false; // A dummy flag
+
+ public WithIdSpans(SpanElementQuery spanElementQuery,
+ AtomicReaderContext context, Bits acceptDocs,
+ Map<Term, TermContext> termContexts) throws IOException {
+ super(spanElementQuery, context, acceptDocs, termContexts);
+ }
+
+ public WithIdSpans(SpanRelationQuery spanRelationQuery,
+ AtomicReaderContext context, Bits acceptDocs,
+ Map<Term, TermContext> termContexts) throws IOException {
+ super(spanRelationQuery, context, acceptDocs, termContexts);
+ }
+
+ public short getSpanId() {
+ return spanId;
+ }
+
+ public void setSpanId(short spanId) {
+ this.spanId = spanId;
+ }
+
+
+}
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestAttributeIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestAttributeIndex.java
index 5749746..88e5c3f 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestAttributeIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestAttributeIndex.java
@@ -14,9 +14,9 @@
import de.ids_mannheim.korap.KorapIndex;
import de.ids_mannheim.korap.KorapResult;
import de.ids_mannheim.korap.query.SpanAttributeQuery;
-import de.ids_mannheim.korap.query.SpanElementAttributeQuery;
import de.ids_mannheim.korap.query.SpanElementQuery;
import de.ids_mannheim.korap.query.SpanNextQuery;
+import de.ids_mannheim.korap.query.SpanWithAttributeQuery;
public class TestAttributeIndex {
@@ -92,7 +92,7 @@
List<SpanQuery> sql = new ArrayList<>();
sql.add(saq);
- SpanQuery sq = new SpanElementAttributeQuery(
+ SpanQuery sq = new SpanWithAttributeQuery(
new SpanElementQuery("base", "div"),
sql, true);
@@ -125,7 +125,7 @@
new SpanTermQuery(new Term("base","@:class=title")),true)
);
- SpanQuery sq = new SpanElementAttributeQuery(
+ SpanQuery sq = new SpanWithAttributeQuery(
new SpanElementQuery("base", "div"),
sql, true);
@@ -146,7 +146,7 @@
new SpanTermQuery(new Term("base","@:class=book")),true,true)
);
- sq = new SpanElementAttributeQuery(
+ sq = new SpanWithAttributeQuery(
new SpanElementQuery("base", "div"),
sql, true);
@@ -164,7 +164,7 @@
new SpanTermQuery(new Term("base","@:class=title")),true,true)
);
- sq = new SpanElementAttributeQuery(
+ sq = new SpanWithAttributeQuery(
new SpanElementQuery("base", "div"),
sql, true);
@@ -188,7 +188,7 @@
sql.add(new SpanAttributeQuery(
new SpanTermQuery(new Term("base","@:class=book")),true,true)
);
- SpanQuery sq = new SpanElementAttributeQuery(
+ SpanQuery sq = new SpanWithAttributeQuery(
new SpanElementQuery("base", "div"),
sql, true);
@@ -218,7 +218,7 @@
List<SpanQuery> sql = new ArrayList<>();
sql.add(saq);
- SpanElementAttributeQuery sq = new SpanElementAttributeQuery(
+ SpanWithAttributeQuery sq = new SpanWithAttributeQuery(
new SpanElementQuery("base", "div"),
sql, true);
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 cb7be66..e155b1e 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java
@@ -9,8 +9,11 @@
import org.junit.Test;
import de.ids_mannheim.korap.KorapIndex;
+import de.ids_mannheim.korap.KorapMatch;
import de.ids_mannheim.korap.KorapResult;
+import de.ids_mannheim.korap.query.SpanAttributeQuery;
import de.ids_mannheim.korap.query.SpanRelationQuery;
+import de.ids_mannheim.korap.query.SpanWithAttributeQuery;
/*
@@ -83,20 +86,64 @@
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]" +
+ "r@:func=subj$<s>2]" +
"[(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]" +
+ "<:xip/syntax-dep_rel$<i>9<i>1<i>3<s>2|" +
+ "r@:func=obj$<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;
}
+ private FieldDocument createFieldDoc2(){
+ FieldDocument fd = new FieldDocument();
+ fd.addString("ID", "doc-2");
+ fd.addTV("base",
+ "Ich kaufe die Blümen für meine Mutter.",
+ "[(0-3)s:Ich|_0#0-3|pos:NN|<>:s#0-38$<i>7<s>-1|<>:np#0-3$<i>1<s>-1|" +
+ ">:child-of$<i>0<i>7<s>1|" +
+ "<:dep$<i>1<s>2|" +
+ "r@:func=sbj$<s>1]" +
+
+ "[(1-2)s:kaufe|_1#4-9|pos:V|<>:vp#4-38$<i>7<s>-1|" +
+ ">:child-of$<i>7<i>0<i>7<s>1|>:child-of$<i>1<i>7<s>2|" +
+ ">:dep$<i>0<s>3|>:dep$<i>3<s>4]" +
+
+ "[(2-3)s:die|_2#10-13|pos:ART|<>:np#10-20$<i>4<s>-1|<>:np#10-38$<i>7<s>-1|" +
+ ">:child-of$<i>4<i>2<i>7<s>1|>:child-of$<i>2<i>4<s>2|>:child-of$<i>7<i>1<i>7<s>2|" +
+ "<:dep$<i>3<s>3|r@:func=obj$<s>1" +
+ "]" +
+
+ "[(3-4)s:Blümen|_3#14-20|pos:NN|" +
+ ">:child-of$<i>2<i>4<s>1|" +
+ "<:dep$<i>1<s>2|>:dep$<i>2<s>3|>:dep$<i>4<s>4|" +
+ "r@:func=head$<s>2]" +
+
+ "[(4-5)s:für|_4#21-24|pos:PREP|<>:pp#21-38$<i>7<s>-1|" +
+ ">:child-of$<i>4<i>7<s>1|>:child-of$<i>7<i>2<i>7<s>2|" +
+ "<:dep$<i>3<s>1|>:dep$<i>5<s>2" +
+ "]" +
+
+ "[(5-6)s:meine|_5#25-30|pos:ART|<>:np#25-38$<i>7<s>-1|" +
+ ">:child-of$<i>5<i>7<s>1|>:child-of$<i>7<i>4<i>7<s>2|" +
+ "<:dep$<i>7<s>3" +
+ "]" +
+ "[(6-7)s:Mutter.|_6#31-38|pos:NN|" +
+ ">:child-of$<i>5<i>7<s>1|" +
+ ">:dep$<i>5<s>2|<:dep$<i>4<s>3|" +
+ "r@:func=head$<s>3]");
+
+ return fd;
+ }
+ /** Relations: token to token, token to span, span to span
+ * */
@Test
public void testCase1() throws IOException {
ki.addDoc(createFieldDoc0());
@@ -134,6 +181,8 @@
}
+ /** Relation span to token
+ * */
@Test
public void testCase2() throws IOException {
ki.addDoc(createFieldDoc0());
@@ -166,4 +215,77 @@
assertEquals(9,kr.getMatch(6).getStartPos());
assertEquals(10,kr.getMatch(6).getEndPos());
}
+
+ /** Relations with attributes
+ * */
+ @Test
+ public void testCase3() throws IOException {
+ ki.addDoc(createFieldDoc2());
+ ki.commit();
+
+ // child-of relations
+ SpanRelationQuery srq = new SpanRelationQuery(
+ new SpanTermQuery(new Term("base",">:child-of")),true);
+ kr = ki.search(srq,(short) 20);
+
+ assertEquals(12, kr.getTotalResults());
+
+ // child-of with attr func=sbj
+ SpanWithAttributeQuery wq =
+ new SpanWithAttributeQuery(srq,
+ new SpanAttributeQuery(
+ new SpanTermQuery(new Term("base", "r@:func=sbj")),
+ true),
+ true
+ );
+
+ kr = ki.search(wq,(short) 10);
+ assertEquals(1, kr.getTotalResults());
+ assertEquals(0,kr.getMatch(0).getStartPos()); // token
+ assertEquals(1,kr.getMatch(0).getEndPos());
+
+ // child-of with attr func-obj
+ wq = new SpanWithAttributeQuery(srq,
+ new SpanAttributeQuery(
+ new SpanTermQuery( new Term("base", "r@:func=obj")),
+ true),
+ true
+ );
+
+ kr = ki.search(wq,(short) 10);
+
+ assertEquals(1, kr.getTotalResults());
+ assertEquals(2,kr.getMatch(0).getStartPos()); // element
+ assertEquals(4,kr.getMatch(0).getEndPos());
+
+ // target of a dependency relation
+ srq = new SpanRelationQuery(
+ new SpanTermQuery(new Term("base","<:dep")),true);
+ kr = ki.search(srq,(short) 10);
+
+ assertEquals(6, kr.getTotalResults());
+
+ // target of a dependency relation, which is also a head
+ wq = new SpanWithAttributeQuery(srq,
+ new SpanAttributeQuery(
+ new SpanTermQuery( new Term("base", "r@:func=head")),
+ true),
+ true
+ );
+
+ kr = ki.search(wq,(short) 20);
+
+ assertEquals(2, kr.getTotalResults());
+ assertEquals(3,kr.getMatch(0).getStartPos());
+ assertEquals(4,kr.getMatch(0).getEndPos());
+ assertEquals(6,kr.getMatch(1).getStartPos());
+ assertEquals(7,kr.getMatch(1).getEndPos());
+
+ /*for (KorapMatch km : kr.getMatches()){
+ System.out.println(km.getStartPos() +","+km.getEndPos()+" "
+ +km.getSnippetBrackets());
+ } */
+ }
+
+
}