You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2011/11/03 14:35:20 UTC

svn commit: r1197110 [5/10] - in /lucene/dev/branches/solrcloud: ./ dev-tools/eclipse/ dev-tools/idea/.idea/ dev-tools/idea/.idea/libraries/ dev-tools/idea/lucene/contrib/ dev-tools/idea/modules/benchmark/ dev-tools/idea/solr/contrib/langid/ dev-tools/...

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/QueryWrapperFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/QueryWrapperFilter.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/QueryWrapperFilter.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/QueryWrapperFilter.java Thu Nov  3 13:35:07 2011
@@ -20,6 +20,7 @@ package org.apache.lucene.search;
 import java.io.IOException;
 
 import org.apache.lucene.index.IndexReader.AtomicReaderContext;
+import org.apache.lucene.util.Bits;
 
 /** 
  * Constrains search results to only match those which also match a provided
@@ -47,7 +48,7 @@ public class QueryWrapperFilter extends 
   }
 
   @Override
-  public DocIdSet getDocIdSet(final AtomicReaderContext context) throws IOException {
+  public DocIdSet getDocIdSet(final AtomicReaderContext context, final Bits acceptDocs) throws IOException {
     // get a private context that is used to rewrite, createWeight and score eventually
     assert context.reader.getTopReaderContext().isAtomic;
     final AtomicReaderContext privateContext = (AtomicReaderContext) context.reader.getTopReaderContext();
@@ -55,7 +56,7 @@ public class QueryWrapperFilter extends 
     return new DocIdSet() {
       @Override
       public DocIdSetIterator iterator() throws IOException {
-        return weight.scorer(privateContext, true, false, privateContext.reader.getLiveDocs());
+        return weight.scorer(privateContext, true, false, acceptDocs);
       }
       @Override
       public boolean isCacheable() { return false; }

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/SpanFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/SpanFilter.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/SpanFilter.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/SpanFilter.java Thu Nov  3 13:35:07 2011
@@ -16,6 +16,7 @@ package org.apache.lucene.search;
  */
 
 import org.apache.lucene.index.IndexReader.AtomicReaderContext;
+import org.apache.lucene.util.Bits;
 
 import java.io.IOException;
 
@@ -34,5 +35,5 @@ public abstract class SpanFilter extends
    * @return A {@link SpanFilterResult}
    * @throws java.io.IOException if there was an issue accessing the necessary information
    * */
-  public abstract SpanFilterResult bitSpans(AtomicReaderContext context) throws IOException;
+  public abstract SpanFilterResult bitSpans(AtomicReaderContext context, Bits acceptDocs) throws IOException;
 }

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/SpanFilterResult.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/SpanFilterResult.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/SpanFilterResult.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/SpanFilterResult.java Thu Nov  3 13:35:07 2011
@@ -16,7 +16,7 @@ package org.apache.lucene.search;
  */
 
 import java.util.ArrayList;
-
+import java.util.Collections;
 import java.util.List;
 
 
