4747import org .elasticsearch .index .codec .tsdb .ES87TSDBDocValuesFormatTests ;
4848import org .elasticsearch .index .codec .tsdb .es819 .ES819TSDBDocValuesProducer .BaseDenseNumericValues ;
4949import org .elasticsearch .index .codec .tsdb .es819 .ES819TSDBDocValuesProducer .BaseSortedDocValues ;
50+ import org .elasticsearch .index .codec .tsdb .es819 .ES819TSDBDocValuesProducer .DenseBinaryDocValues ;
5051import org .elasticsearch .index .mapper .BlockLoader ;
5152import org .elasticsearch .index .mapper .BlockLoader .OptionalColumnAtATimeReader ;
5253import org .elasticsearch .index .mapper .TestBlock ;
6465import java .util .function .Supplier ;
6566import java .util .stream .IntStream ;
6667
68+ import static org .elasticsearch .test .ESTestCase .between ;
69+ import static org .elasticsearch .test .ESTestCase .randomAlphaOfLength ;
6770import static org .elasticsearch .test .ESTestCase .randomFrom ;
6871import static org .hamcrest .Matchers .equalTo ;
6972import static org .hamcrest .Matchers .instanceOf ;
@@ -757,22 +760,30 @@ public void testOptionalColumnAtATimeReader() throws Exception {
757760 final String counterFieldAsString = "counter_as_string" ;
758761 final String timestampField = "@timestamp" ;
759762 final String gaugeField = "gauge" ;
763+ final String binaryFixedField = "binary_variable" ;
764+ final String binaryVariableField = "binary_fixed" ;
760765 long currentTimestamp = 1704067200000L ;
761766 long currentCounter = 10_000_000 ;
762767
763768 var config = getTimeSeriesIndexWriterConfig (null , timestampField );
764769 try (var dir = newDirectory (); var iw = new IndexWriter (dir , config )) {
765770 long [] gauge1Values = new long [] { 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 };
771+ List <BytesRef > binaryFixedValues = new ArrayList <>();
772+ List <BytesRef > binaryVariableValues = new ArrayList <>();
766773 int numDocs = 256 + random ().nextInt (8096 );
767774
768775 for (int i = 0 ; i < numDocs ; i ++) {
776+ binaryFixedValues .add (new BytesRef (randomAlphaOfLength (10 )));
777+ binaryVariableValues .add (new BytesRef (randomAlphaOfLength (between (0 , 10 ))));
769778 var d = new Document ();
770779 long timestamp = currentTimestamp ;
771780 // Index sorting doesn't work with NumericDocValuesField:
772781 d .add (SortedNumericDocValuesField .indexedField (timestampField , timestamp ));
773782 d .add (new SortedNumericDocValuesField (counterField , currentCounter ));
774783 d .add (new SortedSetDocValuesField (counterFieldAsString , new BytesRef (Long .toString (currentCounter ))));
775784 d .add (new SortedNumericDocValuesField (gaugeField , gauge1Values [i % gauge1Values .length ]));
785+ d .add (new BinaryDocValuesField (binaryFixedField , binaryFixedValues .getLast ()));
786+ d .add (new BinaryDocValuesField (binaryVariableField , binaryVariableValues .getLast ()));
776787
777788 iw .addDocument (d );
778789 if (i % 100 == 0 ) {
@@ -794,6 +805,9 @@ public void testOptionalColumnAtATimeReader() throws Exception {
794805 var counterDV = getBaseDenseNumericValues (leaf .reader (), counterField );
795806 var gaugeDV = getBaseDenseNumericValues (leaf .reader (), gaugeField );
796807 var stringCounterDV = getBaseSortedDocValues (leaf .reader (), counterFieldAsString );
808+ var binaryFixedDV = getDenseBinaryValues (leaf .reader (), binaryFixedField );
809+ var binaryVariableDV = getDenseBinaryValues (leaf .reader (), binaryVariableField );
810+
797811 int maxDoc = leaf .reader ().maxDoc ();
798812 for (int i = 0 ; i < maxDoc ;) {
799813 int size = Math .max (1 , random ().nextInt (0 , maxDoc - i ));
@@ -843,6 +857,30 @@ public void testOptionalColumnAtATimeReader() throws Exception {
843857 }
844858 }
845859
860+ {
861+ // bulk loading binary fixed length field:
862+ var block = (TestBlock ) binaryFixedDV .tryRead (factory , docs , 0 , random ().nextBoolean (), null , false );
863+ assertNotNull (block );
864+ assertEquals (size , block .size ());
865+ for (int j = 0 ; j < block .size (); j ++) {
866+ var actual = (BytesRef ) block .get (j );
867+ var expected = binaryFixedValues .removeLast ();
868+ assertEquals (expected , actual );
869+ }
870+ }
871+
872+ {
873+ // bulk loading binary variable length field:
874+ var block = (TestBlock ) binaryVariableDV .tryRead (factory , docs , 0 , random ().nextBoolean (), null , false );
875+ assertNotNull (block );
876+ assertEquals (size , block .size ());
877+ for (int j = 0 ; j < block .size (); j ++) {
878+ var actual = (BytesRef ) block .get (j );
879+ var expected = binaryVariableValues .removeLast ();
880+ assertEquals (expected , actual );
881+ }
882+ }
883+
846884 i += size ;
847885 }
848886 }
@@ -1405,6 +1443,10 @@ public void testEncodeRangeWithSortedSetPrimarySortField() throws Exception {
14051443 }
14061444 }
14071445
1446+ private static DenseBinaryDocValues getDenseBinaryValues (LeafReader leafReader , String field ) throws IOException {
1447+ return (DenseBinaryDocValues ) leafReader .getBinaryDocValues (field );
1448+ }
1449+
14081450 private static BaseDenseNumericValues getBaseDenseNumericValues (LeafReader leafReader , String field ) throws IOException {
14091451 return (BaseDenseNumericValues ) DocValues .unwrapSingleton (leafReader .getSortedNumericDocValues (field ));
14101452 }
0 commit comments