From: SVN by r. <sv...@ca...> - 2009-03-01 14:23:02
|
Author: roy Date: 2009-03-01 15:22:52 +0100 (Sun, 01 Mar 2009) New Revision: 387 Modified: src/main/java/nl/improved/sqlclient/util/SQLParser.java src/main/java/nl/improved/sqlclient/util/SQLPart.java src/test/java/nl/improved/sqlclient/util/SQLParserTest.java Log: added more test fix where tab completion when using table alias names Modified: src/main/java/nl/improved/sqlclient/util/SQLParser.java =================================================================== --- src/main/java/nl/improved/sqlclient/util/SQLParser.java 2009-02-28 13:42:08 UTC (rev 386) +++ src/main/java/nl/improved/sqlclient/util/SQLParser.java 2009-03-01 14:22:52 UTC (rev 387) @@ -350,6 +350,14 @@ , Arrays.asList(new String[]{",", "WHERE"})); // TODO END } + private static String getTableName(String alias, List<SQLPart> parts) { + for (SQLPart tmpPart : parts) { + if (tmpPart.getSQLType() == SQLPart.SQLType.FROM || tmpPart.getSQLType() == SQLPart.SQLType.UPDATE) { + return tmpPart.getTableName(alias); + } + } + return alias; + } private static List<String> getTableNames(List<SQLPart> parts) { SQLPart fromSqlPart = null; for (SQLPart tmpPart : parts) { @@ -399,7 +407,7 @@ lastBreakIndex = 0; } List tableNames = (lastIndex > lastBreakIndex) && lastBreakIndex >=0 ? - Arrays.asList(new String[]{tmpCommand.substring(lastBreakIndex,lastIndex).trim()}) : + Arrays.asList(new String[]{getTableName(tmpCommand.substring(lastBreakIndex,lastIndex).trim(), parts)}) : getTableNames(parts); return new TabCompletionInfo(TabCompletionInfo.MatchType.COLUMN_NAMES , tableNames, end); Modified: src/main/java/nl/improved/sqlclient/util/SQLPart.java =================================================================== --- src/main/java/nl/improved/sqlclient/util/SQLPart.java 2009-02-28 13:42:08 UTC (rev 386) +++ src/main/java/nl/improved/sqlclient/util/SQLPart.java 2009-03-01 14:22:52 UTC (rev 387) @@ -74,6 +74,37 @@ } throw new IllegalStateException("Table names are only available for SELECT ("+ sqlType+")"); } + public String getTableName(String alias) { + if (sqlType == SQLType.FROM || sqlType == SQLType.UPDATE) { + String stringPart = getPart().toString(); + String sub; + if (sqlType == SQLType.FROM) { + sub = stringPart.substring(stringPart.toUpperCase().indexOf("FROM")+"FROM".length()); + } else { + sub = stringPart.substring(stringPart.toUpperCase().indexOf("UPDATE")+"UPDATE".length()); + } + int lastIndex = 0; + int newIndex; + while ( (newIndex = sub.indexOf(',', lastIndex)) > 0) { + String tableName = sub.substring(lastIndex, newIndex).trim(); + if (tableName.indexOf(" ") > 0 && tableName.endsWith(" "+alias)) { + tableName = tableName.substring(0, tableName.indexOf(" ")).trim(); + return tableName; + } + lastIndex = newIndex+1; + } + String tmp = sub.substring(lastIndex).trim(); + if (tmp.length() > 0) { + if (tmp.indexOf(" ") > 0 && tmp.endsWith(" "+alias)) { + tmp = tmp.substring(0, tmp.indexOf(" ")).trim(); + return tmp; + } + } + return alias; + } + throw new IllegalStateException("Table names are only available for FROM,UPDATE ("+ sqlType+")"); + } + public List<String> getTableNames() { if (sqlType == SQLType.FROM || sqlType == SQLType.UPDATE) { List<String> returnValue = new ArrayList<String>(); @@ -106,4 +137,4 @@ throw new IllegalStateException("Table names are only available for FROM,UPDATE ("+ sqlType+")"); } -} \ No newline at end of file +} Modified: src/test/java/nl/improved/sqlclient/util/SQLParserTest.java =================================================================== --- src/test/java/nl/improved/sqlclient/util/SQLParserTest.java 2009-02-28 13:42:08 UTC (rev 386) +++ src/test/java/nl/improved/sqlclient/util/SQLParserTest.java 2009-03-01 14:22:52 UTC (rev 387) @@ -658,6 +658,36 @@ assertEquals(1, matches.size()); assertEquals("b", info.getStart()); assertTrue("Table name should match 'mytable', but was " + matches.get(0), matches.contains("mytable")); + + sqlCommand = Arrays.asList(new String[]{"select * from a where b"}); + cursorPos = new Point(sqlCommand.get(0).length(),0); + info = SQLParser.getTabCompletionInfo(sqlCommand, cursorPos); + assertNotNull(info); + assertEquals(TabCompletionInfo.MatchType.COLUMN_NAMES, info.getMatchType()); + matches = info.getPossibleMatches(); + assertEquals(1, matches.size()); + assertEquals("b", info.getStart()); + assertTrue("Table name should match 'a', but was " + matches.get(0), matches.contains("a")); + + sqlCommand = Arrays.asList(new String[]{"select * from testtable a where b"}); + cursorPos = new Point(sqlCommand.get(0).length(),0); + info = SQLParser.getTabCompletionInfo(sqlCommand, cursorPos); + assertNotNull(info); + assertEquals(TabCompletionInfo.MatchType.COLUMN_NAMES, info.getMatchType()); + matches = info.getPossibleMatches(); + assertEquals(1, matches.size()); + assertEquals("b", info.getStart()); + assertTrue("Table name should match 'testtable', but was " + matches.get(0), matches.contains("testtable")); + + sqlCommand = Arrays.asList(new String[]{"select * from testtable a where a.b"}); + cursorPos = new Point(sqlCommand.get(0).length(),0); + info = SQLParser.getTabCompletionInfo(sqlCommand, cursorPos); + assertNotNull(info); + assertEquals(TabCompletionInfo.MatchType.COLUMN_NAMES, info.getMatchType()); + matches = info.getPossibleMatches(); + assertEquals(1, matches.size()); + assertEquals("b", info.getStart()); + assertTrue("Table name should match 'testtable', but was " + matches.get(0), matches.contains("testtable")); } } |