You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2015/03/03 09:05:03 UTC

svn commit: r1663537 - /lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java

Author: jpountz
Date: Tue Mar  3 08:05:02 2015
New Revision: 1663537

URL: http://svn.apache.org/r1663537
Log:
Add an evil random test to the query cache.

Modified:
    lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java?rev=1663537&r1=1663536&r2=1663537&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java Tue Mar  3 08:05:02 2015
@@ -34,6 +34,7 @@ import java.util.concurrent.atomic.Atomi
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field.Store;
 import org.apache.lucene.document.StringField;
+import org.apache.lucene.document.TextField;
 import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexWriterConfig;
@@ -46,6 +47,7 @@ import org.apache.lucene.store.Directory
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.RamUsageTester;
+import org.apache.lucene.util.TestUtil;
 
 import com.carrotsearch.randomizedtesting.generators.RandomPicks;
 
@@ -819,4 +821,96 @@ public class TestLRUQueryCache extends L
     dir.close();
   }
 
+  private static Term randomTerm() {
+    final String term = RandomPicks.randomFrom(random(), Arrays.asList("foo", "bar", "baz"));
+    return new Term("foo", term);
+  }
+
+  private static Query buildRandomQuery(int level) {
+    if (level == 10) {
+      // at most 10 levels
+      return new MatchAllDocsQuery();
+    }
+    switch (random().nextInt(6)) {
+      case 0:
+        return new TermQuery(randomTerm());
+      case 1:
+        BooleanQuery bq = new BooleanQuery();
+        final int numClauses = TestUtil.nextInt(random(), 1, 3);
+        int numShould = 0;
+        for (int i = 0; i < numClauses; ++i) {
+          final Occur occur = RandomPicks.randomFrom(random(), Occur.values());
+          bq.add(buildRandomQuery(level + 1), occur);
+          if (occur == Occur.SHOULD) {
+            numShould++;
+          }
+        }
+        bq.setMinimumNumberShouldMatch(TestUtil.nextInt(random(), 0, numShould));
+        return bq;
+      case 2:
+        PhraseQuery pq = new PhraseQuery();
+        pq.add(randomTerm());
+        pq.add(randomTerm());
+        pq.setSlop(random().nextInt(2));
+        return pq;
+      case 3:
+        return new MatchAllDocsQuery();
+      case 4:
+        return new ConstantScoreQuery(buildRandomQuery(level + 1));
+      case 5:
+        DisjunctionMaxQuery dmq = new DisjunctionMaxQuery(random().nextFloat());
+        final int numQueries = TestUtil.nextInt(random(), 1, 3);
+        for (int i = 0; i < numQueries; ++i) {
+          dmq.add(buildRandomQuery(level + 1));
+        }
+        return dmq;
+      default:
+        throw new AssertionError();
+    }
+  }
+
+  public void testRandom() throws IOException {
+    Directory dir = newDirectory();
+    final RandomIndexWriter w = new RandomIndexWriter(random(), dir);
+    Document doc = new Document();
+    TextField f = new TextField("foo", "foo", Store.NO);
+    doc.add(f);
+    w.addDocument(doc);
+    IndexReader reader = w.getReader();
+
+    final int maxSize = TestUtil.nextInt(random(), 1, 10000);
+    final long maxRamBytesUsed = TestUtil.nextLong(random(), 1, 5000000);
+    final LRUQueryCache queryCache = new LRUQueryCache(maxSize, maxRamBytesUsed);
+    IndexSearcher uncachedSearcher = null;
+    IndexSearcher cachedSearcher = null;
+
+    final int iters = atLeast(20000);
+    for (int i = 0; i < iters; ++i) {
+      if (i == 0 || random().nextInt(100) == 1) {
+        reader.close();
+        f.setStringValue(RandomPicks.randomFrom(random(), Arrays.asList("foo", "bar", "bar baz")));
+        w.addDocument(doc);
+        if (random().nextBoolean()) {
+          w.deleteDocuments(buildRandomQuery(0));
+        }
+        reader = w.getReader();
+        uncachedSearcher = newSearcher(reader);
+        uncachedSearcher.setQueryCache(null);
+        cachedSearcher = newSearcher(reader);
+        cachedSearcher.setQueryCache(queryCache);
+        cachedSearcher.setQueryCachingPolicy(QueryCachingPolicy.ALWAYS_CACHE);
+      }
+      final Query q = buildRandomQuery(0);
+      assertEquals(uncachedSearcher.count(q), cachedSearcher.count(q));
+      if (rarely()) {
+        queryCache.assertConsistent();
+      }
+    }
+    queryCache.assertConsistent();
+    w.close();
+    reader.close();
+    dir.close();
+    queryCache.assertConsistent();
+  }
+
 }