private void FlushNumTerms(int totalFields) { int maxNumTerms = 0; foreach (DocData dd in PendingDocs) { foreach (FieldData fd in dd.Fields) { maxNumTerms |= fd.NumTerms; } } int bitsRequired = PackedInts.BitsRequired(maxNumTerms); VectorsStream.WriteVInt(bitsRequired); PackedInts.Writer writer = PackedInts.GetWriterNoHeader(VectorsStream, PackedInts.Format.PACKED, totalFields, bitsRequired, 1); foreach (DocData dd in PendingDocs) { foreach (FieldData fd in dd.Fields) { writer.Add(fd.NumTerms); } } Debug.Assert(writer.Ord() == totalFields - 1); writer.Finish(); }
private void FlushFlags(int totalFields, int[] fieldNums) { // check if fields always have the same flags bool nonChangingFlags = true; int[] fieldFlags = new int[fieldNums.Length]; Arrays.Fill(fieldFlags, -1); bool breakOuterLoop; foreach (DocData dd in PendingDocs) { breakOuterLoop = false; foreach (FieldData fd in dd.Fields) { int fieldNumOff = Array.BinarySearch(fieldNums, fd.FieldNum); Debug.Assert(fieldNumOff >= 0); if (fieldFlags[fieldNumOff] == -1) { fieldFlags[fieldNumOff] = fd.Flags; } else if (fieldFlags[fieldNumOff] != fd.Flags) { nonChangingFlags = false; breakOuterLoop = true; } } if (breakOuterLoop) { break; } } if (nonChangingFlags) { // write one flag per field num VectorsStream.WriteVInt(0); PackedInts.Writer writer = PackedInts.GetWriterNoHeader(VectorsStream, PackedInts.Format.PACKED, fieldFlags.Length, FLAGS_BITS, 1); foreach (int flags in fieldFlags) { Debug.Assert(flags >= 0); writer.Add(flags); } Debug.Assert(writer.Ord() == fieldFlags.Length - 1); writer.Finish(); } else { // write one flag for every field instance VectorsStream.WriteVInt(1); PackedInts.Writer writer = PackedInts.GetWriterNoHeader(VectorsStream, PackedInts.Format.PACKED, totalFields, FLAGS_BITS, 1); foreach (DocData dd in PendingDocs) { foreach (FieldData fd in dd.Fields) { writer.Add(fd.Flags); } } Debug.Assert(writer.Ord() == totalFields - 1); writer.Finish(); } }