Add simple query planner
Project: http://git-wip-us.apache.org/repos/asf/incubator-gearpump/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-gearpump/commit/7e9cf0d3 Tree: http://git-wip-us.apache.org/repos/asf/incubator-gearpump/tree/7e9cf0d3 Diff: http://git-wip-us.apache.org/repos/asf/incubator-gearpump/diff/7e9cf0d3 Branch: refs/heads/sql Commit: 7e9cf0d3c06ae17b64016f814d1792a1014b30d6 Parents: 156bfd0 Author: Buddhi Ayesha <[email protected]> Authored: Fri Jun 2 10:38:53 2017 +0530 Committer: manuzhang <[email protected]> Committed: Sun Jul 9 07:50:25 2017 +0800 ---------------------------------------------------------------------- .../java/org/apache/calcite/planner/Query.java | 79 ++++++++++++++++++ .../calcite/table/TransactionsTableFactory.java | 88 ++++++++++++++++++++ .../apache/gearpump/experiments/sql/Query.scala | 54 ++++++++++++ .../src/test/resources/sales/Transactions.csv | 6 ++ 4 files changed, 227 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-gearpump/blob/7e9cf0d3/experiments/sql/src/main/java/org/apache/calcite/planner/Query.java ---------------------------------------------------------------------- diff --git a/experiments/sql/src/main/java/org/apache/calcite/planner/Query.java b/experiments/sql/src/main/java/org/apache/calcite/planner/Query.java new file mode 100644 index 0000000..9008a16 --- /dev/null +++ b/experiments/sql/src/main/java/org/apache/calcite/planner/Query.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.calcite.planner; + +import org.apache.calcite.config.Lex; +import org.apache.calcite.plan.Contexts; +import org.apache.calcite.plan.ConventionTraitDef; +import org.apache.calcite.plan.RelTraitDef; +import org.apache.calcite.rel.RelCollationTraitDef; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.type.RelDataTypeSystem; +import org.apache.calcite.schema.SchemaPlus; +import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.parser.SqlParseException; +import org.apache.calcite.sql.parser.SqlParser; +import org.apache.calcite.tools.*; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +/** + * This Class is intended to test functions of Apache Calcite + */ +public class Query { + + private final static Logger logger = Logger.getLogger(Query.class); + private final Planner queryPlanner; + + public Query(SchemaPlus schema) { + + final List<RelTraitDef> traitDefs = new ArrayList<RelTraitDef>(); + + traitDefs.add(ConventionTraitDef.INSTANCE); + traitDefs.add(RelCollationTraitDef.INSTANCE); + + FrameworkConfig calciteFrameworkConfig = Frameworks.newConfigBuilder() + .parserConfig(SqlParser.configBuilder() + .setLex(Lex.MYSQL) + .build()) + .defaultSchema(schema) + .traitDefs(traitDefs) + .context(Contexts.EMPTY_CONTEXT) + .ruleSets(RuleSets.ofList()) + .costFactory(null) + .typeSystem(RelDataTypeSystem.DEFAULT) + .build(); + this.queryPlanner = Frameworks.getPlanner(calciteFrameworkConfig); + } + + public RelNode getLogicalPlan(String query) throws ValidationException, RelConversionException { + SqlNode sqlNode = null; + try { + sqlNode = queryPlanner.parse(query); + } catch (SqlParseException e) { + logger.error("SQL Parse Exception", e); + } + + SqlNode validatedSqlNode = queryPlanner.validate(sqlNode); + return queryPlanner.rel(validatedSqlNode).project(); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gearpump/blob/7e9cf0d3/experiments/sql/src/main/java/org/apache/calcite/table/TransactionsTableFactory.java ---------------------------------------------------------------------- diff --git a/experiments/sql/src/main/java/org/apache/calcite/table/TransactionsTableFactory.java b/experiments/sql/src/main/java/org/apache/calcite/table/TransactionsTableFactory.java new file mode 100644 index 0000000..42c2f92 --- /dev/null +++ b/experiments/sql/src/main/java/org/apache/calcite/table/TransactionsTableFactory.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.calcite.table; + +import com.google.common.collect.ImmutableList; +import org.apache.calcite.DataContext; +import org.apache.calcite.linq4j.Enumerable; +import org.apache.calcite.linq4j.Linq4j; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeFactory; +import org.apache.calcite.rel.type.RelProtoDataType; +import org.apache.calcite.schema.*; +import org.apache.calcite.sql.type.SqlTypeName; + +import java.util.Map; + +public class TransactionsTableFactory implements TableFactory<Table> { + + @Override + public Table create(SchemaPlus schema, String name, Map<String, Object> operand, RelDataType rowType) { + final Object[][] rows = { + {100, "I001", "item1", 3}, + {101, "I002", "item2", 5}, + {102, "I003", "item3", 8}, + {103, "I004", "item4", 33}, + {104, "I005", "item5", 23} + }; + + return new TransactionsTable(ImmutableList.copyOf(rows)); + } + + public static class TransactionsTable implements ScannableTable { + + protected final RelProtoDataType protoRowType = new RelProtoDataType() { + public RelDataType apply(RelDataTypeFactory a0) { + return a0.builder() + .add("timeStamp", SqlTypeName.TIMESTAMP) + .add("id", SqlTypeName.VARCHAR, 10) + .add("item", SqlTypeName.VARCHAR, 50) + .add("quantity", SqlTypeName.INTEGER) + .build(); + } + }; + + private final ImmutableList<Object[]> rows; + + public TransactionsTable(ImmutableList<Object[]> rows) { + this.rows = rows; + } + + public Enumerable<Object[]> scan(DataContext root) { + return Linq4j.asEnumerable(rows); + } + + @Override + public RelDataType getRowType(RelDataTypeFactory typeFactory) { + return protoRowType.apply(typeFactory); + } + + @Override + public Statistic getStatistic() { + return Statistics.UNKNOWN; + } + + @Override + public Schema.TableType getJdbcTableType() { + return Schema.TableType.TABLE; + } + + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gearpump/blob/7e9cf0d3/experiments/sql/src/main/scala/org/apache/gearpump/experiments/sql/Query.scala ---------------------------------------------------------------------- diff --git a/experiments/sql/src/main/scala/org/apache/gearpump/experiments/sql/Query.scala b/experiments/sql/src/main/scala/org/apache/gearpump/experiments/sql/Query.scala new file mode 100644 index 0000000..e39ed3f --- /dev/null +++ b/experiments/sql/src/main/scala/org/apache/gearpump/experiments/sql/Query.scala @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.gearpump.experiments.sql + +import java.util + +import org.apache.calcite.config.Lex +import org.apache.calcite.plan.{Contexts, ConventionTraitDef, RelTrait, RelTraitDef} +import org.apache.calcite.rel.RelCollationTraitDef +import org.apache.calcite.rel.`type`.RelDataTypeSystem +import org.apache.calcite.sql.parser.SqlParser +import org.apache.calcite.tools.{Frameworks, RuleSets} + +class Query { + + def executeQuery(query: String): Unit = { + + val traitDefs: util.List[RelTraitDef[_ <: RelTrait]] = new util.ArrayList[RelTraitDef[_ <: RelTrait]] + + traitDefs.add(ConventionTraitDef.INSTANCE) + traitDefs.add(RelCollationTraitDef.INSTANCE) + + val config = Frameworks.newConfigBuilder() + .parserConfig(SqlParser.configBuilder.setLex(Lex.MYSQL).build) + .traitDefs(traitDefs) + .context(Contexts.EMPTY_CONTEXT) + .ruleSets(RuleSets.ofList()) + .costFactory(null) + .typeSystem(RelDataTypeSystem.DEFAULT) + .build(); + val planner = Frameworks.getPlanner(config) + + val sqlNode = planner.parse(query) + planner.validate(sqlNode) + + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gearpump/blob/7e9cf0d3/experiments/sql/src/test/resources/sales/Transactions.csv ---------------------------------------------------------------------- diff --git a/experiments/sql/src/test/resources/sales/Transactions.csv b/experiments/sql/src/test/resources/sales/Transactions.csv new file mode 100644 index 0000000..f974d97 --- /dev/null +++ b/experiments/sql/src/test/resources/sales/Transactions.csv @@ -0,0 +1,6 @@ +timeStamp:int,id:string,item:string,quantity:int +100,"I001","item1",3 +101,"I002","item2",5 +102,"I003","item3",8 +103,"I004","item4",33 +104,"I005","item5",23
