Multiple distance with token distance exclusion constraint, 
Add packages to the test classes
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanMultipleDistanceQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanMultipleDistanceQuery.java
index 08628ff..473e9c6 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanMultipleDistanceQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanMultipleDistanceQuery.java
@@ -18,6 +18,7 @@
  * 	No repetition of constraints of the same type is allowed. For example,
  * 	there must only exactly one constraint for word/token-based distance.
  * 	
+ * 	Warning: Exclusion constraint is not suitable yet!
  * 	@author margaretha
  * */
 public class SpanMultipleDistanceQuery extends SimpleSpanQuery{
@@ -71,8 +72,8 @@
 			sb.append(":");
 			sb.append(c.getMaxDistance());
 			sb.append("], ");		
-			sb.append( isOrdered ? "ordered, " : "notOrdered, " );
-			sb.append( c.isExclusion() ? "excluded)]" : "notExcluded)");			
+			sb.append(isOrdered ? "ordered, " : "notOrdered, ");
+			sb.append(c.isExclusion() ? "excluded)]" : "notExcluded)");			
 			if (i < size-1) sb.append(", ");
 		}		
 		sb.append("])");
@@ -92,6 +93,7 @@
 		SpanDistanceQuery sdq,sdq2;		
 		Spans ds,ds2;
 		MultipleDistanceSpans mds = null;
+		boolean exclusion;
 		
 		c = constraints.get(0);
 		sdq = createSpanDistanceQuery(c);
@@ -100,9 +102,10 @@
 		for (int i=1; i< constraints.size(); i++){
 			sdq2 = createSpanDistanceQuery(constraints.get(i));
 			ds2 = sdq2.getSpans(context, acceptDocs, termContexts);			
-						
+			
+			exclusion = sdq.isExclusion() && sdq2.isExclusion();
 			mds = new MultipleDistanceSpans(this, context, acceptDocs, 
-					termContexts, ds, ds2, isOrdered); 
+					termContexts, ds, ds2, isOrdered, exclusion); 
 			ds = mds;
 		}
 		
@@ -113,16 +116,19 @@
 	 * 	@return a SpanDistanceQuery 
 	 * */
 	private SpanDistanceQuery createSpanDistanceQuery(DistanceConstraint c) {		
-				
+		SpanDistanceQuery sdq;		
 		if (c.getUnit().equals("w")){
-			return new SpanDistanceQuery(firstClause, secondClause,
+			sdq = new SpanDistanceQuery(firstClause, secondClause,
 					c.getMinDistance(), c.getMaxDistance(),isOrdered, 
-					collectPayloads);
+					collectPayloads);		
 		}
-		
-		return new SpanDistanceQuery(c.getElementQuery(), firstClause, 
-				secondClause, c.getMinDistance(), c.getMaxDistance(),
-				isOrdered, collectPayloads);
+		else {
+			sdq = new SpanDistanceQuery(c.getElementQuery(), firstClause, 
+					secondClause, c.getMinDistance(), c.getMaxDistance(),
+					isOrdered, collectPayloads);
+		}
+		sdq.setExclusion(c.isExclusion());
+		return sdq;
 	}
 
 	public List<DistanceConstraint> getConstraints() {
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/DistanceExclusionSpan.java b/src/main/java/de/ids_mannheim/korap/query/spans/DistanceExclusionSpan.java
index 02102bb..cb83e5c 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/DistanceExclusionSpan.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/DistanceExclusionSpan.java
@@ -56,17 +56,13 @@
 		
 		// skip the secondSpan to the right side of the firstspan
 		while (hasMoreSecondSpans && secondSpans.doc() == firstSpans.doc() &&
-				firstSpans.start() >= secondSpans.end()){
-			
-			if (isOrdered){
-				hasMoreSecondSpans = secondSpans.next();
-			}
-			else if (calculateActualDistance() > maxDistance){
-				hasMoreSecondSpans = secondSpans.next();
-			}
+				firstSpans.start() >= secondSpans.end()){		
+
 			// the firstspan is within maxDistance
-			//if (!isOrdered && calculateActualDistance() <= maxDistance){
-			else { break; }			
+			if (!isOrdered && calculateActualDistance() <= maxDistance){
+				break; 
+			}		
+			hasMoreSecondSpans = secondSpans.next();
 						
 		}		
 	}
