You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2023/01/17 11:46:21 UTC

[ignite-3] 01/01: Add test.

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

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

commit a23aeb044148070b809f156774d852e6eff09cce
Author: amashenkov <an...@gmail.com>
AuthorDate: Tue Jan 17 14:46:12 2023 +0300

    Add test.
---
 .../sql/engine/AbstractBasicIntegrationTest.java   | 42 ++++++++++++++++++----
 .../internal/sql/engine/ItAggregatesTest.java      | 29 +++++++++++++++
 .../internal/sql/engine/util/QueryChecker.java     | 29 +++++++++++++--
 3 files changed, 92 insertions(+), 8 deletions(-)

diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/AbstractBasicIntegrationTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/AbstractBasicIntegrationTest.java
index 6696801757..788f78ce2d 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/AbstractBasicIntegrationTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/AbstractBasicIntegrationTest.java
@@ -31,14 +31,11 @@ import static org.junit.jupiter.api.Assertions.assertSame;
 
 import java.nio.file.Path;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
 import java.util.stream.IntStream;
-import java.util.stream.Stream;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.internal.app.IgniteImpl;
@@ -244,9 +241,22 @@ public class AbstractBasicIntegrationTest extends BaseIgniteAbstractTest {
      * @param rules Additional rules need to be disabled.
      */
     static QueryChecker assertQuery(String qry, JoinType joinType, String... rules) {
-        return AbstractBasicIntegrationTest.assertQuery(qry.replaceAll("(?i)^select", "select "
-                + Stream.concat(Arrays.stream(joinType.disabledRules), Arrays.stream(rules))
-                .collect(Collectors.joining("','", "/*+ DISABLE_RULE('", "') */"))));
+        return assertQuery(qry)
+                .disableRules(joinType.disabledRules)
+                .disableRules(rules);
+    }
+
+    /**
+     * Used for join checks, disables other join rules for executing exact join algo.
+     *
+     * @param qry Query for check.
+     * @param aggregateType Type of aggregate algo.
+     * @param rules Additional rules need to be disabled.
+     */
+    static QueryChecker assertQuery(String qry, AggregateType aggregateType, String... rules) {
+        return assertQuery(qry)
+                .disableRules(aggregateType.disabledRules)
+                .disableRules(rules);
     }
 
     /**
@@ -289,6 +299,26 @@ public class AbstractBasicIntegrationTest extends BaseIgniteAbstractTest {
         }
     }
 
+    enum AggregateType {
+        SORT(
+                "ColocatedHashAggregateConverterRule",
+                "MapReduceHashAggregateConverterRule",
+                "ColocatedSortAggregateConverterRule"
+        ),
+
+        HASH(
+                "ColocatedSortAggregateConverterRule",
+                "MapReduceSortAggregateConverterRule",
+                "ColocatedHashAggregateConverterRule"
+        );
+
+        private final String[] disabledRules;
+
+        AggregateType(String... disabledRules) {
+            this.disabledRules = disabledRules;
+        }
+    }
+
     protected static void createAndPopulateTable() {
         createTable(DEFAULT_TABLE_NAME, 1, 8);
 
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItAggregatesTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItAggregatesTest.java
index 656467fe55..476741c487 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItAggregatesTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItAggregatesTest.java
@@ -216,4 +216,33 @@ public class ItAggregatesTest extends AbstractBasicIntegrationTest {
                 .returns("val1", 50L)
                 .check();
     }
+
+    @Test
+    public void distinctAggregateWithoutAggregateFunction() {
+        var sql = "select distinct name from person";
+
+        assertQuery(sql)
+                .matches(QueryChecker.matches(".*Colocated.*Aggregate.*Exchange.*"))
+                .returns("Igor")
+                .returns("Ilya")
+                .returns("Roma")
+                .returns(null)
+                .check();
+
+        assertQuery(sql, AggregateType.HASH)
+                .matches(QueryChecker.matches(".*ReduceHashAggregate.*Exchange.*MapHashAggregate.*"))
+                .returns("Igor")
+                .returns("Ilya")
+                .returns("Roma")
+                .returns(null)
+                .check();
+
+        assertQuery(sql, AggregateType.SORT)
+                .matches(QueryChecker.matches(".*ReduceSortAggregate.*Exchange.*MapSortAggregate.*"))
+                .returns("Igor")
+                .returns("Ilya")
+                .returns("Roma")
+                .returns(null)
+                .check();
+    }
 }
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/util/QueryChecker.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/util/QueryChecker.java
index a1b0d50c6f..6dbdf90b88 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/util/QueryChecker.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/util/QueryChecker.java
@@ -233,10 +233,12 @@ public abstract class QueryChecker {
         );
     }
 
-    private final String qry;
+    private final String originalQuery;
 
     private final ArrayList<Matcher<String>> planMatchers = new ArrayList<>();
 
+    private final ArrayList<String> disabledRules = new ArrayList<>();
+
     private List<List<?>> expectedResult;
 
     private List<String> expectedColumnNames;
@@ -257,7 +259,7 @@ public abstract class QueryChecker {
      * @param qry Query.
      */
     public QueryChecker(String qry) {
-        this.qry = qry;
+        this.originalQuery = qry;
     }
 
     /**
@@ -287,6 +289,20 @@ public abstract class QueryChecker {
         return this;
     }
 
+    /**
+     * Disables rules.
+     *
+     * @param rules Rules to disable.
+     * @return This.
+     */
+    public QueryChecker disableRules(String... rules) {
+        if (rules != null) {
+            Arrays.stream(rules).filter(Objects::nonNull).forEach(disabledRules::add);
+        }
+
+        return this;
+    }
+
     /**
      * This method add the given row to the list of expected, the order of enumeration does not matter unless {@link #ordered()} is set.
      *
@@ -370,6 +386,15 @@ public abstract class QueryChecker {
         // Check plan.
         QueryProcessor qryProc = getEngine();
 
+        String qry = originalQuery;
+
+        if (!disabledRules.isEmpty()) {
+            assert qry.matches("(?i)^select .*") : "SELECT query was expected: " + originalQuery;
+
+            qry = qry.replaceAll("(?i)^select", "select "
+                    + disabledRules.stream().collect(Collectors.joining("','", "/*+ DISABLE_RULE('", "') */")));
+        }
+
         var explainCursors = qryProc.queryAsync("PUBLIC", "EXPLAIN PLAN FOR " + qry, params);
 
         var explainCursor = explainCursors.get(0).join();