|
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"));
}
}
|