You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by gv...@apache.org on 2020/03/17 19:35:46 UTC

[ignite] branch ignite-12248 updated: IGNITE-12792: Calcite integration. Update Calcite version to 1.22.0 This closes #7540

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

gvvinblade pushed a commit to branch ignite-12248
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/ignite-12248 by this push:
     new 2ca6ecb  IGNITE-12792: Calcite integration. Update Calcite version to 1.22.0 This closes #7540
2ca6ecb is described below

commit 2ca6ecb3b32883082c24f83c10530e0dee3fb948
Author: Igor Seliverstov <gv...@gmail.com>
AuthorDate: Tue Mar 17 22:35:25 2020 +0300

    IGNITE-12792: Calcite integration. Update Calcite version to 1.22.0 This closes #7540
---
 modules/calcite/pom.xml                            | 25 +++++++
 .../query/calcite/exec/ExecutionServiceImpl.java   | 17 +----
 .../query/calcite/exec/exp/type/BasicType.java     |  3 +-
 .../query/calcite/exec/exp/type/CharacterType.java |  3 +-
 .../query/calcite/exec/exp/type/StructType.java    |  3 +-
 .../metadata/IgniteMdDerivedDistribution.java      |  4 +-
 .../calcite/metadata/IgniteMdDistribution.java     | 21 +++---
 .../calcite/metadata/IgniteMdFragmentInfo.java     |  6 +-
 .../query/calcite/metadata/RelMetadataQueryEx.java | 78 +++++++++-------------
 .../calcite/prepare/AbstractMultiStepPlan.java     |  4 +-
 .../query/calcite/prepare/FragmentSplitter.java    |  6 +-
 .../query/calcite/prepare/IgnitePlanner.java       | 35 ++--------
 .../query/calcite/prepare/IgniteSqlValidator.java  |  4 +-
 .../query/calcite/schema/IgniteTable.java          |  7 +-
 parent/pom.xml                                     |  1 -
 15 files changed, 96 insertions(+), 121 deletions(-)

diff --git a/modules/calcite/pom.xml b/modules/calcite/pom.xml
index 3b30977..88aac81 100644
--- a/modules/calcite/pom.xml
+++ b/modules/calcite/pom.xml
@@ -23,6 +23,13 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
+    <!-- Module specific package versions -->
+    <properties>
+        <calcite.version>1.22.0</calcite.version>
+        <guava.version>19.0</guava.version>
+        <janino.version>3.0.11</janino.version>
+    </properties>
+
     <parent>
         <groupId>org.apache.ignite</groupId>
         <artifactId>ignite-parent</artifactId>
