You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@lucene.apache.org by mi...@apache.org on 2009/06/26 19:45:14 UTC

svn commit: r788785 - in /lucene/java/trunk/src: java/org/apache/lucene/index/IndexWriter.java test/org/apache/lucene/index/TestIndexWriterDelete.java

Author: mikemccand
Date: Fri Jun 26 17:45:14 2009
New Revision: 788785

URL: http://svn.apache.org/viewvc?rev=788785&view=rev
Log:
LUCENE-1705: add deleteAll to IndexWriter

Modified:
    lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java
    lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriterDelete.java

Modified: lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java?rev=788785&r1=788784&r2=788785&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java Fri Jun 26 17:45:14 2009
@@ -3236,6 +3236,53 @@
     closeInternal(false);
   }
 
+  /**
+   * Delete all documents in the index.
+   *
+   * <p>This method will drop all buffered documents and will 
+   *    remove all segments from the index. This change will not be
+   *    visible until a {@link #commit()} has been called. This method
+   *    can be rolled back using {@link #rollback()}.</p>
+   *
+   * <p>NOTE: this method is much faster than using deleteDocuments( new MatchAllDocsQuery() ).</p>
+   *
+   * <p>NOTE: this method will forcefully abort all merges
+   *    in progress.  If other threads are running {@link
+   *    #optimize()} or any of the addIndexes methods, they
+   *    will receive {@link MergePolicy.MergeAbortedException}s.
+   */
+  public synchronized void deleteAll() throws IOException {
+    docWriter.pauseAllThreads();
+    try {
+
+      // Abort any running merges
+      finishMerges(false);
+
+      // Remove any buffered docs
+      docWriter.abort();
+
+      // Remove all segments
+      segmentInfos.clear();
+
+      // Ask deleter to locate unreferenced files & remove them:
+      deleter.checkpoint(segmentInfos, false);
+      deleter.refresh();
+
+      // Don't bother saving any changes in our segmentInfos
+      readerPool.clear(null);      
+
+      // Mark that the index has changed
+      ++changeCount;
+    } catch (OutOfMemoryError oom) {
+      handleOOM(oom, "deleteAll");
+    } finally {
+      docWriter.resumeAllThreads();
+      if (infoStream != null) {
+        message("hit exception during deleteAll");
+      }
+    }
+  }
+
   private synchronized void finishMerges(boolean waitForMerges) throws IOException {
     if (!waitForMerges) {
 

Modified: lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriterDelete.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriterDelete.java?rev=788785&r1=788784&r2=788785&view=diff
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriterDelete.java (original)
+++ lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriterDelete.java Fri Jun 26 17:45:14 2009
@@ -264,6 +264,138 @@
     }
   }
 
+  // test deleteAll()
+  public void testDeleteAll() throws IOException {
+    for (int pass=0;pass<2;pass++) {
+      boolean autoCommit = (0==pass);
+      Directory dir = new MockRAMDirectory();
+      IndexWriter modifier = new IndexWriter(dir, autoCommit,
+                                             new WhitespaceAnalyzer(), true);
+      modifier.setMaxBufferedDocs(2);
+      modifier.setMaxBufferedDeleteTerms(2);
+
+      int id = 0;
+      int value = 100;
+
+      for (int i = 0; i < 7; i++) {
+        addDoc(modifier, ++id, value);
+      }
+      modifier.commit();
+
+      IndexReader reader = IndexReader.open(dir);
+      assertEquals(7, reader.numDocs());
+      reader.close();
+
+      // Add 1 doc (so we will have something buffered)
+      addDoc(modifier, 99, value);
+
+      // Delete all
+      modifier.deleteAll();
+
+      // Delete all shouldn't be on disk yet
+      reader = IndexReader.open(dir);
+      assertEquals(7, reader.numDocs());
+      reader.close();
+
+      // Add 2 new docs (after the deleteAll, before the commit)      
+      addDoc(modifier, 101, value);
+      addDoc(modifier, 102, value);
+
+      // commit the delete all
+      modifier.commit();
+
+      // Validate there are no docs left
+      reader = IndexReader.open(dir);
+      assertEquals(2, reader.numDocs());
+      reader.close();
+
+      modifier.close();
+      dir.close();
+    }
+  }
+
+  // test rollback of deleteAll()
+  public void testDeleteAllRollback() throws IOException {
+    Directory dir = new MockRAMDirectory();
+    IndexWriter modifier = new IndexWriter(dir, false,
+                                           new WhitespaceAnalyzer(), true);
+    modifier.setMaxBufferedDocs(2);
+    modifier.setMaxBufferedDeleteTerms(2);
+    
+    int id = 0;
+    int value = 100;
+    
+    for (int i = 0; i < 7; i++) {
+      addDoc(modifier, ++id, value);
+    }
+    modifier.commit();
+    
+    addDoc(modifier, ++id, value);
+
+    IndexReader reader = IndexReader.open(dir);
+    assertEquals(7, reader.numDocs());
+    reader.close();
+    
+    // Delete all
+    modifier.deleteAll(); 
+
+    // Roll it back
+    modifier.rollback();
+    modifier.close();
+    
+    // Validate that the docs are still there
+    reader = IndexReader.open(dir);
+    assertEquals(7, reader.numDocs());
+    reader.close();
+    
+    dir.close();
+  }
+
+
+  // test deleteAll() w/ near real-time reader
+  public void testDeleteAllNRT() throws IOException {
+    Directory dir = new MockRAMDirectory();
+    IndexWriter modifier = new IndexWriter(dir, false,
+                                           new WhitespaceAnalyzer(), true);
+    modifier.setMaxBufferedDocs(2);
+    modifier.setMaxBufferedDeleteTerms(2);
+    
+    int id = 0;
+    int value = 100;
+    
+    for (int i = 0; i < 7; i++) {
+      addDoc(modifier, ++id, value);
+    }
+    modifier.commit();
+
+    IndexReader reader = modifier.getReader();
+    assertEquals(7, reader.numDocs());
+    reader.close();
+
+    addDoc(modifier, ++id, value);
+    addDoc(modifier, ++id, value);
+    
+    // Delete all
+    modifier.deleteAll(); 
+
+    reader = modifier.getReader();
+    assertEquals(0, reader.numDocs());
+    reader.close();
+    
+
+    // Roll it back
+    modifier.rollback();
+    modifier.close();
+    
+    // Validate that the docs are still there
+    reader = IndexReader.open(dir);
+    assertEquals(7, reader.numDocs());
+    reader.close();
+    
+    dir.close();
+  }
+
+
   private void addDoc(IndexWriter modifier, int id, int value)
       throws IOException {
     Document doc = new Document();