@@ -110,10 +110,11 @@ public SortedNumericDocValues getSortedNumeric(FieldInfo field) throws IOExcepti
110110 }
111111 };
112112
113- writeField (field , producer , -1 );
113+ writeField (field , producer , -1 , null );
114114 }
115115
116- private long [] writeField (FieldInfo field , TsdbDocValuesProducer valuesProducer , long maxOrd ) throws IOException {
116+ private long [] writeField (FieldInfo field , TsdbDocValuesProducer valuesProducer , long maxOrd , OffsetsAccumulator offsetsAccumulator )
117+ throws IOException {
117118 int numDocsWithValue = 0 ;
118119 long numValues = 0 ;
119120
@@ -163,6 +164,9 @@ private long[] writeField(FieldInfo field, TsdbDocValuesProducer valuesProducer,
163164 disiAccumulator .addDocId (doc );
164165 }
165166 final int count = values .docValueCount ();
167+ if (offsetsAccumulator != null ) {
168+ offsetsAccumulator .addDoc (count );
169+ }
166170 for (int i = 0 ; i < count ; ++i ) {
167171 buffer [bufferSize ++] = values .nextValue ();
168172 if (bufferSize == ES819TSDBDocValuesFormat .NUMERIC_BLOCK_SIZE ) {
@@ -372,7 +376,7 @@ public long cost() {
372376 }
373377 SortedDocValues sorted = valuesProducer .getSorted (field );
374378 int maxOrd = sorted .getValueCount ();
375- writeField (field , producer , maxOrd );
379+ writeField (field , producer , maxOrd , null );
376380 addTermsDict (DocValues .singleton (valuesProducer .getSorted (field )));
377381 }
378382
@@ -528,31 +532,46 @@ private void writeSortedNumericField(FieldInfo field, TsdbDocValuesProducer valu
528532 if (maxOrd > -1 ) {
529533 meta .writeByte ((byte ) 1 ); // multiValued (1 = multiValued)
530534 }
531- long [] stats = writeField (field , valuesProducer , maxOrd );
532- int numDocsWithField = Math .toIntExact (stats [0 ]);
533- long numValues = stats [1 ];
534- assert numValues >= numDocsWithField ;
535535
536- if (numValues > numDocsWithField ) {
537- long start = data .getFilePointer ();
538- meta .writeLong (start );
539- meta .writeVInt (ES819TSDBDocValuesFormat .DIRECT_MONOTONIC_BLOCK_SHIFT );
536+ if (valuesProducer .mergeStats .supported ()) {
537+ int numDocsWithField = valuesProducer .mergeStats .sumNumDocsWithField ();
538+ long numValues = valuesProducer .mergeStats .sumNumValues ();
539+ if (numDocsWithField == numValues ) {
540+ writeField (field , valuesProducer , maxOrd , null );
541+ } else {
542+ assert numValues > numDocsWithField ;
543+ try (var accumulator = new OffsetsAccumulator (dir , context , data , numDocsWithField )) {
544+ writeField (field , valuesProducer , maxOrd , accumulator );
545+ accumulator .build (meta , data );
546+ }
547+ }
548+ } else {
549+ long [] stats = writeField (field , valuesProducer , maxOrd , null );
550+ int numDocsWithField = Math .toIntExact (stats [0 ]);
551+ long numValues = stats [1 ];
552+ assert numValues >= numDocsWithField ;
540553
541- final DirectMonotonicWriter addressesWriter = DirectMonotonicWriter .getInstance (
542- meta ,
543- data ,
544- numDocsWithField + 1L ,
545- ES819TSDBDocValuesFormat .DIRECT_MONOTONIC_BLOCK_SHIFT
546- );
547- long addr = 0 ;
548- addressesWriter .add (addr );
549- SortedNumericDocValues values = valuesProducer .getSortedNumeric (field );
550- for (int doc = values .nextDoc (); doc != DocIdSetIterator .NO_MORE_DOCS ; doc = values .nextDoc ()) {
551- addr += values .docValueCount ();
554+ if (numValues > numDocsWithField ) {
555+ long start = data .getFilePointer ();
556+ meta .writeLong (start );
557+ meta .writeVInt (ES819TSDBDocValuesFormat .DIRECT_MONOTONIC_BLOCK_SHIFT );
558+
559+ final DirectMonotonicWriter addressesWriter = DirectMonotonicWriter .getInstance (
560+ meta ,
561+ data ,
562+ numDocsWithField + 1L ,
563+ ES819TSDBDocValuesFormat .DIRECT_MONOTONIC_BLOCK_SHIFT
564+ );
565+ long addr = 0 ;
552566 addressesWriter .add (addr );
567+ SortedNumericDocValues values = valuesProducer .getSortedNumeric (field );
568+ for (int doc = values .nextDoc (); doc != DocIdSetIterator .NO_MORE_DOCS ; doc = values .nextDoc ()) {
569+ addr += values .docValueCount ();
570+ addressesWriter .add (addr );
571+ }
572+ addressesWriter .finish ();
573+ meta .writeLong (data .getFilePointer () - start );
553574 }
554- addressesWriter .finish ();
555- meta .writeLong (data .getFilePointer () - start );
556575 }
557576 }
558577
0 commit comments