@@ -58,6 +65,24 @@
         </dependency>
 
         <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>${guava.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.codehaus.janino</groupId>
+            <artifactId>commons-compiler</artifactId>
+            <version>${janino.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.codehaus.janino</groupId>
+            <artifactId>janino</artifactId>
+            <version>${janino.version}</version>
+        </dependency>
+
+        <dependency>
             <groupId>org.apache.ignite</groupId>
             <artifactId>ignite-core</artifactId>
             <version>${project.version}</version>
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/ExecutionServiceImpl.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/ExecutionServiceImpl.java
index 3c2f4eb..ebd153f 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/ExecutionServiceImpl.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/ExecutionServiceImpl.java
@@ -34,8 +34,6 @@ import org.apache.calcite.plan.ConventionTraitDef;
 import org.apache.calcite.plan.RelTraitDef;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.metadata.JaninoRelMetadataProvider;
-import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.sql.SqlNode;
@@ -70,7 +68,6 @@ import org.apache.ignite.internal.processors.query.calcite.message.MessageType;
 import org.apache.ignite.internal.processors.query.calcite.message.QueryCancelRequest;
 import org.apache.ignite.internal.processors.query.calcite.message.QueryStartRequest;
 import org.apache.ignite.internal.processors.query.calcite.message.QueryStartResponse;
-import org.apache.ignite.internal.processors.query.calcite.metadata.IgniteMetadata;
 import org.apache.ignite.internal.processors.query.calcite.metadata.MappingService;
 import org.apache.ignite.internal.processors.query.calcite.metadata.NodesMapping;
 import org.apache.ignite.internal.processors.query.calcite.metadata.PartitionService;
@@ -348,13 +345,8 @@ public class ExecutionServiceImpl extends AbstractService implements ExecutionSe
     /** {@inheritDoc} */
     @Override public List<FieldsQueryCursor<List<?>>> executeQuery(@Nullable QueryContext ctx, String schema, String query, Object[] params) {
         PlanningContext pctx = createContext(ctx, schema, query, params);
-        RelMetadataQuery.THREAD_PROVIDERS.set(JaninoRelMetadataProvider.of(IgniteMetadata.METADATA_PROVIDER));
-        try (IgnitePlanner ignored = pctx.planner()) {
-            return Commons.transform(prepare(pctx), p -> executeSingle(UUID.randomUUID(), pctx, p));
-        }
-        finally {
-            RelMetadataQuery.THREAD_PROVIDERS.remove();
-        }
+
+        return Commons.transform(prepare(pctx), p -> executeSingle(UUID.randomUUID(), pctx, p));
     }
 
     /** {@inheritDoc} */
@@ -726,7 +718,7 @@ public class ExecutionServiceImpl extends AbstractService implements ExecutionSe
         assert nodeId != null && msg != null;
 
         PlanningContext ctx = createContext(msg.schema(), nodeId, msg.topologyVersion());
-        RelMetadataQuery.THREAD_PROVIDERS.set(JaninoRelMetadataProvider.of(IgniteMetadata.METADATA_PROVIDER));
+
         try {
             ExecutionContext execCtx = new ExecutionContext(
                 taskExecutor(),
@@ -766,9 +758,6 @@ public class ExecutionServiceImpl extends AbstractService implements ExecutionSe
             if (ex instanceof Error)
                 throw (Error)ex;
         }
-        finally {
-            RelMetadataQuery.THREAD_PROVIDERS.remove();
-        }
     }
 
     /** */
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/type/BasicType.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/type/BasicType.java
index a66db57e..e4b6aa6 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/type/BasicType.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/type/BasicType.java
@@ -24,7 +24,6 @@ import java.io.ObjectOutput;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.sql.type.BasicSqlType;
 import org.apache.calcite.sql.type.SqlTypeName;
-import org.apache.commons.lang.text.StrBuilder;
 import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory;
 
 import static org.apache.calcite.rel.type.RelDataType.PRECISION_NOT_SPECIFIED;
@@ -130,7 +129,7 @@ public class BasicType implements DataType, Externalizable {
 
     /** */
     protected String toString(boolean withNullability) {
-        StrBuilder sb = new StrBuilder(typeName.name());
+        StringBuilder sb = new StringBuilder(typeName.name());
 
         boolean printPrecision = precision != PRECISION_NOT_SPECIFIED;
         boolean printScale = scale != SCALE_NOT_SPECIFIED;
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/type/CharacterType.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/type/CharacterType.java
index 22fa92c..bb935ee 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/type/CharacterType.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/type/CharacterType.java
@@ -25,7 +25,6 @@ import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.sql.SqlCollation;
 import org.apache.calcite.sql.type.BasicSqlType;
 import org.apache.commons.codec.Charsets;
-import org.apache.commons.lang.text.StrBuilder;
 import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory;
 
 /** */
@@ -122,7 +121,7 @@ public class CharacterType extends BasicType implements CharacterDataType {
 
     /** {@inheritDoc} */
     @Override public String toString() {
-        StrBuilder sb = new StrBuilder(toString(false));
+        StringBuilder sb = new StringBuilder(toString(false));
 
         if (charset != null)
             sb.append(" CHARACTER SET \"")
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/type/StructType.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/type/StructType.java
index f19c54e..97aa7c3 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/type/StructType.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/type/StructType.java
@@ -22,7 +22,6 @@ import java.util.Map;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.sql.type.SqlTypeName;
-import org.apache.commons.lang.text.StrBuilder;
 import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory;
 
 import static org.apache.calcite.rel.type.RelDataType.PRECISION_NOT_SPECIFIED;
@@ -78,7 +77,7 @@ public class StructType implements DataType {
 
     /** {@inheritDoc} */
     @Override public String toString() {
-        StrBuilder sb = new StrBuilder("Row(");
+        StringBuilder sb = new StringBuilder("Row(");
 
         boolean first = true;
 
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdDerivedDistribution.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdDerivedDistribution.java
index bdbe930..23f213c 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdDerivedDistribution.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdDerivedDistribution.java
@@ -203,6 +203,8 @@ public class IgniteMdDerivedDistribution implements MetadataHandler<DerivedDistr
 
     /** */
     private static List<IgniteDistribution> _deriveDistributions(RelNode rel, RelMetadataQuery mq) {
-        return RelMetadataQueryEx.wrap(mq).derivedDistributions(rel);
+        assert mq instanceof RelMetadataQueryEx;
+
+        return ((RelMetadataQueryEx) mq).derivedDistributions(rel);
     }
 }
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdDistribution.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdDistribution.java
index c9af577..2aabb56 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdDistribution.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdDistribution.java
@@ -49,8 +49,6 @@ import org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistribut
 import org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions;
 import org.apache.ignite.internal.util.typedef.F;
 
-import static org.apache.calcite.rel.RelDistribution.Type.ANY;
-
 /**
  * Implementation class for {@link RelMetadataQuery#distribution(RelNode)} method call.
  */
@@ -80,6 +78,13 @@ public class IgniteMdDistribution implements MetadataHandler<BuiltInMetadata.Dis
     /**
      * See {@link IgniteMdDistribution#distribution(RelNode, RelMetadataQuery)}
      */
+    public IgniteDistribution distribution(IgniteRel rel, RelMetadataQuery mq) {
+        return rel.getTraitSet().getTrait(DistributionTraitDef.INSTANCE);
+    }
+
+    /**
+     * See {@link IgniteMdDistribution#distribution(RelNode, RelMetadataQuery)}
+     */
     public IgniteDistribution distribution(LogicalTableModify rel, RelMetadataQuery mq) {
         return IgniteDistributions.single(); // TODO skip reducer
     }
@@ -141,13 +146,6 @@ public class IgniteMdDistribution implements MetadataHandler<BuiltInMetadata.Dis
     }
 
     /**
-     * See {@link IgniteMdDistribution#distribution(RelNode, RelMetadataQuery)}
-     */
-    public IgniteDistribution distribution(IgniteRel rel, RelMetadataQuery mq) {
-        throw new AssertionError("Unexpected node: " + rel);
-    }
-
-    /**
      * @return Values relational node distribution.
      */
     public static IgniteDistribution values(RelDataType rowType, ImmutableList<ImmutableList<RexLiteral>> tuples) {
@@ -196,10 +194,7 @@ public class IgniteMdDistribution implements MetadataHandler<BuiltInMetadata.Dis
      * @return Actual distribution of the given relational node.
      */
     public static IgniteDistribution _distribution(RelNode rel, RelMetadataQuery mq) {
-        IgniteDistribution distr = rel.getTraitSet().getTrait(DistributionTraitDef.INSTANCE);
-
-        if (distr.getType() != ANY)
-            return distr;
+        assert mq instanceof RelMetadataQueryEx;
 
         return (IgniteDistribution) mq.distribution(rel);
     }
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdFragmentInfo.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdFragmentInfo.java
index 23bce2c..b672ed0 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdFragmentInfo.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdFragmentInfo.java
@@ -98,8 +98,6 @@ public class IgniteMdFragmentInfo implements MetadataHandler<FragmentMetadata> {
      * information will be recalculated for all fragments.
      */
     public FragmentInfo fragmentInfo(Join rel, RelMetadataQuery mq) {
-        mq = RelMetadataQueryEx.wrap(mq);
-
         FragmentInfo left = _fragmentInfo(rel.getLeft(), mq);
         FragmentInfo right = _fragmentInfo(rel.getRight(), mq);
 
@@ -154,6 +152,8 @@ public class IgniteMdFragmentInfo implements MetadataHandler<FragmentMetadata> {
      * @return Fragment meta information.
      */
     public static FragmentInfo _fragmentInfo(RelNode rel, RelMetadataQuery mq) {
-        return RelMetadataQueryEx.wrap(mq).getFragmentInfo(rel);
+        assert mq instanceof RelMetadataQueryEx;
+
+        return ((RelMetadataQueryEx) mq).getFragmentInfo(rel);
     }
 }
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/RelMetadataQueryEx.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/RelMetadataQueryEx.java
index 7725d83..4b4bc29 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/RelMetadataQueryEx.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/RelMetadataQueryEx.java
@@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.metadata.JaninoRelMetadataProvider;
+import org.apache.calcite.rel.metadata.RelMetadataProvider;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteExchange;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteFilter;
@@ -28,32 +29,38 @@ import org.apache.ignite.internal.processors.query.calcite.rel.IgniteJoin;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteProject;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteReceiver;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteSender;
+import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTableModify;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTableScan;
+import org.apache.ignite.internal.processors.query.calcite.rel.IgniteValues;
 import org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistribution;
-import org.jetbrains.annotations.NotNull;
 
 /**
  * See {@link RelMetadataQuery}
  */
 public class RelMetadataQueryEx extends RelMetadataQuery {
-    /** */
-    private static final RelMetadataQueryEx PROTO = new RelMetadataQueryEx();
-
-    /** */
-    public static final JaninoRelMetadataProvider PROVIDER = JaninoRelMetadataProvider.of(IgniteMetadata.METADATA_PROVIDER);
-
     static {
-        PROVIDER.register(ImmutableList.of(
+        JaninoRelMetadataProvider.DEFAULT.register(
+            ImmutableList.of(
                 IgniteExchange.class,
                 IgniteReceiver.class,
                 IgniteSender.class,
                 IgniteFilter.class,
                 IgniteProject.class,
                 IgniteJoin.class,
-                IgniteTableScan.class));
+                IgniteTableScan.class,
+                IgniteValues.class,
+                IgniteTableModify.class));
     }
 
     /** */
+    private static final IgniteMetadata.FragmentMetadata.Handler SOURCE_DISTRIBUTION_INITIAL_HANDLER =
+        initialHandler(IgniteMetadata.FragmentMetadata.Handler.class);
+
+    /** */
+    private static final IgniteMetadata.DerivedDistribution.Handler DERIVED_DISTRIBUTIONS_INITIAL_HANDLER =
+        initialHandler(IgniteMetadata.DerivedDistribution.Handler.class);
+
+    /** */
     private IgniteMetadata.FragmentMetadata.Handler sourceDistributionHandler;
 
     /** */
@@ -64,52 +71,29 @@ public class RelMetadataQueryEx extends RelMetadataQuery {
      *
      * @return return Metadata query instance.
      */
-    @SuppressWarnings("MethodOverridesStaticMethodOfSuperclass")
-    public static RelMetadataQueryEx instance() {
-        return new RelMetadataQueryEx(PROTO);
+    public static RelMetadataQueryEx create() {
+        return create(IgniteMetadata.METADATA_PROVIDER);
     }
 
     /**
-     * Wraps an original metadata query instance and reuses its prepared handlers.
+     * Factory method.
      *
-     * @param mq Original metadata query instance.
-     * @return Wrapped metadata query instance.
-     */
-    public static RelMetadataQueryEx wrap(@NotNull RelMetadataQuery mq) {
-        if (mq.getClass() == RelMetadataQueryEx.class)
-            return (RelMetadataQueryEx) mq;
-
-        return new RelMetadataQueryEx(mq);
-    }
-
-    /**
-     * @param parent Parent metadata query instance.
-     */
-    private RelMetadataQueryEx(@NotNull RelMetadataQueryEx parent) {
-        super(PROVIDER, parent);
-
-        sourceDistributionHandler = parent.sourceDistributionHandler;
-        derivedDistributionsHandler = parent.derivedDistributionsHandler;
-    }
-
-    /**
-     * @param parent Parent metadata query instance.
+     * @return return Metadata query instance.
      */
-    private RelMetadataQueryEx(@NotNull RelMetadataQuery parent) {
-        super(PROVIDER, parent);
-
-        sourceDistributionHandler = PROTO.sourceDistributionHandler;
-        derivedDistributionsHandler = PROTO.derivedDistributionsHandler;
+    public static RelMetadataQueryEx create(RelMetadataProvider metadataProvider) {
+        THREAD_PROVIDERS.set(JaninoRelMetadataProvider.of(metadataProvider));
+        try {
+            return new RelMetadataQueryEx();
+        }
+        finally {
+            THREAD_PROVIDERS.remove();
+        }
     }
 
-    /**
-     * Constructs query prototype.
-     */
+    /** */
     private RelMetadataQueryEx() {
-        super(JaninoRelMetadataProvider.DEFAULT, RelMetadataQuery.EMPTY);
-
-        sourceDistributionHandler = initialHandler(IgniteMetadata.FragmentMetadata.Handler.class);
-        derivedDistributionsHandler = initialHandler(IgniteMetadata.DerivedDistribution.Handler.class);
+        sourceDistributionHandler = SOURCE_DISTRIBUTION_INITIAL_HANDLER;
+        derivedDistributionsHandler = DERIVED_DISTRIBUTIONS_INITIAL_HANDLER;
     }
 
     /**
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/AbstractMultiStepPlan.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/AbstractMultiStepPlan.java
index 99f316b..c759379 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/AbstractMultiStepPlan.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/AbstractMultiStepPlan.java
@@ -18,11 +18,11 @@
 package org.apache.ignite.internal.processors.query.calcite.prepare;
 
 import java.util.List;
+import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata;
 import org.apache.ignite.internal.processors.query.IgniteSQLException;
 import org.apache.ignite.internal.processors.query.calcite.metadata.MappingService;
 import org.apache.ignite.internal.processors.query.calcite.metadata.OptimisticPlanningException;
-import org.apache.ignite.internal.processors.query.calcite.metadata.RelMetadataQueryEx;
 import org.apache.ignite.internal.util.typedef.F;
 
 /**
@@ -52,7 +52,7 @@ public abstract class AbstractMultiStepPlan implements MultiStepPlan {
 
     /** {@inheritDoc} */
     @Override public void init(MappingService mappingService, PlanningContext ctx) {
-        RelMetadataQueryEx mq = RelMetadataQueryEx.instance();
+        RelMetadataQuery mq = F.first(fragments).root().getCluster().getMetadataQuery();
 
         for (int i = 0, j = 0; i < fragments.size();) {
             Fragment fragment = fragments.get(i);
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/FragmentSplitter.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/FragmentSplitter.java
index 92b0cbe..a46242c2 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/FragmentSplitter.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/FragmentSplitter.java
@@ -24,8 +24,8 @@ import java.util.List;
 import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.ignite.internal.processors.query.calcite.metadata.IgniteMdDistribution;
-import org.apache.ignite.internal.processors.query.calcite.metadata.RelMetadataQueryEx;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteExchange;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteFilter;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteJoin;
@@ -43,7 +43,7 @@ import org.apache.ignite.internal.processors.query.calcite.rel.IgniteValues;
  */
 public class FragmentSplitter implements IgniteRelVisitor<IgniteRel> {
     /** */
-    private RelMetadataQueryEx mq;
+    private RelMetadataQuery mq;
 
     /** */
     private List<Fragment> fragments;
@@ -52,7 +52,7 @@ public class FragmentSplitter implements IgniteRelVisitor<IgniteRel> {
     private RelNode cutPoint;
 
     /** */
-    public List<Fragment> go(Fragment fragment, RelNode cutPoint, RelMetadataQueryEx mq) {
+    public List<Fragment> go(Fragment fragment, RelNode cutPoint, RelMetadataQuery mq) {
         this.cutPoint = cutPoint;
         this.mq = mq;
 
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgnitePlanner.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgnitePlanner.java
index 397a9ef..aaa4d41 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgnitePlanner.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgnitePlanner.java
@@ -34,9 +34,6 @@ import org.apache.calcite.prepare.CalciteCatalogReader;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.RelRoot;
 import org.apache.calcite.rel.metadata.CachingRelMetadataProvider;
-import org.apache.calcite.rel.metadata.JaninoRelMetadataProvider;
-import org.apache.calcite.rel.metadata.RelMetadataProvider;
-import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexExecutor;
@@ -58,6 +55,7 @@ import org.apache.calcite.util.Pair;
 import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
 import org.apache.ignite.internal.processors.query.IgniteSQLException;
 import org.apache.ignite.internal.processors.query.calcite.metadata.IgniteMetadata;
+import org.apache.ignite.internal.processors.query.calcite.metadata.RelMetadataQueryEx;
 import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory;
 
 /**
@@ -224,18 +222,7 @@ public class IgnitePlanner implements Planner, RelOptTable.ViewExpander {
 
     /** {@inheritDoc} */
     @Override public RelNode transform(int programIdx, RelTraitSet targetTraits, RelNode rel) {
-        RelMetadataProvider clusterProvider = rel.getCluster().getMetadataProvider();
-        JaninoRelMetadataProvider threadProvider = RelMetadataQuery.THREAD_PROVIDERS.get();
-        try {
-            rel.getCluster().setMetadataProvider(new CachingRelMetadataProvider(IgniteMetadata.METADATA_PROVIDER, planner()));
-            RelMetadataQuery.THREAD_PROVIDERS.set(JaninoRelMetadataProvider.of(rel.getCluster().getMetadataProvider()));
-
-            return programs.get(programIdx).run(planner(), rel, targetTraits.simplify(), materializations(), latices());
-        }
-        finally {
-            rel.getCluster().setMetadataProvider(clusterProvider);
-            RelMetadataQuery.THREAD_PROVIDERS.set(threadProvider);
-        }
+        return programs.get(programIdx).run(planner(), rel, targetTraits.simplify(), materializations(), latices());
     }
 
     /**
@@ -247,18 +234,7 @@ public class IgnitePlanner implements Planner, RelOptTable.ViewExpander {
      * @return The root of the new RelNode tree.
      */
     public <T extends RelNode> T transform(PlannerPhase phase, RelTraitSet targetTraits, RelNode rel)  {
-        RelMetadataProvider clusterProvider = rel.getCluster().getMetadataProvider();
-        JaninoRelMetadataProvider threadProvider = RelMetadataQuery.THREAD_PROVIDERS.get();
-        try {
-            rel.getCluster().setMetadataProvider(new CachingRelMetadataProvider(IgniteMetadata.METADATA_PROVIDER, planner()));
-            RelMetadataQuery.THREAD_PROVIDERS.set(JaninoRelMetadataProvider.of(rel.getCluster().getMetadataProvider()));
-
-            return (T) phase.getProgram(ctx).run(planner(), rel, targetTraits.simplify(), materializations(), latices());
-        }
-        finally {
-            rel.getCluster().setMetadataProvider(clusterProvider);
-            RelMetadataQuery.THREAD_PROVIDERS.set(threadProvider);
-        }
+        return (T) phase.getProgram(ctx).run(planner(), rel, targetTraits.simplify(), materializations(), latices());
     }
 
     /** {@inheritDoc} */
@@ -290,7 +266,10 @@ public class IgnitePlanner implements Planner, RelOptTable.ViewExpander {
     /** Creates a cluster. */
     RelOptCluster createCluster() {
         RelOptCluster cluster = RelOptCluster.create(planner(), rexBuilder);
-        cluster.setMetadataProvider(IgniteMetadata.METADATA_PROVIDER);
+
+        cluster.setMetadataProvider(new CachingRelMetadataProvider(IgniteMetadata.METADATA_PROVIDER, planner()));
+        cluster.setMetadataQuerySupplier(RelMetadataQueryEx::create);
+
         return cluster;
     }
 
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java
index da20d13..558e6a9 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java
@@ -102,7 +102,7 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
         }
 
         return new SqlSelect(SqlParserPos.ZERO, null, selectList, sourceTable,
-            call.getCondition(), null, null, null, null, null, null);
+            call.getCondition(), null, null, null, null, null, null, null);
     }
 
     /** {@inheritDoc} */
@@ -120,7 +120,7 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
         }
 
         return new SqlSelect(SqlParserPos.ZERO, null, selectList, sourceTable,
-            call.getCondition(), null, null, null, null, null, null);
+            call.getCondition(), null, null, null, null, null, null, null);
     }
 
     /** {@inheritDoc} */
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/IgniteTable.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/IgniteTable.java
index b80819f..6b4875b 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/IgniteTable.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/IgniteTable.java
@@ -234,7 +234,12 @@ public class IgniteTable extends AbstractTable implements TranslatableTable, Sca
 
         /** {@inheritDoc} */
         @Override public boolean isKey(ImmutableBitSet columns) {
-            return false;
+            return false; // TODO
+        }
+
+        /** {@inheritDoc} */
+        @Override public List<ImmutableBitSet> getKeys() {
+            return null; // TODO
         }
 
         /** {@inheritDoc} */
diff --git a/parent/pom.xml b/parent/pom.xml
index 9633d1f..0e277a8 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -141,7 +141,6 @@
         <zookeeper.version>3.5.5</zookeeper.version>
         <zstd.version>1.3.7-2</zstd.version>
         <opencensus.version>0.22.0</opencensus.version>
-        <calcite.version>1.21.0</calcite.version>
 
         <!--Spark 2.4 version support -->
         <spark24.hadoop.version>2.6.5</spark24.hadoop.version>