|
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() {
|