plugins/transforms/selectvalues/src/main/java/org/apache/hop/pipeline/transforms/selectvalues/SelectValues.java
private synchronized Object[] removeValues( IRowMeta rowMeta, Object[] rowData ) {
    if ( data.firstdeselect ) {
      data.firstdeselect = false;

      data.removenrs = new int[ meta.getDeleteName().length ];
      for ( int i = 0; i < data.removenrs.length; i++ ) {
        data.removenrs[ i ] = rowMeta.indexOfValue( meta.getDeleteName()[ i ] );
        if ( data.removenrs[ i ] < 0 ) {
          logError( BaseMessages.getString( PKG, "SelectValues.Log.CouldNotFindField", meta.getDeleteName()[ i ] ) );
          setErrors( 1 );
          stopAll();
          return null;
        }
      }

      // Check for doubles in the selected fields...
      int[] cnt = new int[ meta.getDeleteName().length ];
      for ( int i = 0; i < meta.getDeleteName().length; i++ ) {
        cnt[ i ] = 0;
        for ( int j = 0; j < meta.getDeleteName().length; j++ ) {
          if ( meta.getDeleteName()[ i ].equals( meta.getDeleteName()[ j ] ) ) {
            cnt[ i ]++;
          }

          if ( cnt[ i ] > 1 ) {
            logError( BaseMessages.getString( PKG, "SelectValues.Log.FieldCouldNotSpecifiedMoreThanTwice2",
              meta.getDeleteName()[ i ] ) );
            setErrors( 1 );
            stopAll();
            return null;
          }
        }
      }

      // Sort removenrs descending. So that we can delete in ascending order...
      Arrays.sort( data.removenrs );
    }

    /*
     * Remove the field values Take into account that field indexes change once you remove them!!! Therefore removenrs
     * is sorted in reverse on index...
     */
    return RowDataUtil.removeItems( rowData, data.removenrs );
  }
/**
   * Remove the values that are no longer needed.
   * <p/>
   *
   * @param rowMeta The row metadata to change
   * @param rowData the row data to change
   * @return true if everything went well, false if we need to stop because of an error!
   */
Remove the values that are no longer needed.

@param rowMeta The row metadata to change
@param rowData the row data to change
@return true if everything went well, false if we need to stop because of an error!
Remove the values that are no longer needed . @param rowMeta The row metadata to change @param rowData the row data to change @return true if everything went well false if we need to stop because of an error!
private synchronized Object[] removeValues( IRowMeta rowMeta, Object[] rowData ) {
    if ( data.firstdeselect ) {
      data.firstdeselect = false;
      data.removenrs = new int[ meta.getDeleteName().length ];
      for ( int i = 0; i < data.removenrs.length; i++ ) {
        data.removenrs[ i ] = rowMeta.indexOfValue( meta.getDeleteName()[ i ] );
        if ( data.removenrs[ i ] < 0 ) {
          logError( BaseMessages.getString( PKG, "SelectValues.Log.CouldNotFindField", meta.getDeleteName()[ i ] ) );
          setErrors( 1 );
          stopAll();
          return null;
        }
      }
      int[] cnt = new int[ meta.getDeleteName().length ];
      for ( int i = 0; i < meta.getDeleteName().length; i++ ) {
        cnt[ i ] = 0;
        for ( int j = 0; j < meta.getDeleteName().length; j++ ) {
          if ( meta.getDeleteName()[ i ].equals( meta.getDeleteName()[ j ] ) ) {
            cnt[ i ]++;
          }
          if ( cnt[ i ] > 1 ) {
            logError( BaseMessages.getString( PKG, "SelectValues.Log.FieldCouldNotSpecifiedMoreThanTwice2",
              meta.getDeleteName()[ i ] ) );
            setErrors( 1 );
            stopAll();
            return null;
          }
        }
      }
      Arrays.sort( data.removenrs );
    }
    /*
     * Remove the field values Take into account that field indexes change once you remove them!!! Therefore removenrs
     * is sorted in reverse on index...
     */
    return RowDataUtil.removeItems( rowData, data.removenrs );
  }
private synchronized Object [ ] removeValues ( IRowMeta rowMeta , Object [ ] rowData ) { if ( data . firstdeselect ) { data . firstdeselect = false ; data . removenrs = new int [ meta . getDeleteName ( ) . length ] ; for ( int i = 0 ; i < data . removenrs . length ; i ++ ) { data . removenrs [ i ] = rowMeta . indexOfValue ( meta . getDeleteName ( ) [ i ] ) ; if ( data . removenrs [ i ] < 0 ) { logError ( BaseMessages . getString ( PKG , "SelectValues.Log.CouldNotFindField" , meta . getDeleteName ( ) [ i ] ) ) ; setErrors ( 1 ) ; stopAll ( ) ; return null ; } } int [ ] cnt = new int [ meta . getDeleteName ( ) . length ] ; for ( int i = 0 ; i < meta . getDeleteName ( ) . length ; i ++ ) { cnt [ i ] = 0 ; for ( int j = 0 ; j < meta . getDeleteName ( ) . length ; j ++ ) { if ( meta . getDeleteName ( ) [ i ] . equals ( meta . getDeleteName ( ) [ j ] ) ) { cnt [ i ] ++ ; } if ( cnt [ i ] > 1 ) { logError ( BaseMessages . getString ( PKG , "SelectValues.Log.FieldCouldNotSpecifiedMoreThanTwice2" , meta . getDeleteName ( ) [ i ] ) ) ; setErrors ( 1 ) ; stopAll ( ) ; return null ; } } } Arrays . sort ( data . removenrs ) ; } /*
     * Remove the field values Take into account that field indexes change once you remove them!!! Therefore removenrs
     * is sorted in reverse on index...
     */ return RowDataUtil . removeItems ( rowData , data . removenrs ) ; }
Remove the values that are no longer needed.
Remove the values that are no longer needed .
// Check for doubles in the selected fields... // Sort removenrs descending. So that we can delete in ascending order...