You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by ho...@apache.org on 2019/05/30 08:28:52 UTC
[calcite] 02/02: [CALCITE-3093] Remove JDBC connection calls from
PlannerImpl
This is an automated email from the ASF dual-hosted git repository.
hongze pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
commit 037250b99d6db8a605b64780a3643f784d07d308
Author: Hongze Zhang <ho...@apache.org>
AuthorDate: Mon May 27 17:33:28 2019 +0800
[CALCITE-3093] Remove JDBC connection calls from PlannerImpl
Close apache/calcite#1241
---
.../org/apache/calcite/prepare/PlannerImpl.java | 84 ++++++++++++----------
.../java/org/apache/calcite/tools/Frameworks.java | 2 +
2 files changed, 48 insertions(+), 38 deletions(-)
diff --git a/core/src/main/java/org/apache/calcite/prepare/PlannerImpl.java b/core/src/main/java/org/apache/calcite/prepare/PlannerImpl.java
index 5305e91..ec0f8d9 100644
--- a/core/src/main/java/org/apache/calcite/prepare/PlannerImpl.java
+++ b/core/src/main/java/org/apache/calcite/prepare/PlannerImpl.java
@@ -20,19 +20,27 @@ import org.apache.calcite.adapter.java.JavaTypeFactory;
import org.apache.calcite.config.CalciteConnectionConfig;
import org.apache.calcite.config.CalciteConnectionConfigImpl;
import org.apache.calcite.config.CalciteConnectionProperty;
+import org.apache.calcite.config.CalciteSystemProperty;
import org.apache.calcite.jdbc.CalciteSchema;
+import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
import org.apache.calcite.plan.Context;
+import org.apache.calcite.plan.ConventionTraitDef;
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptPlanner;
import org.apache.calcite.plan.RelOptTable.ViewExpander;
+import org.apache.calcite.plan.RelOptUtil;
import org.apache.calcite.plan.RelTraitDef;
import org.apache.calcite.plan.RelTraitSet;
+import org.apache.calcite.plan.volcano.VolcanoPlanner;
+import org.apache.calcite.rel.RelCollationTraitDef;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.RelRoot;
import org.apache.calcite.rel.metadata.CachingRelMetadataProvider;
import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeSystem;
import org.apache.calcite.rex.RexBuilder;
import org.apache.calcite.rex.RexExecutor;
+import org.apache.calcite.runtime.Hook;
import org.apache.calcite.schema.SchemaPlus;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.SqlOperatorTable;
@@ -44,14 +52,12 @@ import org.apache.calcite.sql2rel.RelDecorrelator;
import org.apache.calcite.sql2rel.SqlRexConvertletTable;
import org.apache.calcite.sql2rel.SqlToRelConverter;
import org.apache.calcite.tools.FrameworkConfig;
-import org.apache.calcite.tools.Frameworks;
import org.apache.calcite.tools.Planner;
import org.apache.calcite.tools.Program;
import org.apache.calcite.tools.RelBuilder;
import org.apache.calcite.tools.RelConversionException;
import org.apache.calcite.tools.ValidationException;
import org.apache.calcite.util.Pair;
-import org.apache.calcite.util.Util;
import com.google.common.collect.ImmutableList;
@@ -63,7 +69,9 @@ import java.util.Properties;
public class PlannerImpl implements Planner, ViewExpander {
private final SqlOperatorTable operatorTable;
private final ImmutableList<Program> programs;
- private final FrameworkConfig config;
+ private final FrameworkConfig frameworkConfig;
+ private final Context context;
+ private final CalciteConnectionConfig connectionConfig;
/** Holds the trait definitions to be registered with planner. May be null. */
private final ImmutableList<RelTraitDef> traitDefs;
@@ -84,7 +92,7 @@ public class PlannerImpl implements Planner, ViewExpander {
private RexExecutor executor;
// set in STATE_4_VALIDATE
- private CalciteSqlValidator validator;
+ private SqlValidator validator;
private SqlNode validatedSqlNode;
// set in STATE_5_CONVERT
@@ -93,7 +101,7 @@ public class PlannerImpl implements Planner, ViewExpander {
/** Creates a planner. Not a public API; call
* {@link org.apache.calcite.tools.Frameworks#getPlanner} instead. */
public PlannerImpl(FrameworkConfig config) {
- this.config = config;
+ this.frameworkConfig = config;
this.defaultSchema = config.getDefaultSchema();
this.operatorTable = config.getOperatorTable();
this.programs = config.getPrograms();
@@ -103,9 +111,24 @@ public class PlannerImpl implements Planner, ViewExpander {
this.traitDefs = config.getTraitDefs();
this.convertletTable = config.getConvertletTable();
this.executor = config.getExecutor();
+ this.context = config.getContext();
+ this.connectionConfig = connConfig();
reset();
}
+ private CalciteConnectionConfig connConfig() {
+ CalciteConnectionConfig unwrapped = context.unwrap(CalciteConnectionConfig.class);
+ if (unwrapped != null) {
+ return unwrapped;
+ }
+ Properties properties = new Properties();
+ properties.setProperty(CalciteConnectionProperty.CASE_SENSITIVE.camelName(),
+ String.valueOf(parserConfig.caseSensitive()));
+ properties.setProperty(CalciteConnectionProperty.CONFORMANCE.camelName(),
+ String.valueOf(frameworkConfig.getParserConfig().conformance()));
+ return new CalciteConnectionConfigImpl(properties);
+ }
+
/** Makes sure that the state is at least the given state. */
private void ensure(State state) {
if (state == this.state) {
@@ -140,23 +163,27 @@ public class PlannerImpl implements Planner, ViewExpander {
reset();
}
ensure(State.STATE_1_RESET);
- Frameworks.withPlanner(
- (cluster, relOptSchema, rootSchema) -> {
- Util.discard(rootSchema); // use our own defaultSchema
- typeFactory = (JavaTypeFactory) cluster.getTypeFactory();
- planner = cluster.getPlanner();
- planner.setExecutor(executor);
- return null;
- },
- config);
+
+ RelDataTypeSystem typeSystem =
+ connectionConfig.typeSystem(RelDataTypeSystem.class,
+ RelDataTypeSystem.DEFAULT);
+ typeFactory = new JavaTypeFactoryImpl(typeSystem);
+ planner = new VolcanoPlanner(frameworkConfig.getCostFactory(), context);
+ RelOptUtil.registerDefaultRules(planner,
+ connectionConfig.materializationsEnabled(),
+ Hook.ENABLE_BINDABLE.get(false));
+ planner.setExecutor(executor);
state = State.STATE_2_READY;
// If user specify own traitDef, instead of default default trait,
- // first, clear the default trait def registered with planner
- // then, register the trait def specified in traitDefs.
- if (this.traitDefs != null) {
- planner.clearRelTraitDefs();
+ // register the trait def specified in traitDefs.
+ if (this.traitDefs == null) {
+ planner.addRelTraitDef(ConventionTraitDef.INSTANCE);
+ if (CalciteSystemProperty.ENABLE_COLLATION_TRAIT.value()) {
+ planner.addRelTraitDef(RelCollationTraitDef.INSTANCE);
+ }
+ } else {
for (RelTraitDef def : this.traitDefs) {
planner.addRelTraitDef(def);
}
@@ -194,15 +221,7 @@ public class PlannerImpl implements Planner, ViewExpander {
}
private SqlConformance conformance() {
- final Context context = config.getContext();
- if (context != null) {
- final CalciteConnectionConfig connectionConfig =
- context.unwrap(CalciteConnectionConfig.class);
- if (connectionConfig != null) {
- return connectionConfig.conformance();
- }
- }
- return config.getParserConfig().conformance();
+ return connectionConfig.conformance();
}
public Pair<SqlNode, RelDataType> validateAndGetType(SqlNode sqlNode)
@@ -302,17 +321,6 @@ public class PlannerImpl implements Planner, ViewExpander {
// CalciteCatalogReader is stateless; no need to store one
private CalciteCatalogReader createCatalogReader() {
final SchemaPlus rootSchema = rootSchema(defaultSchema);
- final Context context = config.getContext();
- final CalciteConnectionConfig connectionConfig;
-
- if (context != null) {
- connectionConfig = context.unwrap(CalciteConnectionConfig.class);
- } else {
- Properties properties = new Properties();
- properties.setProperty(CalciteConnectionProperty.CASE_SENSITIVE.camelName(),
- String.valueOf(parserConfig.caseSensitive()));
- connectionConfig = new CalciteConnectionConfigImpl(properties);
- }
return new CalciteCatalogReader(
CalciteSchema.from(rootSchema),
diff --git a/core/src/main/java/org/apache/calcite/tools/Frameworks.java b/core/src/main/java/org/apache/calcite/tools/Frameworks.java
index a273a26..c1f0a31 100644
--- a/core/src/main/java/org/apache/calcite/tools/Frameworks.java
+++ b/core/src/main/java/org/apache/calcite/tools/Frameworks.java
@@ -20,6 +20,7 @@ import org.apache.calcite.config.CalciteConnectionProperty;
import org.apache.calcite.jdbc.CalciteSchema;
import org.apache.calcite.materialize.SqlStatisticProvider;
import org.apache.calcite.plan.Context;
+import org.apache.calcite.plan.Contexts;
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptCostFactory;
import org.apache.calcite.plan.RelOptSchema;
@@ -210,6 +211,7 @@ public class Frameworks {
convertletTable = StandardConvertletTable.INSTANCE;
operatorTable = SqlStdOperatorTable.instance();
programs = ImmutableList.of();
+ context = Contexts.empty();
parserConfig = SqlParser.Config.DEFAULT;
sqlToRelConverterConfig = SqlToRelConverter.Config.DEFAULT;
typeSystem = RelDataTypeSystem.DEFAULT;