5454import java .util .Map ;
5555import java .util .Objects ;
5656import java .util .function .BiConsumer ;
57+ import java .util .function .IntPredicate ;
5758import java .util .stream .Collectors ;
5859import java .util .stream .IntStream ;
5960
@@ -115,7 +116,9 @@ public void markAsNeedToReport() {
115116 //////////////////////////// parse ////////////////////////////
116117
117118 protected void parse (final InsertRowNode insertRowNode ) {
118- final int originColumnSize = insertRowNode .getMeasurements ().length ;
119+ final String [] originColumnNameStringList = insertRowNode .getMeasurements ();
120+ final int originColumnSize =
121+ originColumnNameStringList == null ? 0 : originColumnNameStringList .length ;
119122 final Integer [] originColumnIndex2FilteredColumnIndexMapperList = new Integer [originColumnSize ];
120123
121124 // The full path is always cached when device path is deserialized
@@ -127,14 +130,25 @@ protected void parse(final InsertRowNode insertRowNode) {
127130 final List <Integer > rowIndexList = generateRowIndexList (originTimestampColumn );
128131 this .timestampColumn = rowIndexList .stream ().mapToLong (i -> originTimestampColumn [i ]).toArray ();
129132
133+ final MeasurementSchema [] originMeasurementSchemaList = insertRowNode .getMeasurementSchemas ();
134+ final TsTableColumnCategory [] originColumnCategories = insertRowNode .getColumnCategories ();
135+ final TSDataType [] originValueDataTypes = insertRowNode .getDataTypes ();
136+ final Object [] originValues = insertRowNode .getValues ();
137+
130138 generateColumnIndexMapper (
131- insertRowNode . getMeasurements () , originColumnIndex2FilteredColumnIndexMapperList );
139+ originColumnNameStringList , originColumnIndex2FilteredColumnIndexMapperList );
132140
133141 final int filteredColumnSize =
134- Arrays .stream (originColumnIndex2FilteredColumnIndexMapperList )
135- .filter (Objects ::nonNull )
136- .toArray ()
137- .length ;
142+ compactColumnIndexMapper (
143+ originColumnIndex2FilteredColumnIndexMapperList ,
144+ i ->
145+ isValidOriginColumn (
146+ originColumnNameStringList ,
147+ originMeasurementSchemaList ,
148+ originValueDataTypes ,
149+ i )
150+ && originValues != null
151+ && i < originValues .length );
138152
139153 this .measurementSchemaList = new MeasurementSchema [filteredColumnSize ];
140154 this .columnNameStringList = new String [filteredColumnSize ];
@@ -143,19 +157,15 @@ protected void parse(final InsertRowNode insertRowNode) {
143157 this .valueColumns = new Object [filteredColumnSize ];
144158 this .nullValueColumnBitmaps = new BitMap [filteredColumnSize ];
145159
146- final MeasurementSchema [] originMeasurementSchemaList = insertRowNode .getMeasurementSchemas ();
147- final String [] originColumnNameStringList = insertRowNode .getMeasurements ();
148- final TsTableColumnCategory [] originColumnCategories = insertRowNode .getColumnCategories ();
149- final TSDataType [] originValueDataTypes = insertRowNode .getDataTypes ();
150- final Object [] originValues = insertRowNode .getValues ();
151-
152160 for (int i = 0 ; i < originColumnIndex2FilteredColumnIndexMapperList .length ; i ++) {
153161 if (originColumnIndex2FilteredColumnIndexMapperList [i ] != null ) {
154162 final int filteredColumnIndex = originColumnIndex2FilteredColumnIndexMapperList [i ];
155163 this .measurementSchemaList [filteredColumnIndex ] = originMeasurementSchemaList [i ];
156164 this .columnNameStringList [filteredColumnIndex ] = originColumnNameStringList [i ];
157165 this .valueColumnTypes [filteredColumnIndex ] =
158- originColumnCategories != null && originColumnCategories [i ] != null
166+ originColumnCategories != null
167+ && i < originColumnCategories .length
168+ && originColumnCategories [i ] != null
159169 ? originColumnCategories [i ].toTsFileColumnType ()
160170 : ColumnCategory .FIELD ;
161171 this .valueColumnDataTypes [filteredColumnIndex ] = originValueDataTypes [i ];
@@ -190,7 +200,9 @@ protected void parse(final InsertRowNode insertRowNode) {
190200 }
191201
192202 protected void parse (final InsertTabletNode insertTabletNode ) throws IllegalPathException {
193- final int originColumnSize = insertTabletNode .getMeasurements ().length ;
203+ final String [] originColumnNameStringList = insertTabletNode .getMeasurements ();
204+ final int originColumnSize =
205+ originColumnNameStringList == null ? 0 : originColumnNameStringList .length ;
194206 final Integer [] originColumnIndex2FilteredColumnIndexMapperList = new Integer [originColumnSize ];
195207
196208 // The full path is always cached when device path is deserialized
@@ -202,14 +214,28 @@ protected void parse(final InsertTabletNode insertTabletNode) throws IllegalPath
202214 final List <Integer > rowIndexList = generateRowIndexList (originTimestampColumn );
203215 this .timestampColumn = rowIndexList .stream ().mapToLong (i -> originTimestampColumn [i ]).toArray ();
204216
217+ final MeasurementSchema [] originMeasurementSchemaList =
218+ insertTabletNode .getMeasurementSchemas ();
219+ final TsTableColumnCategory [] originColumnCategories = insertTabletNode .getColumnCategories ();
220+ final TSDataType [] originValueColumnDataTypes = insertTabletNode .getDataTypes ();
221+ final Object [] originValueColumns = insertTabletNode .getColumns ();
222+ final BitMap [] originBitMapList = insertTabletNode .getBitMaps ();
223+
205224 generateColumnIndexMapper (
206- insertTabletNode . getMeasurements () , originColumnIndex2FilteredColumnIndexMapperList );
225+ originColumnNameStringList , originColumnIndex2FilteredColumnIndexMapperList );
207226
208227 final int filteredColumnSize =
209- Arrays .stream (originColumnIndex2FilteredColumnIndexMapperList )
210- .filter (Objects ::nonNull )
211- .toArray ()
212- .length ;
228+ compactColumnIndexMapper (
229+ originColumnIndex2FilteredColumnIndexMapperList ,
230+ i ->
231+ isValidOriginColumn (
232+ originColumnNameStringList ,
233+ originMeasurementSchemaList ,
234+ originValueColumnDataTypes ,
235+ i )
236+ && originValueColumns != null
237+ && i < originValueColumns .length
238+ && originValueColumns [i ] != null );
213239
214240 this .measurementSchemaList = new MeasurementSchema [filteredColumnSize ];
215241 this .columnNameStringList = new String [filteredColumnSize ];
@@ -218,21 +244,15 @@ protected void parse(final InsertTabletNode insertTabletNode) throws IllegalPath
218244 this .valueColumns = new Object [filteredColumnSize ];
219245 this .nullValueColumnBitmaps = new BitMap [filteredColumnSize ];
220246
221- final MeasurementSchema [] originMeasurementSchemaList =
222- insertTabletNode .getMeasurementSchemas ();
223- final String [] originColumnNameStringList = insertTabletNode .getMeasurements ();
224- final TsTableColumnCategory [] originColumnCategories = insertTabletNode .getColumnCategories ();
225- final TSDataType [] originValueColumnDataTypes = insertTabletNode .getDataTypes ();
226- final Object [] originValueColumns = insertTabletNode .getColumns ();
227- final BitMap [] originBitMapList = insertTabletNode .getBitMaps ();
228-
229247 for (int i = 0 ; i < originColumnIndex2FilteredColumnIndexMapperList .length ; i ++) {
230248 if (originColumnIndex2FilteredColumnIndexMapperList [i ] != null ) {
231249 final int filteredColumnIndex = originColumnIndex2FilteredColumnIndexMapperList [i ];
232250 this .measurementSchemaList [filteredColumnIndex ] = originMeasurementSchemaList [i ];
233251 this .columnNameStringList [filteredColumnIndex ] = originColumnNameStringList [i ];
234252 this .valueColumnTypes [filteredColumnIndex ] =
235- originColumnCategories != null && originColumnCategories [i ] != null
253+ originColumnCategories != null
254+ && i < originColumnCategories .length
255+ && originColumnCategories [i ] != null
236256 ? originColumnCategories [i ].toTsFileColumnType ()
237257 : ColumnCategory .FIELD ;
238258 this .valueColumnDataTypes [filteredColumnIndex ] = originValueColumnDataTypes [i ];
@@ -298,10 +318,9 @@ protected void parse(final Tablet tablet, final boolean isAligned) {
298318 originMeasurementList , originColumnIndex2FilteredColumnIndexMapperList );
299319
300320 final int filteredColumnSize =
301- Arrays .stream (originColumnIndex2FilteredColumnIndexMapperList )
302- .filter (Objects ::nonNull )
303- .toArray ()
304- .length ;
321+ compactColumnIndexMapper (
322+ originColumnIndex2FilteredColumnIndexMapperList ,
323+ i -> isValidOriginColumn (originMeasurementSchemaList , i ));
305324
306325 this .measurementSchemaList = new MeasurementSchema [filteredColumnSize ];
307326 this .columnNameStringList = new String [filteredColumnSize ];
@@ -373,6 +392,46 @@ protected abstract void generateColumnIndexMapper(
373392 final String [] originMeasurementList ,
374393 final Integer [] originColumnIndex2FilteredColumnIndexMapperList );
375394
395+ private static int compactColumnIndexMapper (
396+ final Integer [] originColumnIndex2FilteredColumnIndexMapperList ,
397+ final IntPredicate columnValidator ) {
398+ int filteredCount = 0 ;
399+ for (int i = 0 ; i < originColumnIndex2FilteredColumnIndexMapperList .length ; i ++) {
400+ if (originColumnIndex2FilteredColumnIndexMapperList [i ] != null && columnValidator .test (i )) {
401+ originColumnIndex2FilteredColumnIndexMapperList [i ] = filteredCount ++;
402+ } else {
403+ originColumnIndex2FilteredColumnIndexMapperList [i ] = null ;
404+ }
405+ }
406+ return filteredCount ;
407+ }
408+
409+ private static boolean isValidOriginColumn (
410+ final String [] originColumnNameStringList ,
411+ final MeasurementSchema [] originMeasurementSchemaList ,
412+ final TSDataType [] originValueDataTypes ,
413+ final int index ) {
414+ return originColumnNameStringList != null
415+ && index < originColumnNameStringList .length
416+ && originColumnNameStringList [index ] != null
417+ && originMeasurementSchemaList != null
418+ && index < originMeasurementSchemaList .length
419+ && originMeasurementSchemaList [index ] != null
420+ && originMeasurementSchemaList [index ].getType () != null
421+ && originValueDataTypes != null
422+ && index < originValueDataTypes .length
423+ && originValueDataTypes [index ] != null ;
424+ }
425+
426+ private static boolean isValidOriginColumn (
427+ final List <IMeasurementSchema > originMeasurementSchemaList , final int index ) {
428+ return originMeasurementSchemaList != null
429+ && index < originMeasurementSchemaList .size ()
430+ && originMeasurementSchemaList .get (index ) != null
431+ && originMeasurementSchemaList .get (index ).getMeasurementName () != null
432+ && originMeasurementSchemaList .get (index ).getType () != null ;
433+ }
434+
376435 private List <Integer > generateRowIndexList (final long [] originTimestampColumn ) {
377436 final int rowCount = originTimestampColumn .length ;
378437 if (Objects .isNull (sourceEvent ) || !sourceEvent .shouldParseTime ()) {
0 commit comments