@@ -108,7 +104,7 @@
 	    	matchPayload.addAll(firstSpans.getPayload());
   		
   		setMatchFirstSpan(new CandidateSpan(firstSpans));
-  		setMatchSecondSpan(new CandidateSpan(secondSpans));
+  		//setMatchSecondSpan(new CandidateSpan(secondSpans));
   		
   		log.trace("doc# {}, start {}, end {}",matchDocNumber,matchStartPosition,
 				matchEndPosition);		
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/DistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/DistanceSpans.java
index f2169df..5f8b553 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/DistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/DistanceSpans.java
@@ -25,11 +25,13 @@
 
 	protected CandidateSpan matchFirstSpan,matchSecondSpan;	
 	protected Logger log = LoggerFactory.getLogger(DistanceSpans.class);
+	protected boolean exclusion; // because MultipleDistanceQuery doesn't have this property
     
 	public DistanceSpans(SpanDistanceQuery query,
 			AtomicReaderContext context, Bits acceptDocs,
 			Map<Term, TermContext> termContexts) throws IOException {
 		super(query, context, acceptDocs, termContexts);
+		exclusion = query.isExclusion();
 	}
 	
 	public DistanceSpans(SpanMultipleDistanceQuery query,
@@ -85,4 +87,12 @@
 		this.matchSecondSpan = matchSecondSpan;
 	}
 
+	public boolean isExclusion() {
+		return exclusion;
+	}
+
+	public void setExclusion(boolean exclusion) {
+		this.exclusion = exclusion;
+	}
+
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/MultipleDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/MultipleDistanceSpans.java
index 698b88f..b15e94d 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/MultipleDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/MultipleDistanceSpans.java
@@ -8,6 +8,7 @@
 import org.apache.lucene.index.TermContext;
 import org.apache.lucene.search.spans.Spans;
 import org.apache.lucene.util.Bits;
+import org.hamcrest.core.IsInstanceOf;
 
 import de.ids_mannheim.korap.query.SpanDistanceQuery;
 import de.ids_mannheim.korap.query.SpanMultipleDistanceQuery;
@@ -15,6 +16,11 @@
 /**	Span enumeration of matches whose two sub-spans has exactly the same 
  * 	first and second sub-sub-spans. This class basically filters the span 
  * 	matches of its child spans.
+ * 
+ * 	TODO: This doesn't accommodate distance constraint with exclusion
+ * 	Case 1: return the match from another non-exclusion constraint.
+ * 	Case 2: return only the first-span when all constraints are exclusions.
+ * 	Case 3:	spans are not in the same doc 
  * 	 
  *	@author margaretha
  * */
@@ -23,30 +29,17 @@
 	private DistanceSpans x,y;
 	private boolean isOrdered;
 	
-	public MultipleDistanceSpans(SpanDistanceQuery query,
-			AtomicReaderContext context, Bits acceptDocs,
-			Map<Term, TermContext> termContexts, 
-			Spans firstSpans, Spans secondSpans, boolean isOrdered) 
-			throws IOException {
-		super(query, context, acceptDocs, termContexts);
-		init(firstSpans, secondSpans, isOrdered);
-	}
-	
 	public MultipleDistanceSpans(SpanMultipleDistanceQuery query,
 			AtomicReaderContext context, Bits acceptDocs,
-			Map<Term, TermContext> termContexts, 
-			Spans firstSpans, Spans secondSpans, boolean isOrdered) 
+			Map<Term, TermContext> termContexts, Spans firstSpans, 
+			Spans secondSpans, boolean isOrdered, boolean exclusion) 
 			throws IOException {
 		super(query, context, acceptDocs, termContexts);
-		init(firstSpans, secondSpans, isOrdered);
-	}
-	
-	private void init(Spans firstSpans, Spans secondSpans, 
-			boolean isOrdered) throws IOException{
-		this.isOrdered =isOrdered;
+		this.isOrdered = isOrdered;
+		this.exclusion = exclusion;		
 		x = (DistanceSpans) firstSpans;
 		y = (DistanceSpans) secondSpans;		
-		hasMoreSpans = x.next() && y.next();
+		hasMoreSpans = x.next() && y.next();		
 	}
 
 	@Override
@@ -58,8 +51,7 @@
 	
 	/** Find the next match.
 	 * */
