From: SVN by r. <sv...@ca...> - 2010-01-27 08:01:08
|
Author: roy Date: 2010-01-27 09:00:57 +0100 (Wed, 27 Jan 2010) New Revision: 463 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: fix group by tab completion when using to_char(date, 'format') Modified: src/main/java/nl/improved/sqlclient/util/SQLParser.java =================================================================== --- src/main/java/nl/improved/sqlclient/util/SQLParser.java 2010-01-24 14:35:18 UTC (rev 462) +++ src/main/java/nl/improved/sqlclient/util/SQLParser.java 2010-01-27 08:00:57 UTC (rev 463) @@ -220,42 +220,21 @@ List<String> possibleMatches = new ArrayList<String>(); for (SQLPart pPart : parts) { if (pPart.getSQLType() == SQLPart.SQLType.SELECT) { - 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) { - colName = colName.substring(colName.lastIndexOf(' ')); - } + StringBuffer allColumns = new StringBuffer(); + for (String colName : pPart.getColumnNames()) { if (!possibleMatches.contains(colName)) { - possibleMatches.add(colName); if (colName.indexOf("max") < 0 && colName.indexOf("min") < 0 && colName.indexOf("count") < 0) { - if (bestMatch.length() > 0) { - bestMatch.append(','); + possibleMatches.add(colName); + if (allColumns.length() > 0) { + allColumns.append(", "); } - bestMatch.append(colName); + allColumns.append(colName); } } - lastIndex = newIndex+1; } - String colName = pSubPart.substring(lastIndex).trim(); - if (colName.indexOf(' ') >=0) { // alias - colName = colName.substring(colName.lastIndexOf(' ')); + if (allColumns.length() > 0) { + possibleMatches.add(allColumns.toString()); } - if (!possibleMatches.contains(colName) && colName.length() > 0) { - possibleMatches.add(colName); - if (colName.indexOf("max") < 0 && colName.indexOf("min") < 0 && colName.indexOf("count") < 0) { - if (bestMatch.length() > 0) { - bestMatch.append(','); - } - bestMatch.append(colName); - } - } - if (bestMatch.length() > 0 && !possibleMatches.contains(bestMatch)) { - possibleMatches.add(0, bestMatch.toString()); - } } } if (subPart.trim().length() == 0 || subPart.trim().endsWith(",")) { Modified: src/main/java/nl/improved/sqlclient/util/SQLPart.java =================================================================== --- src/main/java/nl/improved/sqlclient/util/SQLPart.java 2010-01-24 14:35:18 UTC (rev 462) +++ src/main/java/nl/improved/sqlclient/util/SQLPart.java 2010-01-27 08:00:57 UTC (rev 463) @@ -49,7 +49,47 @@ } public List<String> getColumnNames() { + if (sqlType != SQLType.SELECT) { + throw new IllegalStateException("Table names are only available for SELECT ("+ sqlType+")"); + } + List<String> returnValue = new ArrayList<String>(); + int openQuotes = 0; + int openRondeHaakjes = 0; + String stringPart = getPart().toString(); + char[] sub = stringPart.substring(stringPart.toUpperCase().indexOf("SELECT")+"SELECT".length()).toCharArray(); + + StringBuffer colName = new StringBuffer(); + for (char c : sub) { + if (c == '\'') { + openQuotes++; + } else if (c == '(') { + if (openQuotes %2 == 0) { // don't count ( in strings + openRondeHaakjes++; + } + } else if (c == ')') { + if (openQuotes %2 == 0) { // don't count ( in strings + openRondeHaakjes--; + } + } + if (c == ',' && openQuotes % 2 == 0 && openRondeHaakjes % 2 == 0) { + String col = colName.toString().trim(); + // TODO cut off alias + returnValue.add(col); + colName = new StringBuffer(); + } else { + colName.append(c); + } + } + if (colName.length() > 0) { + returnValue.add(colName.toString().trim()); // TODO cut off alias + + } + return returnValue; + + } + public List<String> _getColumnNames() { + if (sqlType == SQLType.SELECT) { String stringPart = getPart().toString(); String sub = stringPart.substring(stringPart.toUpperCase().indexOf("SELECT")+"SELECT".length()); Modified: src/test/java/nl/improved/sqlclient/util/SQLParserTest.java =================================================================== --- src/test/java/nl/improved/sqlclient/util/SQLParserTest.java 2010-01-24 14:35:18 UTC (rev 462) +++ src/test/java/nl/improved/sqlclient/util/SQLParserTest.java 2010-01-27 08:00:57 UTC (rev 463) @@ -23,6 +23,31 @@ } + public void testGetColumnNames() { + SQLPart part =new SQLPart(SQLPart.SQLType.SELECT, "SELECT a,b,c"); + List<String> columnNames = part.getColumnNames(); + assertEquals(columnNames.toString(), 3, columnNames.size()); + assertTrue(columnNames.contains("a")); + assertTrue(columnNames.contains("b")); + assertTrue(columnNames.contains("c")); + + part =new SQLPart(SQLPart.SQLType.SELECT, "SELECT a,b,count(*)"); + columnNames = part.getColumnNames(); + assertEquals(columnNames.toString(), 3, columnNames.size()); + assertTrue(columnNames.contains("a")); + assertTrue(columnNames.contains("b")); + assertTrue(columnNames.contains("count(*)")); + + + part =new SQLPart(SQLPart.SQLType.SELECT, "SELECT to_char(mydate, 'yyyymm'),b,count(*)"); + columnNames = part.getColumnNames(); + assertEquals(columnNames.toString(), 3, columnNames.size()); + assertTrue(columnNames.contains("to_char(mydate, 'yyyymm')")); + assertTrue(columnNames.contains("b")); + assertTrue(columnNames.contains("count(*)")); + + + } /** * Test of parse method, of class SQLParser. */ @@ -645,11 +670,10 @@ assertNotNull(info); assertEquals(TabCompletionInfo.MatchType.OTHER, info.getMatchType()); List<String> matches = info.getPossibleMatches(); - assertEquals(4, matches.size()); + assertEquals(matches.toString(), 3, matches.size()); assertTrue(matches.contains("c1")); assertTrue(matches.contains("c2")); - assertTrue(matches.contains("count(*)")); - assertTrue(matches.contains("c1,c2")); + assertTrue(matches.contains("c1, c2")); assertEquals("", info.getStart()); @@ -708,6 +732,18 @@ matches = info.getPossibleMatches(); assertTrue(matches.contains("c1")); assertEquals("", info.getStart()); + + sqlCommand = Arrays.asList(new String[]{"SELECT to_char(mydate, 'yyyymm') , c2 FROM A,B", "GROUP BY "}); + cursorPos = new Point(sqlCommand.get(1).length(),1); + info = SQLParser.getTabCompletionInfo(sqlCommand, cursorPos); + assertNotNull(info); + assertEquals(TabCompletionInfo.MatchType.OTHER, info.getMatchType()); + matches = info.getPossibleMatches(); + assertEquals(matches.toString(), 3, matches.size()); + assertTrue(matches.contains("c2")); + assertTrue(matches.contains("to_char(mydate, 'yyyymm')")); + assertTrue(matches.contains("to_char(mydate, 'yyyymm'), c2")); + assertEquals("", info.getStart()); } public void testOrderBy() { |