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(); }
@Test public void testAddAndSumDistinctValues() { assertEquals(unboundedRange(NaN).addAndSumDistinctValues(unboundedRange(NaN)), unboundedRange(NaN)); assertEquals(unboundedRange(NaN).addAndSumDistinctValues(unboundedRange(1)), unboundedRange(NaN)); assertEquals(unboundedRange(1).addAndSumDistinctValues(unboundedRange(NaN)), unboundedRange(NaN)); assertEquals(unboundedRange(1).addAndSumDistinctValues(unboundedRange(2)), unboundedRange(3)); assertEquals(StatisticRange.empty().addAndSumDistinctValues(StatisticRange.empty()), StatisticRange.empty()); assertEquals(range(0, 1, 1).addAndSumDistinctValues(StatisticRange.empty()), range(0, 1, 1)); assertEquals(range(0, 1, 1).addAndSumDistinctValues(range(1, 2, 1)), range(0, 2, 2)); }
@Test public void testAddAndMaxDistinctValues() { assertEquals(unboundedRange(NaN).addAndMaxDistinctValues(unboundedRange(NaN)), unboundedRange(NaN)); assertEquals(unboundedRange(NaN).addAndMaxDistinctValues(unboundedRange(1)), unboundedRange(NaN)); assertEquals(unboundedRange(1).addAndMaxDistinctValues(unboundedRange(NaN)), unboundedRange(NaN)); assertEquals(unboundedRange(1).addAndMaxDistinctValues(unboundedRange(2)), unboundedRange(2)); assertEquals(StatisticRange.empty().addAndMaxDistinctValues(StatisticRange.empty()), StatisticRange.empty()); assertEquals(range(0, 1, 1).addAndMaxDistinctValues(StatisticRange.empty()), range(0, 1, 1)); assertEquals(range(0, 1, 1).addAndMaxDistinctValues(range(1, 2, 1)), range(0, 2, 1)); }
@Test public void testAddAndCollapseDistinctValues() { assertEquals(unboundedRange(NaN).addAndCollapseDistinctValues(unboundedRange(NaN)), unboundedRange(NaN)); assertEquals(unboundedRange(NaN).addAndCollapseDistinctValues(unboundedRange(1)), unboundedRange(NaN)); assertEquals(unboundedRange(1).addAndCollapseDistinctValues(unboundedRange(NaN)), unboundedRange(NaN)); assertEquals(unboundedRange(1).addAndCollapseDistinctValues(unboundedRange(2)), unboundedRange(2)); assertEquals(StatisticRange.empty().addAndCollapseDistinctValues(StatisticRange.empty()), StatisticRange.empty()); assertEquals(range(0, 1, 1).addAndCollapseDistinctValues(StatisticRange.empty()), range(0, 1, 1)); assertEquals(range(0, 1, 1).addAndCollapseDistinctValues(range(1, 2, 1)), range(0, 2, 1)); assertEquals(range(0, 3, 3).addAndCollapseDistinctValues(range(2, 6, 4)), range(0, 6, 6)); }
@Test public void testAddRowCount() { PlanNodeStatsEstimate unknownStats = statistics(NaN, NaN, NaN, StatisticRange.empty()); PlanNodeStatsEstimate first = statistics(10, NaN, NaN, StatisticRange.empty()); PlanNodeStatsEstimate second = statistics(20, NaN, NaN, StatisticRange.empty()); assertEquals(addStatsAndSumDistinctValues(unknownStats, unknownStats), PlanNodeStatsEstimate.unknown()); assertEquals(addStatsAndSumDistinctValues(first, unknownStats), PlanNodeStatsEstimate.unknown()); assertEquals(addStatsAndSumDistinctValues(unknownStats, second), PlanNodeStatsEstimate.unknown()); assertEquals(addStatsAndSumDistinctValues(first, second).getOutputRowCount(), 30.0); }
@Test public void testSubtractRowCount() { PlanNodeStatsEstimate unknownStats = statistics(NaN, NaN, NaN, StatisticRange.empty()); PlanNodeStatsEstimate first = statistics(40, NaN, NaN, StatisticRange.empty()); PlanNodeStatsEstimate second = statistics(10, NaN, NaN, StatisticRange.empty()); assertEquals(subtractSubsetStats(unknownStats, unknownStats), PlanNodeStatsEstimate.unknown()); assertEquals(subtractSubsetStats(first, unknownStats), PlanNodeStatsEstimate.unknown()); assertEquals(subtractSubsetStats(unknownStats, second), PlanNodeStatsEstimate.unknown()); assertEquals(subtractSubsetStats(first, second).getOutputRowCount(), 30.0); }
@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); }
@Test public void testSumNumberOfDistinctValues() { 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, openRange(2)); PlanNodeStatsEstimate second = statistics(10, NaN, NaN, openRange(3)); assertSumNumberOfDistinctValues(unknownRowCount, unknownRowCount, NaN); assertSumNumberOfDistinctValues(unknownRowCount, second, NaN); assertSumNumberOfDistinctValues(first, emptyRange, 2); assertSumNumberOfDistinctValues(first, unknownRange, NaN); assertSumNumberOfDistinctValues(first, second, 5); }
@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 testMaxNumberOfDistinctValues() { 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, openRange(2)); PlanNodeStatsEstimate second = statistics(10, NaN, NaN, openRange(3)); assertMaxNumberOfDistinctValues(unknownRowCount, unknownRowCount, NaN); assertMaxNumberOfDistinctValues(unknownRowCount, second, NaN); assertMaxNumberOfDistinctValues(first, emptyRange, 2); assertMaxNumberOfDistinctValues(first, unknownRange, NaN); assertMaxNumberOfDistinctValues(first, second, 3); }
@Test public void testOverlapPercentWith() { StatisticRange zeroToTen = range(0, 10, 10); StatisticRange empty = StatisticRange.empty(); // Equal ranges assertOverlap(zeroToTen, range(0, 10, 5), 1); assertOverlap(zeroToTen, range(0, 10, 20), 1); assertOverlap(zeroToTen, range(0, 10, 20), 1); // Some overlap assertOverlap(zeroToTen, range(5, 3000, 3), 0.5); // Single value overlap assertOverlap(zeroToTen, range(3, 3, 1), 1 / zeroToTen.getDistinctValuesCount()); assertOverlap(zeroToTen, range(10, 100, 357), 1 / zeroToTen.getDistinctValuesCount()); // No overlap assertOverlap(zeroToTen, range(20, 30, 10), 0); // Empty ranges assertOverlap(zeroToTen, empty, 0); assertOverlap(empty, zeroToTen, 0); // no test for empty, empty) since any return value is correct assertOverlap(unboundedRange(10), empty, 0); // Unbounded (infinite), NDV-based assertOverlap(unboundedRange(10), unboundedRange(20), 1); assertOverlap(unboundedRange(20), unboundedRange(10), 0.5); assertOverlap(unboundedRange(0.1), unboundedRange(1), 1); assertOverlap(unboundedRange(0.0), unboundedRange(1), 0); assertOverlap(unboundedRange(0.0), unboundedRange(0), 0); }