private void ProcessAssocFacetFields(TaxonomyWriter taxoWriter, IDictionary <string, IList <AssociationFacetField> > byField, Document doc) { foreach (KeyValuePair <string, IList <AssociationFacetField> > ent in byField) { byte[] bytes = new byte[16]; int upto = 0; string indexFieldName = ent.Key; foreach (AssociationFacetField field in ent.Value) { // NOTE: we don't add parents for associations checkTaxoWriter(taxoWriter); FacetLabel label = new FacetLabel(field.dim, field.path); int ordinal = taxoWriter.AddCategory(label); if (upto + 4 > bytes.Length) { bytes = ArrayUtil.Grow(bytes, upto + 4); } // big-endian: bytes[upto++] = (byte)(ordinal >> 24); bytes[upto++] = (byte)(ordinal >> 16); bytes[upto++] = (byte)(ordinal >> 8); bytes[upto++] = (byte)ordinal; if (upto + field.assoc.Length > bytes.Length) { bytes = ArrayUtil.Grow(bytes, upto + field.assoc.Length); } Array.Copy(field.assoc.Bytes, field.assoc.Offset, bytes, upto, field.assoc.Length); upto += field.assoc.Length; // Drill down: for (int i = 1; i <= label.Length; i++) { doc.Add(new StringField(indexFieldName, PathToString(label.Components, i), Field.Store.NO)); } } doc.Add(new BinaryDocValuesField(indexFieldName, new BytesRef(bytes, 0, upto))); } }
/// <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); } } } }
/// <summary> /// fillTaxonomy adds the categories in the categories[] array, and asserts /// that the additions return exactly the ordinals (in the past - paths) /// specified in expectedPaths[]. /// Note that this assumes that fillTaxonomy() 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 FillTaxonomy(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); } } }
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))); } }