@Test public void testOpenIfChangedReplaceTaxonomy() throws Exception { // test openIfChanged when replaceTaxonomy is called, which is equivalent to recreate // only can work with NRT as well Directory src = newDirectory(); DirectoryTaxonomyWriter w = new DirectoryTaxonomyWriter(src); FacetLabel cp_b = new FacetLabel("b"); w.addCategory(cp_b); w.close(); for (boolean nrt : new boolean[] {false, true}) { Directory dir = newDirectory(); DirectoryTaxonomyWriter writer = new DirectoryTaxonomyWriter(dir); FacetLabel cp_a = new FacetLabel("a"); writer.addCategory(cp_a); if (!nrt) writer.commit(); DirectoryTaxonomyReader r1 = nrt ? new DirectoryTaxonomyReader(writer) : new DirectoryTaxonomyReader(dir); // fill r1's caches assertEquals(1, r1.getOrdinal(cp_a)); assertEquals(cp_a, r1.getPath(1)); // now replace taxonomy writer.replaceTaxonomy(src); if (!nrt) writer.commit(); DirectoryTaxonomyReader r2 = TaxonomyReader.openIfChanged(r1); assertNotNull(r2); // fill r2's caches assertEquals(1, r2.getOrdinal(cp_b)); assertEquals(cp_b, r2.getPath(1)); // check that r1 doesn't see cp_b assertEquals(TaxonomyReader.INVALID_ORDINAL, r1.getOrdinal(cp_b)); assertEquals(cp_a, r1.getPath(1)); // check that r2 doesn't see cp_a assertEquals(TaxonomyReader.INVALID_ORDINAL, r2.getOrdinal(cp_a)); assertEquals(cp_b, r2.getPath(1)); r2.close(); r1.close(); writer.close(); dir.close(); } src.close(); }
@Test public void testOpenIfChangedReuseAfterRecreate() throws Exception { // tests that if the taxonomy is recreated, no data is reused from the previous taxonomy Directory dir = newDirectory(); DirectoryTaxonomyWriter writer = new DirectoryTaxonomyWriter(dir); FacetLabel cp_a = new FacetLabel("a"); writer.addCategory(cp_a); writer.close(); DirectoryTaxonomyReader r1 = new DirectoryTaxonomyReader(dir); // fill r1's caches assertEquals(1, r1.getOrdinal(cp_a)); assertEquals(cp_a, r1.getPath(1)); // now recreate, add a different category writer = new DirectoryTaxonomyWriter(dir, OpenMode.CREATE); FacetLabel cp_b = new FacetLabel("b"); writer.addCategory(cp_b); writer.close(); DirectoryTaxonomyReader r2 = TaxonomyReader.openIfChanged(r1); assertNotNull(r2); // fill r2's caches assertEquals(1, r2.getOrdinal(cp_b)); assertEquals(cp_b, r2.getPath(1)); // check that r1 doesn't see cp_b assertEquals(TaxonomyReader.INVALID_ORDINAL, r1.getOrdinal(cp_b)); assertEquals(cp_a, r1.getPath(1)); // check that r2 doesn't see cp_a assertEquals(TaxonomyReader.INVALID_ORDINAL, r2.getOrdinal(cp_a)); assertEquals(cp_b, r2.getPath(1)); r2.close(); r1.close(); dir.close(); }
@Test public void testOpenIfChangedReuse() throws Exception { // test the reuse of data from the old DTR instance for (boolean nrt : new boolean[] {false, true}) { Directory dir = newDirectory(); DirectoryTaxonomyWriter writer = new DirectoryTaxonomyWriter(dir); FacetLabel cp_a = new FacetLabel("a"); writer.addCategory(cp_a); if (!nrt) writer.commit(); DirectoryTaxonomyReader r1 = nrt ? new DirectoryTaxonomyReader(writer) : new DirectoryTaxonomyReader(dir); // fill r1's caches assertEquals(1, r1.getOrdinal(cp_a)); assertEquals(cp_a, r1.getPath(1)); FacetLabel cp_b = new FacetLabel("b"); writer.addCategory(cp_b); if (!nrt) writer.commit(); DirectoryTaxonomyReader r2 = TaxonomyReader.openIfChanged(r1); assertNotNull(r2); // add r2's categories to the caches assertEquals(2, r2.getOrdinal(cp_b)); assertEquals(cp_b, r2.getPath(2)); // check that r1 doesn't see cp_b assertEquals(TaxonomyReader.INVALID_ORDINAL, r1.getOrdinal(cp_b)); assertNull(r1.getPath(2)); r1.close(); r2.close(); writer.close(); dir.close(); } }
@Test public void testGetChildren() throws Exception { Directory dir = newDirectory(); DirectoryTaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(dir); int numCategories = atLeast(10); int numA = 0, numB = 0; Random random = random(); // add the two categories for which we'll also add children (so asserts are simpler) taxoWriter.addCategory(new FacetLabel("a")); taxoWriter.addCategory(new FacetLabel("b")); for (int i = 0; i < numCategories; i++) { if (random.nextBoolean()) { taxoWriter.addCategory(new FacetLabel("a", Integer.toString(i))); ++numA; } else { taxoWriter.addCategory(new FacetLabel("b", Integer.toString(i))); ++numB; } } // add category with no children taxoWriter.addCategory(new FacetLabel("c")); taxoWriter.close(); DirectoryTaxonomyReader taxoReader = new DirectoryTaxonomyReader(dir); // non existing category ChildrenIterator it = taxoReader.getChildren(taxoReader.getOrdinal(new FacetLabel("invalid"))); assertEquals(TaxonomyReader.INVALID_ORDINAL, it.next()); // a category with no children it = taxoReader.getChildren(taxoReader.getOrdinal(new FacetLabel("c"))); assertEquals(TaxonomyReader.INVALID_ORDINAL, it.next()); // arbitrary negative ordinal it = taxoReader.getChildren(-2); assertEquals(TaxonomyReader.INVALID_ORDINAL, it.next()); // root's children Set<String> roots = new HashSet<>(Arrays.asList("a", "b", "c")); it = taxoReader.getChildren(TaxonomyReader.ROOT_ORDINAL); while (!roots.isEmpty()) { FacetLabel root = taxoReader.getPath(it.next()); assertEquals(1, root.length); assertTrue(roots.remove(root.components[0])); } assertEquals(TaxonomyReader.INVALID_ORDINAL, it.next()); for (int i = 0; i < 2; i++) { FacetLabel cp = i == 0 ? new FacetLabel("a") : new FacetLabel("b"); int ordinal = taxoReader.getOrdinal(cp); it = taxoReader.getChildren(ordinal); int numChildren = 0; int child; while ((child = it.next()) != TaxonomyReader.INVALID_ORDINAL) { FacetLabel path = taxoReader.getPath(child); assertEquals(2, path.length); assertEquals(path.components[0], i == 0 ? "a" : "b"); ++numChildren; } int expected = i == 0 ? numA : numB; assertEquals("invalid num children", expected, numChildren); } taxoReader.close(); dir.close(); }