nl_tokens: Visible for testing
pl_tokens: static org . apache . parquet . column . statistics . Statistics fromParquetStatisticsInternal ( String createdBy , Statistics formatStats , PrimitiveType type , SortOrder typeSortOrder ) { // create stats object based on the column type org . apache . parquet . column . statistics . Statistics . Builder statsBuilder = org . apache . parquet . column . statistics . Statistics . getBuilderForReading ( type ) ; if ( formatStats != null ) { // Use the new V2 min-max statistics over the former one if it is filled if ( formatStats . isSetMin_value ( ) && formatStats . isSetMax_value ( ) ) { byte [ ] <mask> = formatStats . min_value . array ( ) ; byte [ ] max = formatStats . max_value . array ( ) ; if ( isMinMaxStatsSupported ( type ) || Arrays . equals ( min , max ) ) { statsBuilder . withMin ( min ) ; statsBuilder . withMax ( max ) ; } } else { boolean isSet = formatStats . isSetMax ( ) && formatStats . isSetMin ( ) ; boolean maxEqualsMin = isSet ? Arrays . equals ( formatStats . getMin ( ) , formatStats . getMax ( ) ) : false ; boolean sortOrdersMatch = SortOrder . SIGNED == typeSortOrder ; // NOTE: See docs in CorruptStatistics for explanation of why this check is needed // The sort order is checked to avoid returning min/max stats that are not // valid with the type's sort order. In previous releases, all stats were // aggregated using a signed byte-wise ordering, which isn't valid for all the // types (e.g. strings, decimals etc.). if ( ! CorruptStatistics . shouldIgnoreStatistics ( createdBy , type . getPrimitiveTypeName ( ) ) && ( sortOrdersMatch || maxEqualsMin ) ) { if ( isSet ) { statsBuilder . withMin ( formatStats . min . array ( ) ) ; statsBuilder . withMax ( formatStats . max . array ( ) ) ; } } } if ( formatStats . isSetNull_count ( ) ) { statsBuilder . withNumNulls ( formatStats . null_count ) ; } } return statsBuilder . build ( ) ; }