You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2012/12/16 11:13:40 UTC

svn commit: r1422497 - in /lucene/dev/branches/branch_4x: ./ lucene/ lucene/facet/ lucene/facet/src/java/org/apache/lucene/facet/taxonomy/directory/ lucene/facet/src/test/org/apache/lucene/facet/taxonomy/directory/

Author: shaie
Date: Sun Dec 16 10:13:39 2012
New Revision: 1422497

URL: http://svn.apache.org/viewvc?rev=1422497&view=rev
Log:
LUCENE-4633: DirectoryTaxonomyWriter.replaceTaxonomy should refresh its reader

Modified:
    lucene/dev/branches/branch_4x/   (props changed)
    lucene/dev/branches/branch_4x/lucene/   (props changed)
    lucene/dev/branches/branch_4x/lucene/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/branch_4x/lucene/facet/   (props changed)
    lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/directory/DirectoryTaxonomyWriter.java
    lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/directory/TestDirectoryTaxonomyWriter.java

Modified: lucene/dev/branches/branch_4x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/CHANGES.txt?rev=1422497&r1=1422496&r2=1422497&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/lucene/CHANGES.txt Sun Dec 16 10:13:39 2012
@@ -276,6 +276,10 @@ Bug Fixes
   indexed and the Iterator throws an exception. Documents were only rolled back
   if the actual indexing process failed. (Simon Willnauer)
 
+* LUCENE-4633: DirectoryTaxonomyWriter.replaceTaxonomy did not refresh its
+  internal reader, which could cause an existing category to be added twice.
+  (Shai Erera)
+  
 Changes in Runtime Behavior
   
 * LUCENE-4586: Change default ResultMode of FacetRequest to PER_NODE_IN_TREE.

Modified: lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/directory/DirectoryTaxonomyWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/directory/DirectoryTaxonomyWriter.java?rev=1422497&r1=1422496&r2=1422497&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/directory/DirectoryTaxonomyWriter.java (original)
+++ lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/directory/DirectoryTaxonomyWriter.java Sun Dec 16 10:13:39 2012
@@ -1027,6 +1027,8 @@ public class DirectoryTaxonomyWriter imp
     indexWriter.deleteAll();
     indexWriter.addIndexes(taxoDir);
     shouldRefreshReaderManager = true;
+    initReaderManager(); // ensure that it's initialized
+    refreshReaderManager();
     nextID = indexWriter.maxDoc();
     
     // need to clear the cache, so that addCategory won't accidentally return

Modified: lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/directory/TestDirectoryTaxonomyWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/directory/TestDirectoryTaxonomyWriter.java?rev=1422497&r1=1422496&r2=1422497&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/directory/TestDirectoryTaxonomyWriter.java (original)
+++ lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/directory/TestDirectoryTaxonomyWriter.java Sun Dec 16 10:13:39 2012
@@ -9,6 +9,7 @@ import java.util.concurrent.atomic.Atomi
 
 import org.apache.lucene.facet.taxonomy.CategoryPath;
 import org.apache.lucene.facet.taxonomy.TaxonomyReader;
+import org.apache.lucene.facet.taxonomy.directory.DirectoryTaxonomyWriter.MemoryOrdinalMap;
 import org.apache.lucene.facet.taxonomy.writercache.TaxonomyWriterCache;
 import org.apache.lucene.facet.taxonomy.writercache.cl2o.Cl2oTaxonomyWriterCache;
 import org.apache.lucene.facet.taxonomy.writercache.lru.LruTaxonomyWriterCache;
@@ -316,12 +317,12 @@ public class TestDirectoryTaxonomyWriter
   public void testReplaceTaxonomy() throws Exception {
     Directory input = newDirectory();
     DirectoryTaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(input);
-    taxoWriter.addCategory(new CategoryPath("a"));
+    int ordA = taxoWriter.addCategory(new CategoryPath("a"));
     taxoWriter.close();
     
     Directory dir = newDirectory();
     taxoWriter = new DirectoryTaxonomyWriter(dir);
-    int ordinal = taxoWriter.addCategory(new CategoryPath("b"));
+    int ordB = taxoWriter.addCategory(new CategoryPath("b"));
     taxoWriter.addCategory(new CategoryPath("c"));
     taxoWriter.commit();
     
@@ -330,11 +331,16 @@ public class TestDirectoryTaxonomyWriter
     // replace the taxonomy with the input one
     taxoWriter.replaceTaxonomy(input);
     
+    // LUCENE-4633: make sure that category "a" is not added again in any case
+    taxoWriter.addTaxonomy(input, new MemoryOrdinalMap());
+    assertEquals("no categories should have been added", 2, taxoWriter.getSize()); // root + 'a'
+    assertEquals("category 'a' received new ordinal?", ordA, taxoWriter.addCategory(new CategoryPath("a")));
+
     // add the same category again -- it should not receive the same ordinal !
-    int newOrdinal = taxoWriter.addCategory(new CategoryPath("b"));
-    assertNotSame("new ordinal cannot be the original ordinal", ordinal, newOrdinal);
-    assertEquals("ordinal should have been 2 since only one category was added by replaceTaxonomy", 2, newOrdinal);
-    
+    int newOrdB = taxoWriter.addCategory(new CategoryPath("b"));
+    assertNotSame("new ordinal cannot be the original ordinal", ordB, newOrdB);
+    assertEquals("ordinal should have been 2 since only one category was added by replaceTaxonomy", 2, newOrdB);
+
     taxoWriter.close();
     
     long newEpoch = getEpoch(dir);