diff options
author | Tschaen, Brendan <ctschaen@att.com> | 2019-04-30 16:17:27 -0400 |
---|---|---|
committer | Tschaen, Brendan <ctschaen@att.com> | 2019-04-30 16:17:27 -0400 |
commit | 04ab8895cde445cb3895d6875e5040921f2a38ca (patch) | |
tree | 73795af3098a25302a73b14307e10e2822384803 /mdbc-server/src/main/java/org | |
parent | 601050a535e916c0ff52826fbe2c61b798c74530 (diff) |
Fall back sql parsing option
If we can't parse the sql query, use basic string analysis
to attempt to find the tables
Change-Id: Ibb81186e1fb768ee2c7c39b11922c99b79bf942d
Issue-ID: MUSIC-391
Signed-off-by: Tschaen, Brendan <ctschaen@att.com>
Diffstat (limited to 'mdbc-server/src/main/java/org')
-rwxr-xr-x | mdbc-server/src/main/java/org/onap/music/mdbc/MdbcConnection.java | 2 | ||||
-rw-r--r-- | mdbc-server/src/main/java/org/onap/music/mdbc/query/QueryProcessor.java | 44 |
2 files changed, 42 insertions, 4 deletions
diff --git a/mdbc-server/src/main/java/org/onap/music/mdbc/MdbcConnection.java b/mdbc-server/src/main/java/org/onap/music/mdbc/MdbcConnection.java index 3db6c3f..cb2df7f 100755 --- a/mdbc-server/src/main/java/org/onap/music/mdbc/MdbcConnection.java +++ b/mdbc-server/src/main/java/org/onap/music/mdbc/MdbcConnection.java @@ -505,7 +505,7 @@ public class MdbcConnection implements Connection { public void preStatementHook(final String sql) throws MDBCServiceException, SQLException { //TODO: verify ownership of keys here //Parse tables from the sql query - Map<String, List<SQLOperation>> tableToInstruction = QueryProcessor.parseSqlQuery(sql); + Map<String, List<SQLOperation>> tableToInstruction = QueryProcessor.parseSqlQuery(sql, table_set); //Check ownership of keys List<Range> queryTables = MDBCUtils.getTables(tableToInstruction); if (this.partition!=null) { 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 index fc41cf6..06ad252 100644 --- 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 @@ -25,7 +25,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; - +import java.util.Set; import org.apache.calcite.avatica.util.Casing; import org.apache.calcite.avatica.util.Quoting; import org.apache.calcite.sql.SqlBasicCall; @@ -73,10 +73,13 @@ public class QueryProcessor { /** * * @param query + * @param tables set of tables found in sql database. This is only used as a cross reference, + * the parser will try to find tables in the query first, regardless of whether they + * are in this set * @return map of table name to {@link org.onap.music.mdbc.query.SQLOperation} * @throws SqlParseException */ - public static Map<String, List<SQLOperation>> parseSqlQuery(String query) throws SQLException { + public static Map<String, List<SQLOperation>> parseSqlQuery(String query, Set<String> tables) throws SQLException { logger.info(EELFLoggerDelegate.applicationLogger, "Parsing query: "+query); query = query.trim(); if (query.endsWith(";")) { @@ -94,7 +97,7 @@ public class QueryProcessor { sqlNode = getSqlParser(query).parseStmt(); } catch (SqlParseException e) { logger.error(EELFLoggerDelegate.errorLogger, "Unable to parse query: " + query +". " + e.getMessage()); - throw new SQLException("Unable to parse query: " + query); + return basicStringParser(query, tables); } SqlBasicVisitor<Void> visitor = new SqlBasicVisitor<Void>() { @@ -209,5 +212,40 @@ public class QueryProcessor { opList.add(op); tableOpsMap.put(identifier.toString(), opList); } + + /** + * Parse the string using basic string methods if parsing library fails + * @param query + * @return + * @throws SQLException + */ + private static Map<String, List<SQLOperation>> basicStringParser(String query, Set<String> tables) throws SQLException { + if (tables==null) { + throw new SQLException("Unable to parse sql query: No tables to look for."); + } + Map<String, List<SQLOperation>> tableOpsMap = new HashMap<>(); + SQLOperation op; + if (query.toUpperCase().startsWith("INSERT")) { + op = SQLOperation.INSERT; + } else if (query.toUpperCase().startsWith("UPDATE")) { + op = SQLOperation.UPDATE; + } else if (query.toUpperCase().startsWith("DELETE")) { + op = SQLOperation.DELETE; + } else if (query.toUpperCase().startsWith("SELECT")) { + op = SQLOperation.SELECT; + } else { + throw new SQLException("Unable to parse sql query: " + query); + } + for (String table: tables) { + if (query.toLowerCase().contains(table.toLowerCase())) { + List<SQLOperation> opList = tableOpsMap.get(table); + if (opList == null) opList = new ArrayList<>(); + opList.add(op); + tableOpsMap.put(table.toString(), opList); + } + } + return tableOpsMap; + } + } |