@@ -30,6 +30,9 @@ public class SpanFilterResult {
   private DocIdSet docIdSet;
   private List<PositionInfo> positions;//Spans spans;
   
+  public static final SpanFilterResult EMPTY_SPAN_FILTER_RESULT =
+    new SpanFilterResult(DocIdSet.EMPTY_DOCIDSET, Collections.<PositionInfo>emptyList());
+  
   /**
   *
   * @param docIdSet The DocIdSet for the Filter

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/SpanQueryFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/SpanQueryFilter.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/SpanQueryFilter.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/SpanQueryFilter.java Thu Nov  3 13:35:07 2011
@@ -19,6 +19,7 @@ package org.apache.lucene.search;
 import org.apache.lucene.index.IndexReader.AtomicReaderContext;
 import org.apache.lucene.search.spans.SpanQuery;
 import org.apache.lucene.search.spans.Spans;
+import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.FixedBitSet;
 
 import java.io.IOException;
@@ -52,16 +53,16 @@ public class SpanQueryFilter extends Spa
   }
 
   @Override
-  public DocIdSet getDocIdSet(AtomicReaderContext context) throws IOException {
-    SpanFilterResult result = bitSpans(context);
+  public final DocIdSet getDocIdSet(AtomicReaderContext context, Bits acceptDocs) throws IOException {
+    SpanFilterResult result = bitSpans(context, acceptDocs);
     return result.getDocIdSet();
   }
 
   @Override
-  public SpanFilterResult bitSpans(AtomicReaderContext context) throws IOException {
+  public SpanFilterResult bitSpans(AtomicReaderContext context, Bits acceptDocs) throws IOException {
 
     final FixedBitSet bits = new FixedBitSet(context.reader.maxDoc());
-    Spans spans = query.getSpans(context, context.reader.getLiveDocs());
+    Spans spans = query.getSpans(context, acceptDocs);
     List<SpanFilterResult.PositionInfo> tmp = new ArrayList<SpanFilterResult.PositionInfo>(20);
     int currentDoc = -1;
     SpanFilterResult.PositionInfo currentInfo = null;

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/TermScorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/TermScorer.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/TermScorer.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/TermScorer.java Thu Nov  3 13:35:07 2011
@@ -25,15 +25,15 @@ import org.apache.lucene.search.similari
 /** Expert: A <code>Scorer</code> for documents matching a <code>Term</code>.
  */
 final class TermScorer extends Scorer {
-  private DocsEnum docsEnum;
+  private final DocsEnum docsEnum;
   private int doc = -1;
   private int freq;
 
   private int pointer;
   private int pointerMax;
 
-  private int[] docs;
-  private int[] freqs;
+  private final int[] docs;
+  private final int[] freqs;
   private final DocsEnum.BulkReadResult bulkResult;
   private final Similarity.ExactDocScorer docScorer;
   
@@ -53,6 +53,8 @@ final class TermScorer extends Scorer {
     this.docScorer = docScorer;
     this.docsEnum = td;
     bulkResult = td.getBulkResult();
+    docs = bulkResult.docs.ints;
+    freqs = bulkResult.freqs.ints;
   }
 
   @Override
@@ -60,12 +62,6 @@ final class TermScorer extends Scorer {
     score(c, Integer.MAX_VALUE, nextDoc());
   }
 
-  private final void refillBuffer() throws IOException {
-    pointerMax = docsEnum.read();  // refill
-    docs = bulkResult.docs.ints;
-    freqs = bulkResult.freqs.ints;
-  }
-
   // firstDocID is ignored since nextDoc() sets 'doc'
   @Override
   public boolean score(Collector c, int end, int firstDocID) throws IOException {
@@ -74,7 +70,7 @@ final class TermScorer extends Scorer {
       //System.out.println("TS: collect doc=" + doc);
       c.collect(doc);                      // collect score
       if (++pointer >= pointerMax) {
-        refillBuffer();
+        pointerMax = docsEnum.read();  // refill
         if (pointerMax != 0) {
           pointer = 0;
         } else {
@@ -109,7 +105,7 @@ final class TermScorer extends Scorer {
   public int nextDoc() throws IOException {
     pointer++;
     if (pointer >= pointerMax) {
-      refillBuffer();
+      pointerMax = docsEnum.read();  // refill
       if (pointerMax != 0) {
         pointer = 0;
       } else {

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/cache/ShortValuesCreator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/cache/ShortValuesCreator.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/cache/ShortValuesCreator.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/cache/ShortValuesCreator.java Thu Nov  3 13:35:07 2011
@@ -119,7 +119,7 @@ public class ShortValuesCreator extends 
           if (term == null) {
             break;
           }
-          final Short termval = parser.parseShort(term);
+          final short termval = parser.parseShort(term);
           docs = termsEnum.docs(null, docs);
           while (true) {
             final int docID = docs.nextDoc();

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/ByteArrayDataInput.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/ByteArrayDataInput.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/ByteArrayDataInput.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/ByteArrayDataInput.java Thu Nov  3 13:35:07 2011
@@ -52,7 +52,7 @@ public final class ByteArrayDataInput ex
   public int getPosition() {
     return pos;
   }
-
+  
   public void setPosition(int pos) {
     this.pos = pos;
   }

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/FSDirectory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/FSDirectory.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/FSDirectory.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/FSDirectory.java Thu Nov  3 13:35:07 2011
@@ -122,7 +122,7 @@ public abstract class FSDirectory extend
   protected final Set<String> staleFiles = synchronizedSet(new HashSet<String>()); // Files written, but not yet sync'ed
   private int chunkSize = DEFAULT_READ_CHUNK_SIZE; // LUCENE-1566
 
-  // null means no limite
+  // null means no limit
   private volatile RateLimiter mergeWriteRateLimiter;
 
   // returns the canonical version of the directory, creating it if it doesn't exist.

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/IndexInput.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/IndexInput.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/IndexInput.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/IndexInput.java Thu Nov  3 13:35:07 2011
@@ -26,8 +26,6 @@ import java.io.IOException;
  */
 public abstract class IndexInput extends DataInput implements Cloneable,Closeable {
 
-  protected byte[] copyBuf = null;
-
   /** Closes the stream to further operations. */
   public abstract void close() throws IOException;
 
@@ -59,9 +57,7 @@ public abstract class IndexInput extends
   public void copyBytes(IndexOutput out, long numBytes) throws IOException {
     assert numBytes >= 0: "numBytes=" + numBytes;
 
-    if (copyBuf == null) {
-      copyBuf = new byte[BufferedIndexInput.BUFFER_SIZE];
-    }
+    byte copyBuf[] = new byte[BufferedIndexInput.BUFFER_SIZE];
 
     while (numBytes > 0) {
       final int toCopy = (int) (numBytes > copyBuf.length ? copyBuf.length : numBytes);

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/RateLimiter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/RateLimiter.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/RateLimiter.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/store/RateLimiter.java Thu Nov  3 13:35:07 2011
@@ -63,7 +63,7 @@ public class RateLimiter {
    *  with a biggish count, not one byte at a time. */
   public void pause(long bytes) {
 
-    // TODO: this is purely instantenous rate; maybe we
+    // TODO: this is purely instantaneous rate; maybe we
     // should also offer decayed recent history one?
     final long targetNS = lastNS = lastNS + ((long) (bytes * nsPerByte));
     long curNS = System.nanoTime();
@@ -71,7 +71,7 @@ public class RateLimiter {
       lastNS = curNS;
     }
 
-    // While loop because Thread.sleep doesn't alway sleep
+    // While loop because Thread.sleep doesn't always sleep
     // enough:
     while(true) {
       final long pauseNS = targetNS - curNS;

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/BytesRef.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/BytesRef.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/BytesRef.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/BytesRef.java Thu Nov  3 13:35:07 2011
@@ -79,7 +79,7 @@ public final class BytesRef implements C
 
   /**
    * @param text Initialize the byte[] from the UTF8 bytes
-   * for the provided Sring.  This must be well-formed
+   * for the provided String.  This must be well-formed
    * unicode text, with no unpaired surrogates or U+FFFF.
    */
   public BytesRef(CharSequence text) {

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/CharsRef.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/CharsRef.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/CharsRef.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/CharsRef.java Thu Nov  3 13:35:07 2011
@@ -189,18 +189,22 @@ public final class CharsRef implements C
    * Copies the given array into this CharsRef starting at offset 0
    */
   public void copy(char[] otherChars, int otherOffset, int otherLength) {
+    grow(otherLength);
+    System.arraycopy(otherChars, otherOffset, this.chars, 0,
+        otherLength);
     this.offset = 0;
-    append(otherChars, otherOffset, otherLength);
+    this.length = otherLength;
   }
 
   /**
-   * Appends the given array to this CharsRef starting at the current offset
+   * Appends the given array to this CharsRef
    */
   public void append(char[] otherChars, int otherOffset, int otherLength) {
-    grow(this.offset + otherLength);
-    System.arraycopy(otherChars, otherOffset, this.chars, this.offset,
+    final int newLength = length + otherLength;
+    grow(this.offset + newLength);
+    System.arraycopy(otherChars, otherOffset, this.chars, this.offset+length,
         otherLength);
-    this.length = otherLength;
+    this.length += otherLength;
   }
 
   @Override

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/DocIdBitSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/DocIdBitSet.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/DocIdBitSet.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/DocIdBitSet.java Thu Nov  3 13:35:07 2011
@@ -24,8 +24,8 @@ import org.apache.lucene.search.DocIdSet
 
 
 /** Simple DocIdSet and DocIdSetIterator backed by a BitSet */
-public class DocIdBitSet extends DocIdSet {
-  private BitSet bitSet;
+public class DocIdBitSet extends DocIdSet implements Bits {
+  private final BitSet bitSet;
     
   public DocIdBitSet(BitSet bitSet) {
     this.bitSet = bitSet;
@@ -36,6 +36,11 @@ public class DocIdBitSet extends DocIdSe
     return new DocIdBitSetIterator(bitSet);
   }
 
+  @Override
+  public Bits bits() {
+    return this;
+  }
+
   /** This DocIdSet implementation is cacheable. */
   @Override
   public boolean isCacheable() {
@@ -46,7 +51,18 @@ public class DocIdBitSet extends DocIdSe
    * Returns the underlying BitSet. 
    */
   public BitSet getBitSet() {
-	return this.bitSet;
+    return this.bitSet;
+  }
+  
+  @Override
+  public boolean get(int index) {
+    return bitSet.get(index);
+  }
+  
+  @Override
+  public int length() {
+    // the size may not be correct...
+    return bitSet.size(); 
   }
   
   private static class DocIdBitSetIterator extends DocIdSetIterator {

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/FixedBitSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/FixedBitSet.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/FixedBitSet.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/FixedBitSet.java Thu Nov  3 13:35:07 2011
@@ -67,6 +67,11 @@ public final class FixedBitSet extends D
   }
 
   @Override
+  public Bits bits() {
+    return this;
+  }
+
+  @Override
   public int length() {
     return numBits;
   }
@@ -141,7 +146,7 @@ public final class FixedBitSet extends D
   public int nextSetBit(int index) {
     assert index >= 0 && index < numBits;
     int i = index >> 6;
-    int subIndex = index & 0x3f;      // index within the word
+    final int subIndex = index & 0x3f;      // index within the word
     long word = bits[i] >> subIndex;  // skip all the bits to the right of index
 
     if (word!=0) {
@@ -158,6 +163,9 @@ public final class FixedBitSet extends D
     return -1;
   }
 
+  /** Returns the index of the last set bit before or on the index specified.
+   *  -1 is returned if there are no more set bits.
+   */
   public int prevSetBit(int index) {
     assert index >= 0 && index < numBits: "index=" + index + " numBits=" + numBits;
     int i = index >> 6;

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/OpenBitSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/OpenBitSet.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/OpenBitSet.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/OpenBitSet.java Thu Nov  3 13:35:07 2011
@@ -119,6 +119,11 @@ public class OpenBitSet extends DocIdSet
     return new OpenBitSetIterator(bits, wlen);
   }
 
+  @Override
+  public Bits bits() {
+    return this;
+  }
+
   /** This DocIdSet implementation is cacheable. */
   @Override
   public boolean isCacheable() {

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/PagedBytes.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/PagedBytes.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/PagedBytes.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/PagedBytes.java Thu Nov  3 13:35:07 2011
@@ -17,12 +17,14 @@ package org.apache.lucene.util;
  * limitations under the License.
  */
 
-import org.apache.lucene.store.IndexInput;
-
-import java.util.List;
-import java.util.ArrayList;
 import java.io.Closeable;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lucene.store.DataInput;
+import org.apache.lucene.store.DataOutput;
+import org.apache.lucene.store.IndexInput;
 
 /** Represents a logical byte[] as a series of pages.  You
  *  can write-once into the logical byte[] (append only),
@@ -37,6 +39,8 @@ public final class PagedBytes {
   private final int blockSize;
   private final int blockBits;
   private final int blockMask;
+  private boolean didSkipBytes;
+  private boolean frozen;
   private int upto;
   private byte[] currentBlock;
 
@@ -320,6 +324,7 @@ public final class PagedBytes {
       if (currentBlock != null) {
         blocks.add(currentBlock);
         blockEnd.add(upto);
+        didSkipBytes = true;
       }
       currentBlock = new byte[blockSize];
       upto = 0;
@@ -338,6 +343,12 @@ public final class PagedBytes {
 
   /** Commits final byte[], trimming it if necessary and if trim=true */
   public Reader freeze(boolean trim) {
+    if (frozen) {
+      throw new IllegalStateException("already frozen");
+    }
+    if (didSkipBytes) {
+      throw new IllegalStateException("cannot freeze when copy(BytesRef, BytesRef) was used");
+    }
     if (trim && upto < blockSize) {
       final byte[] newBlock = new byte[upto];
       System.arraycopy(currentBlock, 0, newBlock, 0, upto);
@@ -348,6 +359,7 @@ public final class PagedBytes {
     }
     blocks.add(currentBlock);
     blockEnd.add(upto); 
+    frozen = true;
     currentBlock = null;
     return new Reader(this);
   }
@@ -389,4 +401,150 @@ public final class PagedBytes {
 
     return pointer;
   }
+
+  public final class PagedBytesDataInput extends DataInput {
+    private int currentBlockIndex;
+    private int currentBlockUpto;
+    private byte[] currentBlock;
+
+    PagedBytesDataInput() {
+      currentBlock = blocks.get(0);
+    }
+
+    @Override
+    public Object clone() {
+      PagedBytesDataInput clone = getDataInput();
+      clone.setPosition(getPosition());
+      return clone;
+    }
+
+    /** Returns the current byte position. */
+    public long getPosition() {
+      return currentBlockIndex * blockSize + currentBlockUpto;
+    }
+  
+    /** Seek to a position previously obtained from
+     *  {@link #getPosition}. */
+    public void setPosition(long pos) {
+      currentBlockIndex = (int) (pos >> blockBits);
+      currentBlock = blocks.get(currentBlockIndex);
+      currentBlockUpto = (int) (pos & blockMask);
+    }
+
+    @Override
+    public byte readByte() {
+      if (currentBlockUpto == blockSize) {
+        nextBlock();
+      }
+      return currentBlock[currentBlockUpto++];
+    }
+
+    @Override
+    public void readBytes(byte[] b, int offset, int len) {
+      final int offsetEnd = offset + len;
+      while (true) {
+        final int blockLeft = blockSize - currentBlockUpto;
+        final int left = offsetEnd - offset;
+        if (blockLeft < left) {
+          System.arraycopy(currentBlock, currentBlockUpto,
+                           b, offset,
+                           blockLeft);
+          nextBlock();
+          offset += blockLeft;
+        } else {
+          // Last block
+          System.arraycopy(currentBlock, currentBlockUpto,
+                           b, offset,
+                           left);
+          currentBlockUpto += left;
+          break;
+        }
+      }
+    }
+
+    private void nextBlock() {
+      currentBlockIndex++;
+      currentBlockUpto = 0;
+      currentBlock = blocks.get(currentBlockIndex);
+    }
+  }
+
+  public final class PagedBytesDataOutput extends DataOutput {
+    @Override
+    public void writeByte(byte b) {
+      if (upto == blockSize) {
+        if (currentBlock != null) {
+          blocks.add(currentBlock);
+          blockEnd.add(upto);
+        }
+        currentBlock = new byte[blockSize];
+        upto = 0;
+      }
+      currentBlock[upto++] = b;
+    }
+
+    @Override
+    public void writeBytes(byte[] b, int offset, int length) throws IOException {
+      if (length == 0) {
+        return;
+      }
+
+      if (upto == blockSize) {
+        if (currentBlock != null) {
+          blocks.add(currentBlock);
+          blockEnd.add(upto);
+        }
+        currentBlock = new byte[blockSize];
+        upto = 0;
+      }
+          
+      final int offsetEnd = offset + length;
+      while(true) {
+        final int left = offsetEnd - offset;
+        final int blockLeft = blockSize - upto;
+        if (blockLeft < left) {
+          System.arraycopy(b, offset, currentBlock, upto, blockLeft);
+          blocks.add(currentBlock);
+          blockEnd.add(blockSize);
+          currentBlock = new byte[blockSize];
+          upto = 0;
+          offset += blockLeft;
+        } else {
+          // Last block
+          System.arraycopy(b, offset, currentBlock, upto, left);
+          upto += left;
+          break;
+        }
+      }
+    }
+
+    /** Return the current byte position. */
+    public long getPosition() {
+      if (currentBlock == null) {
+        return 0;
+      } else {
+        return blocks.size() * blockSize + upto;
+      }
+    }
+  }
+
+  /** Returns a DataInput to read values from this
+   *  PagedBytes instance. */
+  public PagedBytesDataInput getDataInput() {
+    if (!frozen) {
+      throw new IllegalStateException("must call freeze() before getDataInput");
+    }
+    return new PagedBytesDataInput();
+  }
+
+  /** Returns a DataOutput that you may use to write into
+   *  this PagedBytes instance.  If you do this, you should
+   *  not call the other writing methods (eg, copy);
+   *  results are undefined. */
+  public PagedBytesDataOutput getDataOutput() {
+    if (frozen) {
+      throw new IllegalStateException("cannot get DataOutput after freeze()");
+    }
+    return new PagedBytesDataOutput();
+  }
 }

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/automaton/BasicOperations.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/automaton/BasicOperations.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/automaton/BasicOperations.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/automaton/BasicOperations.java Thu Nov  3 13:35:07 2011
@@ -322,7 +322,7 @@ final public class BasicOperations {
     return c;
   }
 
-  /** Returns true if these two auotomata accept exactly the
+  /** Returns true if these two automata accept exactly the
    *  same language.  This is a costly computation!  Note
    *  also that a1 and a2 will be determinized as a side
    *  effect. */

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/fst/UpToTwoPositiveIntOutputs.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/fst/UpToTwoPositiveIntOutputs.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/fst/UpToTwoPositiveIntOutputs.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/fst/UpToTwoPositiveIntOutputs.java Thu Nov  3 13:35:07 2011
@@ -25,7 +25,7 @@ import org.apache.lucene.store.DataOutpu
 /**
  * Holds one or two longs for each input term.  If it's a
  * single output, Long is returned; else, TwoLongs.  Order
- * is preseved in the TwoLongs case, ie .first is the first
+ * is preserved in the TwoLongs case, ie .first is the first
  * input/output added to Builder, and .second is the
  * second.  You cannot store 0 output with this (that's
  * reserved to mean "no output")!

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/mutable/MutableValue.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/mutable/MutableValue.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/mutable/MutableValue.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/util/mutable/MutableValue.java Thu Nov  3 13:35:07 2011
@@ -17,7 +17,7 @@
 package org.apache.lucene.util.mutable;
 
 /** @lucene.internal */
-public abstract class MutableValue implements Comparable {
+public abstract class MutableValue implements Comparable<MutableValue> {
   public boolean exists = true;
 
   public abstract void copy(MutableValue source);
@@ -30,9 +30,9 @@ public abstract class MutableValue imple
     return exists;
   }
 
-  public int compareTo(Object other) {
-    Class c1 = this.getClass();
-    Class c2 = other.getClass();
+  public int compareTo(MutableValue other) {
+    Class<? extends MutableValue> c1 = this.getClass();
+    Class<? extends MutableValue> c2 = other.getClass();
     if (c1 != c2) {
       int c = c1.hashCode() - c2.hashCode();
       if (c == 0) {
@@ -45,9 +45,7 @@ public abstract class MutableValue imple
 
   @Override
   public boolean equals(Object other) {
-    Class c1 = this.getClass();
-    Class c2 = other.getClass();
-    return (c1 == c2) && this.equalsSameType(other);
+    return (getClass() == other.getClass()) && this.equalsSameType(other);
   }
 
   @Override

Modified: lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/index/ThreadedIndexingAndSearchingTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/index/ThreadedIndexingAndSearchingTestCase.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/index/ThreadedIndexingAndSearchingTestCase.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/index/ThreadedIndexingAndSearchingTestCase.java Thu Nov  3 13:35:07 2011
@@ -55,7 +55,7 @@ import org.apache.lucene.util._TestUtil;
 
 // TODO
 //   - mix in optimize, addIndexes
-//   - randomoly mix in non-congruent docs
+//   - randomly mix in non-congruent docs
 
 /** Utility class that spawns multiple indexing and
  *  searching threads. */

Modified: lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/index/codecs/preflexrw/TermInfosWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/index/codecs/preflexrw/TermInfosWriter.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/index/codecs/preflexrw/TermInfosWriter.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/index/codecs/preflexrw/TermInfosWriter.java Thu Nov  3 13:35:07 2011
@@ -199,6 +199,11 @@ final class TermInfosWriter implements C
       if (ch1 != ch2)
         return ch1-ch2;
     }
+    if (utf16Result1.length == 0 && lastFieldNumber == -1) {
+      // If there is a field named "" (empty string) with a term text of "" (empty string) then we
+      // will get 0 on this comparison, yet, it's "OK". 
+      return -1;
+    }
     return utf16Result1.length - utf16Result2.length;
   }
 

Modified: lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/search/AssertingIndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/search/AssertingIndexSearcher.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/search/AssertingIndexSearcher.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/search/AssertingIndexSearcher.java Thu Nov  3 13:35:07 2011
@@ -17,6 +17,7 @@ package org.apache.lucene.search;
  * limitations under the License.
  */
 
+import java.util.Random;
 import java.util.concurrent.ExecutorService;
 import java.io.IOException;
 
@@ -31,20 +32,25 @@ import org.apache.lucene.util.Bits;
  * TODO: Extend this by more checks, that's just a start.
  */
 public class AssertingIndexSearcher extends IndexSearcher {
-  public  AssertingIndexSearcher(IndexReader r) {
+  final Random random;
+  public  AssertingIndexSearcher(Random random, IndexReader r) {
     super(r);
+    this.random = new Random(random.nextLong());
   }
   
-  public  AssertingIndexSearcher(ReaderContext context) {
+  public  AssertingIndexSearcher(Random random, ReaderContext context) {
     super(context);
+    this.random = new Random(random.nextLong());
   }
   
-  public  AssertingIndexSearcher(IndexReader r, ExecutorService ex) {
+  public  AssertingIndexSearcher(Random random, IndexReader r, ExecutorService ex) {
     super(r, ex);
+    this.random = new Random(random.nextLong());
   }
   
-  public  AssertingIndexSearcher(ReaderContext context, ExecutorService ex) {
+  public  AssertingIndexSearcher(Random random, ReaderContext context, ExecutorService ex) {
     super(context, ex);
+    this.random = new Random(random.nextLong());
   }
   
   /** Ensures, that the returned {@code Weight} is not normalized again, which may produce wrong scores. */
@@ -84,4 +90,16 @@ public class AssertingIndexSearcher exte
       }
     };
   }
+
+  @Override
+  protected Query wrapFilter(Query query, Filter filter) {
+    if (random.nextBoolean())
+      return super.wrapFilter(query, filter);
+    return (filter == null) ? query : new FilteredQuery(query, filter) {
+      @Override
+      protected boolean useRandomAccess(Bits bits, int firstFilterDoc) {
+        return random.nextBoolean();
+      }
+    };
+  }
 }

Modified: lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/search/CachingWrapperFilterHelper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/search/CachingWrapperFilterHelper.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/search/CachingWrapperFilterHelper.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/search/CachingWrapperFilterHelper.java Thu Nov  3 13:35:07 2011
@@ -22,6 +22,7 @@ import java.io.IOException;
 import junit.framework.Assert;
 
 import org.apache.lucene.index.IndexReader.AtomicReaderContext;
+import org.apache.lucene.util.Bits;
 
 /**
  * A unit test helper class to test when the filter is getting cached and when it is not.
@@ -42,10 +43,10 @@ public class CachingWrapperFilterHelper 
   }
   
   @Override
-  public synchronized DocIdSet getDocIdSet(AtomicReaderContext context) throws IOException {
+  public synchronized DocIdSet getDocIdSet(AtomicReaderContext context, Bits acceptDocs) throws IOException {
 
     final int saveMissCount = missCount;
-    DocIdSet docIdSet = super.getDocIdSet(context);
+    DocIdSet docIdSet = super.getDocIdSet(context, acceptDocs);
 
     if (shouldHaveCache) {
       Assert.assertEquals("Cache should have data ", saveMissCount, missCount);

Modified: lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/store/MockDirectoryWrapper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/store/MockDirectoryWrapper.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/store/MockDirectoryWrapper.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/store/MockDirectoryWrapper.java Thu Nov  3 13:35:07 2011
@@ -30,6 +30,7 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Random;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.codecs.CodecProvider;
@@ -74,6 +75,8 @@ public class MockDirectoryWrapper extend
   private ThrottledIndexOutput throttledOutput;
   private Throttling throttling = Throttling.SOMETIMES;
 
+  final AtomicInteger inputCloneCount = new AtomicInteger();
+
   // use this for tracking files for crash.
   // additionally: provides debugging information in case you leave one open
   private Map<Closeable,Exception> openFileHandles = Collections.synchronizedMap(new IdentityHashMap<Closeable,Exception>());
@@ -117,6 +120,10 @@ public class MockDirectoryWrapper extend
     init();
   }
 
+  public int getInputCloneCount() {
+    return inputCloneCount.get();
+  }
+
   public void setTrackDiskUsage(boolean v) {
     trackDiskUsage = v;
   }

Modified: lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/store/MockIndexInputWrapper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/store/MockIndexInputWrapper.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/store/MockIndexInputWrapper.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/store/MockIndexInputWrapper.java Thu Nov  3 13:35:07 2011
@@ -30,6 +30,7 @@ public class MockIndexInputWrapper exten
   final String name;
   private IndexInput delegate;
   private boolean isClone;
+  private boolean closed;
 
   /** Construct an empty output buffer. */
   public MockIndexInputWrapper(MockDirectoryWrapper dir, String name, IndexInput delegate) {
@@ -45,6 +46,7 @@ public class MockIndexInputWrapper exten
       // after fixing TestTransactions
       // dir.maybeThrowDeterministicException();
     } finally {
+      closed = true;
       delegate.close();
       // Pending resolution on LUCENE-686 we may want to
       // remove the conditional check so we also track that
@@ -54,9 +56,17 @@ public class MockIndexInputWrapper exten
       }
     }
   }
+  
+  private void ensureOpen() {
+    if (closed) {
+      throw new RuntimeException("Abusing closed IndexInput!");
+    }
+  }
 
   @Override
   public Object clone() {
+    ensureOpen();
+    dir.inputCloneCount.incrementAndGet();
     IndexInput iiclone = (IndexInput) delegate.clone();
     MockIndexInputWrapper clone = new MockIndexInputWrapper(dir, name, iiclone);
     clone.isClone = true;
@@ -79,72 +89,86 @@ public class MockIndexInputWrapper exten
 
   @Override
   public long getFilePointer() {
+    ensureOpen();
     return delegate.getFilePointer();
   }
 
   @Override
   public void seek(long pos) throws IOException {
+    ensureOpen();
     delegate.seek(pos);
   }
 
   @Override
   public long length() {
+    ensureOpen();
     return delegate.length();
   }
 
   @Override
   public byte readByte() throws IOException {
+    ensureOpen();
     return delegate.readByte();
   }
 
   @Override
   public void readBytes(byte[] b, int offset, int len) throws IOException {
+    ensureOpen();
     delegate.readBytes(b, offset, len);
   }
 
   @Override
   public void copyBytes(IndexOutput out, long numBytes) throws IOException {
+    ensureOpen();
     delegate.copyBytes(out, numBytes);
   }
 
   @Override
   public void readBytes(byte[] b, int offset, int len, boolean useBuffer)
       throws IOException {
+    ensureOpen();
     delegate.readBytes(b, offset, len, useBuffer);
   }
 
   @Override
   public short readShort() throws IOException {
+    ensureOpen();
     return delegate.readShort();
   }
 
   @Override
   public int readInt() throws IOException {
+    ensureOpen();
     return delegate.readInt();
   }
 
   @Override
   public long readLong() throws IOException {
+    ensureOpen();
     return delegate.readLong();
   }
 
   @Override
   public String readString() throws IOException {
+    ensureOpen();
     return delegate.readString();
   }
 
   @Override
   public Map<String,String> readStringStringMap() throws IOException {
+    ensureOpen();
     return delegate.readStringStringMap();
   }
 
   @Override
   public int readVInt() throws IOException {
+    ensureOpen();
     return delegate.readVInt();
   }
 
   @Override
   public long readVLong() throws IOException {
+    ensureOpen();
     return delegate.readVLong();
   }
 

Modified: lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneJUnitResultFormatter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneJUnitResultFormatter.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneJUnitResultFormatter.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneJUnitResultFormatter.java Thu Nov  3 13:35:07 2011
@@ -66,7 +66,8 @@ public class LuceneJUnitResultFormatter 
   private static final org.apache.lucene.store.Lock lock;
 
   static {
-    File lockDir = new File(System.getProperty("java.io.tmpdir"),
+    File lockDir = new File(
+        System.getProperty("tests.lockdir", System.getProperty("java.io.tmpdir")),
         "lucene_junit_lock");
     lockDir.mkdirs();
     if (!lockDir.exists()) {

Modified: lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java Thu Nov  3 13:35:07 2011
@@ -400,6 +400,11 @@ public abstract class LuceneTestCase ext
     TimeZone.setDefault(timeZone);
     similarityProvider = new RandomSimilarityProvider(random);
     testsFailed = false;
+    
+    // verify assertions are enabled (do last, for smooth cleanup)
+    if (!Boolean.parseBoolean(System.getProperty("tests.asserts.gracious", "false"))) {
+      assertTrue("assertions are not enabled!", assertionsEnabled());
+    }
   }
 
   @AfterClass
@@ -1300,7 +1305,7 @@ public abstract class LuceneTestCase ext
       if (maybeWrap && rarely()) {
         r = new SlowMultiReaderWrapper(r);
       }
-      IndexSearcher ret = random.nextBoolean() ? new AssertingIndexSearcher(r) : new AssertingIndexSearcher(r.getTopReaderContext());
+      IndexSearcher ret = random.nextBoolean() ? new AssertingIndexSearcher(random, r) : new AssertingIndexSearcher(random, r.getTopReaderContext());
       ret.setSimilarityProvider(similarityProvider);
       return ret;
     } else {
@@ -1312,13 +1317,13 @@ public abstract class LuceneTestCase ext
         System.out.println("NOTE: newSearcher using ExecutorService with " + threads + " threads");
       }
       IndexSearcher ret = random.nextBoolean() ? 
-        new AssertingIndexSearcher(r, ex) {
+        new AssertingIndexSearcher(random, r, ex) {
           @Override
           public void close() throws IOException {
             super.close();
             shutdownExecutorService(ex);
           }
-        } : new AssertingIndexSearcher(r.getTopReaderContext(), ex) {
+        } : new AssertingIndexSearcher(random, r.getTopReaderContext(), ex) {
           @Override
           public void close() throws IOException {
             super.close();
@@ -1442,4 +1447,15 @@ public abstract class LuceneTestCase ext
 
   @Ignore("just a hack")
   public final void alwaysIgnoredTestMethod() {}
+  
+  /** check if assertions are enabled */
+  private static boolean assertionsEnabled() {
+    try {
+      assert Boolean.FALSE.booleanValue();
+      return false; // should never get here
+    } catch (AssertionError e) {
+      return true;
+    }
+  }
+  
 }

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/TestAssertions.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/TestAssertions.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/TestAssertions.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/TestAssertions.java Thu Nov  3 13:35:07 2011
@@ -17,55 +17,14 @@ package org.apache.lucene;
  * limitations under the License.
  */
 
-import java.io.Reader;
-
 import org.apache.lucene.util.LuceneTestCase;
-import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.TokenStream;
 
+/**
+ * validate that assertions are enabled during tests
+ */
 public class TestAssertions extends LuceneTestCase {
 
-  public void testBasics() {
-    try {
-      assert Boolean.FALSE.booleanValue();
-      fail("assertions are not enabled!");
-    } catch (AssertionError e) {
-      assert Boolean.TRUE.booleanValue();
-    }
-  }
-  
-  static class TestAnalyzer1 extends Analyzer {
-
-    @Override
-    protected TokenStreamComponents createComponents(String fieldName, Reader aReader) {
-      return null;
-    }
-  }
-
-  static final class TestAnalyzer2 extends Analyzer {
-
-    @Override
-    protected TokenStreamComponents createComponents(String fieldName, Reader aReader) {
-      return null;
-    }
-  }
-
-  static class TestAnalyzer3 extends Analyzer {
-
-    @Override
-    protected TokenStreamComponents createComponents(String fieldName, Reader aReader) {
-      return null;
-    }
-  }
-
-  static class TestAnalyzer4 extends Analyzer {
-
-    @Override
-    protected TokenStreamComponents createComponents(String fieldName, Reader aReader) {
-      return null;
-    }
-  }
-
   static class TestTokenStream1 extends TokenStream {
     @Override
     public final boolean incrementToken() { return false; }
@@ -82,31 +41,15 @@ public class TestAssertions extends Luce
   }
 
   public void testTokenStreams() {
-    new TestAnalyzer1();
-    
-    new TestAnalyzer2();
-    
-    try {
-      new TestAnalyzer3();
-      fail("TestAnalyzer3 should fail assertion");
-    } catch (AssertionError e) {
-    }
-    
-    try {
-      new TestAnalyzer4();
-      fail("TestAnalyzer4 should fail assertion");
-    } catch (AssertionError e) {
-    }
-    
     new TestTokenStream1();
-    
     new TestTokenStream2();
-    
+    boolean doFail = false;
     try {
       new TestTokenStream3();
-      fail("TestTokenStream3 should fail assertion");
+      doFail = true;
     } catch (AssertionError e) {
+      // expected
     }
+    assertFalse("TestTokenStream3 should fail assertion", doFail);
   }
-
 }

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java Thu Nov  3 13:35:07 2011
@@ -16,10 +16,12 @@ package org.apache.lucene.index;
  * License for the specific language governing permissions and limitations under
  * the License.
  */
+import java.lang.reflect.Field;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.ReentrantLock;
 
 import org.apache.lucene.index.DocumentsWriterDeleteQueue.DeleteSlice;
 import org.apache.lucene.search.TermQuery;
@@ -142,6 +144,32 @@ public class TestDocumentsWriterDeleteQu
       }
     }
   }
+  
+  public void testPartiallyAppliedGlobalSlice() throws SecurityException,
+      NoSuchFieldException, IllegalArgumentException, IllegalAccessException,
+      InterruptedException {
+    final DocumentsWriterDeleteQueue queue = new DocumentsWriterDeleteQueue();
+    Field field = DocumentsWriterDeleteQueue.class
+        .getDeclaredField("globalBufferLock");
+    field.setAccessible(true);
+    ReentrantLock lock = (ReentrantLock) field.get(queue);
+    lock.lock();
+    Thread t = new Thread() {
+      public void run() {
+        queue.addDelete(new Term("foo", "bar"));
+      }
+    };
+    t.start();
+    t.join();
+    lock.unlock();
+    assertTrue("changes in del queue but not in slice yet", queue.anyChanges());
+    queue.tryApplyGlobalSlice();
+    assertTrue("changes in global buffer", queue.anyChanges());
+    FrozenBufferedDeletes freezeGlobalBuffer = queue.freezeGlobalBuffer(null);
+    assertTrue(freezeGlobalBuffer.any());
+    assertEquals(1, freezeGlobalBuffer.termCount);
+    assertFalse("all changes applied", queue.anyChanges());
+  }
 
   public void testStressDeleteQueue() throws InterruptedException {
     DocumentsWriterDeleteQueue queue = new DocumentsWriterDeleteQueue();

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexReader.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexReader.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexReader.java Thu Nov  3 13:35:07 2011
@@ -1201,7 +1201,7 @@ public class TestIndexReader extends Luc
   // LUCENE-1586: getUniqueTermCount
   public void testUniqueTermCount() throws Exception {
     Directory dir = newDirectory();
-    IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)).setCodecProvider(_TestUtil.alwaysCodec("Standard")));
+    IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)));
     Document doc = new Document();
     doc.add(newField("field", "a b c d e f g h i j k l m n o p q r s t u v w x y z", TextField.TYPE_UNSTORED));
     doc.add(newField("number", "0 1 2 3 4 5 6 7 8 9", TextField.TYPE_UNSTORED));
@@ -1217,12 +1217,8 @@ public class TestIndexReader extends Luc
     IndexReader r2 = IndexReader.openIfChanged(r);
     assertNotNull(r2);
     r.close();
-    try {
-      r2.getUniqueTermCount();
-      fail("expected exception");
-    } catch (UnsupportedOperationException uoe) {
-      // expected
-    }
+    assertEquals(-1, r2.getUniqueTermCount());
+
     IndexReader[] subs = r2.getSequentialSubReaders();
     for(int i=0;i<subs.length;i++) {
       assertEquals(36, subs[i].getUniqueTermCount());

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriter.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriter.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriter.java Thu Nov  3 13:35:07 2011
@@ -869,6 +869,46 @@ public class TestIndexWriter extends Luc
     writer.close();
     dir.close();
   }
+  
+  public void testEmptyFieldNameTerms() throws IOException {
+    Directory dir = newDirectory();
+    IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig( TEST_VERSION_CURRENT, new MockAnalyzer(random)));
+    Document doc = new Document();
+    doc.add(newField("", "a b c", TextField.TYPE_UNSTORED));
+    writer.addDocument(doc);  
+    writer.close();
+    IndexReader reader = IndexReader.open(dir, true);
+    IndexReader subreader = getOnlySegmentReader(reader);
+    TermsEnum te = subreader.fields().terms("").iterator();
+    assertEquals(new BytesRef("a"), te.next());
+    assertEquals(new BytesRef("b"), te.next());
+    assertEquals(new BytesRef("c"), te.next());
+    assertNull(te.next());
+    reader.close();
+    dir.close();
+  }
+  
+  public void testEmptyFieldNameWithEmptyTerm() throws IOException {
+    Directory dir = newDirectory();
+    IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig( TEST_VERSION_CURRENT, new MockAnalyzer(random)));
+    Document doc = new Document();
+    doc.add(newField("", "", StringField.TYPE_UNSTORED));
+    doc.add(newField("", "a", StringField.TYPE_UNSTORED));
+    doc.add(newField("", "b", StringField.TYPE_UNSTORED));
+    doc.add(newField("", "c", StringField.TYPE_UNSTORED));
+    writer.addDocument(doc);  
+    writer.close();
+    IndexReader reader = IndexReader.open(dir, true);
+    IndexReader subreader = getOnlySegmentReader(reader);
+    TermsEnum te = subreader.fields().terms("").iterator();
+    assertEquals(new BytesRef(""), te.next());
+    assertEquals(new BytesRef("a"), te.next());
+    assertEquals(new BytesRef("b"), te.next());
+    assertEquals(new BytesRef("c"), te.next());
+    assertNull(te.next());
+    reader.close();
+    dir.close();
+  }
 
 
 

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriterDelete.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriterDelete.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriterDelete.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriterDelete.java Thu Nov  3 13:35:07 2011
@@ -23,14 +23,15 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Random;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.lucene.analysis.*;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.FieldType;
 import org.apache.lucene.document.StringField;
 import org.apache.lucene.document.TextField;
+import org.apache.lucene.index.codecs.CodecProvider;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.TermQuery;
@@ -896,6 +897,8 @@ public class TestIndexWriterDelete exten
   }
   
   public void testIndexingThenDeleting() throws Exception {
+    assumeFalse("This test cannot run with Memory codec", CodecProvider.getDefault().getFieldCodec("field").equals("Memory"));
+    assumeFalse("This test cannot run with SimpleText codec", CodecProvider.getDefault().getFieldCodec("field").equals("SimpleText"));
     final Random r = random;
     Directory dir = newDirectory();
     // note this test explicitly disables payloads

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java Thu Nov  3 13:35:07 2011
@@ -857,7 +857,7 @@ public class TestIndexWriterReader exten
     int sum = 0;
     while(System.currentTimeMillis() < endTime) {
       IndexReader r2 = IndexReader.openIfChanged(r);
-      if (r2 != r) {
+      if (r2 != null) {
         r.close();
         r = r2;
       }
@@ -1016,4 +1016,40 @@ public class TestIndexWriterReader exten
     }
   }
   
+  public void testReopenAfterNoRealChange() throws Exception {
+    Directory d = newDirectory();
+    IndexWriter w = new IndexWriter(
+        d,
+        newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)));
+    w.setInfoStream(VERBOSE ? System.out : null);
+
+    IndexReader r = w.getReader(); // start pooling readers
+
+    IndexReader r2 = IndexReader.openIfChanged(r);
+    assertNull(r2);
+    
+    w.addDocument(new Document());
+    IndexReader r3 = IndexReader.openIfChanged(r);
+    assertNotNull(r3);
+    assertTrue(r3.getVersion() != r.getVersion());
+    assertTrue(r3.isCurrent());
+
+    // Deletes nothing in reality...:
+    w.deleteDocuments(new Term("foo", "bar"));
+
+    // ... but IW marks this as not current:
+    assertFalse(r3.isCurrent());
+    IndexReader r4 = IndexReader.openIfChanged(r3);
+    assertNull(r4);
+
+    // Deletes nothing in reality...:
+    w.deleteDocuments(new Term("foo", "bar"));
+    IndexReader r5 = IndexReader.openIfChanged(r3, w, true);
+    assertNull(r5);
+
+    r3.close();
+
+    w.close();
+    d.close();
+  }
 }

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestNRTThreads.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestNRTThreads.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestNRTThreads.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestNRTThreads.java Thu Nov  3 13:35:07 2011
@@ -22,11 +22,13 @@ import java.util.concurrent.ExecutorServ
 
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.store.MockDirectoryWrapper;
+import org.apache.lucene.util.LuceneTestCase.UseNoMemoryExpensiveCodec;
 
 // TODO
 //   - mix in optimize, addIndexes
 //   - randomoly mix in non-congruent docs
 
+@UseNoMemoryExpensiveCodec
 public class TestNRTThreads extends ThreadedIndexingAndSearchingTestCase {
   
   @Override

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestRollingUpdates.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestRollingUpdates.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestRollingUpdates.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestRollingUpdates.java Thu Nov  3 13:35:07 2011
@@ -37,11 +37,12 @@ public class TestRollingUpdates extends 
 
     CodecProvider provider = CodecProvider.getDefault();
     //provider.register(new MemoryCodec());
-    if (random.nextBoolean()) {
+    if ( (!"PreFlex".equals(provider.getDefaultFieldCodec())) && random.nextBoolean()) {
       provider.setFieldCodec("docid", "Memory");
     }
 
     final IndexWriter w = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)).setCodecProvider(provider));
+    w.setInfoStream(VERBOSE ? System.out : null);
     final int SIZE = atLeast(TEST_NIGHTLY ? 100 : 20);
     int id = 0;
     IndexReader r = null;

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestSegmentMerger.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestSegmentMerger.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestSegmentMerger.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestSegmentMerger.java Thu Nov  3 13:35:07 2011
@@ -146,12 +146,14 @@ public class TestSegmentMerger extends L
     
     // Assert that SM fails if .del exists
     SegmentMerger sm = new SegmentMerger(dir, 1, "a", null, null, null, newIOContext(random));
+    boolean doFail = false;
     try {
       sm.createCompoundFile("b1", w.segmentInfos.info(0), newIOContext(random));
-      fail("should not have been able to create a .cfs with .del and .s* files");
+      doFail = true; // should never get here
     } catch (AssertionError e) {
       // expected
     }
+    assertFalse("should not have been able to create a .cfs with .del and .s* files", doFail);
     
     // Create an index w/ .s*
     w = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)).setOpenMode(OpenMode.CREATE));
@@ -164,12 +166,15 @@ public class TestSegmentMerger extends L
     r.close();
     
     // Assert that SM fails if .s* exists
+    SegmentInfos sis = new SegmentInfos();
+    sis.read(dir);
     try {
-      sm.createCompoundFile("b2", w.segmentInfos.info(0), newIOContext(random));
-      fail("should not have been able to create a .cfs with .del and .s* files");
+      sm.createCompoundFile("b2", sis.info(0), newIOContext(random));
+      doFail = true; // should never get here
     } catch (AssertionError e) {
       // expected
     }
+    assertFalse("should not have been able to create a .cfs with .del and .s* files", doFail);
 
     dir.close();
   }

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestTermsEnum.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestTermsEnum.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestTermsEnum.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestTermsEnum.java Thu Nov  3 13:35:07 2011
@@ -191,7 +191,7 @@ public class TestTermsEnum extends Lucen
     final Directory dir = newDirectory();
     final RandomIndexWriter w = new RandomIndexWriter(random, dir);
     
-    final int numTerms = atLeast(1000);
+    final int numTerms = atLeast(300);
 
     final Set<String> terms = new HashSet<String>();
     final Collection<String> pendingTerms = new ArrayList<String>();

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/FieldCacheRewriteMethod.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/FieldCacheRewriteMethod.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/FieldCacheRewriteMethod.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/FieldCacheRewriteMethod.java Thu Nov  3 13:35:07 2011
@@ -24,6 +24,7 @@ import org.apache.lucene.index.IndexRead
 import org.apache.lucene.index.IndexReader.AtomicReaderContext;
 import org.apache.lucene.index.Terms;
 import org.apache.lucene.index.TermsEnum;
+import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.OpenBitSet;
 
@@ -109,7 +110,7 @@ public final class FieldCacheRewriteMeth
      * results.
      */
     @Override
-    public DocIdSet getDocIdSet(AtomicReaderContext context) throws IOException {
+    public DocIdSet getDocIdSet(AtomicReaderContext context, final Bits acceptDocs) throws IOException {
       final FieldCache.DocTermsIndex fcsi = FieldCache.DEFAULT.getTermsIndex(context.reader, query.field);
       // Cannot use FixedBitSet because we require long index (ord):
       final OpenBitSet termSet = new OpenBitSet(fcsi.numOrd());
@@ -139,6 +140,11 @@ public final class FieldCacheRewriteMeth
         public int getDocCount() throws IOException {
           return -1;
         }
+
+        @Override
+        public long getUniqueTermCount() throws IOException {
+          return -1;
+        }
       });
       
       assert termsEnum != null;
@@ -158,7 +164,8 @@ public final class FieldCacheRewriteMeth
         return DocIdSet.EMPTY_DOCIDSET;
       }
       
-      return new FieldCacheRangeFilter.FieldCacheDocIdSet(context.reader, true) {
+      final int maxDoc = context.reader.maxDoc();
+      return new FieldCacheRangeFilter.FieldCacheDocIdSet(maxDoc, acceptDocs) {
         @Override
         boolean matchDoc(int doc) throws ArrayIndexOutOfBoundsException {
           return termSet.get(fcsi.getOrd(doc));

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/JustCompileSearch.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/JustCompileSearch.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/JustCompileSearch.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/JustCompileSearch.java Thu Nov  3 13:35:07 2011
@@ -160,7 +160,7 @@ final class JustCompileSearch {
     // still added here in case someone will add abstract methods in the future.
     
     @Override
-    public DocIdSet getDocIdSet(AtomicReaderContext context) throws IOException {
+    public DocIdSet getDocIdSet(AtomicReaderContext context, Bits acceptDocs) throws IOException {
       return null;
     }
   }
@@ -288,12 +288,12 @@ final class JustCompileSearch {
   static final class JustCompileSpanFilter extends SpanFilter {
 
     @Override
-    public SpanFilterResult bitSpans(AtomicReaderContext context) throws IOException {
+    public SpanFilterResult bitSpans(AtomicReaderContext context, Bits acceptDocs) throws IOException {
       throw new UnsupportedOperationException(UNSUPPORTED_MSG);
     }
     
     @Override
-    public DocIdSet getDocIdSet(AtomicReaderContext context) throws IOException {
+    public DocIdSet getDocIdSet(AtomicReaderContext context, Bits acceptDocs) throws IOException {
       return null;
     }    
   }

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/MockFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/MockFilter.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/MockFilter.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/MockFilter.java Thu Nov  3 13:35:07 2011
@@ -19,15 +19,16 @@ package org.apache.lucene.search;
 
 import org.apache.lucene.index.IndexReader.AtomicReaderContext;
 import org.apache.lucene.util.DocIdBitSet;
-import java.util.BitSet;
+import org.apache.lucene.util.FixedBitSet;
+import org.apache.lucene.util.Bits;
 
 public class MockFilter extends Filter {
   private boolean wasCalled;
 
   @Override
-  public DocIdSet getDocIdSet(AtomicReaderContext context) {
+  public DocIdSet getDocIdSet(AtomicReaderContext context, Bits acceptDocs) {
     wasCalled = true;
-    return new DocIdBitSet(new BitSet());
+    return new FixedBitSet(context.reader.maxDoc());
   }
 
   public void clear() {

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/SingleDocTestFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/SingleDocTestFilter.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/SingleDocTestFilter.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/SingleDocTestFilter.java Thu Nov  3 13:35:07 2011
@@ -18,9 +18,9 @@ package org.apache.lucene.search;
  */
 
 import org.apache.lucene.index.IndexReader.AtomicReaderContext;
-import org.apache.lucene.util.DocIdBitSet;
+import org.apache.lucene.util.Bits;
+import org.apache.lucene.util.FixedBitSet;
 
-import java.util.BitSet;
 import java.io.IOException;
 
 public class SingleDocTestFilter extends Filter {
@@ -31,9 +31,10 @@ public class SingleDocTestFilter extends
   }
 
   @Override
-  public DocIdSet getDocIdSet(AtomicReaderContext context) throws IOException {
-    BitSet bits = new BitSet(context.reader.maxDoc());
+  public DocIdSet getDocIdSet(AtomicReaderContext context, Bits acceptDocs) throws IOException {
+    FixedBitSet bits = new FixedBitSet(context.reader.maxDoc());
     bits.set(doc);
-    return new DocIdBitSet(bits);
+    if (acceptDocs != null && !acceptDocs.get(doc)) bits.clear(doc);
+    return bits;
   }
 }

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/TestBooleanScorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/TestBooleanScorer.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/TestBooleanScorer.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/TestBooleanScorer.java Thu Nov  3 13:35:07 2011
@@ -18,16 +18,19 @@ package org.apache.lucene.search;
  */
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.StringField;
+import org.apache.lucene.document.TextField;
+import org.apache.lucene.index.IndexReader.AtomicReaderContext;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.RandomIndexWriter;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.BooleanQuery.BooleanWeight;
 import org.apache.lucene.store.Directory;
-
 import org.apache.lucene.util.LuceneTestCase;
 
 public class TestBooleanScorer extends LuceneTestCase
@@ -93,13 +96,88 @@ public class TestBooleanScorer extends L
     }};
     
     BooleanScorer bs = new BooleanScorer(weight, false, 1, Arrays.asList(scorers), null, scorers.length);
-    
-    assertEquals("should have received 3000", 3000, bs.nextDoc());
-    assertEquals("should have received NO_MORE_DOCS", DocIdSetIterator.NO_MORE_DOCS, bs.nextDoc());
+
+    final List<Integer> hits = new ArrayList<Integer>();
+    bs.score(new Collector() {
+      int docBase;
+      @Override
+      public void setScorer(Scorer scorer) {
+      }
+      
+      @Override
+      public void collect(int doc) throws IOException {
+        hits.add(docBase+doc);
+      }
+      
+      @Override
+      public void setNextReader(AtomicReaderContext context) {
+        docBase = context.docBase;
+      }
+      
+      @Override
+      public boolean acceptsDocsOutOfOrder() {
+        return true;
+      }
+      });
+
+    assertEquals("should have only 1 hit", 1, hits.size());
+    assertEquals("hit should have been docID=3000", 3000, hits.get(0).intValue());
     searcher.close();
     ir.close();
     directory.close();
-    
   }
 
+  public void testMoreThan32ProhibitedClauses() throws Exception {
+    final Directory d = newDirectory();
+    final RandomIndexWriter w = new RandomIndexWriter(random, d);
+    Document doc = new Document();
+    doc.add(new TextField("field", "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33"));
+    w.addDocument(doc);
+    doc = new Document();
+    doc.add(new TextField("field", "33"));
+    w.addDocument(doc);
+    final IndexReader r = w.getReader();
+    w.close();
+    final IndexSearcher s = newSearcher(r);
+
+    final BooleanQuery q = new BooleanQuery();
+    for(int term=0;term<33;term++) {
+      q.add(new BooleanClause(new TermQuery(new Term("field", ""+term)),
+                              BooleanClause.Occur.MUST_NOT));
+    }
+    q.add(new BooleanClause(new TermQuery(new Term("field", "33")),
+                            BooleanClause.Occur.SHOULD));
+                            
+    final int[] count = new int[1];
+    s.search(q, new Collector() {
+      private Scorer scorer;
+    
+      @Override
+      public void setScorer(Scorer scorer) {
+        // Make sure we got BooleanScorer:
+        this.scorer = scorer;
+        assertEquals("Scorer is implemented by wrong class", BooleanScorer.class.getName() + "$BucketScorer", scorer.getClass().getName());
+      }
+      
+      @Override
+      public void collect(int doc) throws IOException {
+        count[0]++;
+      }
+      
+      @Override
+      public void setNextReader(AtomicReaderContext context) {
+      }
+      
+      @Override
+      public boolean acceptsDocsOutOfOrder() {
+        return true;
+      }
+    });
+
+    assertEquals(1, count[0]);
+    
+    s.close();
+    r.close();
+    d.close();
+  }
 }

Modified: lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/TestCachingSpanFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/TestCachingSpanFilter.java?rev=1197110&r1=1197109&r2=1197110&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/TestCachingSpanFilter.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/TestCachingSpanFilter.java Thu Nov  3 13:35:07 2011
@@ -69,33 +69,21 @@ public class TestCachingSpanFilter exten
 
     final SpanFilter startFilter = new SpanQueryFilter(new SpanTermQuery(new Term("id", "1")));
 
-    // ignore deletions
-    CachingSpanFilter filter = new CachingSpanFilter(startFilter, CachingWrapperFilter.DeletesMode.IGNORE);
-        
-    docs = searcher.search(new MatchAllDocsQuery(), filter, 1);
-    assertEquals("[query + filter] Should find a hit...", 1, docs.totalHits);
-    ConstantScoreQuery constantScore = new ConstantScoreQuery(filter);
-    docs = searcher.search(constantScore, 1);
-    assertEquals("[just filter] Should find a hit...", 1, docs.totalHits);
-
-    // now delete the doc, refresh the reader, and see that
-    // it's not there
-    _TestUtil.keepFullyDeletedSegments(writer.w);
-    writer.deleteDocuments(new Term("id", "1"));
-
-    reader = refreshReader(reader);
-    searcher.close();
-    searcher = newSearcher(reader, false);
+    CachingSpanFilter filter = new CachingSpanFilter(startFilter);
 
     docs = searcher.search(new MatchAllDocsQuery(), filter, 1);
-    assertEquals("[query + filter] Should *not* find a hit...", 0, docs.totalHits);
-
+    assertEquals("[query + filter] Should find a hit...", 1, docs.totalHits);
+    int missCount = filter.missCount;
+    assertTrue(missCount > 0);
+    Query constantScore = new ConstantScoreQuery(filter);
     docs = searcher.search(constantScore, 1);
     assertEquals("[just filter] Should find a hit...", 1, docs.totalHits);
+    assertEquals(missCount, filter.missCount);
 
-
-    // force cache to regenerate:
-    filter = new CachingSpanFilter(startFilter, CachingWrapperFilter.DeletesMode.RECACHE);
+    // NOTE: important to hold ref here so GC doesn't clear
+    // the cache entry!  Else the assert below may sometimes
+    // fail:
+    IndexReader oldReader = reader;
 
     writer.addDocument(doc);
     reader = refreshReader(reader);
@@ -103,27 +91,19 @@ public class TestCachingSpanFilter exten
     searcher = newSearcher(reader, false);
         
     docs = searcher.search(new MatchAllDocsQuery(), filter, 1);
-    assertEquals("[query + filter] Should find a hit...", 1, docs.totalHits);
+    assertEquals("[query + filter] Should find 2 hits...", 2, docs.totalHits);
+    assertTrue(filter.missCount > missCount);
+    missCount = filter.missCount;
 
     constantScore = new ConstantScoreQuery(filter);
     docs = searcher.search(constantScore, 1);
-    assertEquals("[just filter] Should find a hit...", 1, docs.totalHits);
+    assertEquals("[just filter] Should find a hit...", 2, docs.totalHits);
+    assertEquals(missCount, filter.missCount);
 
     // NOTE: important to hold ref here so GC doesn't clear
     // the cache entry!  Else the assert below may sometimes
     // fail:
-    IndexReader oldReader = reader;
-
-    // make sure we get a cache hit when we reopen readers
-    // that had no new deletions
-    reader = refreshReader(reader);
-    assertTrue(reader != oldReader);
-    searcher.close();
-    searcher = newSearcher(reader, false);
-    int missCount = filter.missCount;
-    docs = searcher.search(constantScore, 1);
-    assertEquals("[just filter] Should find a hit...", 1, docs.totalHits);
-    assertEquals(missCount, filter.missCount);
+    IndexReader oldReader2 = reader;
 
     // now delete the doc, refresh the reader, and see that it's not there
     writer.deleteDocuments(new Term("id", "1"));
@@ -134,15 +114,18 @@ public class TestCachingSpanFilter exten
 
     docs = searcher.search(new MatchAllDocsQuery(), filter, 1);
     assertEquals("[query + filter] Should *not* find a hit...", 0, docs.totalHits);
+    assertEquals(missCount, filter.missCount);
 
     docs = searcher.search(constantScore, 1);
     assertEquals("[just filter] Should *not* find a hit...", 0, docs.totalHits);
+    assertEquals(missCount, filter.missCount);
 
     // NOTE: silliness to make sure JRE does not optimize
     // away our holding onto oldReader to prevent
     // CachingWrapperFilter's WeakHashMap from dropping the
     // entry:
     assertTrue(oldReader != null);
+    assertTrue(oldReader2 != null);
 
     searcher.close();
     writer.close();
@@ -160,4 +143,5 @@ public class TestCachingSpanFilter exten
       return oldReader;
     }
   }
+  
 }