parquet-hadoop/src/main/java/org/apache/parquet/format/converter/ParquetMetadataConverter.java
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[] min = 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();
  }
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[] min = 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();
  }
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 [ ] min = 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 ( ) ; }
Visible for testing
Visible for testing