public TableStatistics(Estimate rowCount, Map<ColumnHandle, ColumnStatistics> columnStatistics) { this.rowCount = requireNonNull(rowCount, "rowCount can not be null"); if (!rowCount.isUnknown() && rowCount.getValue() < 0) { throw new IllegalArgumentException(format("rowCount must be greater than or equal to 0: %s", rowCount.getValue())); } this.columnStatistics = unmodifiableMap(requireNonNull(columnStatistics, "columnStatistics can not be null")); }
public ColumnStatistics( Estimate nullsFraction, Estimate distinctValuesCount, Estimate dataSize, Optional<DoubleRange> range) { this.nullsFraction = requireNonNull(nullsFraction, "nullsFraction is null"); if (!nullsFraction.isUnknown()) { if (nullsFraction.getValue() < 0 || nullsFraction.getValue() > 1) { throw new IllegalArgumentException(format("nullsFraction must be between 0 and 1: %s", nullsFraction.getValue())); } } this.distinctValuesCount = requireNonNull(distinctValuesCount, "distinctValuesCount is null"); if (!distinctValuesCount.isUnknown() && distinctValuesCount.getValue() < 0) { throw new IllegalArgumentException(format("distinctValuesCount must be greater than or equal to 0: %s", distinctValuesCount.getValue())); } this.dataSize = requireNonNull(dataSize, "dataSize is null"); if (!dataSize.isUnknown() && dataSize.getValue() < 0) { throw new IllegalArgumentException(format("dataSize must be greater than or equal to 0: %s", dataSize.getValue())); } this.range = requireNonNull(range, "range is null"); }
private static Expression createEstimateRepresentation(Estimate estimate) { if (estimate.isUnknown()) { return NULL_DOUBLE; } return new DoubleLiteral(Double.toString(estimate.getValue())); }
private Optional<Double> toOptional(Estimate estimate) { return estimate.isUnknown() ? Optional.empty() : Optional.of(estimate.getValue()); }
private Optional<Double> toOptional(Estimate estimate) { return estimate.isUnknown() ? Optional.empty() : Optional.of(estimate.getValue()); }
@Override protected Optional<PlanNodeStatsEstimate> doCalculate(TableScanNode node, StatsProvider sourceStats, Lookup lookup, Session session, TypeProvider types) { // TODO Construct predicate like AddExchanges's LayoutConstraintEvaluator Constraint<ColumnHandle> constraint = new Constraint<>(node.getCurrentConstraint()); TableStatistics tableStatistics = metadata.getTableStatistics(session, node.getTable(), constraint); Map<Symbol, SymbolStatsEstimate> outputSymbolStats = new HashMap<>(); for (Map.Entry<Symbol, ColumnHandle> entry : node.getAssignments().entrySet()) { Symbol symbol = entry.getKey(); Optional<ColumnStatistics> columnStatistics = Optional.ofNullable(tableStatistics.getColumnStatistics().get(entry.getValue())); outputSymbolStats.put(symbol, columnStatistics.map(statistics -> toSymbolStatistics(tableStatistics, statistics)).orElse(SymbolStatsEstimate.unknown())); } return Optional.of(PlanNodeStatsEstimate.builder() .setOutputRowCount(tableStatistics.getRowCount().getValue()) .addSymbolStatistics(outputSymbolStats) .build()); }
private SymbolStatsEstimate toSymbolStatistics(TableStatistics tableStatistics, ColumnStatistics columnStatistics) { double nullsFraction = columnStatistics.getNullsFraction().getValue(); double nonNullRowsCount = tableStatistics.getRowCount().getValue() * (1.0 - nullsFraction); double averageRowSize = nonNullRowsCount == 0 ? 0 : columnStatistics.getDataSize().getValue() / nonNullRowsCount; SymbolStatsEstimate.Builder result = SymbolStatsEstimate.builder(); result.setNullsFraction(nullsFraction); result.setDistinctValuesCount(columnStatistics.getDistinctValuesCount().getValue()); result.setAverageRowSize(averageRowSize); columnStatistics.getRange().ifPresent(range -> { result.setLowValue(range.getMin()); result.setHighValue(range.getMax()); }); return result.build(); } }
private void testTableStats(String schema, TpchTable<?> table, Constraint<ColumnHandle> constraint, double expectedRowCount) { TpchTableHandle tableHandle = tpchMetadata.getTableHandle(session, new SchemaTableName(schema, table.getTableName())); TableStatistics tableStatistics = tpchMetadata.getTableStatistics(session, tableHandle, constraint); double actualRowCountValue = tableStatistics.getRowCount().getValue(); assertEquals(tableStatistics.getRowCount(), Estimate.of(actualRowCountValue)); assertEquals(actualRowCountValue, expectedRowCount, expectedRowCount * TOLERANCE); }
public TableStatistics(Estimate rowCount, Map<ColumnHandle, ColumnStatistics> columnStatistics) { this.rowCount = requireNonNull(rowCount, "rowCount can not be null"); if (!rowCount.isUnknown() && rowCount.getValue() < 0) { throw new IllegalArgumentException(format("rowCount must be greater than or equal to 0: %s", rowCount.getValue())); } this.columnStatistics = unmodifiableMap(requireNonNull(columnStatistics, "columnStatistics can not be null")); }
public ColumnStatistics( Estimate nullsFraction, Estimate distinctValuesCount, Estimate dataSize, Optional<DoubleRange> range) { this.nullsFraction = requireNonNull(nullsFraction, "nullsFraction is null"); if (!nullsFraction.isUnknown()) { if (nullsFraction.getValue() < 0 || nullsFraction.getValue() > 1) { throw new IllegalArgumentException(format("nullsFraction must be between 0 and 1: %s", nullsFraction.getValue())); } } this.distinctValuesCount = requireNonNull(distinctValuesCount, "distinctValuesCount is null"); if (!distinctValuesCount.isUnknown() && distinctValuesCount.getValue() < 0) { throw new IllegalArgumentException(format("distinctValuesCount must be greater than or equal to 0: %s", distinctValuesCount.getValue())); } this.dataSize = requireNonNull(dataSize, "dataSize is null"); if (!dataSize.isUnknown() && dataSize.getValue() < 0) { throw new IllegalArgumentException(format("dataSize must be greater than or equal to 0: %s", dataSize.getValue())); } this.range = requireNonNull(range, "range is null"); }
private Optional<Double> toOptional(Estimate estimate) { return estimate.isUnknown() ? Optional.empty() : Optional.of(estimate.getValue()); }
private Optional<Double> toOptional(Estimate estimate) { return estimate.isUnknown() ? Optional.empty() : Optional.of(estimate.getValue()); }
private void testTableStats(String schema, TpchTable<?> table, Constraint<ColumnHandle> constraint, double expectedRowCount) { TpchTableHandle tableHandle = tpchMetadata.getTableHandle(session, new SchemaTableName(schema, table.getTableName())); TableStatistics tableStatistics = tpchMetadata.getTableStatistics(session, tableHandle, constraint); double actualRowCountValue = tableStatistics.getRowCount().getValue(); assertEquals(tableStatistics.getRowCount(), Estimate.of(actualRowCountValue)); assertEquals(actualRowCountValue, expectedRowCount, expectedRowCount * TOLERANCE); }