@@ -133,11 +133,12 @@ public Page getCheckedOutput() throws IOException {
133133 if (docCollector != null ) {
134134 blocks [blockIndex ++] = docCollector .build ().asBlock ();
135135 }
136- blocks [blockIndex ++] = tsHashesBuilder .build ().asBlock ();
136+ OrdinalBytesRefVector tsidVector = tsHashesBuilder .build ();
137+ blocks [blockIndex ++] = tsidVector .asBlock ();
137138 tsHashesBuilder = new TsidBuilder (blockFactory , Math .min (remainingDocs , maxPageSize ));
138139 blocks [blockIndex ++] = timestampsBuilder .build ().asBlock ();
139140 timestampsBuilder = blockFactory .newLongVectorBuilder (Math .min (remainingDocs , maxPageSize ));
140- System .arraycopy (fieldsReader .buildBlocks (), 0 , blocks , blockIndex , fieldsToExtracts .size ());
141+ System .arraycopy (fieldsReader .buildBlocks (tsidVector . getOrdinalsVector () ), 0 , blocks , blockIndex , fieldsToExtracts .size ());
141142 page = new Page (currentPagePos , blocks );
142143 currentPagePos = 0 ;
143144 }
@@ -217,6 +218,7 @@ void readDocsForNextPage() throws IOException {
217218 }
218219
219220 private boolean readValuesForOneTsid (PriorityQueue <LeafIterator > sub ) throws IOException {
221+ boolean first = true ;
220222 do {
221223 LeafIterator top = sub .top ();
222224 currentPagePos ++;
@@ -226,7 +228,8 @@ private boolean readValuesForOneTsid(PriorityQueue<LeafIterator> sub) throws IOE
226228 }
227229 tsHashesBuilder .appendOrdinal ();
228230 timestampsBuilder .appendLong (top .timestamp );
229- fieldsReader .readValues (top .segmentOrd , top .docID );
231+ fieldsReader .readValues (top .segmentOrd , top .docID , first );
232+ first = false ;
230233 if (top .nextDoc ()) {
231234 sub .updateTop ();
232235 } else if (top .docID == DocIdSetIterator .NO_MORE_DOCS ) {
@@ -350,6 +353,7 @@ static final class ShardLevelFieldsReader implements Releasable {
350353 private final BlockLoaderFactory blockFactory ;
351354 private final SegmentLevelFieldsReader [] segments ;
352355 private final BlockLoader [] loaders ;
356+ private final boolean [] dimensions ;
353357 private final Block .Builder [] builders ;
354358 private final StoredFieldsSpec storedFieldsSpec ;
355359 private final SourceLoader sourceLoader ;
@@ -377,10 +381,14 @@ static final class ShardLevelFieldsReader implements Releasable {
377381 sourceLoader = null ;
378382 }
379383 this .storedFieldsSpec = storedFieldsSpec ;
384+ this .dimensions = new boolean [fields .size ()];
385+ for (int i = 0 ; i < fields .size (); i ++) {
386+ dimensions [i ] = shardContext .fieldType (fields .get (i ).name ()).isDimension ();
387+ }
380388 }
381389
382- void readValues (int segment , int docID ) throws IOException {
383- segments [segment ].read (docID , builders );
390+ void readValues (int segment , int docID , boolean first ) throws IOException {
391+ segments [segment ].read (docID , builders , first , dimensions );
384392 }
385393
386394 void prepareForReading (int estimatedSize ) throws IOException {
@@ -396,9 +404,38 @@ void prepareForReading(int estimatedSize) throws IOException {
396404 }
397405 }
398406
399- Block [] buildBlocks () {
400- Block [] blocks = Block .Builder .buildAll (builders );
401- Arrays .fill (builders , null );
407+ Block [] buildBlocks (IntVector tsidOrdinals ) {
408+ final Block [] blocks = new Block [loaders .length ];
409+ try {
410+ for (int i = 0 ; i < builders .length ; i ++) {
411+ Block values = builders [i ].build ();
412+ if (dimensions [i ]) {
413+ try (values ) {
414+ if (values .asVector () instanceof BytesRefVector bytes ) {
415+ tsidOrdinals .incRef ();
416+ values .incRef ();
417+ blocks [i ] = new OrdinalBytesRefVector (tsidOrdinals , bytes ).asBlock ();
418+ } else {
419+ final int positionCount = tsidOrdinals .getPositionCount ();
420+ try (var newBuilder = values .elementType ().newBlockBuilder (positionCount , blockFactory .factory )) {
421+ for (int p = 0 ; p < positionCount ; p ++) {
422+ int pos = tsidOrdinals .getInt (p );
423+ newBuilder .copyFrom (values , pos , pos + 1 );
424+ }
425+ blocks [i ] = newBuilder .build ();
426+ }
427+ }
428+ }
429+ } else {
430+ blocks [i ] = values ;
431+ }
432+ }
433+ Arrays .fill (builders , null );
434+ } finally {
435+ if (blocks .length > 0 && blocks [blocks .length - 1 ] == null ) {
436+ Releasables .close (blocks );
437+ }
438+ }
402439 return blocks ;
403440 }
404441
@@ -435,10 +472,18 @@ private void reinitializeIfNeeded(SourceLoader sourceLoader, StoredFieldsSpec st
435472 }
436473 }
437474
438- void read (int docId , Block .Builder [] builder ) throws IOException {
475+ void read (int docId , Block .Builder [] builder , boolean first , boolean [] dimensions ) throws IOException {
439476 storedFields .advanceTo (docId );
440- for (int i = 0 ; i < rowStride .length ; i ++) {
441- rowStride [i ].read (docId , storedFields , builder [i ]);
477+ if (first ) {
478+ for (int i = 0 ; i < rowStride .length ; i ++) {
479+ rowStride [i ].read (docId , storedFields , builder [i ]);
480+ }
481+ } else {
482+ for (int i = 0 ; i < rowStride .length ; i ++) {
483+ if (dimensions [i ] == false ) {
484+ rowStride [i ].read (docId , storedFields , builder [i ]);
485+ }
486+ }
442487 }
443488 }
444489 }
@@ -480,9 +525,9 @@ public void close() {
480525 Releasables .close (dictBuilder , ordinalsBuilder );
481526 }
482527
483- BytesRefVector build () throws IOException {
528+ OrdinalBytesRefVector build () throws IOException {
484529 BytesRefVector dict = null ;
485- BytesRefVector result = null ;
530+ OrdinalBytesRefVector result = null ;
486531 IntVector ordinals = null ;
487532 try {
488533 dict = dictBuilder .build ();
0 commit comments