Jibing-Li commented on code in PR #41729: URL: https://github.com/apache/doris/pull/41729#discussion_r1808050542
########## fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java: ########## @@ -508,6 +520,125 @@ private Statistics computeOlapScan(OlapScan olapScan) { return builder.build(); } + private ColumnStatistic updateMinMaxForPartitionKey(OlapTable olapTable, + List<String> selectedPartitionNames, + SlotReference slot, ColumnStatistic cache) { + if (olapTable.getPartitionType() == PartitionType.LIST) { + cache = updateMinMaxForListPartitionKey(olapTable, selectedPartitionNames, slot, cache); + } else if (olapTable.getPartitionType() == PartitionType.RANGE) { + cache = updateMinMaxForTheFirstRangePartitionKey(olapTable, selectedPartitionNames, slot, cache); + } + return cache; + } + + private double convertLegacyLiteralToDouble(LiteralExpr literal) throws AnalysisException { + return StatisticsUtil.convertToDouble(literal.getType(), literal.getStringValue()); + } + + private ColumnStatistic updateMinMaxForListPartitionKey(OlapTable olapTable, + List<String> selectedPartitionNames, + SlotReference slot, ColumnStatistic cache) { + int partitionColumnIdx = olapTable.getPartitionColumns().indexOf(slot.getColumn().get()); + if (partitionColumnIdx != -1) { + try { + LiteralExpr minExpr = null; + LiteralExpr maxExpr = null; + double minValue = 0; + double maxValue = 0; + for (String selectedPartitionName : selectedPartitionNames) { + PartitionItem item = olapTable.getPartitionItemOrAnalysisException( + selectedPartitionName); + if (item instanceof ListPartitionItem) { + ListPartitionItem lp = (ListPartitionItem) item; + for (PartitionKey key : lp.getItems()) { + if (minExpr == null) { + minExpr = key.getKeys().get(partitionColumnIdx); + minValue = convertLegacyLiteralToDouble(minExpr); + maxExpr = key.getKeys().get(partitionColumnIdx); + maxValue = convertLegacyLiteralToDouble(maxExpr); + } else { + double current = convertLegacyLiteralToDouble(key.getKeys().get(partitionColumnIdx)); + if (current > maxValue) { + maxValue = current; + maxExpr = key.getKeys().get(partitionColumnIdx); + } else if (current < minValue) { Review Comment: Should we use `else`? What if there is only one value in the ListPartitionItem items? In this case, either minValue or maxValue would not be set. ########## fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java: ########## @@ -508,6 +520,125 @@ private Statistics computeOlapScan(OlapScan olapScan) { return builder.build(); } + private ColumnStatistic updateMinMaxForPartitionKey(OlapTable olapTable, + List<String> selectedPartitionNames, + SlotReference slot, ColumnStatistic cache) { + if (olapTable.getPartitionType() == PartitionType.LIST) { + cache = updateMinMaxForListPartitionKey(olapTable, selectedPartitionNames, slot, cache); + } else if (olapTable.getPartitionType() == PartitionType.RANGE) { + cache = updateMinMaxForTheFirstRangePartitionKey(olapTable, selectedPartitionNames, slot, cache); + } + return cache; + } + + private double convertLegacyLiteralToDouble(LiteralExpr literal) throws AnalysisException { + return StatisticsUtil.convertToDouble(literal.getType(), literal.getStringValue()); + } + + private ColumnStatistic updateMinMaxForListPartitionKey(OlapTable olapTable, + List<String> selectedPartitionNames, + SlotReference slot, ColumnStatistic cache) { + int partitionColumnIdx = olapTable.getPartitionColumns().indexOf(slot.getColumn().get()); + if (partitionColumnIdx != -1) { + try { + LiteralExpr minExpr = null; + LiteralExpr maxExpr = null; + double minValue = 0; + double maxValue = 0; Review Comment: Should we use Double.POSITIVE_INFINITY and Double.NEGATIVE_INFINITY as the initial values? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org