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

Reply via email to