ZEPPELIN-215: resolve delimiter bug

This commit is contained in:
tzolov 2015-08-11 13:55:18 +02:00
parent 0a3910d673
commit 4dd2a36eec
3 changed files with 30 additions and 11 deletions

View file

@ -223,9 +223,10 @@ public class PostgreSqlInterpreter extends Interpreter {
int updateCount = currentStatement.getUpdateCount();
msg.append(UPDATE_COUNT_HEADER).append(NEWLINE);
msg.append(updateCount).append(NEWLINE);
// update the database metadata completions (beta)
//sqlCompleter.updateMetaData(getJdbcConnection());
// In case of update event (e.g. isResultSetAvailable = false) update the completion
// meta-data.
// sqlCompleter.updateMetaData(getJdbcConnection());
}
} finally {
try {

View file

@ -17,7 +17,6 @@ package org.apache.zeppelin.postgresql;
/*
* This source file is based on code taken from SQLLine 1.0.2 See SQLLine notice in LICENSE
*/
import static java.lang.Character.isWhitespace;
import static org.apache.commons.lang.StringUtils.isBlank;
import java.io.BufferedReader;
@ -32,6 +31,7 @@ import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
import java.util.regex.Pattern;
import jline.console.completer.ArgumentCompleter.ArgumentList;
import jline.console.completer.ArgumentCompleter.WhitespaceArgumentDelimiter;
@ -53,14 +53,16 @@ public class SqlCompleter extends StringsCompleter {
* Delimiter that can split SQL statement in keyword list
*/
private WhitespaceArgumentDelimiter sqlDelimiter = new WhitespaceArgumentDelimiter() {
private Pattern pattern = Pattern.compile("[\\.:;,]");
@Override
public boolean isDelimiterChar(CharSequence buffer, int pos) {
return super.isDelimiterChar(buffer, pos) || (buffer.charAt(pos) == '.')
|| (buffer.charAt(pos) == ';') || (buffer.charAt(pos) == ':');
return pattern.matcher("" + buffer.charAt(pos)).matches()
|| super.isDelimiterChar(buffer, pos);
}
};
public SqlCompleter(Set<String> completions) {
super(completions);
}
@ -81,7 +83,7 @@ public class SqlCompleter extends StringsCompleter {
if (isBlank(argument)) {
int argumentsCount = argumentList.getArguments().length;
if (argumentsCount <= 0 || isWhitespace(buffer.charAt(buffer.length() - 1))) {
if (argumentsCount <= 0 || sqlDelimiter.isDelimiterChar(buffer, buffer.length() - 1)) {
return -1;
}
argument = argumentList.getArguments()[argumentsCount - 1];
@ -228,4 +230,9 @@ public class SqlCompleter extends StringsCompleter {
return new HashSet<String>();
}
}
// test purpose only
WhitespaceArgumentDelimiter getSqlDelimiter() {
return this.sqlDelimiter;
}
}

View file

@ -16,6 +16,7 @@ package org.apache.zeppelin.postgresql;
import static com.google.common.collect.Sets.newHashSet;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.sql.SQLException;
@ -41,9 +42,11 @@ public class SqlCompleterTest extends BasicJDBCTestCaseAdapter {
private CompleterTester tester;
private SqlCompleter sqlCompleter;
@Before
public void beforeTest() throws IOException, SQLException {
SqlCompleter sqlCompleter =
sqlCompleter =
new SqlCompleter(SqlCompleter.getSqlCompleterTokens(getJDBCMockObjectFactory()
.getMockConnection(), false));
tester = new CompleterTester(sqlCompleter);
@ -91,13 +94,21 @@ public class SqlCompleterTest extends BasicJDBCTestCaseAdapter {
}
@Test
public void testCommaDelimiter() {
public void testDotDelimiter() {
String buffer = " order.select ";
tester.buffer(buffer).from(0).to(7).expect(newHashSet("order ")).test();
tester.buffer(buffer).from(4).to(7).expect(newHashSet("order ")).test();
tester.buffer(buffer).from(8).to(14).expect(newHashSet("select ")).test();
tester.buffer(buffer).from(15).to(17).expect(EMPTY).test();
}
@Test
public void testSqlDelimiterCharacters() {
assertTrue(sqlCompleter.getSqlDelimiter().isDelimiterChar("r.", 1));
assertTrue(sqlCompleter.getSqlDelimiter().isDelimiterChar("SS;", 2));
assertTrue(sqlCompleter.getSqlDelimiter().isDelimiterChar(":", 0));
assertTrue(sqlCompleter.getSqlDelimiter().isDelimiterChar("ttt,", 3));
}
public class CompleterTester {
private Completer completer;