-	protected boolean advance() throws IOException {
-		
+	protected boolean advance() throws IOException {		
 		while (hasMoreSpans && ensureSameDoc(x, y)){ 
 			if (findMatch()){
 				moveForward();
@@ -101,24 +93,42 @@
 		CandidateSpan yf = y.getMatchFirstSpan();
 		CandidateSpan ys = y.getMatchSecondSpan();
 		
-		if (xf.getStart() == yf.getStart() &&
+		if (x.isExclusion() || y.isExclusion()){			
+			if (xf.getStart() == yf.getStart() && xf.getEnd() == yf.getEnd()){
+				if (x.isExclusion() && y.isExclusion()){
+					// set x or y doesnt matter
+					setMatchProperties(x,true);
+				}
+				else if (x.isExclusion()){  
+					// set y, the usual match
+					setMatchProperties(y,true);
+				}
+				else { setMatchProperties(x,true); }
+				return true;
+			}
+		}
+		else if (xf.getStart() == yf.getStart() &&
 				xf.getEnd() == yf.getEnd() &&
 				xs.getStart() == ys.getStart() &&
 				xs.getEnd() == ys.getEnd()){
-			
-			matchStartPosition = x.start();
-			matchEndPosition = x.end();
-			matchDocNumber = x.doc();
-			matchPayload = x.matchPayload;	
-			
-			setMatchFirstSpan(x.getMatchFirstSpan());
-			setMatchSecondSpan(x.getMatchSecondSpan());
-			log.trace("doc# {}, start {}, end {}",matchDocNumber,
-					matchStartPosition,matchEndPosition);	
+			setMatchProperties(x,false);			
 			return true;
 		}		
 		return false;
 	}
+	
+
+	private void setMatchProperties(DistanceSpans span, boolean exclusion) {
+		matchStartPosition = span.start();
+		matchEndPosition = span.end();
+		matchDocNumber = span.doc();
+		matchPayload = span.matchPayload;	
+		
+		setMatchFirstSpan(span.getMatchFirstSpan());
+		if (!exclusion) setMatchSecondSpan(span.getMatchSecondSpan());
+		log.trace("doc# {}, start {}, end {}",matchDocNumber,
+				matchStartPosition,matchEndPosition);	
+	}
 
 	@Override
 	public boolean skipTo(int target) throws IOException {
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/OrderedDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/OrderedDistanceSpans.java
index ef29174..9c56fbd 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/OrderedDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/OrderedDistanceSpans.java
@@ -108,7 +108,9 @@
 		}
 		
 		log.trace("doc# {}, start {}, end {}",matchDocNumber,matchStartPosition,
-				matchEndPosition);		
+				matchEndPosition);	
+		System.out.println("firstspan "+getMatchFirstSpan().getStart()+" "+ getMatchFirstSpan().getEnd());
+		System.out.println("secondspan "+getMatchSecondSpan().getStart()+" "+ getMatchSecondSpan().getEnd());
 	}
 
 	@Override
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
index bb2208d..0bb22f2 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
@@ -92,7 +92,7 @@
     public SpanSequenceQueryWrapper withConstraint (int min, int max) {
 	if (this.constraints == null)
 	    this.constraints = new ArrayList<DistanceConstraint>(1);
-	this.constraints.add(new DistanceConstraint(min, max, false));
+	this.constraints.add(new DistanceConstraint(min, max,false));
 	return this;
     };
 
@@ -100,12 +100,11 @@
 	if (this.constraints == null)
 	    this.constraints = new ArrayList<DistanceConstraint>(1);
 	if (unit.equals("w"))
-	    this.constraints.add(new DistanceConstraint(min, max, false));
+	    this.constraints.add(new DistanceConstraint(min, max,false));
 	else
 	    this.constraints.add(
 		 new DistanceConstraint(
-                     new SpanElementQuery(this.field, unit), min, max, false
-                 )
+                     new SpanElementQuery(this.field, unit), min, max,false)
 	    );
 	return this;
     };
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestClassIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestClassIndex.java
index a99ce8a..6229ce1 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestClassIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestClassIndex.java
@@ -1,3 +1,5 @@
+package de.ids_mannheim.korap.index;
+
 import java.util.*;
 import java.io.*;
 
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestDistanceExclusionIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestDistanceExclusionIndex.java
index 91bbed7..1ff0b64 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestDistanceExclusionIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestDistanceExclusionIndex.java
@@ -138,7 +138,6 @@
     	sq.setExclusion(true);
     	return sq;
     }
