Query processing with Calcite 99/73099/1
authorVikram Potturi <vikramaditya.potturi@att.com>
Mon, 19 Nov 2018 22:01:19 +0000 (17:01 -0500)
committerVikram Potturi <vikramaditya.potturi@att.com>
Mon, 19 Nov 2018 22:09:06 +0000 (17:09 -0500)
Change-Id: Id8ebbc48159810ca782081bb4f63071071c926dd
Issue-ID: MUSIC-164
Signed-off-by: Vikram Potturi <vikramaditya.potturi@att.com>
56 files changed:
.gitignore [changed mode: 0644->0755]
.gitreview [changed mode: 0644->0755]
INFO.yaml [changed mode: 0644->0755]
LICENSE [changed mode: 0644->0755]
docs/histo_graph.svg [changed mode: 0644->0755]
docs/redo_arch.svg [changed mode: 0644->0755]
docs/specs.md [changed mode: 0644->0755]
docs/uml.svg [changed mode: 0644->0755]
mdbc-server/pom.xml
mdbc-server/src/main/java/org/onap/music/exceptions/MDBCServiceException.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/exceptions/QueryException.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/logging/EELFLoggerDelegate.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/logging/format/AppMessages.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/logging/format/ErrorSeverity.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/logging/format/ErrorTypes.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/ArchiveProcess.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/Configuration.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/DatabaseOperations.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/DatabasePartition.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/LockId.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/MDBCUtils.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/MdbcCallableStatement.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/MdbcConnection.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/MdbcPreparedStatement.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/MdbcServer.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/MdbcServerLogic.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/MdbcStatement.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/Range.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/RedoRow.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/StateManager.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/configurations/NodeConfiguration.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/configurations/TablesConfiguration.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/configurations/config-0.json [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/configurations/ranges.json [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/configurations/tableConfiguration.json [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/examples/EtdbTestClient.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/mixins/MusicMixin.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/query/Operation.java [new file with mode: 0644]
mdbc-server/src/main/java/org/onap/music/mdbc/query/QueryProcessor.java [new file with mode: 0644]
mdbc-server/src/main/java/org/onap/music/mdbc/tables/MriReference.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/tables/MusicRangeInformationRow.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/tables/MusicTxDigestId.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/tables/Operation.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/tables/OperationType.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/tables/PartitionInformation.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/tables/StagingTable.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/tables/TxCommitProgress.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/tests/ConnectionTest.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/tools/CreateNodeConfigurations.java [changed mode: 0644->0755]
mdbc-server/src/main/java/org/onap/music/mdbc/tools/CreatePartition.java [changed mode: 0644->0755]
mdbc-server/src/main/resources/logback.xml [changed mode: 0644->0755]
mdbc-server/src/main/resources/mdbc_driver.properties [changed mode: 0644->0755]
mdbc-server/src/main/resources/music.properties [changed mode: 0644->0755]
mdbc-server/src/test/java/org/onap/music/mdbc/DatabaseOperationsTest.java [changed mode: 0644->0755]
mdbc-server/src/test/java/org/onap/music/mdbc/MDBCUtilsTest.java [changed mode: 0644->0755]
mdbc-server/src/test/java/org/onap/music/mdbc/TestUtils.java [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
diff --git a/LICENSE b/LICENSE
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
index d2e5fd5..f01f90a 100755 (executable)
     </parent>
 
     <dependencies>
+       <dependency>
+                   <groupId>org.apache.calcite</groupId>
+                   <artifactId>calcite</artifactId>
+                   <version>1.11.0</version>
+                   <type>pom</type>
+               </dependency>
         <dependency>
             <groupId>com.datastax.cassandra</groupId>
             <artifactId>cassandra-driver-core</artifactId>
diff --git a/mdbc-server/src/main/java/org/onap/music/mdbc/query/Operation.java b/mdbc-server/src/main/java/org/onap/music/mdbc/query/Operation.java
new file mode 100644 (file)
index 0000000..6c2d52b
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * ============LICENSE_START====================================================
+ * org.onap.music.mdbc
+ * =============================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * =============================================================================
+ * Licensed 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.
+ * ============LICENSE_END======================================================
+ */
+
+package org.onap.music.mdbc.query;
+
+public enum Operation {
+       
+           INSERT("W"), SELECT("R"), UPDATE("W"), DELETE("W"), TABLE("T");
+               
+           String operation; 
+         
+           String getOperation() { 
+               return this.operation; 
+           } 
+         
+           Operation(String operation) { 
+               this.operation = operation; 
+           } 
+           
+       }
\ No newline at end of file
diff --git a/mdbc-server/src/main/java/org/onap/music/mdbc/query/QueryProcessor.java b/mdbc-server/src/main/java/org/onap/music/mdbc/query/QueryProcessor.java
new file mode 100644 (file)
index 0000000..bc9a8fc
--- /dev/null
@@ -0,0 +1,245 @@
+/*
+ * ============LICENSE_START====================================================
+ * org.onap.music.mdbc
+ * =============================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * =============================================================================
+ * Licensed 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.
+ * ============LICENSE_END======================================================
+ */
+
+package org.onap.music.mdbc.query;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.calcite.avatica.util.Casing;
+import org.apache.calcite.avatica.util.Quoting;
+import org.apache.calcite.config.Lex;
+import org.apache.calcite.sql.SqlCall;
+import org.apache.calcite.sql.SqlDialect;
+import org.apache.calcite.sql.SqlIdentifier;
+import org.apache.calcite.sql.SqlInsert;
+import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.SqlNodeList;
+import org.apache.calcite.sql.SqlSelect;
+import org.apache.calcite.sql.SqlSetOption;
+import org.apache.calcite.sql.SqlUpdate;
+import org.apache.calcite.sql.fun.SqlInOperator;
+import org.apache.calcite.sql.parser.SqlParseException;
+import org.apache.calcite.sql.parser.SqlParser;
+import org.apache.calcite.sql.parser.SqlParserImplFactory;
+import org.apache.calcite.sql.parser.impl.SqlParserImpl;
+import org.apache.calcite.sql.util.SqlBasicVisitor;
+import org.apache.calcite.sql.util.SqlShuttle;
+import org.apache.calcite.sql.validate.SqlConformance;
+import org.apache.calcite.sql.validate.SqlConformanceEnum;
+import org.apache.calcite.util.Util;
+import org.onap.music.logging.EELFLoggerDelegate;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.parser.CCJSqlParserUtil;
+import net.sf.jsqlparser.statement.delete.Delete;
+import net.sf.jsqlparser.statement.insert.Insert;
+import net.sf.jsqlparser.statement.select.Select;
+import net.sf.jsqlparser.statement.update.Update;
+import net.sf.jsqlparser.util.TablesNamesFinder;
+
+public class QueryProcessor {
+
+       private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(QueryProcessor.class);
+
+       public List<String> tables = null;
+
+       public QueryProcessor() {
+
+       }
+
+       protected static SqlParserImplFactory parserImplFactory() {
+               return SqlParserImpl.FACTORY;
+       }
+
+       protected static SqlParser getSqlParser(String sql) {
+               Quoting quoting = Quoting.DOUBLE_QUOTE;
+               Casing unquotedCasing = Casing.TO_UPPER;
+               Casing quotedCasing = Casing.UNCHANGED;
+               SqlConformance conformance = SqlConformanceEnum.DEFAULT;
+               
+               return SqlParser.create(sql, SqlParser.configBuilder().setParserFactory(parserImplFactory()).setQuoting(quoting)
+                               .setUnquotedCasing(unquotedCasing).setQuotedCasing(quotedCasing).setConformance(conformance).build());
+       }
+
+       public static Map<String, List<String>> parseSqlQuery(String query) throws SqlParseException {
+               Map<String, List<String>> tableOpsMap = new HashMap<>();
+               /*SqlParser parser = SqlParser.create(query);
+               SqlNode sqlNode = parser.parseQuery();*/
+               SqlNode sqlNode = getSqlParser(query).parseStmt();
+
+               SqlBasicVisitor<Void> visitor = new SqlBasicVisitor<Void>() {
+
+                       public Void visit(SqlCall call) {
+                               if (call.getOperator() instanceof SqlInOperator) {
+                                       throw new Util.FoundOne(call);
+                               }
+                               return super.visit(call);
+                       }
+
+               };
+
+               // sqlNode.accept(new SqlAnalyzer());
+               sqlNode.accept(visitor);
+
+               if (sqlNode instanceof SqlInsert) {
+                       SqlInsert sqlInsert = (SqlInsert) sqlNode;
+                       SqlNodeList targetColumnList = sqlInsert.getTargetColumnList();
+                       System.out.println("targetColumnList: "+targetColumnList);
+                       String tableName = sqlInsert.getTargetTable().toString();
+                       List<String> Ops = tableOpsMap.get(tableName);
+                       if (Ops == null)
+                               Ops = new ArrayList<>();
+                       Ops.add(Operation.INSERT.getOperation());
+                       tableOpsMap.put(tableName, Ops);
+               } else if (sqlNode instanceof SqlUpdate) {
+                       SqlUpdate sqlUpdate = (SqlUpdate) sqlNode;
+                       String tableName = sqlUpdate.getTargetTable().toString();
+                       List<String> Ops = tableOpsMap.get(tableName);
+                       if (Ops == null)
+                               Ops = new ArrayList<>();
+                       Ops.add(Operation.UPDATE.getOperation());
+                       tableOpsMap.put(tableName, Ops);
+               } else if (sqlNode instanceof SqlSelect) {
+                       SqlSelect sqlSelect = (SqlSelect) sqlNode;
+                       SqlNodeList selectList = sqlSelect.getSelectList();
+                       String tables = sqlSelect.getFrom().toString();
+                       String[] tablesArr = tables.split(",");
+                       
+                       SqlNode where = sqlSelect.getWhere();
+                       
+                       for (String table : tablesArr) {
+                               String[] split = table.split("`");
+                               String tableName = split[1];
+                               List<String> Ops = tableOpsMap.get(tableName);
+                               if (Ops == null) Ops = new ArrayList<>();
+                               if (where == null) {
+                                       Ops.add(Operation.TABLE.getOperation());
+                                       tableOpsMap.put(split[1], Ops);
+                               } else {
+                                       Ops.add(Operation.SELECT.getOperation());
+                                       tableOpsMap.put(split[1], Ops);
+                               }
+                       }
+               }
+
+               return tableOpsMap;
+       }
+
+       public static Map<String, List<String>> extractTableFromQuery(String sqlQuery) {
+               List<String> tables = null;
+               Map<String, List<String>> tableOpsMap = new HashMap<>();
+               try {
+                       net.sf.jsqlparser.statement.Statement stmt = CCJSqlParserUtil.parse(sqlQuery);
+                       if (stmt instanceof Insert) {
+                               Insert s = (Insert) stmt;
+                               String tbl = s.getTable().getName();
+                               List<String> Ops = tableOpsMap.get(tbl);
+                               if (Ops == null)
+                                       Ops = new ArrayList<>();
+                               Ops.add(Operation.INSERT.getOperation());
+                               tableOpsMap.put(tbl, Ops);
+                               logger.debug(EELFLoggerDelegate.applicationLogger, "Inserting into table: " + tbl);
+                       } else {
+                               String tbl;
+                               String where = "";
+                               if (stmt instanceof Update) {
+                                       Update u = (Update) stmt;
+                                       tbl = u.getTables().get(0).getName();
+                                       List<String> Ops = tableOpsMap.get(tbl);
+                                       if (Ops == null)
+                                               Ops = new ArrayList<>();
+                                       if (u.getWhere() != null) {
+                                               where = u.getWhere().toString();
+                                               logger.debug(EELFLoggerDelegate.applicationLogger, "Updating table: " + tbl);
+                                               Ops.add(Operation.UPDATE.getOperation());
+                                       } else {
+                                               Ops.add(Operation.TABLE.getOperation());
+                                       }
+                                       tableOpsMap.put(tbl, Ops);
+                               } else if (stmt instanceof Delete) {
+                                       Delete d = (Delete) stmt;
+                                       tbl = d.getTable().getName();
+                                       List<String> Ops = tableOpsMap.get(tbl);
+                                       if (Ops == null)
+                                               Ops = new ArrayList<>();
+                                       if (d.getWhere() != null) {
+                                               where = d.getWhere().toString();
+                                               Ops.add(Operation.DELETE.getOperation());
+                                       } else {
+                                               Ops.add(Operation.TABLE.getOperation());
+                                       }
+                                       tableOpsMap.put(tbl, Ops);
+                                       logger.debug(EELFLoggerDelegate.applicationLogger, "Deleting from table: " + tbl);
+                               } else if (stmt instanceof Select) {
+                                       TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
+                                       tables = tablesNamesFinder.getTableList(stmt);
+                                       for (String table : tables) {
+                                               List<String> Ops = tableOpsMap.get(table);
+                                               if (Ops == null)
+                                                       Ops = new ArrayList<>();
+                                               Ops.add(Operation.SELECT.getOperation());
+                                               tableOpsMap.put(table, Ops);
+                                       }
+                               } else {
+                                       logger.error(EELFLoggerDelegate.errorLogger, "Not recognized sql type");
+                                       tbl = "";
+                               }
+                       }
+               } catch (JSQLParserException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               }
+               return tableOpsMap;
+       }
+
+       public static void main(String[] args) throws SqlParseException {
+               String sqlQuery = "SELECT name, age FROM table1 t1, table2 t2 WHERE t1.id = t2.id";
+               // Map<String, List<String>> tableOpsMap = extractTableFromQuery(sqlQuery);
+               System.out.println(parseSqlQuery(sqlQuery));
+
+               sqlQuery = "SELECT name, age FROM table1, table2 t2 WHERE id = t2.id";
+               // Map<String, List<String>> tableOpsMap = extractTableFromQuery(sqlQuery);
+               System.out.println(parseSqlQuery(sqlQuery));
+
+               sqlQuery = "SELECT name, age FROM table1 t1";
+               // Map<String, List<String>> tableOpsMap = extractTableFromQuery(sqlQuery);
+               System.out.println(parseSqlQuery(sqlQuery));
+
+               sqlQuery = "INSERT INTO Employees (id, name) values ('1','Vikram')";
+               // tableOpsMap = extractTableFromQuery(sqlQuery);
+               // System.out.println(tableOpsMap);
+               System.out.println(parseSqlQuery(sqlQuery));
+
+               sqlQuery = "UPDATE Employees SET id = 1 WHERE id = 2";
+               System.out.println(parseSqlQuery(sqlQuery));
+
+               sqlQuery = "UPDATE Employees SET id = 1";
+               System.out.println(parseSqlQuery(sqlQuery));
+
+               sqlQuery = "UPDATE table1 SET id = 1";
+               System.out.println(parseSqlQuery(sqlQuery));
+
+       }
+
+}
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)