/// <summary> /// Adds a new doc in this term. If this returns null /// then we just skip consuming positions/payloads. /// </summary> public override void StartDoc(int docId, int termDocFreq) { var delta = docId - LAST_DOC_ID; if (docId < 0 || (DF > 0 && delta <= 0)) { throw new CorruptIndexException("docs out of order (" + docId + " <= " + LAST_DOC_ID + " ) (docOut: " + DOC_OUT + ")"); } if ((++DF % SKIP_INTERVAL) == 0) { // TODO: -- awkward we have to make these two separate calls to skipper SKIP_LIST_WRITER.SetSkipData(LAST_DOC_ID, STORE_PAYLOADS, LAST_PAYLOAD_LENGTH); SKIP_LIST_WRITER.BufferSkip(DF); } LAST_DOC_ID = docId; DOC_OUT.Write(delta); if (INDEX_OPTIONS != FieldInfo.IndexOptions.DOCS_ONLY) { //System.out.println(" sepw startDoc: write freq=" + termDocFreq); FREQ_OUT.Write(termDocFreq); } }
/// <summary> /// Add a new position & payload </summary> public override void AddPosition(int position, BytesRef payload, int startOffset, int endOffset) { Debug.Assert(INDEX_OPTIONS == FieldInfo.IndexOptions.DOCS_AND_FREQS_AND_POSITIONS); int delta = position - LAST_POSITION; Debug.Assert(delta >= 0, "position=" + position + " lastPosition=" + LAST_POSITION); // not quite right (if pos=0 is repeated twice we don't catch it) LAST_POSITION = position; if (STORE_PAYLOADS) { int payloadLength = payload == null ? 0 : payload.Length; if (payloadLength != LAST_PAYLOAD_LENGTH) { LAST_PAYLOAD_LENGTH = payloadLength; // TODO: explore whether we get better compression // by not storing payloadLength into prox stream? POS_OUT.Write((delta << 1) | 1); POS_OUT.Write(payloadLength); } else { POS_OUT.Write(delta << 1); } if (payloadLength > 0 && payload != null) { PAYLOAD_OUT.WriteBytes(payload.Bytes, payload.Offset, payloadLength); } } else { POS_OUT.Write(delta); } LAST_POSITION = position; }