-
     
     private FieldDocument createFieldDoc0(){
     	FieldDocument fd = new FieldDocument();
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestIndex.java
index b74ebc1..874695e 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestIndex.java
@@ -1,3 +1,5 @@
+package de.ids_mannheim.korap.index;
+
 import java.util.*;
 import java.io.*;
 
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestKorapIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestKorapIndex.java
index 2200069..86eaf8d 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestKorapIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestKorapIndex.java
@@ -1,3 +1,5 @@
+package de.ids_mannheim.korap.index;
+
 import java.util.*;
 import java.io.*;
 
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java b/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java
index b556c6f..3596a73 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java
@@ -1,3 +1,5 @@
+package de.ids_mannheim.korap.index;
+
 import java.util.*;
 import java.io.*;
 
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestMatchIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestMatchIndex.java
index 46f8f41..c1855da 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestMatchIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestMatchIndex.java
@@ -1,3 +1,5 @@
+package de.ids_mannheim.korap.index;
+
 import java.util.*;
 import java.io.*;
 
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestMultipleDistanceIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestMultipleDistanceIndex.java
index bcba704..c21ebb1 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestMultipleDistanceIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestMultipleDistanceIndex.java
@@ -36,13 +36,12 @@
 		return new SpanMultipleDistanceQuery(sx, sy, constraints, isOrdered, true);
 	}
 	
-	public DistanceConstraint createConstraint(String unit, int min, int max, 
-			boolean exclusion){		
+	public DistanceConstraint createConstraint(String unit, int min, int max){		
 		if (unit.equals("w")){
-			return new DistanceConstraint(min, max, exclusion);
+			return new DistanceConstraint(min, max,false);
 		}		
 		return new DistanceConstraint(new SpanElementQuery("base", unit), 
-				min, max, exclusion);	
+				min, max,false);	
 	}
 	
     private FieldDocument createFieldDoc0() {
@@ -102,7 +101,6 @@
         return fd;
 	}
     
-  
     /** Unordered, same sentence
      * */
     @Test
@@ -112,8 +110,8 @@
         ki.commit();
         
     	List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
- 	    constraints.add(createConstraint("w", 0, 2,false));	    
- 	    constraints.add(createConstraint("s", 0, 0,false));
+ 	    constraints.add(createConstraint("w", 0, 2));	    
+ 	    constraints.add(createConstraint("s", 0, 0));
  	    
  	    SpanQuery mdq;	   
 		mdq = createQuery("s:b", "s:c", constraints, false);
@@ -141,8 +139,8 @@
         ki.commit();
 		
 	    List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
-	    constraints.add(createConstraint("w", 0, 2,false));	    
-	    constraints.add(createConstraint("s", 1, 1,false));
+	    constraints.add(createConstraint("w", 0, 2));	    
+	    constraints.add(createConstraint("s", 1, 1));
 	    
 	    SpanQuery mdq;
 	    // Ordered
@@ -165,7 +163,7 @@
 	    assertEquals(4, kr.getMatch(2).getEndPos());
 				
 		// Three constraints
-		constraints.add(createConstraint("p", 0, 0,false));		
+		constraints.add(createConstraint("p", 0, 0));		
 		mdq = createQuery("s:b", "s:c", constraints, true);
 		kr = ki.search(mdq, (short) 10);
 		assertEquals(2, kr.getTotalResults());
@@ -188,8 +186,8 @@
     	ki.commit();
            
        	List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
-	    constraints.add(createConstraint("w", 1, 2, false));	    
-	    constraints.add(createConstraint("s", 1, 2, false));
+	    constraints.add(createConstraint("w", 1, 2));	    
+	    constraints.add(createConstraint("s", 1, 2));
     	    
 	    SpanQuery mdq;	   
 		mdq = createQuery("s:b", "s:e", constraints, false);
@@ -218,8 +216,8 @@
     	ki.commit();
     	
     	List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
-	    constraints.add(createConstraint("w", 1, 2, false));	    
-	    constraints.add(createConstraint("s", 1, 2, false));
+	    constraints.add(createConstraint("w", 1, 2));	    
+	    constraints.add(createConstraint("s", 1, 2));
 		
 	    SpanQuery mdq;	   
 		mdq = createQuery("s:b", "s:c", constraints, false);
