2626import org .apache .lucene .index .LeafReader ;
2727import org .apache .lucene .index .LogByteSizeMergePolicy ;
2828import org .apache .lucene .index .NumericDocValues ;
29- import org .apache .lucene .index .SortedNumericDocValues ;
29+ import org .apache .lucene .index .SortedDocValues ;
3030import org .apache .lucene .search .Sort ;
3131import org .apache .lucene .search .SortField ;
3232import org .apache .lucene .search .SortedNumericSortField ;
3333import org .apache .lucene .util .BytesRef ;
3434import org .elasticsearch .cluster .metadata .DataStream ;
3535import org .elasticsearch .common .Randomness ;
36+ import org .elasticsearch .common .util .CollectionUtils ;
3637import org .elasticsearch .index .codec .Elasticsearch900Lucene101Codec ;
3738import org .elasticsearch .index .codec .tsdb .ES87TSDBDocValuesFormatTests ;
39+ import org .elasticsearch .test .ESTestCase ;
3840
3941import java .io .IOException ;
4042import java .util .ArrayList ;
4143import java .util .Arrays ;
4244import java .util .List ;
4345import java .util .Locale ;
4446import java .util .function .Supplier ;
47+ import java .util .stream .IntStream ;
4548
4649public class ES819TSDBDocValuesFormatTests extends ES87TSDBDocValuesFormatTests {
4750
@@ -543,6 +546,11 @@ public DocValuesFormat getDocValuesFormatForField(String field) {
543546 });
544547 return config ;
545548 };
549+ List <String > allNumericFields = IntStream .range (0 , 5 ).mapToObj (n -> "numeric_" + n ).toList ();
550+ List <String > allSortedNumericFields = IntStream .range (0 , 5 ).mapToObj (n -> "sorted_numeric_" + n ).toList ();
551+ List <String > allSortedFields = IntStream .range (0 , 5 ).mapToObj (n -> "sorted_" + n ).toList ();
552+ List <String > allSortedSetFields = IntStream .range (0 , 5 ).mapToObj (n -> "sorted_set" + n ).toList ();
553+ List <String > allBinaryFields = IntStream .range (0 , 5 ).mapToObj (n -> "binary_" + n ).toList ();
546554 try (var source1 = newDirectory (); var source2 = newDirectory (); var singleDir = newDirectory (); var mergeDir = newDirectory ()) {
547555 try (
548556 var writer1 = new IndexWriter (source1 , indexConfigWithRandomDVFormat .get ());
@@ -558,21 +566,38 @@ public DocValuesFormat getDocValuesFormatForField(String field) {
558566 fields .add (new SortedDocValuesField (hostnameField , new BytesRef (hostName )));
559567 fields .add (new SortedNumericDocValuesField (timestampField , timestamp ));
560568 final IndexWriter splitWriter = random ().nextBoolean () ? writer1 : writer2 ;
561- if (random ().nextBoolean ()) {
562- fields .add (new SortedNumericDocValuesField ("gets" , random ().nextLong (1000_000L )));
563- } else {
564- fields .add (new SortedNumericDocValuesField ("posts" , random ().nextLong (1000_000L )));
569+ var numericFields = ESTestCase .randomSubsetOf (allNumericFields );
570+ for (String f : numericFields ) {
571+ fields .add (new NumericDocValuesField (f , random ().nextLong (1000L )));
565572 }
566- fields .add (new NumericDocValuesField ("memory" , random ().nextLong (1000_000L )));
567- Randomness .shuffle (fields );
568- splitWriter .addDocument (fields );
569- if (random ().nextInt (100 ) <= 5 ) {
570- splitWriter .commit ();
573+ var sortedNumericFields = ESTestCase .randomSubsetOf (allSortedNumericFields );
574+ for (String field : sortedNumericFields ) {
575+ int valueCount = 1 + random ().nextInt (3 );
576+ for (int v = 0 ; v < valueCount ; v ++) {
577+ fields .add (new SortedNumericDocValuesField (field , random ().nextLong (1000L )));
578+ }
579+ }
580+ var sortedFields = ESTestCase .randomSubsetOf (allSortedFields );
581+ for (String field : sortedFields ) {
582+ fields .add (new SortedDocValuesField (field , new BytesRef ("v" + random ().nextInt (100 ))));
583+ }
584+ var sortedSetFields = ESTestCase .randomSubsetOf (allSortedSetFields );
585+ for (String field : sortedSetFields ) {
586+ int valueCount = 1 + random ().nextInt (3 );
587+ for (int v = 0 ; v < valueCount ; v ++) {
588+ fields .add (new SortedSetDocValuesField (field , new BytesRef ("v" + random ().nextInt (100 ))));
589+ }
571590 }
572- // add to the single writer
573- singleWriter .addDocument (fields );
574- if (random ().nextInt (100 ) <= 5 ) {
575- singleWriter .commit ();
591+ List <String > binaryFields = ESTestCase .randomSubsetOf (allBinaryFields );
592+ for (String field : binaryFields ) {
593+ fields .add (new BinaryDocValuesField (field , new BytesRef ("b" + random ().nextInt (100 ))));
594+ }
595+ for (IndexWriter writer : List .of (splitWriter , singleWriter )) {
596+ Randomness .shuffle (fields );
597+ writer .addDocument (fields );
598+ if (random ().nextInt (100 ) <= 5 ) {
599+ writer .commit ();
600+ }
576601 }
577602 }
578603 if (random ().nextBoolean ()) {
@@ -595,43 +620,92 @@ public DocValuesFormat getDocValuesFormatForField(String field) {
595620 for (int i = 0 ; i < reader1 .leaves ().size (); i ++) {
596621 LeafReader leaf1 = reader1 .leaves ().get (i ).reader ();
597622 LeafReader leaf2 = reader2 .leaves ().get (i ).reader ();
598- duelAssertNumericField (leaf1 , leaf2 , "gets" );
599- duelAssertNumericField (leaf1 , leaf2 , "posts" );
600- duelAssertNumericField (leaf1 , leaf2 , "memory" );
601- duelAssertNumericField (leaf1 , leaf2 , "@timestamp" );
623+ for (String f : CollectionUtils .appendToCopy (allSortedNumericFields , timestampField )) {
624+ var dv1 = leaf1 .getNumericDocValues (f );
625+ var dv2 = leaf2 .getNumericDocValues (f );
626+ if (dv1 == null ) {
627+ assertNull (dv2 );
628+ continue ;
629+ }
630+ assertNotNull (dv2 );
631+ while (dv1 .nextDoc () != NumericDocValues .NO_MORE_DOCS ) {
632+ assertNotEquals (NumericDocValues .NO_MORE_DOCS , dv2 .nextDoc ());
633+ assertEquals (dv1 .docID (), dv2 .docID ());
634+ assertEquals (dv1 .longValue (), dv2 .longValue ());
635+ }
636+ assertEquals (NumericDocValues .NO_MORE_DOCS , dv2 .nextDoc ());
637+ }
638+ for (String f : CollectionUtils .appendToCopy (allSortedNumericFields , timestampField )) {
639+ var dv1 = leaf1 .getSortedNumericDocValues (f );
640+ var dv2 = leaf2 .getSortedNumericDocValues (f );
641+ if (dv1 == null ) {
642+ assertNull (dv2 );
643+ continue ;
644+ }
645+ assertNotNull (dv2 );
646+ while (dv1 .nextDoc () != NumericDocValues .NO_MORE_DOCS ) {
647+ assertNotEquals (NumericDocValues .NO_MORE_DOCS , dv2 .nextDoc ());
648+ assertEquals (dv1 .docID (), dv2 .docID ());
649+ assertEquals (dv1 .docValueCount (), dv2 .docValueCount ());
650+ for (int v = 0 ; v < dv1 .docValueCount (); v ++) {
651+ assertEquals (dv1 .nextValue (), dv2 .nextValue ());
652+ }
653+ }
654+ assertEquals (NumericDocValues .NO_MORE_DOCS , dv2 .nextDoc ());
655+ }
656+ for (String f : CollectionUtils .appendToCopy (allSortedFields , hostnameField )) {
657+ var dv1 = leaf1 .getSortedDocValues (f );
658+ var dv2 = leaf2 .getSortedDocValues (f );
659+ if (dv1 == null ) {
660+ assertNull (dv2 );
661+ continue ;
662+ }
663+ assertNotNull (dv2 );
664+ while (dv1 .nextDoc () != SortedDocValues .NO_MORE_DOCS ) {
665+ assertNotEquals (SortedDocValues .NO_MORE_DOCS , dv2 .nextDoc ());
666+ assertEquals (dv1 .docID (), dv2 .docID ());
667+ assertEquals (dv1 .lookupOrd (dv1 .ordValue ()), dv2 .lookupOrd (dv2 .ordValue ()));
668+ }
669+ assertEquals (NumericDocValues .NO_MORE_DOCS , dv2 .nextDoc ());
670+ }
671+ for (String f : allSortedSetFields ) {
672+ var dv1 = leaf1 .getSortedSetDocValues (f );
673+ var dv2 = leaf2 .getSortedSetDocValues (f );
674+ if (dv1 == null ) {
675+ assertNull (dv2 );
676+ continue ;
677+ }
678+ assertNotNull (dv2 );
679+ while (dv1 .nextDoc () != SortedDocValues .NO_MORE_DOCS ) {
680+ assertNotEquals (SortedDocValues .NO_MORE_DOCS , dv2 .nextDoc ());
681+ assertEquals (dv1 .docID (), dv2 .docID ());
682+ assertEquals (dv1 .docValueCount (), dv2 .docValueCount ());
683+ for (int v = 0 ; v < dv1 .docValueCount (); v ++) {
684+ assertEquals (dv1 .lookupOrd (dv1 .nextOrd ()), dv2 .lookupOrd (dv2 .nextOrd ()));
685+ }
686+ }
687+ assertEquals (NumericDocValues .NO_MORE_DOCS , dv2 .nextDoc ());
688+ }
689+ for (String f : allBinaryFields ) {
690+ var dv1 = leaf1 .getBinaryDocValues (f );
691+ var dv2 = leaf2 .getBinaryDocValues (f );
692+ if (dv1 == null ) {
693+ assertNull (dv2 );
694+ continue ;
695+ }
696+ assertNotNull (dv2 );
697+ while (dv1 .nextDoc () != SortedDocValues .NO_MORE_DOCS ) {
698+ assertNotEquals (SortedDocValues .NO_MORE_DOCS , dv2 .nextDoc ());
699+ assertEquals (dv1 .docID (), dv2 .docID ());
700+ assertEquals (dv1 .binaryValue (), dv2 .binaryValue ());
701+ }
702+ assertEquals (NumericDocValues .NO_MORE_DOCS , dv2 .nextDoc ());
703+ }
602704 }
603705 }
604706 }
605707 }
606708
607- static void duelAssertNumericField (LeafReader reader1 , LeafReader reader2 , String fieldName ) throws IOException {
608- SortedNumericDocValues sdv1 = reader1 .getSortedNumericDocValues (fieldName );
609- SortedNumericDocValues sdv2 = reader2 .getSortedNumericDocValues (fieldName );
610- NumericDocValues dv1 ;
611- NumericDocValues dv2 ;
612- if (sdv1 != null ) {
613- dv1 = DocValues .unwrapSingleton (sdv1 );
614- assertNotNull (sdv2 );
615- dv2 = DocValues .unwrapSingleton (sdv2 );
616- assertNotNull (dv1 );
617- assertNotNull (dv2 );
618- } else {
619- assertNull (sdv2 );
620- dv1 = reader1 .getNumericDocValues (fieldName );
621- dv2 = reader2 .getNumericDocValues (fieldName );
622- if (dv1 == null ) {
623- assertNull (dv2 );
624- return ;
625- }
626- }
627- while (dv1 .nextDoc () != NumericDocValues .NO_MORE_DOCS ) {
628- assertNotEquals (NumericDocValues .NO_MORE_DOCS , dv2 .nextDoc ());
629- assertEquals (dv1 .docID (), dv2 .docID ());
630- assertEquals (dv1 .longValue (), dv2 .longValue ());
631- }
632- assertEquals (NumericDocValues .NO_MORE_DOCS , dv2 .nextDoc ());
633- }
634-
635709 private IndexWriterConfig getTimeSeriesIndexWriterConfig (String hostnameField , String timestampField ) {
636710 var config = new IndexWriterConfig ();
637711 config .setIndexSort (
0 commit comments