Index: lucene/facet/src/java/org/apache/lucene/facet/taxonomy/directory/DirectoryTaxonomyWriter.java =================================================================== --- lucene/facet/src/java/org/apache/lucene/facet/taxonomy/directory/DirectoryTaxonomyWriter.java (revision 1418230) +++ lucene/facet/src/java/org/apache/lucene/facet/taxonomy/directory/DirectoryTaxonomyWriter.java (working copy) @@ -496,7 +496,7 @@ } @Override - public int addCategory(CategoryPath categoryPath) throws IOException { + public synchronized int addCategory(CategoryPath categoryPath) throws IOException { ensureOpen(); // check the cache outside the synchronized block. this results in better // concurrency when categories are there. @@ -832,6 +832,7 @@ if (ordinal >= nextID) { throw new ArrayIndexOutOfBoundsException("requested ordinal is bigger than the largest ordinal in the taxonomy"); } + return getTaxoArrays().parents()[ordinal]; } Index: lucene/facet/src/test/org/apache/lucene/facet/taxonomy/directory/TestDirectoryTaxonomyWriter.java =================================================================== --- lucene/facet/src/test/org/apache/lucene/facet/taxonomy/directory/TestDirectoryTaxonomyWriter.java (revision 1418230) +++ lucene/facet/src/test/org/apache/lucene/facet/taxonomy/directory/TestDirectoryTaxonomyWriter.java (working copy) @@ -237,7 +237,7 @@ final int range = ncats * 3; // affects the categories selection final AtomicInteger numCats = new AtomicInteger(ncats); final Directory dir = newDirectory(); - final ConcurrentHashMap values = new ConcurrentHashMap(); + final ConcurrentHashMap values = new ConcurrentHashMap(); final double d = random().nextDouble(); final TaxonomyWriterCache cache; if (d < 0.7) { @@ -261,8 +261,18 @@ while (numCats.decrementAndGet() > 0) { try { int value = random.nextInt(range); - tw.addCategory(new CategoryPath("a", Integer.toString(value))); - values.put(value, value); + CategoryPath cp = new CategoryPath(Integer.toString(value / 1000), Integer.toString(value / 10000), + Integer.toString(value / 100000), Integer.toString(value)); + int ord = tw.addCategory(cp); + assertTrue("invalid parent for ordinal " + ord + ", category " + cp, tw.getParent(ord) != -1); + String l1 = cp.toString('/', 1); + String l2 = cp.toString('/', 2); + String l3 = cp.toString('/', 3); + String l4 = cp.toString('/', 4); + values.put(l1, l1); + values.put(l2, l2); + values.put(l3, l3); + values.put(l4, l4); } catch (IOException e) { throw new RuntimeException(e); } @@ -276,9 +286,9 @@ tw.close(); DirectoryTaxonomyReader dtr = new DirectoryTaxonomyReader(dir); - assertEquals("mismatch number of categories", values.size() + 2, dtr.getSize()); // +2 for root category + "a" - for (Integer value : values.keySet()) { - assertTrue("category not found a/" + value, dtr.getOrdinal(new CategoryPath("a", value.toString())) > 0); + assertEquals("mismatch number of categories", values.size() + 1, dtr.getSize()); // +1 for root category + for (String cat : values.keySet()) { + assertTrue("category not found a/" + cat, dtr.getOrdinal(new CategoryPath(cat, '/')) > 0); } dtr.close();