XieJiann commented on code in PR #24973:
URL: https://github.com/apache/doris/pull/24973#discussion_r1339579543


##########
fe/fe-core/src/main/java/org/apache/doris/nereids/stats/FilterEstimation.java:
##########
@@ -359,31 +364,55 @@ public Statistics visitNot(Not not, EstimationContext 
context) {
         if (context.statistics.isInputSlotsUnknown(not.getInputSlots())) {
             return handleUnknownCase(context);
         }
-        Statistics childStats = new FilterEstimation().estimate(not.child(), 
context.statistics);
+        Expression child = not.child();
+        Statistics childStats = child.accept(this, context);
         //if estimated rowCount is 0, adjust to 1 to make upper join reorder 
reasonable.
         double rowCount = Math.max(context.statistics.getRowCount() - 
childStats.getRowCount(), 1);
         StatisticsBuilder statisticsBuilder = new 
StatisticsBuilder(context.statistics).setRowCount(rowCount);
-        for (Entry<Expression, ColumnStatistic> entry : 
context.statistics.columnStatistics().entrySet()) {
-            Expression expr = entry.getKey();
-            ColumnStatistic originColStats = entry.getValue();
-            ColumnStatistic childColStats = 
childStats.findColumnStatistics(expr);
-            double originNonNullCount = Math.max(originColStats.count - 
originColStats.numNulls, 0);
-            double childNonNullCount = Math.max(childColStats.count - 
childColStats.numNulls, 0);
-            double supersetValuesPerDistinctValue = 
StatsMathUtil.divide(originNonNullCount, originColStats.ndv);
-            double subsetValuesPerDistinctValue = 
StatsMathUtil.divide(childNonNullCount, childColStats.ndv);
-            double ndv;
-            if (supersetValuesPerDistinctValue <= 
subsetValuesPerDistinctValue) {
-                ndv = Math.max(originColStats.ndv - childColStats.ndv, 0);
-            } else {
-                ndv = originColStats.ndv;
+        // update key col stats
+        for (Slot slot : not.child().getInputSlots()) {
+            ColumnStatistic originColStats = 
context.statistics.findColumnStatistics(slot);
+            ColumnStatistic childColStats = 
childStats.findColumnStatistics(slot);
+            if (context.isKeySlot(slot)) {
+                ColumnStatisticBuilder colBuilder = new 
ColumnStatisticBuilder(childColStats);
+                // update column stats for
+                // 1. not (A=B)
+                // 2. not A in (...)
+                // 3. not A is null
+                // 4. not A like XXX
+                colBuilder.setNumNulls(0);
+                Preconditions.checkArgument(
+                        child instanceof EqualTo
+                                || child instanceof InPredicate
+                                || child instanceof IsNull
+                                || child instanceof Like,
+                        "Not-predicate meet unexpected child: " + 
child.toSql());
+                if (child instanceof Like) {

Review Comment:
   use `Preconditions.checkArgument(
                           child instanceof EqualTo
                                   || child instanceof InPredicate
                                   || child instanceof IsNull
                                   || child instanceof Like,
                           "Not-predicate meet unexpected child: {} ", 
child.toSql())` to avoid construct string when condition is true;



-- 
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

Reply via email to