Skip to content

Commit

Permalink
use input column statistics for IF min/max statistics.
Browse files Browse the repository at this point in the history
Signed-off-by: m-selmi <[email protected]>
  • Loading branch information
m-selmi committed Feb 14, 2025
1 parent 77e0535 commit 20f9408
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -640,7 +640,11 @@ private ColumnStatistic multiaryExpressionCalculate(CallOperator callOperator,
case FunctionSet.IF:
distinctValues = childColumnStatisticList.get(1).getDistinctValuesCount() +
childColumnStatisticList.get(2).getDistinctValuesCount();
return new ColumnStatistic(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, 0,
double minValue = Math.min(childColumnStatisticList.get(1).getMinValue(),
childColumnStatisticList.get(2).getMinValue());
double maxValue = Math.max(childColumnStatisticList.get(1).getMaxValue(),
childColumnStatisticList.get(2).getMaxValue());
return new ColumnStatistic(minValue, maxValue, 0,
callOperator.getType().getTypeSize(), distinctValues);
// use child column statistics for now
case FunctionSet.SUBSTRING:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -632,4 +632,28 @@ public void testFromDays() {
Assert.assertEquals(columnStatistic.getMaxValue(), 2.534021856E11, 0.001);
Assert.assertEquals(columnStatistic.getMinValue(), -28800.0, 0.001);
}

@Test
public void testIF() {
ColumnRefOperator column = new ColumnRefOperator(1, Type.INT, "column", true);
BinaryPredicateOperator condition = new BinaryPredicateOperator(BinaryType.EQ, column, ConstantOperator.createInt(1));
ColumnRefOperator left = new ColumnRefOperator(0, Type.INT, "left", true);
ColumnRefOperator right = new ColumnRefOperator(1, Type.INT, "right", true);

ColumnStatistic columnStatistic = new ColumnStatistic(-300, 300, 0, 0, 300);
ColumnStatistic leftStatistic = new ColumnStatistic(-100, 100, 0, 0, 100);
ColumnStatistic rightStatistic = new ColumnStatistic(100, 200, 0, 0, 100);

Statistics.Builder builder = Statistics.builder();
builder.setOutputRowCount(300);
builder.addColumnStatistic(column, columnStatistic);
builder.addColumnStatistic(left, leftStatistic);
builder.addColumnStatistic(right, rightStatistic);

CallOperator callOperator = new CallOperator(FunctionSet.IF, Type.INT, Lists.newArrayList(condition, left, right));
ColumnStatistic ifStatistic = ExpressionStatisticCalculator.calculate(callOperator, builder.build());
Assert.assertEquals(ifStatistic.getDistinctValuesCount(), 200, 0.001);
Assert.assertEquals(ifStatistic.getMaxValue(), 200, 0.001);
Assert.assertEquals(ifStatistic.getMinValue(), -100, 0.001);
}
}

0 comments on commit 20f9408

Please sign in to comment.