From: SVN by r. <sv...@ca...> - 2009-02-27 20:13:28
|
Author: roy Date: 2009-02-27 21:13:20 +0100 (Fri, 27 Feb 2009) New Revision: 381 Modified: src/main/java/nl/improved/sqlclient/SQLUtil.java src/main/java/nl/improved/sqlclient/util/SQLParser.java src/main/java/nl/improved/sqlclient/util/SQLPart.java Log: added unit test stuff improved group by and order by tab completion Modified: src/main/java/nl/improved/sqlclient/SQLUtil.java =================================================================== --- src/main/java/nl/improved/sqlclient/SQLUtil.java 2009-02-27 08:10:51 UTC (rev 380) +++ src/main/java/nl/improved/sqlclient/SQLUtil.java 2009-02-27 20:13:20 UTC (rev 381) @@ -19,6 +19,7 @@ import java.util.Arrays; import java.util.ArrayList; import java.util.Iterator; +import nl.improved.sqlclient.util.SQLParser; /** * A SQL Utility class. @@ -133,6 +134,9 @@ * @return tab completion info for the provided command lines. */ public static TabCompletionInfo getTabCompletionInfo(List<? extends CharSequence> commandInfo, Point commandPoint) { + /*if (true) { + return SQLParser.getTabCompletionInfo(commandInfo, commandPoint); + }*/ if (commandInfo.size() == 1 && commandInfo.get(0).length() == 0) { return new TabCompletionInfo(TabCompletionInfo.MatchType.SQL_KEYWORD , Arrays.asList(new String[]{"SELECT", "INSERT INTO", "DELETE FROM", "UPDATE"})); Modified: src/main/java/nl/improved/sqlclient/util/SQLParser.java =================================================================== --- src/main/java/nl/improved/sqlclient/util/SQLParser.java 2009-02-27 08:10:51 UTC (rev 380) +++ src/main/java/nl/improved/sqlclient/util/SQLParser.java 2009-02-27 20:13:20 UTC (rev 381) @@ -199,6 +199,7 @@ String pSubPart = pPart.getPart().toString().substring("SELECT".length()).trim(); int lastIndex = 0; int newIndex; + StringBuffer bestMatch = new StringBuffer(); while ( (newIndex = pSubPart.indexOf(',', lastIndex)) > 0) { String colName = pSubPart.substring(lastIndex, newIndex).trim(); if (colName.indexOf(' ') >=0) { @@ -206,6 +207,12 @@ } if (!possibleMatches.contains(colName)) { possibleMatches.add(colName); + if (colName.indexOf('(') < 0) { + if (bestMatch.length() > 0) { + bestMatch.append(','); + } + bestMatch.append(colName); + } } lastIndex = newIndex+1; } @@ -215,7 +222,16 @@ } if (!possibleMatches.contains(colName) && colName.length() > 0) { possibleMatches.add(colName); + if (colName.indexOf('(') < 0) { + if (bestMatch.length() > 0) { + bestMatch.append(','); + } + bestMatch.append(colName); + } } + if (bestMatch.length() > 0) { + possibleMatches.add(0, bestMatch.toString()); + } } } if (subPart.trim().length() == 0 || subPart.trim().endsWith(",")) { @@ -235,6 +251,9 @@ String subPart = stringPart.substring(stringPart.toUpperCase().indexOf("ORDER BY")+"ORDER BY".length(), charsLeft); List<String> possibleMatches = new ArrayList<String>(); for (SQLPart pPart : parts) { + if (pPart.getSQLType() == SQLPart.SQLType.SELECT) { + possibleMatches.addAll(pPart.getColumnNames()); + } } if (subPart.trim().length() == 0 || subPart.trim().endsWith(",")) { return new TabCompletionInfo(TabCompletionInfo.MatchType.OTHER, possibleMatches); Modified: src/main/java/nl/improved/sqlclient/util/SQLPart.java =================================================================== --- src/main/java/nl/improved/sqlclient/util/SQLPart.java 2009-02-27 08:10:51 UTC (rev 380) +++ src/main/java/nl/improved/sqlclient/util/SQLPart.java 2009-02-27 20:13:20 UTC (rev 381) @@ -47,6 +47,33 @@ return sqlType+": "+ part.toString(); } + public List<String> getColumnNames() { + + if (sqlType == SQLType.SELECT) { + String stringPart = getPart().toString(); + String sub = stringPart.substring(stringPart.toUpperCase().indexOf("SELECT")+"SELECT".length()); + List<String> returnValue = new ArrayList<String>(); + int lastIndex = 0; + int newIndex; + while ( (newIndex = sub.indexOf(',', lastIndex)) > 0) { + String tableName = sub.substring(lastIndex, newIndex).trim(); + if (tableName.indexOf(" ") > 0) { + tableName = tableName.substring(0, tableName.indexOf(" ")).trim(); + } + returnValue.add(tableName); + lastIndex = newIndex+1; + } + String tmp = sub.substring(lastIndex).trim(); + if (tmp.length() > 0) { + if (tmp.indexOf(" ") > 0) { + tmp = tmp.substring(0, tmp.indexOf(" ")).trim(); + } + returnValue.add(tmp); + } + return returnValue; + } + throw new IllegalStateException("Table names are only available for SELECT ("+ sqlType+")"); + } public List<String> getTableNames() { if (sqlType == SQLType.FROM || sqlType == SQLType.UPDATE) { List<String> returnValue = new ArrayList<String>(); @@ -64,7 +91,6 @@ if (tableName.indexOf(" ") > 0) { tableName = tableName.substring(0, tableName.indexOf(" ")).trim(); } - System.err.println("********ADDTN: "+ tableName); returnValue.add(tableName); lastIndex = newIndex+1; } @@ -73,7 +99,6 @@ if (tmp.indexOf(" ") > 0) { tmp = tmp.substring(0, tmp.indexOf(" ")).trim(); } - System.err.println("********ADD: "+ tmp); returnValue.add(tmp); } return returnValue; |
From: SVN by r. <sv...@ca...> - 2009-02-27 21:15:30
|
Author: roy Date: 2009-02-27 22:15:25 +0100 (Fri, 27 Feb 2009) New Revision: 382 Modified: src/main/java/nl/improved/sqlclient/SQLShell.java src/main/java/nl/improved/sqlclient/SQLUtil.java src/main/java/nl/improved/sqlclient/util/SQLParser.java Log: more test more tabcompletion fixes added option -tc [new/old] for tabcompletion switch Modified: src/main/java/nl/improved/sqlclient/SQLShell.java =================================================================== --- src/main/java/nl/improved/sqlclient/SQLShell.java 2009-02-27 20:13:20 UTC (rev 381) +++ src/main/java/nl/improved/sqlclient/SQLShell.java 2009-02-27 21:15:25 UTC (rev 382) @@ -41,6 +41,7 @@ public static final String INPUT = "-i"; public static final String OUTPUT = "-o"; public static final String ENGINE = "-engine"; + public static final String TABCOMPLETION = "-tc"; public static final String ENGINE_CHARVA = "charva"; public static final String ENGINE_JCURSES = "jcurses"; @@ -100,6 +101,18 @@ System.exit(-1); } argsMap.put(args[i], args[i+1]); + } else if (args[i].equals(TABCOMPLETION)) { + if (args.length < i+1) { + System.err.println("Missing type parameter for -tc argument."); + System.err.println("Possible values are 'new' and 'old'"); + System.exit(-1); + } + if (!(args[i+1].equals("new")) && !(args[i+1].equals("old"))) { + System.err.println("Unknown parameter for tabcompletion '"+ args[i+1]+"'"); + System.err.println("Possible values are 'new' and 'new'"); + System.exit(-1); + } + argsMap.put(args[i], args[i+1]); } else { System.err.println("Uknown option: "+ args[i]+"\nAborting..."); System.exit(-1); @@ -186,6 +199,9 @@ } } else { //sqlshellWindow = new SQLShellWindow(); + if (argsMap.containsKey(TABCOMPLETION) && argsMap.get(TABCOMPLETION).equals("new")) { + SQLUtil.USE_V2=true; + } if (!argsMap.containsKey(ENGINE) || argsMap.get(ENGINE).equals(ENGINE_CHARVA)) { try { sqlshellWindow = new CharvaSQLShellWindow(); Modified: src/main/java/nl/improved/sqlclient/SQLUtil.java =================================================================== --- src/main/java/nl/improved/sqlclient/SQLUtil.java 2009-02-27 20:13:20 UTC (rev 381) +++ src/main/java/nl/improved/sqlclient/SQLUtil.java 2009-02-27 21:15:25 UTC (rev 382) @@ -54,6 +54,7 @@ private static final String VALUE = "('.*'|[0-9]+|"+VAR+")"; public static List<String> KEYWORDS = Arrays.asList(new String[]{"SELECT", "UPDATE", "FROM", "WHERE", "VALUES", "SET", "INSERT", "INTO", "DELETE", "GROUP BY", "ORDER BY", "DESC"}); + public static boolean USE_V2 = false; /** * Private constructor. @@ -134,9 +135,9 @@ * @return tab completion info for the provided command lines. */ public static TabCompletionInfo getTabCompletionInfo(List<? extends CharSequence> commandInfo, Point commandPoint) { - /*if (true) { + if (USE_V2) { return SQLParser.getTabCompletionInfo(commandInfo, commandPoint); - }*/ + } if (commandInfo.size() == 1 && commandInfo.get(0).length() == 0) { return new TabCompletionInfo(TabCompletionInfo.MatchType.SQL_KEYWORD , Arrays.asList(new String[]{"SELECT", "INSERT INTO", "DELETE FROM", "UPDATE"})); Modified: src/main/java/nl/improved/sqlclient/util/SQLParser.java =================================================================== --- src/main/java/nl/improved/sqlclient/util/SQLParser.java 2009-02-27 20:13:20 UTC (rev 381) +++ src/main/java/nl/improved/sqlclient/util/SQLParser.java 2009-02-27 21:15:25 UTC (rev 382) @@ -58,6 +58,10 @@ if (y == commandPoint.y) { position+=commandPoint.x; } + if (buf.length() > 0) { + buf.append(' '); + position++; + } buf.append(seq); } return getTabCompletionInfo(buf, position); @@ -120,6 +124,10 @@ sqlType = SQLPart.SQLType.FROM; if (sql.matches("[\\s]*FROM.*WHERE.*")) { end = sql.indexOf("WHERE"); + } else if (sql.matches("[\\s]*FROM.*GROUP BY.*")) { + end = sql.indexOf("GROUP BY"); + } else if (sql.matches("[\\s]*FROM.*ORDER BY.*")) { + end = sql.indexOf("ORDER BY"); } } else if (sql.matches("[\\s]*WHERE.*")) { sqlType = SQLPart.SQLType.WHERE; @@ -135,6 +143,7 @@ } } else if (sql.matches("[\\s]*GROUP BY.*")) { sqlType = SQLPart.SQLType.GROUPBY; + end = sqlSequence.length(); } else if (sql.matches("[\\s]*DELETE.*")) { sqlType = SQLPart.SQLType.DELETE; if (sql.matches("[\\s]*DELETE FROM.*")) { @@ -191,7 +200,7 @@ } private static TabCompletionInfo getGroupByTabCompletionInfo(SQLPart part, List<SQLPart> parts, int charsLeft) { - String stringPart = part.getPart().toString(); + String stringPart = part.getPart().toString().substring(0,charsLeft); String subPart = stringPart.substring(stringPart.toUpperCase().indexOf("GROUP BY")+"GROUP BY".length(), charsLeft); List<String> possibleMatches = new ArrayList<String>(); for (SQLPart pPart : parts) { @@ -229,7 +238,7 @@ bestMatch.append(colName); } } - if (bestMatch.length() > 0) { + if (bestMatch.length() > 0 && !possibleMatches.contains(bestMatch)) { possibleMatches.add(0, bestMatch.toString()); } } |
From: SVN by r. <sv...@ca...> - 2009-03-31 19:38:36
|
Author: roy Date: 2009-03-31 21:38:19 +0200 (Tue, 31 Mar 2009) New Revision: 398 Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java src/main/java/nl/improved/sqlclient/util/SQLParser.java Log: tab completion fixes in select Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java =================================================================== --- src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2009-03-26 18:49:51 UTC (rev 397) +++ src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2009-03-31 19:38:19 UTC (rev 398) @@ -60,7 +60,9 @@ import nl.improved.sqlclient.history.HistoryPersister; import nl.improved.sqlclient.history.exception.CouldNotLoadHistoryException; import nl.improved.sqlclient.history.exception.CouldNotSaveHistoryException; +import nl.improved.sqlclient.util.Function; import nl.improved.sqlclient.util.LimitedArrayList; +import nl.improved.sqlclient.util.oracle.Functions; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -727,6 +729,7 @@ } CharSequence newText; if (inp.getCharacter() == '\t') { + new Throwable().printStackTrace(); try { Point cursorPosition = screen.getCursorPosition(); newText = getTabCompletion(commandLines, cursorPosition); @@ -1017,6 +1020,16 @@ return nullToEmpty(findMatch(getTableNames(), info.getStart())); } if (info.getMatchType() == TabCompletionInfo.MatchType.COLUMN_NAMES) { + if (info.getStart().length() > 0) { + try { + List<Function> functions = Functions.getFunctionMatches(getConnection(), info.getStart()); + if (functions.size() > 0) { + debug("Found function matches: "+ functions); + } + } catch (SQLException ex) { + Logger.getLogger(AbstractSQLShellWindow.class.getName()).log(Level.SEVERE, null, ex); + } + } return nullToEmpty(findMatch(getColumnNames(info.getPossibleMatches()), info.getStart())); } if (info.getMatchType() == TabCompletionInfo.MatchType.OTHER) { Modified: src/main/java/nl/improved/sqlclient/util/SQLParser.java =================================================================== --- src/main/java/nl/improved/sqlclient/util/SQLParser.java 2009-03-26 18:49:51 UTC (rev 397) +++ src/main/java/nl/improved/sqlclient/util/SQLParser.java 2009-03-31 19:38:19 UTC (rev 398) @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import nl.improved.sqlclient.Point; import nl.improved.sqlclient.SQLCommand; @@ -311,11 +312,12 @@ return new TabCompletionInfo(TabCompletionInfo.MatchType.COLUMN_NAMES, getTableNames(parts), end); } - private static TabCompletionInfo getSelectTabCompletionInfo(SQLPart part, List<SQLPart> parts, int position) { + private static TabCompletionInfo getSelectTabCompletionInfo(SQLPart part, List<SQLPart> parts, int charsLeft) { // if it looks like: // SELECT x // return "FROM" - String startOfCommand = part.getPart().toString(); + String stringPart = part.getPart().toString(); + String startOfCommand = stringPart.substring(0, charsLeft); String upCommand = startOfCommand.toUpperCase(); if (upCommand.equals("SELECT")) { return new TabCompletionInfo(TabCompletionInfo.MatchType.OTHER @@ -347,6 +349,11 @@ , Arrays.asList(new String[]{tableName.substring(0,tableName.indexOf('.'))}) , tableName.substring(tableName.indexOf('.')+1)); } + List<String> tableNames = getTableNames(parts); + if (tableNames.size() > 0) { + return new TabCompletionInfo(TabCompletionInfo.MatchType.COLUMN_NAMES + , tableNames, tableName); + } return new TabCompletionInfo(TabCompletionInfo.MatchType.TABLE_NAMES , Arrays.asList(new String[0]), tableName); } @@ -413,6 +420,9 @@ tableNamesSqlPart = tmpPart; } } + if (tableNamesSqlPart == null) { + return Collections.emptyList(); + } return tableNamesSqlPart.getTableNames(); } |