@@ -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