You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by tl...@apache.org on 2021/10/04 07:30:40 UTC

[ignite-3] branch main updated: IGNITE-15668 Commented code without ticket link in ignite-calcite (#371)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new a970223  IGNITE-15668 Commented code without ticket link in ignite-calcite (#371)
a970223 is described below

commit a9702234d3a535d537f55853e8062d6a833cc5b6
Author: korlov42 <ko...@gridgain.com>
AuthorDate: Mon Oct 4 10:30:37 2021 +0300

    IGNITE-15668 Commented code without ticket link in ignite-calcite (#371)
---
 .../calcite/AbstractBasicIntegrationTest.java      |  10 --
 .../ignite/internal/calcite/ITFunctionsTest.java   | 127 ++++++++++++---------
 .../ignite/internal/calcite/ITMetadataTest.java    |   9 ++
 .../internal/calcite/ITMixedQueriesTest.java       |  26 -----
 .../ignite/internal/calcite/util/QueryChecker.java |  38 ++++--
 5 files changed, 112 insertions(+), 98 deletions(-)

diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/AbstractBasicIntegrationTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/AbstractBasicIntegrationTest.java
index 69008a4..75fb4d2 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/AbstractBasicIntegrationTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/AbstractBasicIntegrationTest.java
@@ -126,16 +126,6 @@ public class AbstractBasicIntegrationTest {
             LOG.info("End tearDown()");
     }
 
-//    /** */
-//    protected void cleanQueryPlanCache() {
-//        for (Ignite ign : G.allGrids()) {
-//            CalciteQueryProcessor qryProc = (CalciteQueryProcessor)Commons.lookupComponent(
-//                ((IgniteEx)ign).context(), QueryEngine.class);
-//
-//            qryProc.queryPlanCache().clear();
-//        }
-//    }
-
     /** */
     protected QueryChecker assertQuery(String qry) {
         return new QueryChecker(qry) {
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/ITFunctionsTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/ITFunctionsTest.java
index 125b28d..b7c7af7 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/ITFunctionsTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/ITFunctionsTest.java
@@ -23,7 +23,13 @@ import java.sql.Timestamp;
 import java.util.List;
 import java.util.function.LongFunction;
 
+import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
 import org.apache.ignite.lang.IgniteInternalException;
+import org.apache.ignite.schema.SchemaBuilders;
+import org.apache.ignite.schema.definition.ColumnType;
+import org.apache.ignite.schema.definition.TableDefinition;
+import org.apache.ignite.table.RecordView;
+import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
@@ -121,61 +127,72 @@ public class ITFunctionsTest extends AbstractBasicIntegrationTest {
         assertEquals("Increment can't be 0", ex.getMessage());
     }
 
-//    /**
-//     * Important! Don`t change query call sequence in this test. This also tests correctness of
-//     * {@link org.apache.ignite.internal.processors.query.calcite.exec.exp.ExpressionFactoryImpl#SCALAR_CACHE} usage.
-//     */
-//    @Test
-//    public void testRangeWithCache() throws Exception {
-//        IgniteCache<Integer, Integer> cache = grid(0).getOrCreateCache(
-//            new CacheConfiguration<Integer, Integer>("test")
-//                .setBackups(1)
-//                .setIndexedTypes(Integer.class, Integer.class)
-//        );
-//
-//        for (int i = 0; i < 100; i++)
-//            cache.put(i, i);
-//
-//        awaitPartitionMapExchange();
-//
-//        // Correlated INNER join.
-//        assertQuery("SELECT t._val FROM \"test\".Integer t WHERE t._val < 5 AND " +
-//            "t._key in (SELECT x FROM table(system_range(t._val, t._val))) ")
-//            .returns(0)
-//            .returns(1)
-//            .returns(2)
-//            .returns(3)
-//            .returns(4)
-//            .check();
-//
-//        // Correlated LEFT joins.
-//        assertQuery("SELECT t._val FROM \"test\".Integer t WHERE t._val < 5 AND " +
-//            "EXISTS (SELECT x FROM table(system_range(t._val, t._val)) WHERE mod(x, 2) = 0) ")
-//            .returns(0)
-//            .returns(2)
-//            .returns(4)
-//            .check();
-//
-//        assertQuery("SELECT t._val FROM \"test\".Integer t WHERE t._val < 5 AND " +
-//            "NOT EXISTS (SELECT x FROM table(system_range(t._val, t._val)) WHERE mod(x, 2) = 0) ")
-//            .returns(1)
-//            .returns(3)
-//            .check();
-//
-//        assertEquals(0, qryEngine.query(null, "PUBLIC",
-//            "SELECT t._val FROM \"test\".Integer t WHERE " +
-//                "EXISTS (SELECT x FROM table(system_range(t._val, null))) ").get(0).getAll().size());
-//
-//        // Non-correlated join.
-//        assertQuery("SELECT t._val FROM \"test\".Integer t JOIN table(system_range(1, 50)) as r ON t._key = r.x " +
-//            "WHERE mod(r.x, 10) = 0")
-//            .returns(10)
-//            .returns(20)
-//            .returns(30)
-//            .returns(40)
-//            .returns(50)
-//            .check();
-//    }
+    /** */
+    @Test
+    public void testRangeWithCache() {
+        TableDefinition tblDef = SchemaBuilders.tableBuilder("PUBLIC", "TEST")
+            .columns(
+                SchemaBuilders.column("ID", ColumnType.INT32).asNonNull().build(),
+                SchemaBuilders.column("VAL", ColumnType.INT32).asNonNull().build()
+            )
+            .withPrimaryKey("ID")
+            .build();
+
+        String tblName = tblDef.canonicalName();
+
+        RecordView<Tuple> tbl = CLUSTER_NODES.get(0).tables().createTable(tblDef.canonicalName(), tblCh ->
+            SchemaConfigurationConverter.convert(tblDef, tblCh)
+                .changeReplicas(1)
+                .changePartitions(10)
+        ).recordView();
+
+        try {
+
+            for (int i = 0; i < 100; i++)
+                tbl.insert(Tuple.create().set("ID", i).set("VAL", i));
+
+            // Correlated INNER join.
+            assertQuery("SELECT t.val FROM test t WHERE t.val < 5 AND " +
+                "t.id in (SELECT x FROM table(system_range(t.val, t.val))) ")
+                .returns(0)
+                .returns(1)
+                .returns(2)
+                .returns(3)
+                .returns(4)
+                .check();
+
+            // Correlated LEFT joins.
+            assertQuery("SELECT t.val FROM test t WHERE t.val < 5 AND " +
+                "EXISTS (SELECT x FROM table(system_range(t.val, t.val)) WHERE mod(x, 2) = 0) ")
+                .returns(0)
+                .returns(2)
+                .returns(4)
+                .check();
+
+            assertQuery("SELECT t.val FROM test t WHERE t.val < 5 AND " +
+                "NOT EXISTS (SELECT x FROM table(system_range(t.val, t.val)) WHERE mod(x, 2) = 0) ")
+                .returns(1)
+                .returns(3)
+                .check();
+
+            assertQuery("SELECT t.val FROM test t WHERE " +
+                "EXISTS (SELECT x FROM table(system_range(t.val, null))) ")
+                .check();
+
+            // Non-correlated join.
+            assertQuery("SELECT t.val FROM test t JOIN table(system_range(1, 50)) as r ON t.id = r.x " +
+                "WHERE mod(r.x, 10) = 0")
+                .returns(10)
+                .returns(20)
+                .returns(30)
+                .returns(40)
+                .returns(50)
+                .check();
+        }
+        finally {
+            CLUSTER_NODES.get(0).tables().dropTable(tblName);
+        }
+    }
 
     /** */
     @Test
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/ITMetadataTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/ITMetadataTest.java
index 86bc68a..d5492bc 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/ITMetadataTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/ITMetadataTest.java
@@ -69,4 +69,13 @@ public class ITMetadataTest extends AbstractBasicIntegrationTest {
 
         assertQuery("select 1, -1, 'some string' from person").columnNames("1", "-1", "'some string'").check();
     }
+
+    /** */
+    @Test
+    public void infixTypeCast() {
+        assertQuery("select id, id::tinyint as tid, id::smallint as sid, id::varchar as vid from person")
+            .columnNames("ID", "TID", "SID", "VID")
+            .columnTypes(Integer.class, Byte.class, Short.class, String.class)
+            .check();
+    }
 }
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/ITMixedQueriesTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/ITMixedQueriesTest.java
index e32f899..4722277 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/ITMixedQueriesTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/ITMixedQueriesTest.java
@@ -267,32 +267,6 @@ public class ITMixedQueriesTest extends AbstractBasicIntegrationTest {
         assertQuery(selectAllQry).columnNames("ID", "VAL").check();
     }
 
-//    /**
-//     * Verifies infix cast operator.
-//     */
-//    @Test
-//    public void testInfixTypeCast() {
-//        sql("drop table if exists test_tbl");
-//        sql("create table test_tbl(id int primary key, val varchar)");
-//
-//        // Await for PME, see details here: https://issues.apache.org/jira/browse/IGNITE-14974
-//        awaitPartitionMapExchange();
-//
-//        QueryEngine engineSrv = Commons.lookupComponent(grid(1).context(), QueryEngine.class);
-//
-//        FieldsQueryCursor<List<?>> cur = engineSrv.query(null, "PUBLIC",
-//            "select id, id::tinyint as tid, id::smallint as sid, id::varchar as vid from test_tbl").get(0);
-//
-//        assertThat(cur, CoreMatchers.instanceOf(QueryCursorEx.class));
-//
-//        QueryCursorEx<?> qCur = (QueryCursorEx<?>)cur;
-//
-//        assertThat(qCur.fieldsMeta().get(0).fieldTypeName(), equalTo(Integer.class.getName()));
-//        assertThat(qCur.fieldsMeta().get(1).fieldTypeName(), equalTo(Byte.class.getName()));
-//        assertThat(qCur.fieldsMeta().get(2).fieldTypeName(), equalTo(Short.class.getName()));
-//        assertThat(qCur.fieldsMeta().get(3).fieldTypeName(), equalTo(String.class.getName()));
-//    }
-
     /** Quantified predicates test. */
     @Disabled("https://issues.apache.org/jira/browse/IGNITE-13159")
     @Test
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/util/QueryChecker.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/util/QueryChecker.java
index f92c462..43aeae7 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/util/QueryChecker.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/calcite/util/QueryChecker.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.calcite.util;
 
+import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -27,8 +28,10 @@ import java.util.List;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
+import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.ignite.internal.processors.query.calcite.QueryProcessor;
 import org.apache.ignite.internal.processors.query.calcite.SqlCursor;
+import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory;
 import org.apache.ignite.internal.util.CollectionUtils;
 import org.apache.ignite.internal.util.Cursor;
 import org.hamcrest.CoreMatchers;
@@ -39,6 +42,7 @@ import org.jetbrains.annotations.Nullable;
 import static org.apache.ignite.internal.calcite.util.Commons.getAllFromCursor;
 import static org.apache.ignite.internal.util.ArrayUtils.OBJECT_EMPTY_ARRAY;
 import static org.apache.ignite.internal.util.ArrayUtils.nullOrEmpty;
+import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.fail;
@@ -223,6 +227,9 @@ public abstract class QueryChecker {
     private List<String> expectedColumnNames;
 
     /** */
+    private List<Type> expectedColumnTypes;
+
+    /** */
     private boolean ordered;
 
     /** */
@@ -273,6 +280,13 @@ public abstract class QueryChecker {
     }
 
     /** */
+    public QueryChecker columnTypes(Type... columns) {
+        expectedColumnTypes = Arrays.asList(columns);
+
+        return this;
+    }
+
+    /** */
     public QueryChecker matches(Matcher<String>... planMatcher) {
         Collections.addAll(planMatchers, planMatcher);
 
@@ -310,14 +324,24 @@ public abstract class QueryChecker {
         List<SqlCursor<List<?>>> cursors =
             qryProc.query( "PUBLIC", qry, params);
 
-        Cursor<List<?>> cur = cursors.get(0);
+        SqlCursor<List<?>> cur = cursors.get(0);
 
-//        if (expectedColumnNames != null) {
-//            List<String> colNames = IntStream.range(0, cur.getColumnsCount())
-//                .mapToObj(cur::getFieldName).collect(Collectors.toList());
-//
-//            assertThat("Column names don't match", colNames, equalTo(expectedColumnNames));
-//        }
+        if (expectedColumnNames != null) {
+            List<String> colNames = cur.getColumnMetadata().rowType().getFieldNames();
+
+            assertThat("Column names don't match", colNames, equalTo(expectedColumnNames));
+        }
+
+        if (expectedColumnTypes != null) {
+            IgniteTypeFactory typeFactory = new IgniteTypeFactory();
+
+            List<Type> colNames = cur.getColumnMetadata().rowType().getFieldList().stream()
+                .map(RelDataTypeField::getType)
+                .map(typeFactory::getResultClass)
+                .collect(Collectors.toList());
+
+            assertThat("Column types don't match", colNames, equalTo(expectedColumnTypes));
+        }
 
         List<List<?>> res = getAllFromCursor(cur);