@@ -247,8 +245,8 @@
     	ki.commit();
     	
     	List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
-	    constraints.add(createConstraint("w", 1, 2, false));	    
-	    constraints.add(createConstraint("s", 1, 2, false));
+	    constraints.add(createConstraint("w", 1, 2));	    
+	    constraints.add(createConstraint("s", 1, 2));
 		
 	    SpanQuery mdq;	   
 		mdq = createQuery("s:c", "s:c", constraints, false);
@@ -267,75 +265,76 @@
 
     }
 	
-    /** Gaps
-     * 	TODO: exclusion is wrong, only need to match the first span,
-     * 
+    /** Exclusion
+     * 	Gaps
      * */
     @Test
    	public void testCase6() throws IOException {
     	ki = new KorapIndex();
     	ki.addDoc(createFieldDoc3());    	
-    	ki.commit();    	
-    	    	
+    	ki.commit();
+    	
+    	// First constraint - token exclusion
     	SpanQuery sx = new SpanTermQuery(new Term("base","s:b")); 
 		SpanQuery sy = new SpanTermQuery(new Term("base","s:c"));
 		SpanDistanceQuery sq = new SpanDistanceQuery(sx, sy, 0, 1, false, true);
 		sq.setExclusion(true);
 		
 		kr = ki.search(sq, (short) 10);
-
-//		System.out.print(kr.getTotalResults()+"\n");
-//		for (int i=0; i< kr.getTotalResults(); i++){
-//			System.out.println(
-//				kr.match(i).getLocalDocID()+" "+
-//				kr.match(i).startPos + " " +
-//				kr.match(i).endPos
-//		    );
-//		}
+		assertEquals(1, kr.getTotalResults());
+		// 4-5
 		
+    	// Second constraint - element distance
 		sq = new SpanDistanceQuery(new SpanElementQuery("base", "s"), sx,
-				sy, 1, 1, false, true);
-		
-		kr = ki.search(sq, (short) 10);
-
-//		System.out.print(kr.getTotalResults()+"\n");
-//		for (int i=0; i< kr.getTotalResults(); i++){
-//			System.out.println(
-//				kr.match(i).getLocalDocID()+" "+
-//				kr.match(i).startPos + " " +
-//				kr.match(i).endPos
-//		    );
-//		}
+				sy, 1, 1, false, true);		
+		kr = ki.search(sq, (short) 10);		
+		// 0-3, 1-3, 1-4, 1-5, 3-7, 4-7
+		assertEquals(6, kr.getTotalResults());
 		
     	List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
-	    constraints.add(createConstraint("w", 0, 1, true));	    
-	    constraints.add(createConstraint("s", 1, 1, false));
-	    
+	    constraints.add(new DistanceConstraint(0, 1,true));
+	    constraints.add(createConstraint("s", 1, 1));
+	    	    
 	    SpanQuery mdq;	   
 		mdq = createQuery("s:b", "s:c", constraints, false);
 		kr = ki.search(mdq, (short) 10);
 		
-//		System.out.print(kr.getTotalResults()+"\n");
-//		for (int i=0; i< kr.getTotalResults(); i++){
-//			System.out.println(
-//				kr.match(i).getLocalDocID()+" "+
-//				kr.match(i).startPos + " " +
-//				kr.match(i).endPos
-//		    );
-//		}
-		
-//		assertEquals(4, kr.getTotalResults());
-//	    assertEquals(0, kr.getMatch(0).getStartPos());
-//	    assertEquals(3, kr.getMatch(0).getEndPos());
-//	    assertEquals(1, kr.getMatch(1).getStartPos());
-//	    assertEquals(3, kr.getMatch(1).getEndPos());	    
-//	    assertEquals(1, kr.getMatch(2).getStartPos());
-//	    assertEquals(4, kr.getMatch(2).getEndPos());
-//	    assertEquals(3, kr.getMatch(3).getStartPos());
-//	    assertEquals(7, kr.getMatch(3).getEndPos());	
-	    
-
-    }    
+		assertEquals(2, kr.getTotalResults());
+	    assertEquals(1, kr.getMatch(0).getStartPos());
+	    assertEquals(5, kr.getMatch(0).getEndPos());
+	    assertEquals(4, kr.getMatch(1).getStartPos());
+	    assertEquals(7, kr.getMatch(1).getEndPos());
+    }
     
