2121import it .unimi .dsi .fastutil .ints .IntArrayList ;
2222
2323import java .util .Arrays ;
24- import java .util .List ;
2524import java .util .Optional ;
2625
2726import static com .google .common .base .Preconditions .checkArgument ;
@@ -79,9 +78,25 @@ public void append(IntArrayList positions, ValueBlock block)
7978 }
8079 ensureCapacity (positions .size ());
8180 RowBlock sourceRowBlock = (RowBlock ) block ;
81+ int startOffset = sourceRowBlock .getOffsetBase ();
8282
83- for (int i = 0 ; i < fieldAppenders .length ; i ++) {
84- fieldAppenders [i ].append (positions , sourceRowBlock .getFieldBlock (i ));
83+ Block [] rawFieldBlocks = sourceRowBlock .getRawFieldBlocks ();
84+
85+ if (startOffset == 0 ) {
86+ for (int i = 0 ; i < fieldAppenders .length ; i ++) {
87+ fieldAppenders [i ].append (positions , rawFieldBlocks [i ]);
88+ }
89+ }
90+ else {
91+ int [] adjustedPositions = new int [positions .size ()];
92+ for (int i = 0 ; i < positions .size (); i ++) {
93+ adjustedPositions [i ] = startOffset + positions .getInt (i );
94+ }
95+ IntArrayList adjustedPositionsList = IntArrayList .wrap (adjustedPositions );
96+
97+ for (int i = 0 ; i < fieldAppenders .length ; i ++) {
98+ fieldAppenders [i ].append (adjustedPositionsList , rawFieldBlocks [i ]);
99+ }
85100 }
86101
87102 if (sourceRowBlock .mayHaveNull ()) {
@@ -108,9 +123,11 @@ public void appendRle(ValueBlock value, int rlePositionCount)
108123 ensureCapacity (rlePositionCount );
109124 RowBlock sourceRowBlock = (RowBlock ) value ;
110125
111- List <Block > fieldBlocks = sourceRowBlock .getFieldBlocks ();
126+ Block [] rawFieldBlocks = sourceRowBlock .getRawFieldBlocks ();
127+ int startOffset = sourceRowBlock .getOffsetBase ();
128+
112129 for (int i = 0 ; i < fieldAppenders .length ; i ++) {
113- fieldAppenders [i ].appendRle (fieldBlocks . get ( i ) .getSingleValueBlock (0 ), rlePositionCount );
130+ fieldAppenders [i ].appendRle (rawFieldBlocks [ i ] .getSingleValueBlock (startOffset ), rlePositionCount );
114131 }
115132
116133 if (sourceRowBlock .isNull (0 )) {
@@ -134,9 +151,11 @@ public void append(int position, ValueBlock value)
134151 ensureCapacity (1 );
135152 RowBlock sourceRowBlock = (RowBlock ) value ;
136153
137- List <Block > fieldBlocks = sourceRowBlock .getFieldBlocks ();
154+ Block [] rawFieldBlocks = sourceRowBlock .getRawFieldBlocks ();
155+ int startOffset = sourceRowBlock .getOffsetBase ();
156+
138157 for (int i = 0 ; i < fieldAppenders .length ; i ++) {
139- fieldAppenders [i ].append (position , fieldBlocks . get ( i ) );
158+ fieldAppenders [i ].append (startOffset + position , rawFieldBlocks [ i ] );
140159 }
141160
142161 if (sourceRowBlock .isNull (position )) {
0 commit comments