This is an automated email from the ASF dual-hosted git repository.

amashenkov pushed a commit to branch ignite-21580
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit f49027b304c5e453857f0eaceccfecd28ce0d6a0
Author: amashenkov <andrey.mashen...@gmail.com>
AuthorDate: Fri Mar 29 19:23:37 2024 +0300

    Fix distinct row count calculation.
---
 .../engine/metadata/IgniteMdDistinctRowCount.java  | 27 +++++++++++++++++-----
 .../internal/sql/engine/rel/IgniteAggregate.java   |  8 ++++---
 2 files changed, 26 insertions(+), 9 deletions(-)

diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/IgniteMdDistinctRowCount.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/IgniteMdDistinctRowCount.java
index 9530ee5059..6b1cce64c2 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/IgniteMdDistinctRowCount.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/IgniteMdDistinctRowCount.java
@@ -17,7 +17,10 @@
 
 package org.apache.ignite.internal.sql.engine.metadata;
 
+import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.volcano.RelSubset;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.metadata.CyclicMetadataException;
 import org.apache.calcite.rel.metadata.ReflectiveRelMetadataProvider;
 import org.apache.calcite.rel.metadata.RelMdDistinctRowCount;
 import org.apache.calcite.rel.metadata.RelMetadataProvider;
@@ -25,6 +28,7 @@ import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableBitSet;
+import org.apache.calcite.util.NumberUtil;
 
 /**
  * IgniteMdDistinctRowCount.
@@ -44,14 +48,25 @@ public class IgniteMdDistinctRowCount extends 
RelMdDistinctRowCount {
             ImmutableBitSet groupKey,
             RexNode predicate
     ) {
-        if (groupKey.cardinality() == 0) {
-            return 1d;
+        RelNode best = rel.getBest();
+        if (best != null) {
+            return mq.getDistinctRowCount(best, groupKey, predicate);
         }
 
-        double rowCount = mq.getRowCount(rel);
-
-        rowCount *= 1.0 - Math.pow(.5, groupKey.cardinality());
+        if (rel.getConvention() == Convention.NONE) {
+            return null;
+        }
 
-        return rowCount;
+        Double d = null;
+        for (RelNode r2 : rel.getRels()) {
+            try {
+                Double d2 = mq.getDistinctRowCount(r2, groupKey, predicate);
+                d = NumberUtil.min(d, d2);
+            } catch (CyclicMetadataException e) {
+                // Ignore this relational expression; there will be non-cyclic 
ones
+                // in this set.
+            }
+        }
+        return d;
     }
 }
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteAggregate.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteAggregate.java
index 484ad1f0c8..78a0a3d67b 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteAggregate.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteAggregate.java
@@ -81,11 +81,13 @@ public abstract class IgniteAggregate extends Aggregate 
implements IgniteRel {
 
             for (AggregateCall aggCall : aggCalls) {
                 if (aggCall.isDistinct()) {
-                    Double distinctRowCount = 
mq.getDistinctRowCount(getInput(), ImmutableBitSet.of(aggCall.getArgList()), 
null);
+                    ImmutableBitSet aggGroup = 
ImmutableBitSet.of(aggCall.getArgList());
+                    Double distinctRowCount = 
mq.getDistinctRowCount(getInput(), aggGroup, null);
 
-                    double rows = distinctRowCount == null ? 
input.estimateRowCount(mq) : distinctRowCount;
+                    double distinctRows = distinctRowCount != null ? 
distinctRowCount
+                            : mq.getRowCount(getInput()) * (1 - Math.pow(0.5, 
aggGroup.cardinality()));
 
-                    mem += IgniteCost.AGG_CALL_MEM_COST * rows / grps;
+                    mem += IgniteCost.AGG_CALL_MEM_COST * distinctRows / grps;
                 } else {
                     mem += IgniteCost.AGG_CALL_MEM_COST;
                 }

Reply via email to