korlov42 commented on a change in pull request #8869:
URL: https://github.com/apache/ignite/pull/8869#discussion_r595245404



##########
File path: 
modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/HashAggregateConverterRule.java
##########
@@ -26,29 +26,85 @@
 import org.apache.calcite.rel.logical.LogicalAggregate;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import 
org.apache.ignite.internal.processors.query.calcite.rel.IgniteConvention;
-import 
org.apache.ignite.internal.processors.query.calcite.rel.IgniteHashAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteMapHashAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteReduceHashAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteSingleHashAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions;
 
 /**
  *
  */
-public class HashAggregateConverterRule extends 
AbstractIgniteConverterRule<LogicalAggregate> {
+public class HashAggregateConverterRule {
     /** */
-    public static final RelOptRule INSTANCE = new HashAggregateConverterRule();
+    public static final RelOptRule SINGLE = new 
HashSingleAggregateConverterRule();
 
     /** */
-    public HashAggregateConverterRule() {
-        super(LogicalAggregate.class, "HashAggregateConverterRule");
+    public static final RelOptRule MAP_REDUCE = new 
HashMapReduceAggregateConverterRule();
+
+    /** */
+    private HashAggregateConverterRule() {
+        // No-op.
+    }
+
+    /** */
+    private static class HashSingleAggregateConverterRule extends 
AbstractIgniteConverterRule<LogicalAggregate> {
+        /** */
+        HashSingleAggregateConverterRule() {
+            super(LogicalAggregate.class, "HashSingleAggregateConverterRule");
+        }
+
+        /** {@inheritDoc} */
+        @Override protected PhysicalNode convert(RelOptPlanner planner, 
RelMetadataQuery mq,
+            LogicalAggregate agg) {
+            RelOptCluster cluster = agg.getCluster();
+            RelTraitSet inTrait = 
cluster.traitSetOf(IgniteConvention.INSTANCE).replace(IgniteDistributions.single());
+            RelTraitSet outTrait = 
cluster.traitSetOf(IgniteConvention.INSTANCE).replace(IgniteDistributions.single());
+            RelNode input = convert(agg.getInput(), inTrait);
+
+            return new IgniteSingleHashAggregate(
+                cluster,
+                outTrait,
+                convert(input, inTrait),
+                agg.getGroupSet(),
+                agg.getGroupSets(),
+                agg.getAggCallList()
+            );
+        }
     }
 
-    /** {@inheritDoc} */
-    @Override protected PhysicalNode convert(RelOptPlanner planner, 
RelMetadataQuery mq,
-        LogicalAggregate rel) {
-        RelOptCluster cluster = rel.getCluster();
-        RelTraitSet inTrait = cluster.traitSetOf(IgniteConvention.INSTANCE);
-        RelTraitSet outTrait = cluster.traitSetOf(IgniteConvention.INSTANCE);
-        RelNode input = convert(rel.getInput(), inTrait);
+    /** */
+    private static class HashMapReduceAggregateConverterRule extends 
AbstractIgniteConverterRule<LogicalAggregate> {
+        /** */
+        HashMapReduceAggregateConverterRule() {
+            super(LogicalAggregate.class, 
"HashMapReduceAggregateConverterRule");
+        }
+
+        /** {@inheritDoc} */
+        @Override protected PhysicalNode convert(RelOptPlanner planner, 
RelMetadataQuery mq,
+            LogicalAggregate agg) {
+            RelOptCluster cluster = agg.getCluster();
+            RelTraitSet inTrait = 
cluster.traitSetOf(IgniteConvention.INSTANCE);
+            RelTraitSet outTrait = 
cluster.traitSetOf(IgniteConvention.INSTANCE);
+            RelNode input = convert(agg.getInput(), inTrait);
+
+            RelNode map = new IgniteMapHashAggregate(
+                cluster,
+                outTrait,
+                convert(input, inTrait),

Review comment:
       input already converted

##########
File path: 
modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/AggregatePlannerTest.java
##########
@@ -223,42 +222,51 @@ public void mapReduceDistinctWithIndex() throws Exception 
{
     enum AggregateAlgorithm {
         /** */
         SORT(
-            IgniteSortAggregate.class,
+            IgniteSingleSortAggregate.class,
             IgniteMapSortAggregate.class,
             IgniteReduceSortAggregate.class,
-            "HashAggregateConverterRule"
+            new String[] {"HashSingleAggregateConverterRule", 
"HashMapReduceAggregateConverterRule"},
+            new String[] {"HashSingleAggregateConverterRule", 
"HashMapReduceAggregateConverterRule",
+                "SortSingleAggregateConverterRule"}
         ),
 
         /** */
         HASH(
-            IgniteHashAggregate.class,
+            IgniteSingleHashAggregate.class,
             IgniteMapHashAggregate.class,
             IgniteReduceHashAggregate.class,
-            "SortAggregateConverterRule"
+            new String[] {"SortSingleAggregateConverterRule", 
"SortMapReduceAggregateConverterRule"},
+            new String[] {"SortSingleAggregateConverterRule", 
"SortMapReduceAggregateConverterRule",
+                "HashSingleAggregateConverterRule"}
         );
 
         /** */
-        public final Class<? extends IgniteAggregateBase> single;
+        public final Class<? extends IgniteSingleAggregateBase> single;
 
         /** */
-        public final Class<? extends IgniteAggregate> map;
+        public final Class<? extends IgniteMapAggregateBase> map;
 
         /** */
         public final Class<? extends IgniteReduceAggregateBase> reduce;
 
         /** */
-        public final String ruleToDisable;
+        public final String[] rulesToDisableOtherAlgorithm;
+
+        /** */
+        public final String[] rulesToDisableOtherAlgorithmAndSingle;

Review comment:
       i'd rather provide two more values of enum (SORT_SINGLE and 
HASH_SINGLE), and leave only one collection with name `rulesToDisable`

##########
File path: 
modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/HashAggregateConverterRule.java
##########
@@ -26,29 +26,85 @@
 import org.apache.calcite.rel.logical.LogicalAggregate;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import 
org.apache.ignite.internal.processors.query.calcite.rel.IgniteConvention;
-import 
org.apache.ignite.internal.processors.query.calcite.rel.IgniteHashAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteMapHashAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteReduceHashAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteSingleHashAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions;
 
 /**
  *
  */
-public class HashAggregateConverterRule extends 
AbstractIgniteConverterRule<LogicalAggregate> {
+public class HashAggregateConverterRule {
     /** */
-    public static final RelOptRule INSTANCE = new HashAggregateConverterRule();
+    public static final RelOptRule SINGLE = new 
HashSingleAggregateConverterRule();
 
     /** */
-    public HashAggregateConverterRule() {
-        super(LogicalAggregate.class, "HashAggregateConverterRule");
+    public static final RelOptRule MAP_REDUCE = new 
HashMapReduceAggregateConverterRule();
+
+    /** */
+    private HashAggregateConverterRule() {
+        // No-op.
+    }
+
+    /** */
+    private static class HashSingleAggregateConverterRule extends 
AbstractIgniteConverterRule<LogicalAggregate> {
+        /** */
+        HashSingleAggregateConverterRule() {
+            super(LogicalAggregate.class, "HashSingleAggregateConverterRule");
+        }
+
+        /** {@inheritDoc} */
+        @Override protected PhysicalNode convert(RelOptPlanner planner, 
RelMetadataQuery mq,
+            LogicalAggregate agg) {
+            RelOptCluster cluster = agg.getCluster();
+            RelTraitSet inTrait = 
cluster.traitSetOf(IgniteConvention.INSTANCE).replace(IgniteDistributions.single());
+            RelTraitSet outTrait = 
cluster.traitSetOf(IgniteConvention.INSTANCE).replace(IgniteDistributions.single());
+            RelNode input = convert(agg.getInput(), inTrait);
+
+            return new IgniteSingleHashAggregate(
+                cluster,
+                outTrait,
+                convert(input, inTrait),
+                agg.getGroupSet(),
+                agg.getGroupSets(),
+                agg.getAggCallList()
+            );
+        }
     }
 
-    /** {@inheritDoc} */
-    @Override protected PhysicalNode convert(RelOptPlanner planner, 
RelMetadataQuery mq,
-        LogicalAggregate rel) {
-        RelOptCluster cluster = rel.getCluster();
-        RelTraitSet inTrait = cluster.traitSetOf(IgniteConvention.INSTANCE);
-        RelTraitSet outTrait = cluster.traitSetOf(IgniteConvention.INSTANCE);
-        RelNode input = convert(rel.getInput(), inTrait);
+    /** */
+    private static class HashMapReduceAggregateConverterRule extends 
AbstractIgniteConverterRule<LogicalAggregate> {
+        /** */
+        HashMapReduceAggregateConverterRule() {
+            super(LogicalAggregate.class, 
"HashMapReduceAggregateConverterRule");
+        }
+
+        /** {@inheritDoc} */
+        @Override protected PhysicalNode convert(RelOptPlanner planner, 
RelMetadataQuery mq,
+            LogicalAggregate agg) {
+            RelOptCluster cluster = agg.getCluster();
+            RelTraitSet inTrait = 
cluster.traitSetOf(IgniteConvention.INSTANCE);
+            RelTraitSet outTrait = 
cluster.traitSetOf(IgniteConvention.INSTANCE);
+            RelNode input = convert(agg.getInput(), inTrait);
+
+            RelNode map = new IgniteMapHashAggregate(
+                cluster,
+                outTrait,
+                convert(input, inTrait),
+                agg.getGroupSet(),
+                agg.getGroupSets(),
+                agg.getAggCallList()
+            );
 
-        return new IgniteHashAggregate(cluster, outTrait, input,
-            rel.getGroupSet(), rel.getGroupSets(), rel.getAggCallList());
+            return new IgniteReduceHashAggregate(
+                cluster,
+                outTrait.replace(IgniteDistributions.single()),
+                convert(map, inTrait.replace(IgniteDistributions.single())),

Review comment:
       please create `map` with a required traits and don't use `convert` here

##########
File path: 
modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/HashAggregateConverterRule.java
##########
@@ -26,29 +26,85 @@
 import org.apache.calcite.rel.logical.LogicalAggregate;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import 
org.apache.ignite.internal.processors.query.calcite.rel.IgniteConvention;
-import 
org.apache.ignite.internal.processors.query.calcite.rel.IgniteHashAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteMapHashAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteReduceHashAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteSingleHashAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions;
 
 /**
  *
  */
-public class HashAggregateConverterRule extends 
AbstractIgniteConverterRule<LogicalAggregate> {
+public class HashAggregateConverterRule {
     /** */
-    public static final RelOptRule INSTANCE = new HashAggregateConverterRule();
+    public static final RelOptRule SINGLE = new 
HashSingleAggregateConverterRule();
 
     /** */
-    public HashAggregateConverterRule() {
-        super(LogicalAggregate.class, "HashAggregateConverterRule");
+    public static final RelOptRule MAP_REDUCE = new 
HashMapReduceAggregateConverterRule();
+
+    /** */
+    private HashAggregateConverterRule() {
+        // No-op.
+    }
+
+    /** */
+    private static class HashSingleAggregateConverterRule extends 
AbstractIgniteConverterRule<LogicalAggregate> {
+        /** */
+        HashSingleAggregateConverterRule() {
+            super(LogicalAggregate.class, "HashSingleAggregateConverterRule");
+        }
+
+        /** {@inheritDoc} */
+        @Override protected PhysicalNode convert(RelOptPlanner planner, 
RelMetadataQuery mq,
+            LogicalAggregate agg) {
+            RelOptCluster cluster = agg.getCluster();
+            RelTraitSet inTrait = 
cluster.traitSetOf(IgniteConvention.INSTANCE).replace(IgniteDistributions.single());
+            RelTraitSet outTrait = 
cluster.traitSetOf(IgniteConvention.INSTANCE).replace(IgniteDistributions.single());
+            RelNode input = convert(agg.getInput(), inTrait);
+
+            return new IgniteSingleHashAggregate(
+                cluster,
+                outTrait,
+                convert(input, inTrait),

Review comment:
       input already converted 

##########
File path: 
modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/SortAggregateConverterRule.java
##########
@@ -29,40 +29,108 @@
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.util.ImmutableIntList;
 import 
org.apache.ignite.internal.processors.query.calcite.rel.IgniteConvention;
-import 
org.apache.ignite.internal.processors.query.calcite.rel.IgniteSortAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteMapSortAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteReduceSortAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteSingleSortAggregate;
+import 
org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions;
 import org.apache.ignite.internal.util.typedef.F;
 
-/** */
-public class SortAggregateConverterRule extends 
AbstractIgniteConverterRule<LogicalAggregate> {
+/**
+ *
+ */
+public class SortAggregateConverterRule {
+    /** */
+    public static final RelOptRule SINGLE = new 
SortSingleAggregateConverterRule();
+
+    /** */
+    public static final RelOptRule MAP_REDUCE = new 
SortMapReduceAggregateConverterRule();
+
     /** */
-    public static final RelOptRule INSTANCE = new SortAggregateConverterRule();
+    private SortAggregateConverterRule() {
+        // No-op.
+    }
 
     /** */
-    public SortAggregateConverterRule() {
-        super(LogicalAggregate.class, "SortAggregateConverterRule");
+    private static class SortSingleAggregateConverterRule extends 
AbstractIgniteConverterRule<LogicalAggregate> {
+        /** */
+        SortSingleAggregateConverterRule() {
+            super(LogicalAggregate.class, "SortSingleAggregateConverterRule");
+        }
+
+        /** {@inheritDoc} */
+        @Override protected PhysicalNode convert(RelOptPlanner planner, 
RelMetadataQuery mq,
+            LogicalAggregate agg) {
+            // Applicable only for GROUP BY
+            if (F.isEmpty(agg.getGroupSet()) || agg.getGroupSets().size() > 1)
+                return null;
+
+            RelOptCluster cluster = agg.getCluster();
+            RelNode input = agg.getInput();
+
+            RelCollation collation = 
RelCollations.of(ImmutableIntList.copyOf(agg.getGroupSet().asList()));
+
+            RelTraitSet inTrait = cluster.traitSetOf(IgniteConvention.INSTANCE)
+                .replace(collation)
+                .replace(IgniteDistributions.single());
+
+            RelTraitSet outTrait = 
cluster.traitSetOf(IgniteConvention.INSTANCE)
+                .replace(collation)
+                .replace(IgniteDistributions.single());
+
+            return new IgniteSingleSortAggregate(
+                cluster,
+                outTrait,
+                convert(input, inTrait),
+                agg.getGroupSet(),
+                agg.getGroupSets(),
+                agg.getAggCallList()
+            );
+        }
     }
 
-    /** {@inheritDoc} */
-    @Override protected PhysicalNode convert(RelOptPlanner planner, 
RelMetadataQuery mq,
-        LogicalAggregate rel) {
-        // Applicable only for GROUP BY
-        if (F.isEmpty(rel.getGroupSet()) || rel.getGroupSets().size() > 1)
-            return null;
-
-        RelOptCluster cluster = rel.getCluster();
-        RelTraitSet inTrait = cluster.traitSetOf(IgniteConvention.INSTANCE);
-        RelTraitSet outTrait = cluster.traitSetOf(IgniteConvention.INSTANCE);
-        RelNode input = rel.getInput();
-
-        RelCollation collation = 
RelCollations.of(ImmutableIntList.copyOf(rel.getGroupSet().asList()));
-
-        return new IgniteSortAggregate(
-            cluster,
-            outTrait.replace(collation),
-            convert(input, inTrait.replace(collation)),
-            rel.getGroupSet(),
-            rel.getGroupSets(),
-            rel.getAggCallList()
-        );
+    /** */
+    private static class SortMapReduceAggregateConverterRule extends 
AbstractIgniteConverterRule<LogicalAggregate> {
+        /** */
+        SortMapReduceAggregateConverterRule() {
+            super(LogicalAggregate.class, 
"SortMapReduceAggregateConverterRule");
+        }
+
+        /** {@inheritDoc} */
+        @Override protected PhysicalNode convert(RelOptPlanner planner, 
RelMetadataQuery mq,
+            LogicalAggregate agg) {
+            // Applicable only for GROUP BY
+            if (F.isEmpty(agg.getGroupSet()) || agg.getGroupSets().size() > 1)
+                return null;
+
+            RelOptCluster cluster = agg.getCluster();
+            RelNode input = agg.getInput();
+
+            RelCollation collation = 
RelCollations.of(ImmutableIntList.copyOf(agg.getGroupSet().asList()));
+
+            RelTraitSet inTrait = 
cluster.traitSetOf(IgniteConvention.INSTANCE).replace(collation);
+            RelTraitSet outTrait = 
cluster.traitSetOf(IgniteConvention.INSTANCE)
+                .replace(collation);
+
+            RelNode map = new IgniteMapSortAggregate(
+                cluster,
+                outTrait,
+                convert(input, inTrait),
+                agg.getGroupSet(),
+                agg.getGroupSets(),
+                agg.getAggCallList(),
+                collation
+            );
+
+            return new IgniteReduceSortAggregate(
+                cluster,
+                outTrait.replace(IgniteDistributions.single()),
+                convert(map, inTrait.replace(IgniteDistributions.single())),

Review comment:
       the same recommendation as for hash aggregate rule




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

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to