Fixed deletion bug in virtual collections - left two known bugs

Change-Id: Ib975976009ddfa74e9a9f3f07049bdad87a0486f
diff --git a/src/main/java/de/ids_mannheim/korap/KrillCollectionNew.java b/src/main/java/de/ids_mannheim/korap/KrillCollectionNew.java
index 894a747..f94b407 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillCollectionNew.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillCollectionNew.java
@@ -7,11 +7,13 @@
 import de.ids_mannheim.korap.response.Notifications;
 
 import org.apache.lucene.search.*;
+import org.apache.lucene.index.AtomicReader;
 import org.apache.lucene.index.AtomicReaderContext;
 import org.apache.lucene.util.FixedBitSet;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.OpenBitSet;
 import org.apache.lucene.util.DocIdBitSet;
+import org.apache.lucene.search.BitsFilteredDocIdSet;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -58,6 +60,7 @@
         return filter.toString();
     };
 
+    /*
     public FixedBitSet bits (AtomicReaderContext atomic) throws IOException {
 
         int maxDoc = atomic.reader().maxDoc();
@@ -68,7 +71,7 @@
             return null;
 
         // Init vector
-        DocIdSet docids = filter.getDocIdSet(atomic, atomic.reader().getLiveDocs());
+        DocIdSet docids = filter.getDocIdSet(atomic, null);
         DocIdSetIterator filterIter = (docids == null) ? null : docids.iterator();
 
         if (filterIter == null) {
@@ -87,17 +90,60 @@
         };
 
         // Remove deleted docs
-        /*
-        System.err.println(atomic.reader().getClass());
-        FixedBitSet livedocs = (FixedBitSet) atomic.reader().getLiveDocs();
-        if (livedocs != null) {
-            bitset.and(livedocs);
-        };
-        */
+        return (FixedBitSet) BitsFilteredDocIdSet.wrap(
+            (DocIdSet) bitset,
+            (Bits) atomic.reader().getLiveDocs()
+                                                       ).iterator();
+    };
+    */
 
+
+    public FixedBitSet bits (AtomicReaderContext atomic) throws IOException {
+        AtomicReader r = atomic.reader();
+        FixedBitSet bitset = new FixedBitSet(r.maxDoc());
+        DocIdSet docids = this.getDocIdSet(atomic, (Bits) r.getLiveDocs());
+        if (docids == null)
+            return null;
+        bitset.or(docids.iterator());
         return bitset;
     };
 
+
+    public DocIdSet getDocIdSet (AtomicReaderContext atomic, Bits acceptDocs) throws IOException {
+
+        int maxDoc = atomic.reader().maxDoc();
+        FixedBitSet bitset = new FixedBitSet(maxDoc);
+
+        Filter filter;
+        if (this.cb == null || (filter = this.cb.toFilter()) == null)
+            return null;
+
+        // Init vector
+        DocIdSet docids = filter.getDocIdSet(atomic, null);
+        DocIdSetIterator filterIter = (docids == null) ? null : docids.iterator();
+
+        if (filterIter == null) {
+            if (!this.cb.isNegative())
+                return null;
+
+            bitset.set(0, maxDoc);
+        }
+        else {
+            // Or bit set
+            bitset.or(filterIter);
+
+            // Revert for negation
+            if (this.cb.isNegative())
+                bitset.flip(0, maxDoc);
+        };
+
+        // Remove deleted docs
+        return (DocIdSet) BitsFilteredDocIdSet.wrap(
+            (DocIdSet) bitset,
+            acceptDocs
+        );
+    };
+
     /**
      * Search for the number of occurrences of different types,
      * e.g. <i>documents</i>, <i>sentences</i> etc. in the virtual
diff --git a/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilderNew.java b/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilderNew.java
index 8b2ff4d..5bb9968 100644
--- a/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilderNew.java
+++ b/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilderNew.java
@@ -73,7 +73,8 @@
 
             return new CollectionBuilderRange(field, begin, end);
         };
-        return new CollectionBuilderTerm(field, dateDF.toString());
+
+        return new CollectionBuilderRange(field, dateDF.floor(), dateDF.ceil());
     };