/// <summary> /// fillTaxonomyCheckPaths adds the categories in the categories[] array, /// and asserts that the additions return exactly paths specified in /// expectedPaths[]. This is the same add fillTaxonomy() but also checks /// the correctness of getParent(), not just addCategory(). /// Note that this assumes that fillTaxonomyCheckPaths() is called on an empty /// taxonomy index. Calling it after something else was already added to the /// taxonomy index will surely have this method fail. /// </summary> public static void FillTaxonomyCheckPaths(TaxonomyWriter tw) { for (int i = 0; i < categories.Length; i++) { int ordinal = tw.AddCategory(new FacetLabel(categories[i])); int expectedOrdinal = ExpectedPaths[i][ExpectedPaths[i].Length - 1]; if (ordinal != expectedOrdinal) { Fail("For category " + Showcat(categories[i]) + " expected ordinal " + expectedOrdinal + ", but got " + ordinal); } for (int j = ExpectedPaths[i].Length - 2; j >= 0; j--) { ordinal = tw.GetParent(ordinal); expectedOrdinal = ExpectedPaths[i][j]; if (ordinal != expectedOrdinal) { Fail("For category " + Showcat(categories[i]) + " expected ancestor level " + (ExpectedPaths[i].Length - 1 - j) + " was " + expectedOrdinal + ", but got " + ordinal); } } } }
// After fillTaxonomy returned successfully, checkPaths() checks that // the getParent() calls return as expected, from the table public static void CheckPaths(TaxonomyWriter tw) { for (int i = 0; i < categories.Length; i++) { int ordinal = ExpectedPaths[i][ExpectedPaths[i].Length - 1]; for (int j = ExpectedPaths[i].Length - 2; j >= 0; j--) { ordinal = tw.GetParent(ordinal); int expectedOrdinal = ExpectedPaths[i][j]; if (ordinal != expectedOrdinal) { Fail("For category " + Showcat(categories[i]) + " expected ancestor level " + (ExpectedPaths[i].Length - 1 - j) + " was " + expectedOrdinal + ", but got " + ordinal); } } Assert.AreEqual(TaxonomyReader.ROOT_ORDINAL, tw.GetParent(ExpectedPaths[i][0])); } Assert.AreEqual(TaxonomyReader.INVALID_ORDINAL, tw.GetParent(TaxonomyReader.ROOT_ORDINAL)); }
private void CheckWriterParent(TaxonomyReader tr, TaxonomyWriter tw) { // check that the parent of the root ordinal is the invalid ordinal: Assert.AreEqual(TaxonomyReader.INVALID_ORDINAL, tw.GetParent(0)); // check parent of non-root ordinals: for (int ordinal = 1; ordinal < tr.Size; ordinal++) { FacetLabel me = tr.GetPath(ordinal); int parentOrdinal = tw.GetParent(ordinal); FacetLabel parent = tr.GetPath(parentOrdinal); if (parent == null) { Fail("Parent of " + ordinal + " is " + parentOrdinal + ", but this is not a valid category."); } // verify that the parent is indeed my parent, according to the // strings if (!me.Subpath(me.Length - 1).Equals(parent)) { Fail("Got parent " + parentOrdinal + " for ordinal " + ordinal + " but categories are " + Showcat(parent) + " and " + Showcat(me) + " respectively."); } } // check parent of of invalid ordinals: try { tw.GetParent(-1); Fail("getParent for -1 should throw exception"); } catch (System.IndexOutOfRangeException) { // ok } try { tw.GetParent(TaxonomyReader.INVALID_ORDINAL); Fail("getParent for INVALID_ORDINAL should throw exception"); } catch (System.IndexOutOfRangeException) { // ok } try { int parent = tw.GetParent(tr.Size); Fail("getParent for getSize() should throw exception, but returned " + parent); } catch (System.IndexOutOfRangeException) { // ok } }
private void ProcessFacetFields(TaxonomyWriter taxoWriter, IDictionary <string, IList <FacetField> > byField, Document doc) { foreach (KeyValuePair <string, IList <FacetField> > ent in byField) { string indexFieldName = ent.Key; //System.out.println(" indexFieldName=" + indexFieldName + " fields=" + ent.getValue()); IntsRef ordinals = new IntsRef(32); foreach (FacetField facetField in ent.Value) { FacetsConfig.DimConfig ft = GetDimConfig(facetField.dim); if (facetField.path.Length > 1 && ft.Hierarchical == false) { throw new System.ArgumentException("dimension \"" + facetField.dim + "\" is not hierarchical yet has " + facetField.path.Length + " components"); } FacetLabel cp = new FacetLabel(facetField.dim, facetField.path); checkTaxoWriter(taxoWriter); int ordinal = taxoWriter.AddCategory(cp); if (ordinals.Length == ordinals.Ints.Length) { ordinals.Grow(ordinals.Length + 1); } ordinals.Ints[ordinals.Length++] = ordinal; //System.out.println("ords[" + (ordinals.length-1) + "]=" + ordinal); //System.out.println(" add cp=" + cp); if (ft.MultiValued && (ft.Hierarchical || ft.RequireDimCount)) { //System.out.println(" add parents"); // Add all parents too: int parent = taxoWriter.GetParent(ordinal); while (parent > 0) { if (ordinals.Ints.Length == ordinals.Length) { ordinals.Grow(ordinals.Length + 1); } ordinals.Ints[ordinals.Length++] = parent; parent = taxoWriter.GetParent(parent); } if (ft.RequireDimCount == false) { // Remove last (dimension) ord: ordinals.Length--; } } // Drill down: for (int i = 1; i <= cp.Length; i++) { doc.Add(new StringField(indexFieldName, PathToString(cp.Components, i), Field.Store.NO)); } } // Facet counts: // DocValues are considered stored fields: doc.Add(new BinaryDocValuesField(indexFieldName, DedupAndEncode(ordinals))); } }