+    
+    /** Exclusion, multiple documents
+     * 	wait for element distance exclusion 
+     * */
+/*    @Test
+    public void testCase7() throws IOException {
+    	ki = new KorapIndex();
+    	//ki.addDoc(createFieldDoc3());
+    	ki.addDoc(createFieldDoc0());
+    	ki.addDoc(createFieldDoc2());    	
+    	ki.commit();
+    	
+    	List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
+	    constraints.add(new DistanceConstraint(0, 1,true));
+	    constraints.add(new DistanceConstraint(new SpanElementQuery("base", "s"), 
+				0, 0,true));
+	    	    
+	    SpanQuery mdq;	   
+		mdq = createQuery("s:b", "s:c", constraints, false);
+		kr = ki.search(mdq, (short) 10);
+		
+		System.out.print(kr.getTotalResults()+"\n");
+		for (int i=0; i< kr.getTotalResults(); i++){
+			System.out.println(
+				kr.match(i).getLocalDocID()+" "+
+				kr.match(i).startPos + " " +
+				kr.match(i).endPos
+		    );
+		}
+	}*/
 }
 
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestPosToOffset.java b/src/test/java/de/ids_mannheim/korap/index/TestPosToOffset.java
index d656275..f096877 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestPosToOffset.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestPosToOffset.java
@@ -1,3 +1,5 @@
+package de.ids_mannheim.korap.index;
+
 import java.util.*;
 import java.io.*;
 
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestRealIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestRealIndex.java
index c3c7443..3ac5a32 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestRealIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestRealIndex.java
@@ -1,3 +1,5 @@
+package de.ids_mannheim.korap.index;
+
 import java.util.*;
 import java.io.*;
 
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestRegexWildcardIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestRegexWildcardIndex.java
index 13916cf..0cddcf9 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestRegexWildcardIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestRegexWildcardIndex.java
@@ -1,3 +1,5 @@
+package de.ids_mannheim.korap.index;
+
 import java.util.*;
 import java.io.*;
 
@@ -49,7 +51,7 @@
 	KorapQuery kq = new KorapQuery("base");
 	SpanQuery sq = kq.re("s:af*e").toQuery();
 	assertEquals("SpanMultiTermQueryWrapper(base:/s:af*e/)", sq.toString());
-
+			
 	KorapSearch ks = new KorapSearch(sq);
 	ks.leftContext.setToken(true).setLength(1);
 	ks.rightContext.setToken(true).setLength(1);
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestTermInfo.java b/src/test/java/de/ids_mannheim/korap/index/TestTermInfo.java
index b9f4014..28f5b2b 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestTermInfo.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestTermInfo.java
@@ -1,3 +1,5 @@
+package de.ids_mannheim.korap.index;
+
 import java.util.*;
 import java.io.*;
 
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestWithinIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestWithinIndex.java
index 8f40a7f..be963c1 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestWithinIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestWithinIndex.java
@@ -1,3 +1,5 @@
+package de.ids_mannheim.korap.index;
+
 import java.util.*;
 import java.io.*;
 
@@ -946,4 +948,28 @@
 
 	assertEquals("totalResults", 0, kr.totalResults());
     };
+    
+   /** SpanElementQueries 
+    * */
+   @Test
+   public void indexExample8() throws IOException{	   
+	   	KorapIndex ki = new KorapIndex();		
+		FieldDocument fd = new FieldDocument();
+		// <a>xx <e>hi j <e>hi j</e></e></a>
+		fd.addTV("base",
+			 "xx hi j hi j",
+			 "[(0-1)s:x|i:x|_0#0-1|<>:a#1-12$<i>8]" +
+			 "[(1-2)s:x|i:x|_1#1-2]" +
+			 "[(3-4)s:h|i:h|_2#3-4|<>:e#3-12$<i>8]" +
+			 "[(4-5)s:i|i:i|_3#4-5]" +
+			 "[(6-7)s:j|i:j|_4#6-7]" +
+			 "[(8-9)s:h|i:h|_5#8-9|<>:e#8-9$<i>8]" +
+			 "[(9-10)s:i|i:i|_6#9-10]" +
+			 "[(11-12)s:j|i:j|_7#11-12]");
+		ki.addDoc(fd);
+		
+		
+	}
+   
+    
 };