public StatisticRange statisticRange() { return new StatisticRange(lowValue, highValue, distinctValuesCount); }
public static StatisticRange empty() { return new StatisticRange(NaN, NaN, 0); }
private static StatisticRange openRange(double distinctValues) { return new StatisticRange(NEGATIVE_INFINITY, POSITIVE_INFINITY, distinctValues); } }
private static StatisticRange unboundedRange(double distinctValues) { return new StatisticRange(NEGATIVE_INFINITY, POSITIVE_INFINITY, distinctValues); }
private static StatisticRange range(double low, double high, double distinctValues) { return new StatisticRange(low, high, distinctValues); }
private static PlanNodeStatsEstimate estimateExpressionEqualToLiteral( PlanNodeStatsEstimate inputStatistics, SymbolStatsEstimate expressionStatistics, Optional<Symbol> expressionSymbol, OptionalDouble literalValue) { StatisticRange filterRange; if (literalValue.isPresent()) { filterRange = new StatisticRange(literalValue.getAsDouble(), literalValue.getAsDouble(), 1); } else { filterRange = new StatisticRange(NEGATIVE_INFINITY, POSITIVE_INFINITY, 1); } return estimateFilterRange(inputStatistics, expressionStatistics, expressionSymbol, filterRange); }
public StatisticRange intersect(StatisticRange other) { double newLow = max(low, other.low); double newHigh = min(high, other.high); if (newLow <= newHigh) { return new StatisticRange(newLow, newHigh, overlappingDistinctValues(other)); } return empty(); }
public StatisticRange addAndMaxDistinctValues(StatisticRange other) { double newDistinctValues = max(distinctValues, other.distinctValues); return new StatisticRange(minExcludeNaN(low, other.low), maxExcludeNaN(high, other.high), newDistinctValues); }
public StatisticRange addAndSumDistinctValues(StatisticRange other) { double newDistinctValues = distinctValues + other.distinctValues; return new StatisticRange(minExcludeNaN(low, other.low), maxExcludeNaN(high, other.high), newDistinctValues); }
private static PlanNodeStatsEstimate estimateExpressionLessThanLiteral( PlanNodeStatsEstimate inputStatistics, SymbolStatsEstimate expressionStatistics, Optional<Symbol> expressionSymbol, OptionalDouble literalValue) { StatisticRange filterRange = new StatisticRange(NEGATIVE_INFINITY, literalValue.orElse(POSITIVE_INFINITY), NaN); return estimateFilterRange(inputStatistics, expressionStatistics, expressionSymbol, filterRange); }
private static PlanNodeStatsEstimate estimateExpressionGreaterThanLiteral( PlanNodeStatsEstimate inputStatistics, SymbolStatsEstimate expressionStatistics, Optional<Symbol> expressionSymbol, OptionalDouble literalValue) { StatisticRange filterRange = new StatisticRange(literalValue.orElse(NEGATIVE_INFINITY), POSITIVE_INFINITY, NaN); return estimateFilterRange(inputStatistics, expressionStatistics, expressionSymbol, filterRange); }
public StatisticRange addAndCollapseDistinctValues(StatisticRange other) { double overlapPercentOfThis = this.overlapPercentWith(other); double overlapPercentOfOther = other.overlapPercentWith(this); double overlapDistinctValuesThis = overlapPercentOfThis * distinctValues; double overlapDistinctValuesOther = overlapPercentOfOther * other.distinctValues; double maxOverlappingValues = max(overlapDistinctValuesThis, overlapDistinctValuesOther); double newDistinctValues = maxOverlappingValues + (1 - overlapPercentOfThis) * distinctValues + (1 - overlapPercentOfOther) * other.distinctValues; return new StatisticRange(minExcludeNaN(low, other.low), maxExcludeNaN(high, other.high), newDistinctValues); }
public static StatisticRange from(SymbolStatsEstimate estimate) { return new StatisticRange(estimate.getLowValue(), estimate.getHighValue(), estimate.getDistinctValuesCount()); }
private static PlanNodeStatsEstimate estimateExpressionNotEqualToLiteral( PlanNodeStatsEstimate inputStatistics, SymbolStatsEstimate expressionStatistics, Optional<Symbol> expressionSymbol, OptionalDouble literalValue) { StatisticRange expressionRange = StatisticRange.from(expressionStatistics); StatisticRange filterRange; if (literalValue.isPresent()) { filterRange = new StatisticRange(literalValue.getAsDouble(), literalValue.getAsDouble(), 1); } else { filterRange = new StatisticRange(NEGATIVE_INFINITY, POSITIVE_INFINITY, 1); } StatisticRange intersectRange = expressionRange.intersect(filterRange); double filterFactor = 1 - expressionRange.overlapPercentWith(intersectRange); PlanNodeStatsEstimate.Builder estimate = PlanNodeStatsEstimate.buildFrom(inputStatistics); estimate.setOutputRowCount(filterFactor * (1 - expressionStatistics.getNullsFraction()) * inputStatistics.getOutputRowCount()); if (expressionSymbol.isPresent()) { SymbolStatsEstimate symbolNewEstimate = buildFrom(expressionStatistics) .setNullsFraction(0.0) .setDistinctValuesCount(max(expressionStatistics.getDistinctValuesCount() - 1, 0)) .build(); estimate = estimate.addSymbolStatistics(expressionSymbol.get(), symbolNewEstimate); } return estimate.build(); }
private static void assertSubtractRange(double supersetLow, double supersetHigh, double subsetLow, double subsetHigh, double expectedLow, double expectedHigh) { PlanNodeStatsEstimate first = statistics(30, NaN, NaN, new StatisticRange(supersetLow, supersetHigh, 10)); PlanNodeStatsEstimate second = statistics(20, NaN, NaN, new StatisticRange(subsetLow, subsetHigh, 5)); SymbolStatsEstimate statistics = subtractSubsetStats(first, second).getSymbolStatistics(SYMBOL); assertEquals(statistics.getLowValue(), expectedLow); assertEquals(statistics.getHighValue(), expectedHigh); }
@Test public void testAddRange() { PlanNodeStatsEstimate unknownRowCount = statistics(NaN, NaN, NaN, NON_EMPTY_RANGE); PlanNodeStatsEstimate emptyRange = statistics(10, NaN, NaN, StatisticRange.empty()); PlanNodeStatsEstimate unknownRange = statistics(10, NaN, NaN, openRange(NaN)); PlanNodeStatsEstimate first = statistics(10, NaN, NaN, new StatisticRange(12, 100, 2)); PlanNodeStatsEstimate second = statistics(10, NaN, NaN, new StatisticRange(101, 200, 3)); assertAddRange(unknownRange, unknownRange, NEGATIVE_INFINITY, POSITIVE_INFINITY); assertAddRange(unknownRowCount, second, NEGATIVE_INFINITY, POSITIVE_INFINITY); assertAddRange(unknownRange, second, NEGATIVE_INFINITY, POSITIVE_INFINITY); assertAddRange(emptyRange, second, 101, 200); assertAddRange(first, second, 12, 200); }
@Test public void testCapRange() { PlanNodeStatsEstimate emptyRange = statistics(10, NaN, NaN, StatisticRange.empty()); PlanNodeStatsEstimate openRange = statistics(10, NaN, NaN, openRange(NaN)); PlanNodeStatsEstimate first = statistics(10, NaN, NaN, new StatisticRange(12, 100, NaN)); PlanNodeStatsEstimate second = statistics(10, NaN, NaN, new StatisticRange(13, 99, NaN)); assertCapRange(emptyRange, emptyRange, NaN, NaN); assertCapRange(emptyRange, openRange, NaN, NaN); assertCapRange(openRange, emptyRange, NaN, NaN); assertCapRange(first, openRange, 12, 100); assertCapRange(openRange, second, 13, 99); assertCapRange(first, second, 13, 99); }