@@ -121,10 +121,11 @@ public SortedNumericDocValues getSortedNumeric(FieldInfo field) throws IOExcepti
121121 writeSkipIndex (field , producer );
122122 }
123123
124- writeField (field , producer , -1 );
124+ writeField (field , producer , -1 , null );
125125 }
126126
127- private long [] writeField (FieldInfo field , TsdbDocValuesProducer valuesProducer , long maxOrd ) throws IOException {
127+ private long [] writeField (FieldInfo field , TsdbDocValuesProducer valuesProducer , long maxOrd , OffsetsAccumulator offsetsAccumulator )
128+ throws IOException {
128129 int numDocsWithValue = 0 ;
129130 long numValues = 0 ;
130131
@@ -174,6 +175,9 @@ private long[] writeField(FieldInfo field, TsdbDocValuesProducer valuesProducer,
174175 disiAccumulator .addDocId (doc );
175176 }
176177 final int count = values .docValueCount ();
178+ if (offsetsAccumulator != null ) {
179+ offsetsAccumulator .addDoc (count );
180+ }
177181 for (int i = 0 ; i < count ; ++i ) {
178182 buffer [bufferSize ++] = values .nextValue ();
179183 if (bufferSize == ES819TSDBDocValuesFormat .NUMERIC_BLOCK_SIZE ) {
@@ -386,7 +390,7 @@ public long cost() {
386390 }
387391 SortedDocValues sorted = valuesProducer .getSorted (field );
388392 int maxOrd = sorted .getValueCount ();
389- writeField (field , producer , maxOrd );
393+ writeField (field , producer , maxOrd , null );
390394 addTermsDict (DocValues .singleton (valuesProducer .getSorted (field )));
391395 }
392396
@@ -545,31 +549,46 @@ private void writeSortedNumericField(FieldInfo field, TsdbDocValuesProducer valu
545549 if (maxOrd > -1 ) {
546550 meta .writeByte ((byte ) 1 ); // multiValued (1 = multiValued)
547551 }
548- long [] stats = writeField (field , valuesProducer , maxOrd );
549- int numDocsWithField = Math .toIntExact (stats [0 ]);
550- long numValues = stats [1 ];
551- assert numValues >= numDocsWithField ;
552552
553- if (numValues > numDocsWithField ) {
554- long start = data .getFilePointer ();
555- meta .writeLong (start );
556- meta .writeVInt (ES819TSDBDocValuesFormat .DIRECT_MONOTONIC_BLOCK_SHIFT );
553+ if (valuesProducer .mergeStats .supported ()) {
554+ int numDocsWithField = valuesProducer .mergeStats .sumNumDocsWithField ();
555+ long numValues = valuesProducer .mergeStats .sumNumValues ();
556+ if (numDocsWithField == numValues ) {
557+ writeField (field , valuesProducer , maxOrd , null );
558+ } else {
559+ assert numValues > numDocsWithField ;
560+ try (var accumulator = new OffsetsAccumulator (dir , context , data , numDocsWithField )) {
561+ writeField (field , valuesProducer , maxOrd , accumulator );
562+ accumulator .build (meta , data );
563+ }
564+ }
565+ } else {
566+ long [] stats = writeField (field , valuesProducer , maxOrd , null );
567+ int numDocsWithField = Math .toIntExact (stats [0 ]);
568+ long numValues = stats [1 ];
569+ assert numValues >= numDocsWithField ;
557570
558- final DirectMonotonicWriter addressesWriter = DirectMonotonicWriter .getInstance (
559- meta ,
560- data ,
561- numDocsWithField + 1L ,
562- ES819TSDBDocValuesFormat .DIRECT_MONOTONIC_BLOCK_SHIFT
563- );
564- long addr = 0 ;
565- addressesWriter .add (addr );
566- SortedNumericDocValues values = valuesProducer .getSortedNumeric (field );
567- for (int doc = values .nextDoc (); doc != DocIdSetIterator .NO_MORE_DOCS ; doc = values .nextDoc ()) {
568- addr += values .docValueCount ();
571+ if (numValues > numDocsWithField ) {
572+ long start = data .getFilePointer ();
573+ meta .writeLong (start );
574+ meta .writeVInt (ES819TSDBDocValuesFormat .DIRECT_MONOTONIC_BLOCK_SHIFT );
575+
576+ final DirectMonotonicWriter addressesWriter = DirectMonotonicWriter .getInstance (
577+ meta ,
578+ data ,
579+ numDocsWithField + 1L ,
580+ ES819TSDBDocValuesFormat .DIRECT_MONOTONIC_BLOCK_SHIFT
581+ );
582+ long addr = 0 ;
569583 addressesWriter .add (addr );
584+ SortedNumericDocValues values = valuesProducer .getSortedNumeric (field );
585+ for (int doc = values .nextDoc (); doc != DocIdSetIterator .NO_MORE_DOCS ; doc = values .nextDoc ()) {
586+ addr += values .docValueCount ();
587+ addressesWriter .add (addr );
588+ }
589+ addressesWriter .finish ();
590+ meta .writeLong (data .getFilePointer () - start );
570591 }
571- addressesWriter .finish ();
572- meta .writeLong (data .getFilePointer () - start );
573592 }
574593 }
575594
0 commit comments