/* Write as a d-gaps list */ func (bv *BitVector) writeClearedDgaps(output store.IndexOutput) error { err := store.Stream(output). WriteInt(-1). // mark using d-gaps WriteInt(int32(bv.size)). WriteInt(int32(bv.Count())). Close() if err != nil { return err } last, numCleared := 0, bv.size-bv.Count() for i, v := range bv.bits { if v == byte(0xff) { continue } err = output.WriteVInt(int32(i - last)) if err == nil { err = output.WriteByte(v) } if err != nil { return err } last = i numCleared -= (8 - util.BitCount(v)) assert(numCleared >= 0 || i == len(bv.bits)-1 && numCleared == -(8-(bv.size&7))) if numCleared <= 0 { break } } return nil }
} if fi.IsIndexed() { bits |= FI_IS_INDEXED assert(indexOptions >= INDEX_OPT_DOCS_AND_FREQS_AND_POSITIONS || !fi.HasPayloads()) switch indexOptions { case INDEX_OPT_DOCS_ONLY: bits |= FI_OMIT_TERM_FREQ_AND_POSITIONS case INDEX_OPT_DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS: bits |= FI_STORE_OFFSETS_IN_POSTINGS case INDEX_OPT_DOCS_AND_FREQS: bits |= FI_OMIT_POSITIONS } } if err = output.WriteString(fi.Name); err == nil { if err = output.WriteVInt(fi.Number); err == nil { err = output.WriteByte(bits) } } if err != nil { return } // pack the DV types in one byte dv := byte(fi.DocValuesType()) nrm := byte(fi.NormType()) assert((dv&(^byte(0xF))) == 0 && (nrm&(^byte(0x0F))) == 0) val := (0xff & ((nrm << 4) | dv)) if err = output.WriteByte(val); err == nil { if err = output.WriteLong(fi.DocValuesGen()); err == nil { err = output.WriteStringStringMap(fi.Attributes()) }