You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by mo...@apache.org on 2017/04/17 05:18:42 UTC
[1/3] zeppelin git commit: [ZEPPELIN-2297] improvements to jdbc
autocompleter
Repository: zeppelin
Updated Branches:
refs/heads/master 775607f10 -> 4d398ef2a
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterResourcePool.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterResourcePool.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterResourcePool.java
index 4321e22..c4ff6ab 100644
--- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterResourcePool.java
+++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterResourcePool.java
@@ -121,7 +121,8 @@ public class MockInterpreterResourcePool extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-server/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java b/zeppelin-server/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java
index b8343c0..1b1306a 100644
--- a/zeppelin-server/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java
+++ b/zeppelin-server/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java
@@ -68,7 +68,8 @@ public class MockInterpreter1 extends Interpreter{
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
index 6a9920a..a453f16 100644
--- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
+++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
@@ -640,6 +640,19 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat
var remoteCompleter = {
getCompletions: function(editor, session, pos, prefix, callback) {
+ var langTools = ace.require('ace/ext/language_tools');
+ var defaultKeywords = new Set();
+ var getDefaultKeywords = function(err, completions) {
+ if (completions !== undefined) {
+ completions.forEach(function(c) {
+ defaultKeywords.add(c.value);
+ });
+ }
+ }
+ if (langTools.keyWordCompleter !== undefined) {
+ langTools.keyWordCompleter.getCompletions(editor, session, pos, prefix, getDefaultKeywords);
+ }
+
if (!editor.isFocused()) {
return;
}
@@ -650,13 +663,29 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat
websocketMsgSrv.completion($scope.paragraph.id, buf, pos);
$scope.$on('completionList', function(event, data) {
+ var computeCaption = function(value, meta) {
+ var metaLength = meta !== undefined ? meta.length : 0;
+ var length = 42;
+ var whitespaceLength = 3;
+ var ellipses = '...';
+ var maxLengthCaption = length - metaLength - whitespaceLength - ellipses.length;
+ if (value !== undefined && value.length > maxLengthCaption) {
+ return value.substr(0, maxLengthCaption) + ellipses;
+ }
+ return value;
+ }
if (data.completions) {
var completions = [];
for (var c in data.completions) {
var v = data.completions[c];
+ if (v.meta !== undefined && v.meta === 'keyword' && defaultKeywords.has(v.value.trim())) {
+ continue;
+ }
completions.push({
name: v.name,
value: v.value,
+ meta: v.meta,
+ caption: computeCaption(v.value, v.meta),
score: 300
});
}
@@ -842,7 +871,7 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat
};
var getInterpreterName = function(paragraphText) {
- var intpNameRegexp = /^\s*%(.+?)\s/g;
+ var intpNameRegexp = /^\s*%(.+?)(\s|\()/g;
var match = intpNameRegexp.exec(paragraphText);
if (match) {
return match[1].trim();
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java
index 894fd19..78a0e8d 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java
@@ -20,6 +20,7 @@ package org.apache.zeppelin.notebook;
import com.google.common.collect.Maps;
import com.google.common.base.Strings;
import org.apache.commons.lang.StringUtils;
+import org.apache.zeppelin.completer.CompletionType;
import org.apache.zeppelin.display.AngularObject;
import org.apache.zeppelin.display.AngularObjectRegistry;
import org.apache.zeppelin.helium.HeliumPackage;
@@ -267,10 +268,11 @@ public class Paragraph extends Job implements Serializable, Cloneable {
if (intInfo.size() > 1) {
for (InterpreterInfo info : intInfo) {
String name = intp.getName() + "." + info.getName();
- completion.add(new InterpreterCompletion(name, name));
+ completion.add(new InterpreterCompletion(name, name, CompletionType.setting.name()));
}
} else {
- completion.add(new InterpreterCompletion(intp.getName(), intp.getName()));
+ completion.add(new InterpreterCompletion(intp.getName(), intp.getName(),
+ CompletionType.setting.name()));
}
}
return completion;
@@ -297,7 +299,9 @@ public class Paragraph extends Job implements Serializable, Cloneable {
return null;
}
- List completion = repl.completion(body, cursor);
+ InterpreterContext interpreterContext = getInterpreterContextWithoutRunner(null);
+
+ List completion = repl.completion(body, cursor, interpreterContext);
return completion;
}
@@ -533,7 +537,9 @@ public class Paragraph extends Job implements Serializable, Cloneable {
final Paragraph self = this;
Credentials credentials = note.getCredentials();
- if (authenticationInfo != null) {
+ setAuthenticationInfo(new AuthenticationInfo(getUser()));
+
+ if (authenticationInfo.getUser() != null) {
UserCredentials userCredentials =
credentials.getUserCredentials(authenticationInfo.getUser());
authenticationInfo.setUserCredentials(userCredentials);
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java
index e462f72..b16e937 100644
--- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java
+++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java
@@ -98,7 +98,8 @@ Map<String, Object> vars = new HashMap<>();
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter11.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter11.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter11.java
index 58200d8..5b9e802 100644
--- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter11.java
+++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter11.java
@@ -76,7 +76,8 @@ public class MockInterpreter11 extends Interpreter{
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter2.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter2.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter2.java
index 93f99ae..7a52f7d 100644
--- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter2.java
+++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter2.java
@@ -97,7 +97,8 @@ public class MockInterpreter2 extends Interpreter{
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
}
[2/3] zeppelin git commit: [ZEPPELIN-2297] improvements to jdbc
autocompleter
Posted by mo...@apache.org.
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/jdbc/src/test/java/org/apache/zeppelin/jdbc/SqlCompleterTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/zeppelin/jdbc/SqlCompleterTest.java b/jdbc/src/test/java/org/apache/zeppelin/jdbc/SqlCompleterTest.java
index 567e975..999f7de 100644
--- a/jdbc/src/test/java/org/apache/zeppelin/jdbc/SqlCompleterTest.java
+++ b/jdbc/src/test/java/org/apache/zeppelin/jdbc/SqlCompleterTest.java
@@ -14,18 +14,26 @@
*/
package org.apache.zeppelin.jdbc;
-import com.google.common.base.Joiner;
-import com.mockrunner.jdbc.BasicJDBCTestCaseAdapter;
-import jline.console.completer.ArgumentCompleter;
-import jline.console.completer.Completer;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.zeppelin.completer.CompletionType;
+import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.IOException;
-import java.sql.SQLException;
-import java.util.*;
+import com.google.common.base.Joiner;
+import jline.console.completer.ArgumentCompleter;
import static com.google.common.collect.Sets.newHashSet;
import static org.junit.Assert.assertEquals;
@@ -34,18 +42,18 @@ import static org.junit.Assert.assertTrue;
/**
* SQL completer unit tests
*/
-public class SqlCompleterTest extends BasicJDBCTestCaseAdapter {
+public class SqlCompleterTest {
public class CompleterTester {
- private Completer completer;
+ private SqlCompleter completer;
private String buffer;
private int fromCursor;
private int toCursor;
- private Set<String> expectedCompletions;
+ private Set<InterpreterCompletion> expectedCompletions;
- public CompleterTester(Completer completer) {
+ public CompleterTester(SqlCompleter completer) {
this.completer = completer;
}
@@ -64,7 +72,7 @@ public class SqlCompleterTest extends BasicJDBCTestCaseAdapter {
return this;
}
- public CompleterTester expect(Set<String> expectedCompletions) {
+ public CompleterTester expect(Set<InterpreterCompletion> expectedCompletions) {
this.expectedCompletions = expectedCompletions;
return this;
}
@@ -75,9 +83,13 @@ public class SqlCompleterTest extends BasicJDBCTestCaseAdapter {
}
}
- private void expectedCompletions(String buffer, int cursor, Set<String> expected) {
+ private void expectedCompletions(String buffer, int cursor,
+ Set<InterpreterCompletion> expected) {
+ if (StringUtils.isNotEmpty(buffer) && buffer.length() > cursor) {
+ buffer = buffer.substring(0, cursor + 1);
+ }
- ArrayList<CharSequence> candidates = new ArrayList<>();
+ List<InterpreterCompletion> candidates = new ArrayList<>();
completer.complete(buffer, cursor, candidates);
@@ -85,11 +97,15 @@ public class SqlCompleterTest extends BasicJDBCTestCaseAdapter {
logger.info(explain);
- assertEquals("Buffer [" + buffer.replace(" ", ".") + "] and Cursor[" + cursor + "] "
- + explain, expected, newHashSet(candidates));
+ Assert.assertEquals("Buffer [" + buffer.replace(" ", ".") + "] and Cursor[" + cursor + "] "
+ + explain, expected, newHashSet(candidates));
}
- private String explain(String buffer, int cursor, ArrayList<CharSequence> candidates) {
+ private String explain(String buffer, int cursor, List<InterpreterCompletion> candidates) {
+ List<String> cndidateStrings = new ArrayList<>();
+ for (InterpreterCompletion candidate : candidates) {
+ cndidateStrings.add(candidate.getValue());
+ }
StringBuffer sb = new StringBuffer();
for (int i = 0; i <= Math.max(cursor, buffer.length()); i++) {
@@ -109,7 +125,7 @@ public class SqlCompleterTest extends BasicJDBCTestCaseAdapter {
sb.append(")");
}
}
- sb.append(" >> [").append(Joiner.on(",").join(candidates)).append("]");
+ sb.append(" >> [").append(Joiner.on(",").join(cndidateStrings)).append("]");
return sb.toString();
}
@@ -122,7 +138,7 @@ public class SqlCompleterTest extends BasicJDBCTestCaseAdapter {
private CompleterTester tester;
private ArgumentCompleter.WhitespaceArgumentDelimiter delimiter =
- new ArgumentCompleter.WhitespaceArgumentDelimiter();
+ new ArgumentCompleter.WhitespaceArgumentDelimiter();
private SqlCompleter sqlCompleter = new SqlCompleter();
@@ -178,7 +194,7 @@ public class SqlCompleterTest extends BasicJDBCTestCaseAdapter {
}
@Test
- public void testFindAliasesInSQL_Simple(){
+ public void testFindAliasesInSQL_Simple() {
String sql = "select * from prod_emart.financial_account a";
Map<String, String> res = sqlCompleter.findAliasesInSQL(delimiter.delimit(sql, 0).getArguments());
assertEquals(1, res.size());
@@ -186,7 +202,7 @@ public class SqlCompleterTest extends BasicJDBCTestCaseAdapter {
}
@Test
- public void testFindAliasesInSQL_Two(){
+ public void testFindAliasesInSQL_Two() {
String sql = "select * from prod_dds.financial_account a, prod_dds.customer b";
Map<String, String> res = sqlCompleter.findAliasesInSQL(sqlCompleter.getSqlDelimiter().delimit(sql, 0).getArguments());
assertEquals(2, res.size());
@@ -195,7 +211,7 @@ public class SqlCompleterTest extends BasicJDBCTestCaseAdapter {
}
@Test
- public void testFindAliasesInSQL_WrongTables(){
+ public void testFindAliasesInSQL_WrongTables() {
String sql = "select * from prod_ddsxx.financial_account a, prod_dds.customerxx b";
Map<String, String> res = sqlCompleter.findAliasesInSQL(sqlCompleter.getSqlDelimiter().delimit(sql, 0).getArguments());
assertEquals(0, res.size());
@@ -205,116 +221,145 @@ public class SqlCompleterTest extends BasicJDBCTestCaseAdapter {
public void testCompleteName_Empty() {
String buffer = "";
int cursor = 0;
- List<CharSequence> candidates = new ArrayList<>();
+ List<InterpreterCompletion> candidates = new ArrayList<>();
Map<String, String> aliases = new HashMap<>();
- sqlCompleter.completeName(buffer, cursor, candidates, aliases, false);
- assertEquals(9, candidates.size());
- assertTrue(candidates.contains("prod_dds"));
- assertTrue(candidates.contains("prod_emart"));
- assertTrue(candidates.contains("SUM"));
- assertTrue(candidates.contains("SUBSTRING"));
- assertTrue(candidates.contains("SUBCLASS_ORIGIN"));
- assertTrue(candidates.contains("SELECT"));
- assertTrue(candidates.contains("ORDER"));
- assertTrue(candidates.contains("LIMIT"));
- assertTrue(candidates.contains("FROM"));
+ sqlCompleter.completeName(buffer, cursor, candidates, aliases, true);
+ assertEquals(17, candidates.size());
+ assertTrue(candidates.contains(new InterpreterCompletion("prod_dds", "prod_dds", CompletionType.schema.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("prod_emart", "prod_emart", CompletionType.schema.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("SUM", "SUM", CompletionType.keyword.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("SUBSTRING", "SUBSTRING", CompletionType.keyword.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("SUBCLASS_ORIGIN", "SUBCLASS_ORIGIN", CompletionType.keyword.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("SELECT", "SELECT", CompletionType.keyword.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("ORDER", "ORDER", CompletionType.keyword.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("LIMIT", "LIMIT", CompletionType.keyword.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("FROM", "FROM", CompletionType.keyword.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("financial_account", "financial_account", CompletionType.table.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("customer", "customer", CompletionType.table.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("account_id", "account_id", CompletionType.column.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("customer_rk", "customer_rk", CompletionType.column.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("account_rk", "account_rk", CompletionType.column.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("name", "name", CompletionType.column.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("birth_dt", "birth_dt", CompletionType.column.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("balance_amt", "balance_amt", CompletionType.column.name())));
}
@Test
public void testCompleteName_SimpleSchema() {
String buffer = "prod_";
int cursor = 3;
- List<CharSequence> candidates = new ArrayList<>();
+ List<InterpreterCompletion> candidates = new ArrayList<>();
Map<String, String> aliases = new HashMap<>();
sqlCompleter.completeName(buffer, cursor, candidates, aliases, false);
assertEquals(2, candidates.size());
- assertTrue(candidates.contains("prod_dds"));
- assertTrue(candidates.contains("prod_emart"));
+ assertTrue(candidates.contains(new InterpreterCompletion("prod_dds", "prod_dds", CompletionType.schema.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("prod_emart", "prod_emart", CompletionType.schema.name())));
}
@Test
public void testCompleteName_SimpleTable() {
String buffer = "prod_dds.fin";
int cursor = 11;
- List<CharSequence> candidates = new ArrayList<>();
+ List<InterpreterCompletion> candidates = new ArrayList<>();
Map<String, String> aliases = new HashMap<>();
sqlCompleter.completeName(buffer, cursor, candidates, aliases, false);
assertEquals(1, candidates.size());
- assertTrue(candidates.contains("financial_account "));
+ assertTrue(candidates.contains(new InterpreterCompletion("financial_account", "financial_account", CompletionType.table.name())));
}
@Test
public void testCompleteName_SimpleColumn() {
String buffer = "prod_dds.financial_account.acc";
int cursor = 30;
- List<CharSequence> candidates = new ArrayList<>();
+ List<InterpreterCompletion> candidates = new ArrayList<>();
Map<String, String> aliases = new HashMap<>();
sqlCompleter.completeName(buffer, cursor, candidates, aliases, true);
assertEquals(2, candidates.size());
- assertTrue(candidates.contains("account_rk"));
- assertTrue(candidates.contains("account_id"));
+ assertTrue(candidates.contains(new InterpreterCompletion("account_rk", "account_rk", CompletionType.column.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("account_id", "account_id", CompletionType.column.name())));
}
@Test
public void testCompleteName_WithAlias() {
String buffer = "a.acc";
int cursor = 4;
- List<CharSequence> candidates = new ArrayList<>();
+ List<InterpreterCompletion> candidates = new ArrayList<>();
Map<String, String> aliases = new HashMap<>();
aliases.put("a", "prod_dds.financial_account");
sqlCompleter.completeName(buffer, cursor, candidates, aliases, true);
assertEquals(2, candidates.size());
- assertTrue(candidates.contains("account_rk"));
- assertTrue(candidates.contains("account_id"));
+ assertTrue(candidates.contains(new InterpreterCompletion("account_rk", "account_rk", CompletionType.column.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("account_id", "account_id", CompletionType.column.name())));
}
@Test
public void testCompleteName_WithAliasAndPoint() {
String buffer = "a.";
int cursor = 2;
- List<CharSequence> candidates = new ArrayList<>();
+ List<InterpreterCompletion> candidates = new ArrayList<>();
Map<String, String> aliases = new HashMap<>();
aliases.put("a", "prod_dds.financial_account");
sqlCompleter.completeName(buffer, cursor, candidates, aliases, true);
assertEquals(2, candidates.size());
- assertTrue(candidates.contains("account_rk"));
- assertTrue(candidates.contains("account_id"));
+ assertTrue(candidates.contains(new InterpreterCompletion("account_rk", "account_rk", CompletionType.column.name())));
+ assertTrue(candidates.contains(new InterpreterCompletion("account_id", "account_id", CompletionType.column.name())));
}
+ @Test
public void testSchemaAndTable() {
- String buffer = "select * from prod_v_emart.fi";
- tester.buffer(buffer).from(15).to(26).expect(newHashSet("prod_v_emart ")).test();
- tester.buffer(buffer).from(27).to(29).expect(newHashSet("financial_account ")).test();
+ String buffer = "select * from prod_emart.fi";
+ tester.buffer(buffer).from(19).to(23).expect(newHashSet(new InterpreterCompletion("prod_emart ", "prod_emart ", CompletionType.schema.name()))).test();
+ tester.buffer(buffer).from(25).to(27).expect(newHashSet(new InterpreterCompletion("financial_account ", "financial_account ", CompletionType.table.name()))).test();
}
@Test
public void testEdges() {
String buffer = " ORDER ";
- tester.buffer(buffer).from(0).to(7).expect(newHashSet("ORDER ")).test();
- tester.buffer(buffer).from(8).to(15).expect(newHashSet("ORDER", "SUBCLASS_ORIGIN", "SUBSTRING",
- "prod_emart", "LIMIT", "SUM", "prod_dds", "SELECT", "FROM")).test();
+ tester.buffer(buffer).from(2).to(6).expect(newHashSet(new InterpreterCompletion("ORDER ", "ORDER ", CompletionType.keyword.name()))).test();
+ tester.buffer(buffer).from(0).to(1).expect(newHashSet(
+ new InterpreterCompletion("ORDER", "ORDER", CompletionType.keyword.name()),
+ new InterpreterCompletion("SUBCLASS_ORIGIN", "SUBCLASS_ORIGIN", CompletionType.keyword.name()),
+ new InterpreterCompletion("SUBSTRING", "SUBSTRING", CompletionType.keyword.name()),
+ new InterpreterCompletion("prod_emart", "prod_emart", CompletionType.schema.name()),
+ new InterpreterCompletion("LIMIT", "LIMIT", CompletionType.keyword.name()),
+ new InterpreterCompletion("SUM", "SUM", CompletionType.keyword.name()),
+ new InterpreterCompletion("prod_dds", "prod_dds", CompletionType.schema.name()),
+ new InterpreterCompletion("SELECT", "SELECT", CompletionType.keyword.name()),
+ new InterpreterCompletion("FROM", "FROM", CompletionType.keyword.name()),
+ new InterpreterCompletion("financial_account", "financial_account", CompletionType.table.name()),
+ new InterpreterCompletion("customer", "customer", CompletionType.table.name()),
+ new InterpreterCompletion("account_rk", "account_rk", CompletionType.column.name()),
+ new InterpreterCompletion("account_id", "account_id", CompletionType.column.name()),
+ new InterpreterCompletion("customer_rk", "customer_rk", CompletionType.column.name()),
+ new InterpreterCompletion("name", "name", CompletionType.column.name()),
+ new InterpreterCompletion("birth_dt", "birth_dt", CompletionType.column.name()),
+ new InterpreterCompletion("balance_amt", "balance_amt", CompletionType.column.name())
+ )).test();
}
@Test
public void testMultipleWords() {
String buffer = "SELE FRO LIM";
- tester.buffer(buffer).from(0).to(4).expect(newHashSet("SELECT ")).test();
- tester.buffer(buffer).from(5).to(8).expect(newHashSet("FROM ")).test();
- tester.buffer(buffer).from(9).to(12).expect(newHashSet("LIMIT ")).test();
+ tester.buffer(buffer).from(1).to(3).expect(newHashSet(new InterpreterCompletion("SELECT ", "SELECT ", CompletionType.keyword.name()))).test();
+ tester.buffer(buffer).from(6).to(7).expect(newHashSet(new InterpreterCompletion("FROM ", "FROM ", CompletionType.keyword.name()))).test();
+ tester.buffer(buffer).from(9).to(12).expect(newHashSet(new InterpreterCompletion("LIMIT ", "LIMIT ", CompletionType.keyword.name()))).test();
}
@Test
public void testMultiLineBuffer() {
String buffer = " \n SELE\nFRO";
- tester.buffer(buffer).from(0).to(7).expect(newHashSet("SELECT ")).test();
- tester.buffer(buffer).from(8).to(11).expect(newHashSet("FROM ")).test();
+ tester.buffer(buffer).from(4).to(6).expect(newHashSet(new InterpreterCompletion("SELECT ", "SELECT ", CompletionType.keyword.name()))).test();
+ tester.buffer(buffer).from(9).to(11).expect(newHashSet(new InterpreterCompletion("FROM ", "FROM ", CompletionType.keyword.name()))).test();
}
@Test
public void testMultipleCompletionSuggestions() {
String buffer = "SU";
- tester.buffer(buffer).from(0).to(2).expect(newHashSet("SUBCLASS_ORIGIN", "SUM", "SUBSTRING"))
- .test();
+ tester.buffer(buffer).from(1).to(2).expect(newHashSet(
+ new InterpreterCompletion("SUBCLASS_ORIGIN", "SUBCLASS_ORIGIN", CompletionType.keyword.name()),
+ new InterpreterCompletion("SUM", "SUM", CompletionType.keyword.name()),
+ new InterpreterCompletion("SUBSTRING", "SUBSTRING", CompletionType.keyword.name()))
+ ).test();
}
@Test
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/kylin/src/main/java/org/apache/zeppelin/kylin/KylinInterpreter.java
----------------------------------------------------------------------
diff --git a/kylin/src/main/java/org/apache/zeppelin/kylin/KylinInterpreter.java b/kylin/src/main/java/org/apache/zeppelin/kylin/KylinInterpreter.java
index 5969717..6b68d28 100755
--- a/kylin/src/main/java/org/apache/zeppelin/kylin/KylinInterpreter.java
+++ b/kylin/src/main/java/org/apache/zeppelin/kylin/KylinInterpreter.java
@@ -95,7 +95,8 @@ public class KylinInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/lens/src/main/java/org/apache/zeppelin/lens/LensInterpreter.java
----------------------------------------------------------------------
diff --git a/lens/src/main/java/org/apache/zeppelin/lens/LensInterpreter.java b/lens/src/main/java/org/apache/zeppelin/lens/LensInterpreter.java
index 17e3a46..9727a27 100644
--- a/lens/src/main/java/org/apache/zeppelin/lens/LensInterpreter.java
+++ b/lens/src/main/java/org/apache/zeppelin/lens/LensInterpreter.java
@@ -420,7 +420,8 @@ public class LensInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/markdown/src/main/java/org/apache/zeppelin/markdown/Markdown.java
----------------------------------------------------------------------
diff --git a/markdown/src/main/java/org/apache/zeppelin/markdown/Markdown.java b/markdown/src/main/java/org/apache/zeppelin/markdown/Markdown.java
index c908a54..45fa6ce 100644
--- a/markdown/src/main/java/org/apache/zeppelin/markdown/Markdown.java
+++ b/markdown/src/main/java/org/apache/zeppelin/markdown/Markdown.java
@@ -124,7 +124,8 @@ public class Markdown extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/pig/pom.xml
----------------------------------------------------------------------
diff --git a/pig/pom.xml b/pig/pom.xml
index 918b551..e58a62a 100644
--- a/pig/pom.xml
+++ b/pig/pom.xml
@@ -47,6 +47,12 @@
<artifactId>zeppelin-interpreter</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>jline</groupId>
+ <artifactId>jline</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java
----------------------------------------------------------------------
diff --git a/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java b/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java
index 7f6a7eb..0bfcae0 100644
--- a/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java
+++ b/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java
@@ -435,7 +435,8 @@ public class PythonInterpreter extends Interpreter implements ExecuteResultHandl
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/r/src/main/java/org/apache/zeppelin/rinterpreter/KnitR.java
----------------------------------------------------------------------
diff --git a/r/src/main/java/org/apache/zeppelin/rinterpreter/KnitR.java b/r/src/main/java/org/apache/zeppelin/rinterpreter/KnitR.java
index 51a790c..bdc5b86 100644
--- a/r/src/main/java/org/apache/zeppelin/rinterpreter/KnitR.java
+++ b/r/src/main/java/org/apache/zeppelin/rinterpreter/KnitR.java
@@ -77,8 +77,9 @@ public class KnitR extends Interpreter implements WrappedInterpreter {
}
@Override
- public List<InterpreterCompletion> completion(String s, int i) {
- List completion = intp.completion(s, i);
+ public List<InterpreterCompletion> completion(String s, int i,
+ InterpreterContext interpreterContext) {
+ List completion = intp.completion(s, i, interpreterContext);
return completion;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/r/src/main/java/org/apache/zeppelin/rinterpreter/RRepl.java
----------------------------------------------------------------------
diff --git a/r/src/main/java/org/apache/zeppelin/rinterpreter/RRepl.java b/r/src/main/java/org/apache/zeppelin/rinterpreter/RRepl.java
index 0c46670..81891f8 100644
--- a/r/src/main/java/org/apache/zeppelin/rinterpreter/RRepl.java
+++ b/r/src/main/java/org/apache/zeppelin/rinterpreter/RRepl.java
@@ -77,8 +77,9 @@ public class RRepl extends Interpreter implements WrappedInterpreter {
}
@Override
- public List<InterpreterCompletion> completion(String s, int i) {
- List completion = intp.completion(s, i);
+ public List<InterpreterCompletion> completion(String s, int i,
+ InterpreterContext interpreterContext) {
+ List completion = intp.completion(s, i, interpreterContext);
return completion;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java
----------------------------------------------------------------------
diff --git a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java
index db58268..7156c37 100644
--- a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java
+++ b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java
@@ -270,7 +270,8 @@ public class ScaldingInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return NO_COMPLETION;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/shell/src/main/java/org/apache/zeppelin/shell/ShellInterpreter.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/zeppelin/shell/ShellInterpreter.java b/shell/src/main/java/org/apache/zeppelin/shell/ShellInterpreter.java
index abf5ee8..ec75684 100644
--- a/shell/src/main/java/org/apache/zeppelin/shell/ShellInterpreter.java
+++ b/shell/src/main/java/org/apache/zeppelin/shell/ShellInterpreter.java
@@ -138,7 +138,8 @@ public class ShellInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/spark/src/main/java/org/apache/zeppelin/spark/DepInterpreter.java
----------------------------------------------------------------------
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/DepInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/DepInterpreter.java
index 478d0bc..6b1f0a9 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/DepInterpreter.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/DepInterpreter.java
@@ -33,6 +33,8 @@ import java.util.Properties;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
+
+import org.apache.commons.lang.StringUtils;
import org.apache.spark.repl.SparkILoop;
import org.apache.zeppelin.interpreter.Interpreter;
import org.apache.zeppelin.interpreter.InterpreterContext;
@@ -284,7 +286,8 @@ public class DepInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
if (Utils.isScala2_10()) {
ScalaCompleter c = (ScalaCompleter) Utils.invokeMethod(completer, "completer");
Candidates ret = c.complete(buf, cursor);
@@ -293,7 +296,7 @@ public class DepInterpreter extends Interpreter {
List<InterpreterCompletion> completions = new LinkedList<>();
for (String candidate : candidates) {
- completions.add(new InterpreterCompletion(candidate, candidate));
+ completions.add(new InterpreterCompletion(candidate, candidate, StringUtils.EMPTY));
}
return completions;
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java
----------------------------------------------------------------------
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java
index da99b9f..bf0a915 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java
@@ -42,6 +42,7 @@ import org.apache.commons.exec.ExecuteResultHandler;
import org.apache.commons.exec.ExecuteWatchdog;
import org.apache.commons.exec.PumpStreamHandler;
import org.apache.commons.exec.environment.EnvironmentUtils;
+import org.apache.commons.lang.StringUtils;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SQLContext;
@@ -457,7 +458,8 @@ public class PySparkInterpreter extends Interpreter implements ExecuteResultHand
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
if (buf.length() < cursor) {
cursor = buf.length();
}
@@ -508,7 +510,7 @@ public class PySparkInterpreter extends Interpreter implements ExecuteResultHand
List<InterpreterCompletion> results = new LinkedList<>();
for (String name: completionList) {
- results.add(new InterpreterCompletion(name, name));
+ results.add(new InterpreterCompletion(name, name, StringUtils.EMPTY));
}
return results;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
----------------------------------------------------------------------
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
index 49c83dc..bd2d453 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
@@ -1068,7 +1068,8 @@ public class SparkInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
if (completer == null) {
logger.warn("Can't find completer");
return new LinkedList<>();
@@ -1090,7 +1091,7 @@ public class SparkInterpreter extends Interpreter {
List<InterpreterCompletion> completions = new LinkedList<>();
for (String candidate : candidates) {
- completions.add(new InterpreterCompletion(candidate, candidate));
+ completions.add(new InterpreterCompletion(candidate, candidate, StringUtils.EMPTY));
}
return completions;
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/spark/src/main/java/org/apache/zeppelin/spark/SparkRInterpreter.java
----------------------------------------------------------------------
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkRInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkRInterpreter.java
index c6b0796..606c8a0 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/SparkRInterpreter.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkRInterpreter.java
@@ -212,7 +212,8 @@ public class SparkRInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return new ArrayList<>();
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/spark/src/main/java/org/apache/zeppelin/spark/SparkSqlInterpreter.java
----------------------------------------------------------------------
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkSqlInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkSqlInterpreter.java
index d2de9a1..f59c0d0 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/SparkSqlInterpreter.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkSqlInterpreter.java
@@ -177,7 +177,8 @@ public class SparkSqlInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java
----------------------------------------------------------------------
diff --git a/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java b/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java
index d47a8bd..ce0c86c 100644
--- a/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java
+++ b/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java
@@ -118,7 +118,7 @@ public class PySparkInterpreterTest {
@Test
public void testCompletion() {
if (getSparkVersionNumber() > 11) {
- List<InterpreterCompletion> completions = pySparkInterpreter.completion("sc.", "sc.".length());
+ List<InterpreterCompletion> completions = pySparkInterpreter.completion("sc.", "sc.".length(), null);
assertTrue(completions.size() > 0);
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java
----------------------------------------------------------------------
diff --git a/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java b/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java
index ba5feea..3a31e5d 100644
--- a/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java
+++ b/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java
@@ -301,7 +301,7 @@ public class SparkInterpreterTest {
@Test
public void testCompletion() {
- List<InterpreterCompletion> completions = repl.completion("sc.", "sc.".length());
+ List<InterpreterCompletion> completions = repl.completion("sc.", "sc.".length(), null);
assertTrue(completions.size() > 0);
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/pom.xml
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/pom.xml b/zeppelin-interpreter/pom.xml
index 6b75111..e55144c 100644
--- a/zeppelin-interpreter/pom.xml
+++ b/zeppelin-interpreter/pom.xml
@@ -43,6 +43,7 @@
<aether.version>1.12</aether.version>
<maven.aeither.provider.version>3.0.3</maven.aeither.provider.version>
<wagon.version>1.0</wagon.version>
+ <jline.version>2.12.1</jline.version>
<!--plugin versions-->
<plugin.shade.version>2.3</plugin.shade.version>
@@ -203,6 +204,17 @@
</dependency>
<dependency>
+ <groupId>jline</groupId>
+ <artifactId>jline</artifactId>
+ <version>${jline.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/completer/CompletionType.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/completer/CompletionType.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/completer/CompletionType.java
new file mode 100644
index 0000000..20cceda
--- /dev/null
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/completer/CompletionType.java
@@ -0,0 +1,28 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.zeppelin.completer;
+
+/**
+ * Types of completion
+ */
+public enum CompletionType {
+ schema,
+ table,
+ column,
+ setting,
+ command,
+ keyword,
+ path
+}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/completer/StringsCompleter.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/completer/StringsCompleter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/completer/StringsCompleter.java
new file mode 100644
index 0000000..c7dcebe
--- /dev/null
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/completer/StringsCompleter.java
@@ -0,0 +1,77 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.zeppelin.completer;
+
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import jline.console.completer.Completer;
+import jline.internal.Preconditions;
+
+/**
+ * Case-insensitive completer for a set of strings.
+ */
+public class StringsCompleter implements Completer {
+ private final SortedSet<String> strings = new TreeSet<String>(new Comparator<String>() {
+ @Override
+ public int compare(String o1, String o2) {
+ return o1.compareToIgnoreCase(o2);
+ }
+ });
+
+ public StringsCompleter() {
+ }
+
+ public StringsCompleter(final Collection<String> strings) {
+ Preconditions.checkNotNull(strings);
+ getStrings().addAll(strings);
+ }
+
+ public Collection<String> getStrings() {
+ return strings;
+ }
+
+ public int complete(final String buffer, final int cursor, final List<CharSequence> candidates) {
+ return completeCollection(buffer, cursor, candidates);
+ }
+
+ public int complete(final String buffer, final int cursor, final Set<CharSequence> candidates) {
+ return completeCollection(buffer, cursor, candidates);
+ }
+
+ private int completeCollection(final String buffer, final int cursor,
+ final Collection<CharSequence> candidates) {
+ Preconditions.checkNotNull(candidates);
+ if (buffer == null) {
+ candidates.addAll(strings);
+ } else {
+ String bufferTmp = buffer.toUpperCase();
+ for (String match : strings.tailSet(buffer)) {
+ String matchTmp = match.toUpperCase();
+ if (!matchTmp.startsWith(bufferTmp)) {
+ break;
+ }
+
+ candidates.add(match);
+ }
+ }
+
+ return candidates.isEmpty() ? -1 : 0;
+ }
+}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/ClassloaderInterpreter.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/ClassloaderInterpreter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/ClassloaderInterpreter.java
index e20f7c5..a1dafd9 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/ClassloaderInterpreter.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/ClassloaderInterpreter.java
@@ -152,11 +152,12 @@ public class ClassloaderInterpreter
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
ClassLoader oldcl = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(cl);
try {
- List completion = intp.completion(buf, cursor);
+ List completion = intp.completion(buf, cursor, interpreterContext);
return completion;
} catch (Exception e) {
throw new InterpreterException(e);
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java
index b64530a..a327b55 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java
@@ -102,10 +102,12 @@ public abstract class Interpreter {
*
* @param buf statements
* @param cursor cursor position in statements
+ * @param interpreterContext
* @return list of possible completion. Return empty list if there're nothing to return.
*/
@ZeppelinApi
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/LazyOpenInterpreter.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/LazyOpenInterpreter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/LazyOpenInterpreter.java
index ad85ded..bb09d19 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/LazyOpenInterpreter.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/LazyOpenInterpreter.java
@@ -121,9 +121,10 @@ public class LazyOpenInterpreter
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
open();
- List completion = intp.completion(buf, cursor);
+ List completion = intp.completion(buf, cursor, interpreterContext);
return completion;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java
index aae50ae..2f9d2bb 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java
@@ -481,7 +481,8 @@ public class RemoteInterpreter extends Interpreter {
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
RemoteInterpreterProcess interpreterProcess = getInterpreterProcess();
Client client = null;
try {
@@ -492,7 +493,8 @@ public class RemoteInterpreter extends Interpreter {
boolean broken = false;
try {
- List completion = client.completion(sessionKey, className, buf, cursor);
+ List completion = client.completion(sessionKey, className, buf, cursor,
+ convert(interpreterContext));
return completion;
} catch (TException e) {
broken = true;
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java
index effaf85..3b7ec5c 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java
@@ -562,10 +562,10 @@ public class RemoteInterpreterServer
@Override
public List<InterpreterCompletion> completion(String noteId,
- String className, String buf, int cursor)
+ String className, String buf, int cursor, RemoteInterpreterContext remoteInterpreterContext)
throws TException {
Interpreter intp = getInterpreter(noteId, className);
- List completion = intp.completion(buf, cursor);
+ List completion = intp.completion(buf, cursor, convert(remoteInterpreterContext, null));
return completion;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java
index 8a1bc7d..43713e9 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java
@@ -51,12 +51,13 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-1-25")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
public class InterpreterCompletion implements org.apache.thrift.TBase<InterpreterCompletion, InterpreterCompletion._Fields>, java.io.Serializable, Cloneable, Comparable<InterpreterCompletion> {
private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("InterpreterCompletion");
private static final org.apache.thrift.protocol.TField NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("name", org.apache.thrift.protocol.TType.STRING, (short)1);
private static final org.apache.thrift.protocol.TField VALUE_FIELD_DESC = new org.apache.thrift.protocol.TField("value", org.apache.thrift.protocol.TType.STRING, (short)2);
+ private static final org.apache.thrift.protocol.TField META_FIELD_DESC = new org.apache.thrift.protocol.TField("meta", org.apache.thrift.protocol.TType.STRING, (short)3);
private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
static {
@@ -66,11 +67,13 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
public String name; // required
public String value; // required
+ public String meta; // required
/** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
public enum _Fields implements org.apache.thrift.TFieldIdEnum {
NAME((short)1, "name"),
- VALUE((short)2, "value");
+ VALUE((short)2, "value"),
+ META((short)3, "meta");
private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
@@ -89,6 +92,8 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
return NAME;
case 2: // VALUE
return VALUE;
+ case 3: // META
+ return META;
default:
return null;
}
@@ -136,6 +141,8 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
tmpMap.put(_Fields.VALUE, new org.apache.thrift.meta_data.FieldMetaData("value", org.apache.thrift.TFieldRequirementType.DEFAULT,
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+ tmpMap.put(_Fields.META, new org.apache.thrift.meta_data.FieldMetaData("meta", org.apache.thrift.TFieldRequirementType.DEFAULT,
+ new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
metaDataMap = Collections.unmodifiableMap(tmpMap);
org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(InterpreterCompletion.class, metaDataMap);
}
@@ -145,11 +152,13 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
public InterpreterCompletion(
String name,
- String value)
+ String value,
+ String meta)
{
this();
this.name = name;
this.value = value;
+ this.meta = meta;
}
/**
@@ -162,6 +171,9 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
if (other.isSetValue()) {
this.value = other.value;
}
+ if (other.isSetMeta()) {
+ this.meta = other.meta;
+ }
}
public InterpreterCompletion deepCopy() {
@@ -172,6 +184,7 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
public void clear() {
this.name = null;
this.value = null;
+ this.meta = null;
}
public String getName() {
@@ -222,6 +235,30 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
}
}
+ public String getMeta() {
+ return this.meta;
+ }
+
+ public InterpreterCompletion setMeta(String meta) {
+ this.meta = meta;
+ return this;
+ }
+
+ public void unsetMeta() {
+ this.meta = null;
+ }
+
+ /** Returns true if field meta is set (has been assigned a value) and false otherwise */
+ public boolean isSetMeta() {
+ return this.meta != null;
+ }
+
+ public void setMetaIsSet(boolean value) {
+ if (!value) {
+ this.meta = null;
+ }
+ }
+
public void setFieldValue(_Fields field, Object value) {
switch (field) {
case NAME:
@@ -240,6 +277,14 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
}
break;
+ case META:
+ if (value == null) {
+ unsetMeta();
+ } else {
+ setMeta((String)value);
+ }
+ break;
+
}
}
@@ -251,6 +296,9 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
case VALUE:
return getValue();
+ case META:
+ return getMeta();
+
}
throw new IllegalStateException();
}
@@ -266,6 +314,8 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
return isSetName();
case VALUE:
return isSetValue();
+ case META:
+ return isSetMeta();
}
throw new IllegalStateException();
}
@@ -301,6 +351,15 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
return false;
}
+ boolean this_present_meta = true && this.isSetMeta();
+ boolean that_present_meta = true && that.isSetMeta();
+ if (this_present_meta || that_present_meta) {
+ if (!(this_present_meta && that_present_meta))
+ return false;
+ if (!this.meta.equals(that.meta))
+ return false;
+ }
+
return true;
}
@@ -318,6 +377,11 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
if (present_value)
list.add(value);
+ boolean present_meta = true && (isSetMeta());
+ list.add(present_meta);
+ if (present_meta)
+ list.add(meta);
+
return list.hashCode();
}
@@ -349,6 +413,16 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
return lastComparison;
}
}
+ lastComparison = Boolean.valueOf(isSetMeta()).compareTo(other.isSetMeta());
+ if (lastComparison != 0) {
+ return lastComparison;
+ }
+ if (isSetMeta()) {
+ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.meta, other.meta);
+ if (lastComparison != 0) {
+ return lastComparison;
+ }
+ }
return 0;
}
@@ -384,6 +458,14 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
sb.append(this.value);
}
first = false;
+ if (!first) sb.append(", ");
+ sb.append("meta:");
+ if (this.meta == null) {
+ sb.append("null");
+ } else {
+ sb.append(this.meta);
+ }
+ first = false;
sb.append(")");
return sb.toString();
}
@@ -443,6 +525,14 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
}
break;
+ case 3: // META
+ if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+ struct.meta = iprot.readString();
+ struct.setMetaIsSet(true);
+ } else {
+ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+ }
+ break;
default:
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
}
@@ -468,6 +558,11 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
oprot.writeString(struct.value);
oprot.writeFieldEnd();
}
+ if (struct.meta != null) {
+ oprot.writeFieldBegin(META_FIELD_DESC);
+ oprot.writeString(struct.meta);
+ oprot.writeFieldEnd();
+ }
oprot.writeFieldStop();
oprot.writeStructEnd();
}
@@ -492,19 +587,25 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
if (struct.isSetValue()) {
optionals.set(1);
}
- oprot.writeBitSet(optionals, 2);
+ if (struct.isSetMeta()) {
+ optionals.set(2);
+ }
+ oprot.writeBitSet(optionals, 3);
if (struct.isSetName()) {
oprot.writeString(struct.name);
}
if (struct.isSetValue()) {
oprot.writeString(struct.value);
}
+ if (struct.isSetMeta()) {
+ oprot.writeString(struct.meta);
+ }
}
@Override
public void read(org.apache.thrift.protocol.TProtocol prot, InterpreterCompletion struct) throws org.apache.thrift.TException {
TTupleProtocol iprot = (TTupleProtocol) prot;
- BitSet incoming = iprot.readBitSet(2);
+ BitSet incoming = iprot.readBitSet(3);
if (incoming.get(0)) {
struct.name = iprot.readString();
struct.setNameIsSet(true);
@@ -513,6 +614,10 @@ public class InterpreterCompletion implements org.apache.thrift.TBase<Interprete
struct.value = iprot.readString();
struct.setValueIsSet(true);
}
+ if (incoming.get(2)) {
+ struct.meta = iprot.readString();
+ struct.setMetaIsSet(true);
+ }
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java
index ebb8579..cf8e50a 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-1-25")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
public class RemoteApplicationResult implements org.apache.thrift.TBase<RemoteApplicationResult, RemoteApplicationResult._Fields>, java.io.Serializable, Cloneable, Comparable<RemoteApplicationResult> {
private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("RemoteApplicationResult");
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterContext.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterContext.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterContext.java
index 6a24e56..d6619fc 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterContext.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterContext.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-1-25")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteInterpreterContext, RemoteInterpreterContext._Fields>, java.io.Serializable, Cloneable, Comparable<RemoteInterpreterContext> {
private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("RemoteInterpreterContext");
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterEvent.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterEvent.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterEvent.java
index 39c4f81..e252775 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterEvent.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterEvent.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-1-25")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
public class RemoteInterpreterEvent implements org.apache.thrift.TBase<RemoteInterpreterEvent, RemoteInterpreterEvent._Fields>, java.io.Serializable, Cloneable, Comparable<RemoteInterpreterEvent> {
private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("RemoteInterpreterEvent");
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResult.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResult.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResult.java
index 4929efa..b18bad5 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResult.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResult.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-1-25")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteInterpreterResult, RemoteInterpreterResult._Fields>, java.io.Serializable, Cloneable, Comparable<RemoteInterpreterResult> {
private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("RemoteInterpreterResult");
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResultMessage.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResultMessage.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResultMessage.java
index eb1261e..a2aff29 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResultMessage.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResultMessage.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-1-25")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
public class RemoteInterpreterResultMessage implements org.apache.thrift.TBase<RemoteInterpreterResultMessage, RemoteInterpreterResultMessage._Fields>, java.io.Serializable, Cloneable, Comparable<RemoteInterpreterResultMessage> {
private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("RemoteInterpreterResultMessage");
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterService.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterService.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterService.java
index 7b2a76e..def96fa 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterService.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterService.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-1-25")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
public class RemoteInterpreterService {
public interface Iface {
@@ -70,7 +70,7 @@ public class RemoteInterpreterService {
public String getFormType(String sessionKey, String className) throws org.apache.thrift.TException;
- public List<InterpreterCompletion> completion(String sessionKey, String className, String buf, int cursor) throws org.apache.thrift.TException;
+ public List<InterpreterCompletion> completion(String sessionKey, String className, String buf, int cursor, RemoteInterpreterContext interpreterContext) throws org.apache.thrift.TException;
public void shutdown() throws org.apache.thrift.TException;
@@ -126,7 +126,7 @@ public class RemoteInterpreterService {
public void getFormType(String sessionKey, String className, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
- public void completion(String sessionKey, String className, String buf, int cursor, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
+ public void completion(String sessionKey, String className, String buf, int cursor, RemoteInterpreterContext interpreterContext, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
public void shutdown(org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
@@ -349,19 +349,20 @@ public class RemoteInterpreterService {
throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "getFormType failed: unknown result");
}
- public List<InterpreterCompletion> completion(String sessionKey, String className, String buf, int cursor) throws org.apache.thrift.TException
+ public List<InterpreterCompletion> completion(String sessionKey, String className, String buf, int cursor, RemoteInterpreterContext interpreterContext) throws org.apache.thrift.TException
{
- send_completion(sessionKey, className, buf, cursor);
+ send_completion(sessionKey, className, buf, cursor, interpreterContext);
return recv_completion();
}
- public void send_completion(String sessionKey, String className, String buf, int cursor) throws org.apache.thrift.TException
+ public void send_completion(String sessionKey, String className, String buf, int cursor, RemoteInterpreterContext interpreterContext) throws org.apache.thrift.TException
{
completion_args args = new completion_args();
args.setSessionKey(sessionKey);
args.setClassName(className);
args.setBuf(buf);
args.setCursor(cursor);
+ args.setInterpreterContext(interpreterContext);
sendBase("completion", args);
}
@@ -1064,9 +1065,9 @@ public class RemoteInterpreterService {
}
}
- public void completion(String sessionKey, String className, String buf, int cursor, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException {
+ public void completion(String sessionKey, String className, String buf, int cursor, RemoteInterpreterContext interpreterContext, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException {
checkReady();
- completion_call method_call = new completion_call(sessionKey, className, buf, cursor, resultHandler, this, ___protocolFactory, ___transport);
+ completion_call method_call = new completion_call(sessionKey, className, buf, cursor, interpreterContext, resultHandler, this, ___protocolFactory, ___transport);
this.___currentMethod = method_call;
___manager.call(method_call);
}
@@ -1076,12 +1077,14 @@ public class RemoteInterpreterService {
private String className;
private String buf;
private int cursor;
- public completion_call(String sessionKey, String className, String buf, int cursor, org.apache.thrift.async.AsyncMethodCallback resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
+ private RemoteInterpreterContext interpreterContext;
+ public completion_call(String sessionKey, String className, String buf, int cursor, RemoteInterpreterContext interpreterContext, org.apache.thrift.async.AsyncMethodCallback resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
super(client, protocolFactory, transport, resultHandler, false);
this.sessionKey = sessionKey;
this.className = className;
this.buf = buf;
this.cursor = cursor;
+ this.interpreterContext = interpreterContext;
}
public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {
@@ -1091,6 +1094,7 @@ public class RemoteInterpreterService {
args.setClassName(className);
args.setBuf(buf);
args.setCursor(cursor);
+ args.setInterpreterContext(interpreterContext);
args.write(prot);
prot.writeMessageEnd();
}
@@ -1933,7 +1937,7 @@ public class RemoteInterpreterService {
public completion_result getResult(I iface, completion_args args) throws org.apache.thrift.TException {
completion_result result = new completion_result();
- result.success = iface.completion(args.sessionKey, args.className, args.buf, args.cursor);
+ result.success = iface.completion(args.sessionKey, args.className, args.buf, args.cursor, args.interpreterContext);
return result;
}
}
@@ -2742,7 +2746,7 @@ public class RemoteInterpreterService {
}
public void start(I iface, completion_args args, org.apache.thrift.async.AsyncMethodCallback<List<InterpreterCompletion>> resultHandler) throws TException {
- iface.completion(args.sessionKey, args.className, args.buf, args.cursor,resultHandler);
+ iface.completion(args.sessionKey, args.className, args.buf, args.cursor, args.interpreterContext,resultHandler);
}
}
@@ -9809,6 +9813,7 @@ public class RemoteInterpreterService {
private static final org.apache.thrift.protocol.TField CLASS_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("className", org.apache.thrift.protocol.TType.STRING, (short)2);
private static final org.apache.thrift.protocol.TField BUF_FIELD_DESC = new org.apache.thrift.protocol.TField("buf", org.apache.thrift.protocol.TType.STRING, (short)3);
private static final org.apache.thrift.protocol.TField CURSOR_FIELD_DESC = new org.apache.thrift.protocol.TField("cursor", org.apache.thrift.protocol.TType.I32, (short)4);
+ private static final org.apache.thrift.protocol.TField INTERPRETER_CONTEXT_FIELD_DESC = new org.apache.thrift.protocol.TField("interpreterContext", org.apache.thrift.protocol.TType.STRUCT, (short)5);
private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
static {
@@ -9820,13 +9825,15 @@ public class RemoteInterpreterService {
public String className; // required
public String buf; // required
public int cursor; // required
+ public RemoteInterpreterContext interpreterContext; // required
/** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
public enum _Fields implements org.apache.thrift.TFieldIdEnum {
SESSION_KEY((short)1, "sessionKey"),
CLASS_NAME((short)2, "className"),
BUF((short)3, "buf"),
- CURSOR((short)4, "cursor");
+ CURSOR((short)4, "cursor"),
+ INTERPRETER_CONTEXT((short)5, "interpreterContext");
private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
@@ -9849,6 +9856,8 @@ public class RemoteInterpreterService {
return BUF;
case 4: // CURSOR
return CURSOR;
+ case 5: // INTERPRETER_CONTEXT
+ return INTERPRETER_CONTEXT;
default:
return null;
}
@@ -9902,6 +9911,8 @@ public class RemoteInterpreterService {
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
tmpMap.put(_Fields.CURSOR, new org.apache.thrift.meta_data.FieldMetaData("cursor", org.apache.thrift.TFieldRequirementType.DEFAULT,
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
+ tmpMap.put(_Fields.INTERPRETER_CONTEXT, new org.apache.thrift.meta_data.FieldMetaData("interpreterContext", org.apache.thrift.TFieldRequirementType.DEFAULT,
+ new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, RemoteInterpreterContext.class)));
metaDataMap = Collections.unmodifiableMap(tmpMap);
org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(completion_args.class, metaDataMap);
}
@@ -9913,7 +9924,8 @@ public class RemoteInterpreterService {
String sessionKey,
String className,
String buf,
- int cursor)
+ int cursor,
+ RemoteInterpreterContext interpreterContext)
{
this();
this.sessionKey = sessionKey;
@@ -9921,6 +9933,7 @@ public class RemoteInterpreterService {
this.buf = buf;
this.cursor = cursor;
setCursorIsSet(true);
+ this.interpreterContext = interpreterContext;
}
/**
@@ -9938,6 +9951,9 @@ public class RemoteInterpreterService {
this.buf = other.buf;
}
this.cursor = other.cursor;
+ if (other.isSetInterpreterContext()) {
+ this.interpreterContext = new RemoteInterpreterContext(other.interpreterContext);
+ }
}
public completion_args deepCopy() {
@@ -9951,6 +9967,7 @@ public class RemoteInterpreterService {
this.buf = null;
setCursorIsSet(false);
this.cursor = 0;
+ this.interpreterContext = null;
}
public String getSessionKey() {
@@ -10048,6 +10065,30 @@ public class RemoteInterpreterService {
__isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __CURSOR_ISSET_ID, value);
}
+ public RemoteInterpreterContext getInterpreterContext() {
+ return this.interpreterContext;
+ }
+
+ public completion_args setInterpreterContext(RemoteInterpreterContext interpreterContext) {
+ this.interpreterContext = interpreterContext;
+ return this;
+ }
+
+ public void unsetInterpreterContext() {
+ this.interpreterContext = null;
+ }
+
+ /** Returns true if field interpreterContext is set (has been assigned a value) and false otherwise */
+ public boolean isSetInterpreterContext() {
+ return this.interpreterContext != null;
+ }
+
+ public void setInterpreterContextIsSet(boolean value) {
+ if (!value) {
+ this.interpreterContext = null;
+ }
+ }
+
public void setFieldValue(_Fields field, Object value) {
switch (field) {
case SESSION_KEY:
@@ -10082,6 +10123,14 @@ public class RemoteInterpreterService {
}
break;
+ case INTERPRETER_CONTEXT:
+ if (value == null) {
+ unsetInterpreterContext();
+ } else {
+ setInterpreterContext((RemoteInterpreterContext)value);
+ }
+ break;
+
}
}
@@ -10099,6 +10148,9 @@ public class RemoteInterpreterService {
case CURSOR:
return Integer.valueOf(getCursor());
+ case INTERPRETER_CONTEXT:
+ return getInterpreterContext();
+
}
throw new IllegalStateException();
}
@@ -10118,6 +10170,8 @@ public class RemoteInterpreterService {
return isSetBuf();
case CURSOR:
return isSetCursor();
+ case INTERPRETER_CONTEXT:
+ return isSetInterpreterContext();
}
throw new IllegalStateException();
}
@@ -10171,6 +10225,15 @@ public class RemoteInterpreterService {
return false;
}
+ boolean this_present_interpreterContext = true && this.isSetInterpreterContext();
+ boolean that_present_interpreterContext = true && that.isSetInterpreterContext();
+ if (this_present_interpreterContext || that_present_interpreterContext) {
+ if (!(this_present_interpreterContext && that_present_interpreterContext))
+ return false;
+ if (!this.interpreterContext.equals(that.interpreterContext))
+ return false;
+ }
+
return true;
}
@@ -10198,6 +10261,11 @@ public class RemoteInterpreterService {
if (present_cursor)
list.add(cursor);
+ boolean present_interpreterContext = true && (isSetInterpreterContext());
+ list.add(present_interpreterContext);
+ if (present_interpreterContext)
+ list.add(interpreterContext);
+
return list.hashCode();
}
@@ -10249,6 +10317,16 @@ public class RemoteInterpreterService {
return lastComparison;
}
}
+ lastComparison = Boolean.valueOf(isSetInterpreterContext()).compareTo(other.isSetInterpreterContext());
+ if (lastComparison != 0) {
+ return lastComparison;
+ }
+ if (isSetInterpreterContext()) {
+ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.interpreterContext, other.interpreterContext);
+ if (lastComparison != 0) {
+ return lastComparison;
+ }
+ }
return 0;
}
@@ -10296,6 +10374,14 @@ public class RemoteInterpreterService {
sb.append("cursor:");
sb.append(this.cursor);
first = false;
+ if (!first) sb.append(", ");
+ sb.append("interpreterContext:");
+ if (this.interpreterContext == null) {
+ sb.append("null");
+ } else {
+ sb.append(this.interpreterContext);
+ }
+ first = false;
sb.append(")");
return sb.toString();
}
@@ -10303,6 +10389,9 @@ public class RemoteInterpreterService {
public void validate() throws org.apache.thrift.TException {
// check for required fields
// check for sub-struct validity
+ if (interpreterContext != null) {
+ interpreterContext.validate();
+ }
}
private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
@@ -10373,6 +10462,15 @@ public class RemoteInterpreterService {
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
}
break;
+ case 5: // INTERPRETER_CONTEXT
+ if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
+ struct.interpreterContext = new RemoteInterpreterContext();
+ struct.interpreterContext.read(iprot);
+ struct.setInterpreterContextIsSet(true);
+ } else {
+ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+ }
+ break;
default:
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
}
@@ -10406,6 +10504,11 @@ public class RemoteInterpreterService {
oprot.writeFieldBegin(CURSOR_FIELD_DESC);
oprot.writeI32(struct.cursor);
oprot.writeFieldEnd();
+ if (struct.interpreterContext != null) {
+ oprot.writeFieldBegin(INTERPRETER_CONTEXT_FIELD_DESC);
+ struct.interpreterContext.write(oprot);
+ oprot.writeFieldEnd();
+ }
oprot.writeFieldStop();
oprot.writeStructEnd();
}
@@ -10436,7 +10539,10 @@ public class RemoteInterpreterService {
if (struct.isSetCursor()) {
optionals.set(3);
}
- oprot.writeBitSet(optionals, 4);
+ if (struct.isSetInterpreterContext()) {
+ optionals.set(4);
+ }
+ oprot.writeBitSet(optionals, 5);
if (struct.isSetSessionKey()) {
oprot.writeString(struct.sessionKey);
}
@@ -10449,12 +10555,15 @@ public class RemoteInterpreterService {
if (struct.isSetCursor()) {
oprot.writeI32(struct.cursor);
}
+ if (struct.isSetInterpreterContext()) {
+ struct.interpreterContext.write(oprot);
+ }
}
@Override
public void read(org.apache.thrift.protocol.TProtocol prot, completion_args struct) throws org.apache.thrift.TException {
TTupleProtocol iprot = (TTupleProtocol) prot;
- BitSet incoming = iprot.readBitSet(4);
+ BitSet incoming = iprot.readBitSet(5);
if (incoming.get(0)) {
struct.sessionKey = iprot.readString();
struct.setSessionKeyIsSet(true);
@@ -10471,6 +10580,11 @@ public class RemoteInterpreterService {
struct.cursor = iprot.readI32();
struct.setCursorIsSet(true);
}
+ if (incoming.get(4)) {
+ struct.interpreterContext = new RemoteInterpreterContext();
+ struct.interpreterContext.read(iprot);
+ struct.setInterpreterContextIsSet(true);
+ }
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/ZeppelinServerResourceParagraphRunner.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/ZeppelinServerResourceParagraphRunner.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/ZeppelinServerResourceParagraphRunner.java
index 74cb25d..78cb090 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/ZeppelinServerResourceParagraphRunner.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/ZeppelinServerResourceParagraphRunner.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-1-25")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
public class ZeppelinServerResourceParagraphRunner implements org.apache.thrift.TBase<ZeppelinServerResourceParagraphRunner, ZeppelinServerResourceParagraphRunner._Fields>, java.io.Serializable, Cloneable, Comparable<ZeppelinServerResourceParagraphRunner> {
private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("ZeppelinServerResourceParagraphRunner");
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/main/thrift/RemoteInterpreterService.thrift
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/thrift/RemoteInterpreterService.thrift b/zeppelin-interpreter/src/main/thrift/RemoteInterpreterService.thrift
index fc09ade..f2eb13f 100644
--- a/zeppelin-interpreter/src/main/thrift/RemoteInterpreterService.thrift
+++ b/zeppelin-interpreter/src/main/thrift/RemoteInterpreterService.thrift
@@ -84,7 +84,8 @@ struct ZeppelinServerResourceParagraphRunner {
*/
struct InterpreterCompletion {
1: string name,
- 2: string value
+ 2: string value,
+ 3: string meta
}
service RemoteInterpreterService {
@@ -96,7 +97,7 @@ service RemoteInterpreterService {
void cancel(1: string sessionKey, 2: string className, 3: RemoteInterpreterContext interpreterContext);
i32 getProgress(1: string sessionKey, 2: string className, 3: RemoteInterpreterContext interpreterContext);
string getFormType(1: string sessionKey, 2: string className);
- list<InterpreterCompletion> completion(1: string sessionKey, 2: string className, 3: string buf, 4: i32 cursor);
+ list<InterpreterCompletion> completion(1: string sessionKey, 2: string className, 3: string buf, 4: i32 cursor, 5: RemoteInterpreterContext interpreterContext);
void shutdown();
string getStatus(1: string sessionKey, 2:string jobId);
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterA.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterA.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterA.java
index aef3a00..81a9164 100644
--- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterA.java
+++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterA.java
@@ -78,7 +78,8 @@ public class MockInterpreterA extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterAngular.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterAngular.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterAngular.java
index 6805da2..d4b26ad 100644
--- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterAngular.java
+++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterAngular.java
@@ -106,7 +106,8 @@ public class MockInterpreterAngular extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterB.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterB.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterB.java
index 4262500..7103335 100644
--- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterB.java
+++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterB.java
@@ -78,7 +78,8 @@ public class MockInterpreterB extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterEnv.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterEnv.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterEnv.java
index 2bd7893..12e11f7 100644
--- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterEnv.java
+++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterEnv.java
@@ -67,7 +67,8 @@ public class MockInterpreterEnv extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterOutputStream.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterOutputStream.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterOutputStream.java
index 8181df1..349315c 100644
--- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterOutputStream.java
+++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/mock/MockInterpreterOutputStream.java
@@ -78,7 +78,8 @@ public class MockInterpreterOutputStream extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
[3/3] zeppelin git commit: [ZEPPELIN-2297] improvements to jdbc
autocompleter
Posted by mo...@apache.org.
[ZEPPELIN-2297] improvements to jdbc autocompleter
### What is this PR for?
PR contains some improvements for completion (JDBC Interpreter):
- types of completion
- display of long values
- refactoring of search of completions
- uniqness of completions with type `keyword`
- updating data in completer by pressing `Ctrl + .`
- setting the schema filter to generate completions
- fix highlighting code when used not default data source
### What type of PR is it?
Improvement
### What is the Jira issue?
https://issues.apache.org/jira/browse/ZEPPELIN-2297
### How should this be tested?
try to work with new completer
### Screenshots (if appropriate)
**1. Types of completion**
![1](https://cloud.githubusercontent.com/assets/25951039/24449367/758eeeac-1490-11e7-863f-bf1b313a3f4d.png)
**2. Display of long values**
before
![2297_before_long_caption](https://cloud.githubusercontent.com/assets/25951039/24449397/8ecd3072-1490-11e7-8fd4-415424ef337e.gif)
after
![2297_after_long_caption](https://cloud.githubusercontent.com/assets/25951039/24449413/9c7a36b6-1490-11e7-9d7c-cbbdac71cbe7.gif)
**3. Refactoring of search of completions. Updating data in completer by pressing `Ctrl + .`**
before
![2297_before_refactoring_search](https://cloud.githubusercontent.com/assets/25951039/24449463/c1801214-1490-11e7-84a8-25c887b68d65.gif)
after
![2297_after_refactoring_search](https://cloud.githubusercontent.com/assets/25951039/24449567/1079bdc0-1491-11e7-8409-5187aeceb428.gif)
**4. uniqness of completions with type keyword**
before
![2297_before_uniq](https://cloud.githubusercontent.com/assets/25951039/24449615/4e20c8d0-1491-11e7-94cc-c86aab886c53.gif)
after
![2297_after_uniq](https://cloud.githubusercontent.com/assets/25951039/24449635/5cf59aca-1491-11e7-8ee1-31ea3cdacb3e.gif)
**5. fix highlighting code when used not default data source**
before
![2297_before_inrpret_name](https://cloud.githubusercontent.com/assets/25951039/24449730/b6c8d62a-1491-11e7-8dc3-39fa6975c8c3.gif)
after
![2297_after_inrpret_name](https://cloud.githubusercontent.com/assets/25951039/24449738/baf63e18-1491-11e7-8711-12557a674212.gif)
### Questions:
* Does the licenses files need update? no
* Is there breaking changes for older versions? no
* Does this needs documentation? no
Author: Tinkoff DWH <ti...@gmail.com>
Closes #2203 from tinkoff-dwh/ZEPPELIN-2297 and squashes the following commits:
b86b57a [Tinkoff DWH] [ZEPPELIN-2297] small fix to compute caption
8552049 [Tinkoff DWH] [ZEPPELIN-2297] schema filters
5308f1e [Tinkoff DWH] [ZEPPELIN-2297] updating completions
ef6c9cb [Tinkoff DWH] Merge remote-tracking branch 'origin/ZEPPELIN-2297' into ZEPPELIN-2297
1e05a68 [Tinkoff DWH] [ZEPPELIN-2297] fix uniqueness keywords
ec3cd3b [Tinkoff DWH] [ZEPPELIN-2297] fix uniqueness keywords
2b58cc5 [Tinkoff DWH] [ZEPPELIN-2297] refactoring search completions
7b5835d [Tinkoff DWH] [ZEPPELIN-2297] compute caption of copletion
1c74384 [Tinkoff DWH] [ZEPPELIN-2297] add type of completion
Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/4d398ef2
Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/4d398ef2
Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/4d398ef2
Branch: refs/heads/master
Commit: 4d398ef2a6471614cebd6b0177a08333114f5802
Parents: 775607f
Author: Tinkoff DWH <ti...@gmail.com>
Authored: Mon Apr 3 20:53:02 2017 +0500
Committer: Lee moon soo <mo...@apache.org>
Committed: Mon Apr 17 14:18:32 2017 +0900
----------------------------------------------------------------------
.../zeppelin/alluxio/AlluxioInterpreter.java | 7 +-
.../alluxio/AlluxioInterpreterTest.java | 38 +--
.../zeppelin/angular/AngularInterpreter.java | 3 +-
.../apache/zeppelin/beam/BeamInterpreter.java | 3 +-
.../zeppelin/bigquery/BigQueryInterpreter.java | 3 +-
.../cassandra/CassandraInterpreter.java | 3 +-
docs/interpreter/jdbc.md | 5 +
.../elasticsearch/ElasticsearchInterpreter.java | 6 +-
.../ElasticsearchInterpreterTest.java | 11 +-
.../apache/zeppelin/file/FileInterpreter.java | 3 +-
.../zeppelin/file/HDFSFileInterpreter.java | 23 +-
.../zeppelin/file/HDFSFileInterpreterTest.java | 10 +-
.../apache/zeppelin/flink/FlinkInterpreter.java | 3 +-
.../zeppelin/geode/GeodeOqlInterpreter.java | 3 +-
.../apache/zeppelin/hbase/HbaseInterpreter.java | 3 +-
.../apache/zeppelin/helium/DevInterpreter.java | 3 +-
.../zeppelin/ignite/IgniteInterpreter.java | 3 +-
.../zeppelin/ignite/IgniteSqlInterpreter.java | 3 +-
jdbc/pom.xml | 12 -
.../apache/zeppelin/jdbc/JDBCInterpreter.java | 56 ++--
.../org/apache/zeppelin/jdbc/SqlCompleter.java | 257 ++++++++++++-------
jdbc/src/main/resources/ansi.sql.keywords | 2 +-
.../src/main/resources/interpreter-setting.json | 6 +
.../postgresql-native-driver-sql.keywords | 2 +-
.../zeppelin/jdbc/JDBCInterpreterTest.java | 5 +-
.../apache/zeppelin/jdbc/SqlCompleterTest.java | 167 +++++++-----
.../apache/zeppelin/kylin/KylinInterpreter.java | 3 +-
.../apache/zeppelin/lens/LensInterpreter.java | 3 +-
.../org/apache/zeppelin/markdown/Markdown.java | 3 +-
pig/pom.xml | 6 +
.../zeppelin/python/PythonInterpreter.java | 3 +-
.../org/apache/zeppelin/rinterpreter/KnitR.java | 5 +-
.../org/apache/zeppelin/rinterpreter/RRepl.java | 5 +-
.../zeppelin/scalding/ScaldingInterpreter.java | 3 +-
.../apache/zeppelin/shell/ShellInterpreter.java | 3 +-
.../apache/zeppelin/spark/DepInterpreter.java | 7 +-
.../zeppelin/spark/PySparkInterpreter.java | 6 +-
.../apache/zeppelin/spark/SparkInterpreter.java | 5 +-
.../zeppelin/spark/SparkRInterpreter.java | 3 +-
.../zeppelin/spark/SparkSqlInterpreter.java | 3 +-
.../zeppelin/spark/PySparkInterpreterTest.java | 2 +-
.../zeppelin/spark/SparkInterpreterTest.java | 2 +-
zeppelin-interpreter/pom.xml | 12 +
.../zeppelin/completer/CompletionType.java | 28 ++
.../zeppelin/completer/StringsCompleter.java | 77 ++++++
.../interpreter/ClassloaderInterpreter.java | 5 +-
.../zeppelin/interpreter/Interpreter.java | 4 +-
.../interpreter/LazyOpenInterpreter.java | 5 +-
.../interpreter/remote/RemoteInterpreter.java | 6 +-
.../remote/RemoteInterpreterServer.java | 4 +-
.../thrift/InterpreterCompletion.java | 115 ++++++++-
.../thrift/RemoteApplicationResult.java | 2 +-
.../thrift/RemoteInterpreterContext.java | 2 +-
.../thrift/RemoteInterpreterEvent.java | 2 +-
.../thrift/RemoteInterpreterResult.java | 2 +-
.../thrift/RemoteInterpreterResultMessage.java | 2 +-
.../thrift/RemoteInterpreterService.java | 144 +++++++++--
.../ZeppelinServerResourceParagraphRunner.java | 2 +-
.../main/thrift/RemoteInterpreterService.thrift | 5 +-
.../remote/mock/MockInterpreterA.java | 3 +-
.../remote/mock/MockInterpreterAngular.java | 3 +-
.../remote/mock/MockInterpreterB.java | 3 +-
.../remote/mock/MockInterpreterEnv.java | 3 +-
.../mock/MockInterpreterOutputStream.java | 3 +-
.../mock/MockInterpreterResourcePool.java | 3 +-
.../interpreter/mock/MockInterpreter1.java | 3 +-
.../notebook/paragraph/paragraph.controller.js | 31 ++-
.../org/apache/zeppelin/notebook/Paragraph.java | 14 +-
.../interpreter/mock/MockInterpreter1.java | 3 +-
.../interpreter/mock/MockInterpreter11.java | 3 +-
.../interpreter/mock/MockInterpreter2.java | 3 +-
71 files changed, 875 insertions(+), 319 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/alluxio/src/main/java/org/apache/zeppelin/alluxio/AlluxioInterpreter.java
----------------------------------------------------------------------
diff --git a/alluxio/src/main/java/org/apache/zeppelin/alluxio/AlluxioInterpreter.java b/alluxio/src/main/java/org/apache/zeppelin/alluxio/AlluxioInterpreter.java
index 79e10b6..8eb152b 100644
--- a/alluxio/src/main/java/org/apache/zeppelin/alluxio/AlluxioInterpreter.java
+++ b/alluxio/src/main/java/org/apache/zeppelin/alluxio/AlluxioInterpreter.java
@@ -23,9 +23,9 @@ import java.io.PrintStream;
import java.io.ByteArrayOutputStream;
import java.util.*;
+import org.apache.zeppelin.completer.CompletionType;
import org.apache.zeppelin.interpreter.Interpreter;
import org.apache.zeppelin.interpreter.InterpreterContext;
-import org.apache.zeppelin.interpreter.InterpreterPropertyBuilder;
import org.apache.zeppelin.interpreter.InterpreterResult;
import org.apache.zeppelin.interpreter.InterpreterResult.Code;
import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion;
@@ -166,7 +166,8 @@ public class AlluxioInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
String[] words = splitAndRemoveEmpty(splitAndRemoveEmpty(buf, "\n"), " ");
String lastWord = "";
if (words.length > 0) {
@@ -176,7 +177,7 @@ public class AlluxioInterpreter extends Interpreter {
List<InterpreterCompletion> voices = new LinkedList<>();
for (String command : keywords) {
if (command.startsWith(lastWord)) {
- voices.add(new InterpreterCompletion(command, command));
+ voices.add(new InterpreterCompletion(command, command, CompletionType.command.name()));
}
}
return voices;
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/alluxio/src/test/java/org/apache/zeppelin/alluxio/AlluxioInterpreterTest.java
----------------------------------------------------------------------
diff --git a/alluxio/src/test/java/org/apache/zeppelin/alluxio/AlluxioInterpreterTest.java b/alluxio/src/test/java/org/apache/zeppelin/alluxio/AlluxioInterpreterTest.java
index 3aff4aa..e272a51 100644
--- a/alluxio/src/test/java/org/apache/zeppelin/alluxio/AlluxioInterpreterTest.java
+++ b/alluxio/src/test/java/org/apache/zeppelin/alluxio/AlluxioInterpreterTest.java
@@ -29,6 +29,8 @@ import java.util.Properties;
import alluxio.client.WriteType;
import alluxio.client.file.URIStatus;
+
+import org.apache.zeppelin.completer.CompletionType;
import org.apache.zeppelin.interpreter.InterpreterResult;
import org.apache.zeppelin.interpreter.InterpreterResult.Code;
import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion;
@@ -78,28 +80,28 @@ public class AlluxioInterpreterTest {
@Test
public void testCompletion() {
List expectedResultOne = Arrays.asList(
- new InterpreterCompletion("cat", "cat"),
- new InterpreterCompletion("chgrp", "chgrp"),
- new InterpreterCompletion("chmod", "chmod"),
- new InterpreterCompletion("chown", "chown"),
- new InterpreterCompletion("copyFromLocal", "copyFromLocal"),
- new InterpreterCompletion("copyToLocal", "copyToLocal"),
- new InterpreterCompletion("count", "count"),
- new InterpreterCompletion("createLineage", "createLineage"));
+ new InterpreterCompletion("cat", "cat", CompletionType.command.name()),
+ new InterpreterCompletion("chgrp", "chgrp", CompletionType.command.name()),
+ new InterpreterCompletion("chmod", "chmod", CompletionType.command.name()),
+ new InterpreterCompletion("chown", "chown", CompletionType.command.name()),
+ new InterpreterCompletion("copyFromLocal", "copyFromLocal", CompletionType.command.name()),
+ new InterpreterCompletion("copyToLocal", "copyToLocal", CompletionType.command.name()),
+ new InterpreterCompletion("count", "count", CompletionType.command.name()),
+ new InterpreterCompletion("createLineage", "createLineage", CompletionType.command.name()));
List expectedResultTwo = Arrays.asList(
- new InterpreterCompletion("copyFromLocal", "copyFromLocal"),
- new InterpreterCompletion("copyToLocal", "copyToLocal"),
- new InterpreterCompletion("count", "count"));
+ new InterpreterCompletion("copyFromLocal", "copyFromLocal", CompletionType.command.name()),
+ new InterpreterCompletion("copyToLocal", "copyToLocal", CompletionType.command.name()),
+ new InterpreterCompletion("count", "count", CompletionType.command.name()));
List expectedResultThree = Arrays.asList(
- new InterpreterCompletion("copyFromLocal", "copyFromLocal"),
- new InterpreterCompletion("copyToLocal", "copyToLocal"));
+ new InterpreterCompletion("copyFromLocal", "copyFromLocal", CompletionType.command.name()),
+ new InterpreterCompletion("copyToLocal", "copyToLocal", CompletionType.command.name()));
List expectedResultNone = new ArrayList<>();
- List<InterpreterCompletion> resultOne = alluxioInterpreter.completion("c", 0);
- List<InterpreterCompletion> resultTwo = alluxioInterpreter.completion("co", 0);
- List<InterpreterCompletion> resultThree = alluxioInterpreter.completion("copy", 0);
- List<InterpreterCompletion> resultNotMatch = alluxioInterpreter.completion("notMatch", 0);
- List<InterpreterCompletion> resultAll = alluxioInterpreter.completion("", 0);
+ List<InterpreterCompletion> resultOne = alluxioInterpreter.completion("c", 0, null);
+ List<InterpreterCompletion> resultTwo = alluxioInterpreter.completion("co", 0, null);
+ List<InterpreterCompletion> resultThree = alluxioInterpreter.completion("copy", 0, null);
+ List<InterpreterCompletion> resultNotMatch = alluxioInterpreter.completion("notMatch", 0, null);
+ List<InterpreterCompletion> resultAll = alluxioInterpreter.completion("", 0, null);
Assert.assertEquals(expectedResultOne, resultOne);
Assert.assertEquals(expectedResultTwo, resultTwo);
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/angular/src/main/java/org/apache/zeppelin/angular/AngularInterpreter.java
----------------------------------------------------------------------
diff --git a/angular/src/main/java/org/apache/zeppelin/angular/AngularInterpreter.java b/angular/src/main/java/org/apache/zeppelin/angular/AngularInterpreter.java
index f8ff350..696e450 100644
--- a/angular/src/main/java/org/apache/zeppelin/angular/AngularInterpreter.java
+++ b/angular/src/main/java/org/apache/zeppelin/angular/AngularInterpreter.java
@@ -67,7 +67,8 @@ public class AngularInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return new LinkedList<>();
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/beam/src/main/java/org/apache/zeppelin/beam/BeamInterpreter.java
----------------------------------------------------------------------
diff --git a/beam/src/main/java/org/apache/zeppelin/beam/BeamInterpreter.java b/beam/src/main/java/org/apache/zeppelin/beam/BeamInterpreter.java
index caa91c3..37ccfae 100644
--- a/beam/src/main/java/org/apache/zeppelin/beam/BeamInterpreter.java
+++ b/beam/src/main/java/org/apache/zeppelin/beam/BeamInterpreter.java
@@ -92,7 +92,8 @@ public class BeamInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return Collections.emptyList();
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/bigquery/src/main/java/org/apache/zeppelin/bigquery/BigQueryInterpreter.java
----------------------------------------------------------------------
diff --git a/bigquery/src/main/java/org/apache/zeppelin/bigquery/BigQueryInterpreter.java b/bigquery/src/main/java/org/apache/zeppelin/bigquery/BigQueryInterpreter.java
index 33e1960..d0c23e5 100644
--- a/bigquery/src/main/java/org/apache/zeppelin/bigquery/BigQueryInterpreter.java
+++ b/bigquery/src/main/java/org/apache/zeppelin/bigquery/BigQueryInterpreter.java
@@ -332,7 +332,8 @@ public class BigQueryInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return NO_COMPLETION;
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/cassandra/src/main/java/org/apache/zeppelin/cassandra/CassandraInterpreter.java
----------------------------------------------------------------------
diff --git a/cassandra/src/main/java/org/apache/zeppelin/cassandra/CassandraInterpreter.java b/cassandra/src/main/java/org/apache/zeppelin/cassandra/CassandraInterpreter.java
index a4984ad..5eb3a03 100644
--- a/cassandra/src/main/java/org/apache/zeppelin/cassandra/CassandraInterpreter.java
+++ b/cassandra/src/main/java/org/apache/zeppelin/cassandra/CassandraInterpreter.java
@@ -216,7 +216,8 @@ public class CassandraInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return NO_COMPLETION;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/docs/interpreter/jdbc.md
----------------------------------------------------------------------
diff --git a/docs/interpreter/jdbc.md b/docs/interpreter/jdbc.md
index ab31b11..2c1d2f7 100644
--- a/docs/interpreter/jdbc.md
+++ b/docs/interpreter/jdbc.md
@@ -123,6 +123,11 @@ The JDBC interpreter properties are defined by default like below.
<td></td>
<td>Some SQL which executes while opening connection</td>
</tr>
+ <tr>
+ <td>default.completer.schemaFilters</td>
+ <td></td>
+ <td>\u0421omma separated schema (schema = catalog = database) filters to get metadata for completions. Supports '%' symbol is equivalent to any set of characters. (ex. prod_v_%,public%,info)</td>
+ </tr>
</table>
If you want to connect other databases such as `Mysql`, `Redshift` and `Hive`, you need to edit the property values.
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreter.java
----------------------------------------------------------------------
diff --git a/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreter.java b/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreter.java
index 8c5bc94..33448df 100644
--- a/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreter.java
+++ b/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreter.java
@@ -33,6 +33,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
+import org.apache.zeppelin.completer.CompletionType;
import org.apache.zeppelin.elasticsearch.action.ActionResponse;
import org.apache.zeppelin.elasticsearch.action.AggWrapper;
import org.apache.zeppelin.elasticsearch.action.HitWrapper;
@@ -239,12 +240,13 @@ public class ElasticsearchInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String s, int i) {
+ public List<InterpreterCompletion> completion(String s, int i,
+ InterpreterContext interpreterContext) {
final List suggestions = new ArrayList<>();
for (final String cmd : COMMANDS) {
if (cmd.toLowerCase().contains(s)) {
- suggestions.add(new InterpreterCompletion(cmd, cmd));
+ suggestions.add(new InterpreterCompletion(cmd, cmd, CompletionType.command.name()));
}
}
return suggestions;
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java
----------------------------------------------------------------------
diff --git a/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java b/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java
index aece163..4679f29 100644
--- a/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java
+++ b/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java
@@ -31,6 +31,7 @@ import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.lang.math.RandomUtils;
+import org.apache.zeppelin.completer.CompletionType;
import org.apache.zeppelin.display.AngularObjectRegistry;
import org.apache.zeppelin.interpreter.InterpreterContext;
import org.apache.zeppelin.interpreter.InterpreterResult;
@@ -305,12 +306,12 @@ public class ElasticsearchInterpreterTest {
@Theory
public void testCompletion(ElasticsearchInterpreter interpreter) {
- final List<InterpreterCompletion> expectedResultOne = Arrays.asList(new InterpreterCompletion("count", "count"));
- final List<InterpreterCompletion> expectedResultTwo = Arrays.asList(new InterpreterCompletion("help", "help"));
+ final List<InterpreterCompletion> expectedResultOne = Arrays.asList(new InterpreterCompletion("count", "count", CompletionType.command.name()));
+ final List<InterpreterCompletion> expectedResultTwo = Arrays.asList(new InterpreterCompletion("help", "help", CompletionType.command.name()));
- final List<InterpreterCompletion> resultOne = interpreter.completion("co", 0);
- final List<InterpreterCompletion> resultTwo = interpreter.completion("he", 0);
- final List<InterpreterCompletion> resultAll = interpreter.completion("", 0);
+ final List<InterpreterCompletion> resultOne = interpreter.completion("co", 0, null);
+ final List<InterpreterCompletion> resultTwo = interpreter.completion("he", 0, null);
+ final List<InterpreterCompletion> resultAll = interpreter.completion("", 0, null);
Assert.assertEquals(expectedResultOne, resultOne);
Assert.assertEquals(expectedResultTwo, resultTwo);
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/file/src/main/java/org/apache/zeppelin/file/FileInterpreter.java
----------------------------------------------------------------------
diff --git a/file/src/main/java/org/apache/zeppelin/file/FileInterpreter.java b/file/src/main/java/org/apache/zeppelin/file/FileInterpreter.java
index 9aa3605..d7aad19 100644
--- a/file/src/main/java/org/apache/zeppelin/file/FileInterpreter.java
+++ b/file/src/main/java/org/apache/zeppelin/file/FileInterpreter.java
@@ -166,7 +166,8 @@ public abstract class FileInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/file/src/main/java/org/apache/zeppelin/file/HDFSFileInterpreter.java
----------------------------------------------------------------------
diff --git a/file/src/main/java/org/apache/zeppelin/file/HDFSFileInterpreter.java b/file/src/main/java/org/apache/zeppelin/file/HDFSFileInterpreter.java
index 1b2b01c..c4a1730 100644
--- a/file/src/main/java/org/apache/zeppelin/file/HDFSFileInterpreter.java
+++ b/file/src/main/java/org/apache/zeppelin/file/HDFSFileInterpreter.java
@@ -23,6 +23,8 @@ import java.util.*;
import com.google.gson.Gson;
import org.apache.commons.lang.StringUtils;
+import org.apache.zeppelin.completer.CompletionType;
+import org.apache.zeppelin.interpreter.InterpreterContext;
import org.apache.zeppelin.interpreter.InterpreterException;
import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion;
@@ -247,21 +249,25 @@ public class HDFSFileInterpreter extends FileInterpreter {
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
logger.info("Completion request at position\t" + cursor + " in string " + buf);
final List<InterpreterCompletion> suggestions = new ArrayList<>();
if (StringUtils.isEmpty(buf)) {
- suggestions.add(new InterpreterCompletion("ls", "ls"));
- suggestions.add(new InterpreterCompletion("cd", "cd"));
- suggestions.add(new InterpreterCompletion("pwd", "pwd"));
+ suggestions.add(new InterpreterCompletion("ls", "ls", CompletionType.command.name()));
+ suggestions.add(new InterpreterCompletion("cd", "cd", CompletionType.command.name()));
+ suggestions.add(new InterpreterCompletion("pwd", "pwd", CompletionType.command.name()));
return suggestions;
}
//part of a command == no spaces
if (buf.split(" ").length == 1){
- if ("cd".contains(buf)) suggestions.add(new InterpreterCompletion("cd", "cd"));
- if ("ls".contains(buf)) suggestions.add(new InterpreterCompletion("ls", "ls"));
- if ("pwd".contains(buf)) suggestions.add(new InterpreterCompletion("pwd", "pwd"));
+ if ("cd".contains(buf)) suggestions.add(new InterpreterCompletion("cd", "cd",
+ CompletionType.command.name()));
+ if ("ls".contains(buf)) suggestions.add(new InterpreterCompletion("ls", "ls",
+ CompletionType.command.name()));
+ if ("pwd".contains(buf)) suggestions.add(new InterpreterCompletion("pwd", "pwd",
+ CompletionType.command.name()));
return suggestions;
}
@@ -298,7 +304,8 @@ public class HDFSFileInterpreter extends FileInterpreter {
String beforeLastPeriod = unfinished.substring(0, unfinished.lastIndexOf('.') + 1);
//beforeLastPeriod should be the start of fs.pathSuffix, so take the end of it.
String suggestedFinish = fs.pathSuffix.substring(beforeLastPeriod.length());
- suggestions.add(new InterpreterCompletion(suggestedFinish, suggestedFinish));
+ suggestions.add(new InterpreterCompletion(suggestedFinish, suggestedFinish,
+ CompletionType.path.name()));
}
}
return suggestions;
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/file/src/test/java/org/apache/zeppelin/file/HDFSFileInterpreterTest.java
----------------------------------------------------------------------
diff --git a/file/src/test/java/org/apache/zeppelin/file/HDFSFileInterpreterTest.java b/file/src/test/java/org/apache/zeppelin/file/HDFSFileInterpreterTest.java
index fe6697d..335693f 100644
--- a/file/src/test/java/org/apache/zeppelin/file/HDFSFileInterpreterTest.java
+++ b/file/src/test/java/org/apache/zeppelin/file/HDFSFileInterpreterTest.java
@@ -21,6 +21,8 @@ package org.apache.zeppelin.file;
import com.google.gson.Gson;
import junit.framework.TestCase;
import static org.junit.Assert.*;
+
+import org.apache.zeppelin.completer.CompletionType;
import org.apache.zeppelin.interpreter.InterpreterResult;
import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion;
import org.junit.Test;
@@ -106,11 +108,11 @@ public class HDFSFileInterpreterTest extends TestCase {
// auto completion test
List expectedResultOne = Arrays.asList(
- new InterpreterCompletion("ls", "ls"));
+ new InterpreterCompletion("ls", "ls", CompletionType.command.name()));
List expectedResultTwo = Arrays.asList(
- new InterpreterCompletion("pwd", "pwd"));
- List<InterpreterCompletion> resultOne = t.completion("l", 0);
- List<InterpreterCompletion> resultTwo = t.completion("p", 0);
+ new InterpreterCompletion("pwd", "pwd", CompletionType.command.name()));
+ List<InterpreterCompletion> resultOne = t.completion("l", 0, null);
+ List<InterpreterCompletion> resultTwo = t.completion("p", 0, null);
assertEquals(expectedResultOne, resultOne);
assertEquals(expectedResultTwo, resultTwo);
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/flink/src/main/java/org/apache/zeppelin/flink/FlinkInterpreter.java
----------------------------------------------------------------------
diff --git a/flink/src/main/java/org/apache/zeppelin/flink/FlinkInterpreter.java b/flink/src/main/java/org/apache/zeppelin/flink/FlinkInterpreter.java
index 8b9b4ec..91ffb9c 100644
--- a/flink/src/main/java/org/apache/zeppelin/flink/FlinkInterpreter.java
+++ b/flink/src/main/java/org/apache/zeppelin/flink/FlinkInterpreter.java
@@ -373,7 +373,8 @@ public class FlinkInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return new LinkedList<>();
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/geode/src/main/java/org/apache/zeppelin/geode/GeodeOqlInterpreter.java
----------------------------------------------------------------------
diff --git a/geode/src/main/java/org/apache/zeppelin/geode/GeodeOqlInterpreter.java b/geode/src/main/java/org/apache/zeppelin/geode/GeodeOqlInterpreter.java
index b6c3faa..1825008 100644
--- a/geode/src/main/java/org/apache/zeppelin/geode/GeodeOqlInterpreter.java
+++ b/geode/src/main/java/org/apache/zeppelin/geode/GeodeOqlInterpreter.java
@@ -282,7 +282,8 @@ public class GeodeOqlInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/hbase/src/main/java/org/apache/zeppelin/hbase/HbaseInterpreter.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/zeppelin/hbase/HbaseInterpreter.java b/hbase/src/main/java/org/apache/zeppelin/hbase/HbaseInterpreter.java
index 6c2460d..74d3ed1 100644
--- a/hbase/src/main/java/org/apache/zeppelin/hbase/HbaseInterpreter.java
+++ b/hbase/src/main/java/org/apache/zeppelin/hbase/HbaseInterpreter.java
@@ -145,7 +145,8 @@ public class HbaseInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return null;
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/helium-dev/src/main/java/org/apache/zeppelin/helium/DevInterpreter.java
----------------------------------------------------------------------
diff --git a/helium-dev/src/main/java/org/apache/zeppelin/helium/DevInterpreter.java b/helium-dev/src/main/java/org/apache/zeppelin/helium/DevInterpreter.java
index 07b6326..7d1c361 100644
--- a/helium-dev/src/main/java/org/apache/zeppelin/helium/DevInterpreter.java
+++ b/helium-dev/src/main/java/org/apache/zeppelin/helium/DevInterpreter.java
@@ -98,7 +98,8 @@ public class DevInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return new LinkedList<>();
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteInterpreter.java
----------------------------------------------------------------------
diff --git a/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteInterpreter.java b/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteInterpreter.java
index 0b022fa..ac385ea 100644
--- a/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteInterpreter.java
+++ b/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteInterpreter.java
@@ -331,7 +331,8 @@ public class IgniteInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return new LinkedList<>();
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteSqlInterpreter.java
----------------------------------------------------------------------
diff --git a/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteSqlInterpreter.java b/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteSqlInterpreter.java
index 03ea4f8..41803bb 100644
--- a/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteSqlInterpreter.java
+++ b/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteSqlInterpreter.java
@@ -184,7 +184,8 @@ public class IgniteSqlInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
return new LinkedList<>();
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/jdbc/pom.xml
----------------------------------------------------------------------
diff --git a/jdbc/pom.xml b/jdbc/pom.xml
index e34be89..71d3310 100644
--- a/jdbc/pom.xml
+++ b/jdbc/pom.xml
@@ -35,7 +35,6 @@
<properties>
<!--library versions-->
<postgresql.version>9.4-1201-jdbc41</postgresql.version>
- <jline.version>2.12.1</jline.version>
<hadoop.common.version>2.7.2</hadoop.common.version>
<h2.version>1.4.190</h2.version>
<commons.dbcp2.version>2.0.1</commons.dbcp2.version>
@@ -68,17 +67,6 @@
<artifactId>slf4j-log4j12</artifactId>
</dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </dependency>
-
- <dependency>
- <groupId>jline</groupId>
- <artifactId>jline</artifactId>
- <version>${jline.version}</version>
- </dependency>
-
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/jdbc/src/main/java/org/apache/zeppelin/jdbc/JDBCInterpreter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/zeppelin/jdbc/JDBCInterpreter.java b/jdbc/src/main/java/org/apache/zeppelin/jdbc/JDBCInterpreter.java
index 2e35e81..ff3d3cf 100644
--- a/jdbc/src/main/java/org/apache/zeppelin/jdbc/JDBCInterpreter.java
+++ b/jdbc/src/main/java/org/apache/zeppelin/jdbc/JDBCInterpreter.java
@@ -57,9 +57,7 @@ import org.apache.zeppelin.user.UsernamePassword;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.base.Function;
import com.google.common.base.Throwables;
-import com.google.common.collect.Lists;
import static org.apache.commons.lang.StringUtils.containsIgnoreCase;
import static org.apache.commons.lang.StringUtils.isEmpty;
@@ -103,6 +101,7 @@ public class JDBCInterpreter extends Interpreter {
static final String USER_KEY = "user";
static final String PASSWORD_KEY = "password";
static final String PRECODE_KEY = "precode";
+ static final String COMPLETER_SCHEMA_FILTERS_KEY = "completer.schemaFilters";
static final String JDBC_JCEKS_FILE = "jceks.file";
static final String JDBC_JCEKS_CREDENTIAL_KEY = "jceks.credentialKey";
static final String PRECODE_KEY_TEMPLATE = "%s.precode";
@@ -130,22 +129,12 @@ public class JDBCInterpreter extends Interpreter {
private final HashMap<String, Properties> basePropretiesMap;
private final HashMap<String, JDBCUserConfigurations> jdbcUserConfigurationsMap;
- private final Map<String, SqlCompleter> propertyKeySqlCompleterMap;
- private static final Function<CharSequence, InterpreterCompletion> sequenceToStringTransformer =
- new Function<CharSequence, InterpreterCompletion>() {
- public InterpreterCompletion apply(CharSequence seq) {
- return new InterpreterCompletion(seq.toString(), seq.toString());
- }
- };
-
- private static final List<InterpreterCompletion> NO_COMPLETION = new ArrayList<>();
private int maxLineResults;
public JDBCInterpreter(Properties property) {
super(property);
jdbcUserConfigurationsMap = new HashMap<>();
- propertyKeySqlCompleterMap = new HashMap<>();
basePropretiesMap = new HashMap<>();
maxLineResults = MAX_LINE_DEFAULT;
}
@@ -193,9 +182,7 @@ public class JDBCInterpreter extends Interpreter {
if (!isEmpty(property.getProperty("zeppelin.jdbc.auth.type"))) {
JDBCSecurityImpl.createSecureConfiguration(property);
}
- for (String propertyKey : basePropretiesMap.keySet()) {
- propertyKeySqlCompleterMap.put(propertyKey, createSqlCompleter(null));
- }
+
setMaxLineResults();
}
@@ -206,10 +193,11 @@ public class JDBCInterpreter extends Interpreter {
}
}
- private SqlCompleter createSqlCompleter(Connection jdbcConnection) {
-
+ private SqlCompleter createSqlCompleter(Connection jdbcConnection, String propertyKey) {
+ String schemaFiltersKey = String.format("%s.%s", propertyKey, COMPLETER_SCHEMA_FILTERS_KEY);
+ String filters = getProperty(schemaFiltersKey);
SqlCompleter completer = new SqlCompleter();
- completer.initFromConnection(jdbcConnection, "");
+ completer.initFromConnection(jdbcConnection, filters);
return completer;
}
@@ -425,7 +413,7 @@ public class JDBCInterpreter extends Interpreter {
connection = getConnectionFromPool(url, user, propertyKey, properties);
}
}
- propertyKeySqlCompleterMap.put(propertyKey, createSqlCompleter(connection));
+
return connection;
}
@@ -794,18 +782,26 @@ public class JDBCInterpreter extends Interpreter {
}
@Override
- public List<InterpreterCompletion> completion(String buf, int cursor) {
- List<CharSequence> candidates = new ArrayList<>();
- SqlCompleter sqlCompleter = propertyKeySqlCompleterMap.get(getPropertyKey(buf));
- // It's strange but here cursor comes with additional +1 (even if buf is "" cursor = 1)
- if (sqlCompleter != null && sqlCompleter.complete(buf, cursor - 1, candidates) >= 0) {
- List<InterpreterCompletion> completion;
- completion = Lists.transform(candidates, sequenceToStringTransformer);
-
- return completion;
- } else {
- return NO_COMPLETION;
+ public List<InterpreterCompletion> completion(String buf, int cursor,
+ InterpreterContext interpreterContext) {
+ List<InterpreterCompletion> candidates = new ArrayList<>();
+ String propertyKey = getPropertyKey(buf);
+ Connection connection = null;
+ try {
+ if (interpreterContext != null) {
+ connection = getConnection(propertyKey, interpreterContext);
+ }
+ } catch (ClassNotFoundException | SQLException | IOException e) {
+ logger.warn("SQLCompleter will created without use connection");
}
+
+ SqlCompleter sqlCompleter = createSqlCompleter(connection, propertyKey);
+
+ if (sqlCompleter != null) {
+ sqlCompleter.complete(buf, cursor - 1, candidates);
+ }
+
+ return candidates;
}
public int getMaxResult() {
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/jdbc/src/main/java/org/apache/zeppelin/jdbc/SqlCompleter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/zeppelin/jdbc/SqlCompleter.java b/jdbc/src/main/java/org/apache/zeppelin/jdbc/SqlCompleter.java
index bf2a25e..704ec59 100644
--- a/jdbc/src/main/java/org/apache/zeppelin/jdbc/SqlCompleter.java
+++ b/jdbc/src/main/java/org/apache/zeppelin/jdbc/SqlCompleter.java
@@ -4,15 +4,6 @@ package org.apache.zeppelin.jdbc;
* This source file is based on code taken from SQLLine 1.0.2 See SQLLine notice in LICENSE
*/
-import com.google.common.base.Joiner;
-import com.google.common.collect.Sets;
-import com.google.common.collect.Sets.SetView;
-import jline.console.completer.ArgumentCompleter.ArgumentList;
-import jline.console.completer.ArgumentCompleter.WhitespaceArgumentDelimiter;
-import jline.console.completer.StringsCompleter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
@@ -20,15 +11,34 @@ import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.TreeSet;
import java.util.regex.Pattern;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.NumberUtils;
+import org.apache.zeppelin.completer.CompletionType;
+import org.apache.zeppelin.completer.StringsCompleter;
+import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import jline.console.completer.ArgumentCompleter.ArgumentList;
+import jline.console.completer.ArgumentCompleter.WhitespaceArgumentDelimiter;
+
import static org.apache.commons.lang.StringUtils.isBlank;
/**
* SQL auto complete functionality for the JdbcInterpreter.
*/
-public class SqlCompleter extends StringsCompleter {
+public class SqlCompleter {
private static Logger logger = LoggerFactory.getLogger(SqlCompleter.class);
@@ -67,8 +77,7 @@ public class SqlCompleter extends StringsCompleter {
*/
private StringsCompleter keywordCompleter = new StringsCompleter();
- @Override
- public int complete(String buffer, int cursor, List<CharSequence> candidates) {
+ public int complete(String buffer, int cursor, List<InterpreterCompletion> candidates) {
logger.debug("Complete with buffer = " + buffer + ", cursor = " + cursor);
@@ -76,21 +85,36 @@ public class SqlCompleter extends StringsCompleter {
// white spaces.
ArgumentList argumentList = sqlDelimiter.delimit(buffer, cursor);
- String beforeCursorBuffer = buffer.substring(0,
- Math.min(cursor, buffer.length())).toUpperCase();
+ Pattern whitespaceEndPatter = Pattern.compile("\\s$");
+ String cursorArgument = null;
+ int argumentPosition;
+ if (buffer.length() == 0 || whitespaceEndPatter.matcher(buffer).find()) {
+ argumentPosition = buffer.length() - 1;
+ } else {
+ cursorArgument = argumentList.getCursorArgument();
+ argumentPosition = argumentList.getArgumentPosition();
+ }
- // check what sql is and where cursor is to allow column completion or not
boolean isColumnAllowed = true;
- if (beforeCursorBuffer.contains("SELECT ") && beforeCursorBuffer.contains(" FROM ")
- && !beforeCursorBuffer.contains(" WHERE "))
- isColumnAllowed = false;
+ if (buffer.length() > 0) {
+ String beforeCursorBuffer = buffer.substring(0,
+ Math.min(cursor, buffer.length())).toUpperCase();
+ // check what sql is and where cursor is to allow column completion or not
+ if (beforeCursorBuffer.contains("SELECT ") && beforeCursorBuffer.contains(" FROM ")
+ && !beforeCursorBuffer.contains(" WHERE "))
+ isColumnAllowed = false;
+ }
- int complete = completeName(argumentList.getCursorArgument(),
- argumentList.getArgumentPosition(), candidates,
+ int complete = completeName(cursorArgument, argumentPosition, candidates,
findAliasesInSQL(argumentList.getArguments()), isColumnAllowed);
+ if (candidates.size() == 1) {
+ InterpreterCompletion interpreterCompletion = candidates.get(0);
+ interpreterCompletion.setName(interpreterCompletion.getName() + " ");
+ interpreterCompletion.setValue(interpreterCompletion.getValue() + " ");
+ candidates.set(0, interpreterCompletion);
+ }
logger.debug("complete:" + complete + ", size:" + candidates.size());
-
return complete;
}
@@ -98,24 +122,26 @@ public class SqlCompleter extends StringsCompleter {
* Return list of schema names within the database
*
* @param meta metadata from connection to database
- * @param schemaFilter a schema name pattern; must match the schema name
+ * @param schemaFilters a schema name patterns; must match the schema name
* as it is stored in the database; "" retrieves those without a schema;
* <code>null</code> means that the schema name should not be used to narrow
- * the search; supports '%' and '_' symbols; for example "prod_v_%"
+ * the search; supports '%'; for example "prod_v_%"
* @return set of all schema names in the database
*/
- private static Set<String> getSchemaNames(DatabaseMetaData meta, String schemaFilter) {
+ private static Set<String> getSchemaNames(DatabaseMetaData meta, List<String> schemaFilters) {
Set<String> res = new HashSet<>();
try {
ResultSet schemas = meta.getSchemas();
try {
while (schemas.next()) {
String schemaName = schemas.getString("TABLE_SCHEM");
- if (schemaName == null)
+ if (schemaName == null) {
schemaName = "";
- if (schemaFilter.equals("") || schemaFilter == null || schemaName.matches(
- schemaFilter.replace("_", ".").replace("%", ".*?"))) {
- res.add(schemaName);
+ }
+ for (String schemaFilter : schemaFilters) {
+ if (schemaFilter.equals("") || schemaName.matches(schemaFilter.replace("%", ".*?"))) {
+ res.add(schemaName);
+ }
}
}
} finally {
@@ -131,22 +157,23 @@ public class SqlCompleter extends StringsCompleter {
* Return list of catalog names within the database
*
* @param meta metadata from connection to database
- * @param schemaFilter a catalog name pattern; must match the catalog name
+ * @param schemaFilters a catalog name patterns; must match the catalog name
* as it is stored in the database; "" retrieves those without a catalog;
* <code>null</code> means that the schema name should not be used to narrow
- * the search; supports '%' and '_' symbols; for example "prod_v_%"
+ * the search; supports '%'; for example "prod_v_%"
* @return set of all catalog names in the database
*/
- private static Set<String> getCatalogNames(DatabaseMetaData meta, String schemaFilter) {
+ private static Set<String> getCatalogNames(DatabaseMetaData meta, List<String> schemaFilters) {
Set<String> res = new HashSet<>();
try {
ResultSet schemas = meta.getCatalogs();
try {
while (schemas.next()) {
String schemaName = schemas.getString("TABLE_CAT");
- if (schemaFilter.equals("") || schemaFilter == null || schemaName.matches(
- schemaFilter.replace("_", ".").replace("%", ".*?"))) {
- res.add(schemaName);
+ for (String schemaFilter : schemaFilters) {
+ if (schemaFilter.equals("") || schemaName.matches(schemaFilter.replace("%", ".*?"))) {
+ res.add(schemaName);
+ }
}
}
} finally {
@@ -166,7 +193,7 @@ public class SqlCompleter extends StringsCompleter {
* @param schemaFilter a schema name pattern; must match the schema name
* as it is stored in the database; "" retrieves those without a schema;
* <code>null</code> means that the schema name should not be used to narrow
- * the search; supports '%' and '_' symbols; for example "prod_v_%"
+ * the search; supports '%'; for example "prod_v_%"
* @param tables function fills this map, for every schema name adds
* set of table names within the schema
* @param columns function fills this map, for every table name adds set
@@ -177,19 +204,27 @@ public class SqlCompleter extends StringsCompleter {
Map<String, Set<String>> tables,
Map<String, Set<String>> columns) {
try {
- ResultSet cols = meta.getColumns(catalogName, schemaFilter, "%",
- "%");
+ ResultSet cols = meta.getColumns(catalogName, StringUtils.EMPTY, "%", "%");
try {
while (cols.next()) {
String schema = cols.getString("TABLE_SCHEM");
- if (schema == null) schema = cols.getString("TABLE_CAT");
+ if (schema == null) {
+ schema = cols.getString("TABLE_CAT");
+ }
+ if (!schemaFilter.equals("") && !schema.matches(schemaFilter.replace("%", ".*?"))) {
+ continue;
+ }
String table = cols.getString("TABLE_NAME");
String column = cols.getString("COLUMN_NAME");
if (!isBlank(table)) {
String schemaTable = schema + "." + table;
- if (!columns.containsKey(schemaTable)) columns.put(schemaTable, new HashSet<String>());
+ if (!columns.containsKey(schemaTable)) {
+ columns.put(schemaTable, new HashSet<String>());
+ }
columns.get(schemaTable).add(column);
- if (!tables.containsKey(schema)) tables.put(schema, new HashSet<String>());
+ if (!tables.containsKey(schema)) {
+ tables.put(schema, new HashSet<String>());
+ }
tables.get(schema).add(table);
}
}
@@ -327,33 +362,31 @@ public class SqlCompleter extends StringsCompleter {
* Initializes all local completers from database connection
*
* @param connection database connection
- * @param schemaFilter a schema name pattern; must match the schema name
- * as it is stored in the database; "" retrieves those without a schema;
- * <code>null</code> means that the schema name should not be used to narrow
- * the search; supports '%' and '_' symbols; for example "prod_v_%"
+ * @param schemaFiltersString a comma separated schema name patterns; supports '%' symbol;
+ * for example "prod_v_%,prod_t_%"
*/
- public void initFromConnection(Connection connection, String schemaFilter) {
+ public void initFromConnection(Connection connection, String schemaFiltersString) {
+ if (schemaFiltersString == null) {
+ schemaFiltersString = StringUtils.EMPTY;
+ }
+ List<String> schemaFilters = Arrays.asList(schemaFiltersString.split(","));
- try {
+ try (Connection c = connection) {
Map<String, Set<String>> tables = new HashMap<>();
Map<String, Set<String>> columns = new HashMap<>();
Set<String> schemas = new HashSet<>();
Set<String> catalogs = new HashSet<>();
Set<String> keywords = getSqlKeywordsCompletions(connection);
if (connection != null) {
- schemas = getSchemaNames(connection.getMetaData(), schemaFilter);
- catalogs = getCatalogNames(connection.getMetaData(), schemaFilter);
-
- if (!"".equals(connection.getCatalog())) {
- if (schemas.size() == 0 )
- schemas.add(connection.getCatalog());
- fillTableAndColumnNames(connection.getCatalog(), connection.getMetaData(), schemaFilter,
- tables, columns);
- } else {
- if (schemas.size() == 0) schemas.addAll(catalogs);
- for (String catalog : catalogs) {
- fillTableAndColumnNames(catalog, connection.getMetaData(), schemaFilter, tables,
- columns);
+ schemas = getSchemaNames(connection.getMetaData(), schemaFilters);
+ catalogs = getCatalogNames(connection.getMetaData(), schemaFilters);
+ if (schemas.size() == 0) {
+ schemas.addAll(catalogs);
+ }
+ for (String schema : schemas) {
+ for (String schemaFilter : schemaFilters) {
+ fillTableAndColumnNames(schema, connection.getMetaData(), schemaFilter, tables,
+ columns);
}
}
}
@@ -408,8 +441,18 @@ public class SqlCompleter extends StringsCompleter {
*/
private int completeTable(String schema, String buffer, int cursor,
List<CharSequence> candidates) {
+ if (schema == null) {
+ int res = -1;
+ Set<CharSequence> candidatesSet = new HashSet<>();
+ for (StringsCompleter stringsCompleter : tablesCompleters.values()) {
+ int resTable = stringsCompleter.complete(buffer, cursor, candidatesSet);
+ res = Math.max(res, resTable);
+ }
+ candidates.addAll(candidatesSet);
+ return res;
+ }
// Wrong schema
- if (!tablesCompleters.containsKey(schema))
+ if (!tablesCompleters.containsKey(schema) && schema != null)
return -1;
else
return tablesCompleters.get(schema).complete(buffer, cursor, candidates);
@@ -422,12 +465,23 @@ public class SqlCompleter extends StringsCompleter {
*/
private int completeColumn(String schema, String table, String buffer, int cursor,
List<CharSequence> candidates) {
+ if (table == null && schema == null) {
+ int res = -1;
+ Set<CharSequence> candidatesSet = new HashSet<>();
+ for (StringsCompleter stringsCompleter : columnsCompleters.values()) {
+ int resColumn = stringsCompleter.complete(buffer, cursor, candidatesSet);
+ res = Math.max(res, resColumn);
+ }
+ candidates.addAll(candidatesSet);
+ return res;
+ }
// Wrong schema or wrong table
if (!tablesCompleters.containsKey(schema) ||
- !columnsCompleters.containsKey(schema + "." + table))
+ !columnsCompleters.containsKey(schema + "." + table)) {
return -1;
- else
+ } else {
return columnsCompleters.get(schema + "." + table).complete(buffer, cursor, candidates);
+ }
}
/**
@@ -438,32 +492,43 @@ public class SqlCompleter extends StringsCompleter {
* @param isColumnAllowed if false the function will not search and complete columns
* @return -1 in case of no candidates found, 0 otherwise
*/
- public int completeName(String buffer, int cursor, List<CharSequence> candidates,
+ public int completeName(String buffer, int cursor, List<InterpreterCompletion> candidates,
Map<String, String> aliases, boolean isColumnAllowed) {
- if (buffer == null) buffer = "";
-
- // no need to process after first point after cursor
- int nextPointPos = buffer.indexOf('.', cursor);
- if (nextPointPos != -1) buffer = buffer.substring(0, nextPointPos);
-
// points divide the name to the schema, table and column - find them
- int pointPos1 = buffer.indexOf('.');
- int pointPos2 = buffer.indexOf('.', pointPos1 + 1);
+ int pointPos1 = -1;
+ int pointPos2 = -1;
+ if (StringUtils.isNotEmpty(buffer)) {
+ if (buffer.length() > cursor) {
+ buffer = buffer.substring(0, cursor + 1);
+ }
+ pointPos1 = buffer.indexOf('.');
+ pointPos2 = buffer.indexOf('.', pointPos1 + 1);
+ }
// find schema and table name if they are
String schema;
String table;
String column;
- if (pointPos1 == -1) { // process only schema or keyword case
- schema = buffer;
- int keywordsRes = completeKeyword(buffer, cursor, candidates);
+
+ if (pointPos1 == -1) { // process all
+ List<CharSequence> keywordsCandidates = new ArrayList();
List<CharSequence> schemaCandidates = new ArrayList<>();
- int schemaRes = completeSchema(schema, cursor, schemaCandidates);
- candidates.addAll(schemaCandidates);
- return Math.max(keywordsRes, schemaRes);
- }
- else {
+ List<CharSequence> tableCandidates = new ArrayList<>();
+ List<CharSequence> columnCandidates = new ArrayList<>();
+ int keywordsRes = completeKeyword(buffer, cursor, keywordsCandidates);
+ int schemaRes = completeSchema(buffer, cursor, schemaCandidates);
+ int tableRes = completeTable(null, buffer, cursor, tableCandidates);
+ int columnRes = -1;
+ if (isColumnAllowed) {
+ columnRes = completeColumn(null, null, buffer, cursor, columnCandidates);
+ }
+ addCompletions(candidates, keywordsCandidates, CompletionType.keyword.name());
+ addCompletions(candidates, schemaCandidates, CompletionType.schema.name());
+ addCompletions(candidates, tableCandidates, CompletionType.table.name());
+ addCompletions(candidates, columnCandidates, CompletionType.column.name());
+ return NumberUtils.max(new int[]{keywordsRes, schemaRes, tableRes, columnRes});
+ } else {
schema = buffer.substring(0, pointPos1);
if (aliases.containsKey(schema)) { // process alias case
String alias = aliases.get(schema);
@@ -471,26 +536,40 @@ public class SqlCompleter extends StringsCompleter {
schema = alias.substring(0, pointPos);
table = alias.substring(pointPos + 1);
column = buffer.substring(pointPos1 + 1);
- }
- else if (pointPos2 == -1) { // process schema.table case
+ } else if (pointPos2 == -1) { // process schema.table case
+ List<CharSequence> tableCandidates = new ArrayList();
table = buffer.substring(pointPos1 + 1);
- return completeTable(schema, table, cursor - pointPos1 - 1, candidates);
- }
- else {
+ int tableRes = completeTable(schema, table, cursor - pointPos1 - 1, tableCandidates);
+ addCompletions(candidates, tableCandidates, CompletionType.table.name());
+ return tableRes;
+ } else {
table = buffer.substring(pointPos1 + 1, pointPos2);
column = buffer.substring(pointPos2 + 1);
}
}
// here in case of column
- if (isColumnAllowed)
- return completeColumn(schema, table, column, cursor - pointPos2 - 1, candidates);
- else
- return -1;
+ if (table != null && isColumnAllowed) {
+ List<CharSequence> columnCandidates = new ArrayList();
+ int columnRes = completeColumn(schema, table, column, cursor - pointPos2 - 1,
+ columnCandidates);
+ addCompletions(candidates, columnCandidates, CompletionType.column.name());
+ return columnRes;
+ }
+
+ return -1;
}
// test purpose only
WhitespaceArgumentDelimiter getSqlDelimiter() {
return this.sqlDelimiter;
}
+
+ private void addCompletions(List<InterpreterCompletion> interpreterCompletions,
+ List<CharSequence> candidates, String meta) {
+ for (CharSequence candidate : candidates) {
+ interpreterCompletions.add(new InterpreterCompletion(candidate.toString(),
+ candidate.toString(), meta));
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/jdbc/src/main/resources/ansi.sql.keywords
----------------------------------------------------------------------
diff --git a/jdbc/src/main/resources/ansi.sql.keywords b/jdbc/src/main/resources/ansi.sql.keywords
index 1f25a81..35b4bcb 100644
--- a/jdbc/src/main/resources/ansi.sql.keywords
+++ b/jdbc/src/main/resources/ansi.sql.keywords
@@ -1 +1 @@
-ABSOLUTE,ACTION,ADD,ALL,ALLOCATE,ALTER,AND,ANY,ARE,AS,ASC,ASSERTION,AT,AUTHORIZATION,AVG,BEGIN,BETWEEN,BIT,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,CATALOG,CHAR,CHARACTER,CHAR_LENGTH,CHARACTER_LENGTH,CHECK,CLOSE,CLUSTER,COALESCE,COLLATE,COLLATION,COLUMN,COMMIT,CONNECT,CONNECTION,CONSTRAINT,CONSTRAINTS,CONTINUE,CONVERT,CORRESPONDING,COUNT,CREATE,CROSS,CURRENT,CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,CURSOR,DATE,DAY,DEALLOCATE,DEC,DECIMAL,DECLARE,DEFAULT,DEFERRABLE,DEFERRED,DELETE,DESC,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,DISCONNECT,DISTINCT,DOMAIN,DOUBLE,DROP,ELSE,END,END-EXEC,ESCAPE,EXCEPT,EXCEPTION,EXEC,EXECUTE,EXISTS,EXTERNAL,EXTRACT,FALSE,FETCH,FIRST,FLOAT,FOR,FOREIGN,FOUND,FROM,FULL,GET,GLOBAL,GO,GOTO,GRANT,GROUP,HAVING,HOUR,IDENTITY,IMMEDIATE,IN,INDICATOR,INITIALLY,INNER,INPUT,INSENSITIVE,INSERT,INT,INTEGER,INTERSECT,INTERVAL,INTO,IS,ISOLATION,JOIN,KEY,LANGUAGE,LAST,LEADING,LEFT,LEVEL,LIKE,LOCAL,LOWER,MATCH,MAX,MIN,MINUTE,MODULE,MONTH,NAMES,NATIONAL,NATURAL,NCHA
R,NEXT,NO,NOT,NULL,NULLIF,NUMERIC,OCTET_LENGTH,OF,ON,ONLY,OPEN,OPTION,OR,ORDER,OUTER,OUTPUT,OVERLAPS,OVERWRITE,PAD,PARTIAL,PARTITION,POSITION,PRECISION,PREPARE,PRESERVE,PRIMARY,PRIOR,PRIVILEGES,PROCEDURE,PUBLIC,READ,REAL,REFERENCES,RELATIVE,RESTRICT,REVOKE,RIGHT,ROLLBACK,ROWS,SCHEMA,SCROLL,SECOND,SECTION,SELECT,SESSION,SESSION_USER,SET,SIZE,SMALLINT,SOME,SPACE,SQL,SQLCODE,SQLERROR,SQLSTATE,SUBSTRING,SUM,SYSTEM_USER,TABLE,TEMPORARY,THEN,TIME,TIMESTAMP,TIMEZONE_HOUR,TIMEZONE_MINUTE,TO,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,TRUE,UNION,UNIQUE,UNKNOWN,UPDATE,UPPER,USAGE,USER,USING,VALUE,VALUES,VARCHAR,VARYING,VIEW,WHEN,WHENEVER,WHERE,WITH,WORK,WRITE,YEAR,ZONE,ADA,C,CATALOG_NAME,CHARACTER_SET_CATALOG,CHARACTER_SET_NAME,CHARACTER_SET_SCHEMA,CLASS_ORIGIN,COBOL,COLLATION_CATALOG,COLLATION_NAME,COLLATION_SCHEMA,COLUMN_NAME,COMMAND_FUNCTION,COMMITTED,CONDITION_NUMBER,CONNECTION_NAME,CONSTRAINT_CATALOG,CONSTRAINT_NAME,CONSTRAINT_SCHEMA,CURSOR_NAME,DATA,DATETIME_INTERVAL_CODE,DATETIME_I
NTERVAL_PRECISION,DYNAMIC_FUNCTION,FORTRAN,LENGTH,MESSAGE_LENGTH,MESSAGE_OCTET_LENGTH,MESSAGE_TEXT,MORE,MUMPS,NAME,NULLABLE,NUMBER,PASCAL,PLI,REPEATABLE,RETURNED_LENGTH,RETURNED_OCTET_LENGTH,RETURNED_SQLSTATE,ROW_COUNT,SCALE,SCHEMA_NAME,SERIALIZABLE,SERVER_NAME,SUBCLASS_ORIGIN,TABLE_NAME,TYPE,UNCOMMITTED,UNNAMED,LIMIT
+absolute,action,add,all,allocate,alter,and,any,are,as,asc,assertion,at,authorization,avg,begin,between,bit,bit_length,both,by,cascade,cascaded,case,cast,catalog,char,character,char_length,character_length,check,close,cluster,coalesce,collate,collation,column,commit,connect,connection,constraint,constraints,continue,convert,corresponding,count,create,cross,current,current_date,current_time,current_timestamp,current_user,cursor,date,day,deallocate,dec,decimal,declare,default,deferrable,deferred,delete,desc,describe,descriptor,diagnostics,disconnect,distinct,domain,double,drop,else,end,end-exec,escape,except,exception,exec,execute,exists,external,extract,false,fetch,first,float,for,foreign,found,from,full,get,global,go,goto,grant,group,having,hour,identity,immediate,in,indicator,initially,inner,input,insensitive,insert,int,integer,intersect,interval,into,is,isolation,join,key,language,last,leading,left,level,like,local,lower,match,max,min,minute,module,month,names,national,natural,ncha
r,next,no,not,null,nullif,numeric,octet_length,of,on,only,open,option,or,order,outer,output,overlaps,overwrite,pad,partial,partition,position,precision,prepare,preserve,primary,prior,privileges,procedure,public,read,real,references,relative,restrict,revoke,right,rollback,rows,schema,scroll,second,section,select,session,session_user,set,size,smallint,some,space,sql,sqlcode,sqlerror,sqlstate,substring,sum,system_user,table,temporary,then,time,timestamp,timezone_hour,timezone_minute,to,trailing,transaction,translate,translation,trim,true,union,unique,unknown,update,upper,usage,user,using,value,values,varchar,varying,view,when,whenever,where,with,work,write,year,zone,ada,c,catalog_name,character_set_catalog,character_set_name,character_set_schema,class_origin,cobol,collation_catalog,collation_name,collation_schema,column_name,command_function,committed,condition_number,connection_name,constraint_catalog,constraint_name,constraint_schema,cursor_name,data,datetime_interval_code,datetime_i
nterval_precision,dynamic_function,fortran,length,message_length,message_octet_length,message_text,more,mumps,name,nullable,number,pascal,pli,repeatable,returned_length,returned_octet_length,returned_sqlstate,row_count,scale,schema_name,serializable,server_name,subclass_origin,table_name,type,uncommitted,unnamed,limit
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/jdbc/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/jdbc/src/main/resources/interpreter-setting.json b/jdbc/src/main/resources/interpreter-setting.json
index 322ea5a..fb8b8b2 100644
--- a/jdbc/src/main/resources/interpreter-setting.json
+++ b/jdbc/src/main/resources/interpreter-setting.json
@@ -28,6 +28,12 @@
"defaultValue": "org.postgresql.Driver",
"description": "JDBC Driver Name"
},
+ "default.completer.schemaFilters": {
+ "envName": null,
+ "propertyName": "default.completer.schemaFilters",
+ "defaultValue": "",
+ "description": "\u0421omma separated schema (schema = catalog = database) filters to get metadata for completions. Supports '%' symbol is equivalent to any set of characters. (ex. prod_v_%,public%,info)"
+ },
"default.precode": {
"envName": null,
"propertyName": "zeppelin.jdbc.precode",
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/jdbc/src/main/resources/postgresql-native-driver-sql.keywords
----------------------------------------------------------------------
diff --git a/jdbc/src/main/resources/postgresql-native-driver-sql.keywords b/jdbc/src/main/resources/postgresql-native-driver-sql.keywords
index a857cbd..bcd00c8 100644
--- a/jdbc/src/main/resources/postgresql-native-driver-sql.keywords
+++ b/jdbc/src/main/resources/postgresql-native-driver-sql.keywords
@@ -1 +1 @@
-A,ABORT,ABS,ABSENT,ABSOLUTE,ACCESS,ACCORDING,ACTION,ADA,ADD,ADMIN,AFTER,AGGREGATE,ALL,ALLOCATE,ALSO,ALTER,ALWAYS,ANALYSE,ANALYZE,AND,ANY,ARE,ARRAY,ARRAY_AGG,ARRAY_MAX_CARDINALITY,AS,ASC,ASENSITIVE,ASSERTION,ASSIGNMENT,ASYMMETRIC,AT,ATOMIC,ATTRIBUTE,ATTRIBUTES,AUTHORIZATION,AVG,BACKWARD,BASE64,BEFORE,BEGIN,BEGIN_FRAME,BEGIN_PARTITION,BERNOULLI,BETWEEN,BIGINT,BINARY,BIT,BIT_LENGTH,BLOB,BLOCKED,BOM,BOOLEAN,BOTH,BREADTH,BY,C,CACHE,CALL,CALLED,CARDINALITY,CASCADE,CASCADED,CASE,CAST,CATALOG,CATALOG_NAME,CEIL,CEILING,CHAIN,CHAR,CHARACTER,CHARACTERISTICS,CHARACTERS,CHARACTER_LENGTH,CHARACTER_SET_CATALOG,CHARACTER_SET_NAME,CHARACTER_SET_SCHEMA,CHAR_LENGTH,CHECK,CHECKPOINT,CLASS,CLASS_ORIGIN,CLOB,CLOSE,CLUSTER,COALESCE,COBOL,COLLATE,COLLATION,COLLATION_CATALOG,COLLATION_NAME,COLLATION_SCHEMA,COLLECT,COLUMN,COLUMNS,COLUMN_NAME,COMMAND_FUNCTION,COMMAND_FUNCTION_CODE,COMMENT,COMMENTS,COMMIT,COMMITTED,CONCURRENTLY,CONDITION,CONDITION_NUMBER,CONFIGURATION,CONNECT,CONNECTION,CONNECTION_NAME,CONSTRA
INT,CONSTRAINTS,CONSTRAINT_CATALOG,CONSTRAINT_NAME,CONSTRAINT_SCHEMA,CONSTRUCTOR,CONTAINS,CONTENT,CONTINUE,CONTROL,CONVERSION,CONVERT,COPY,CORR,CORRESPONDING,COST,COUNT,COVAR_POP,COVAR_SAMP,CREATE,CROSS,CSV,CUBE,CUME_DIST,CURRENT,CURRENT_CATALOG,CURRENT_DATE,CURRENT_DEFAULT_TRANSFORM_GROUP,CURRENT_PATH,CURRENT_ROLE,CURRENT_ROW,CURRENT_SCHEMA,CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_TRANSFORM_GROUP_FOR_TYPE,CURRENT_USER,CURSOR,CURSOR_NAME,CYCLE,DATA,DATABASE,DATALINK,DATE,DATETIME_INTERVAL_CODE,DATETIME_INTERVAL_PRECISION,DAY,DB,DEALLOCATE,DEC,DECIMAL,DECLARE,DEFAULT,DEFAULTS,DEFERRABLE,DEFERRED,DEFINED,DEFINER,DEGREE,DELETE,DELIMITER,DELIMITERS,DENSE_RANK,DEPTH,DEREF,DERIVED,DESC,DESCRIBE,DESCRIPTOR,DETERMINISTIC,DIAGNOSTICS,DICTIONARY,DISABLE,DISCARD,DISCONNECT,DISPATCH,DISTINCT,DLNEWCOPY,DLPREVIOUSCOPY,DLURLCOMPLETE,DLURLCOMPLETEONLY,DLURLCOMPLETEWRITE,DLURLPATH,DLURLPATHONLY,DLURLPATHWRITE,DLURLSCHEME,DLURLSERVER,DLVALUE,DO,DOCUMENT,DOMAIN,DOUBLE,DROP,DYNAMIC,DYNAMIC_FUNCTION,DYNAM
IC_FUNCTION_CODE,EACH,ELEMENT,ELSE,EMPTY,ENABLE,ENCODING,ENCRYPTED,END,END-EXEC,END_FRAME,END_PARTITION,ENFORCED,ENUM,EQUALS,ESCAPE,EVENT,EVERY,EXCEPT,EXCEPTION,EXCLUDE,EXCLUDING,EXCLUSIVE,EXEC,EXECUTE,EXISTS,EXP,EXPLAIN,EXPRESSION,EXTENSION,EXTERNAL,EXTRACT,FALSE,FAMILY,FETCH,FILE,FILTER,FINAL,FIRST,FIRST_VALUE,FLAG,FLOAT,FLOOR,FOLLOWING,FOR,FORCE,FOREIGN,FORTRAN,FORWARD,FOUND,FRAME_ROW,FREE,FREEZE,FROM,FS,FULL,FUNCTION,FUNCTIONS,FUSION,G,GENERAL,GENERATED,GET,GLOBAL,GO,GOTO,GRANT,GRANTED,GREATEST,GROUP,GROUPING,GROUPS,HANDLER,HAVING,HEADER,HEX,HIERARCHY,HOLD,HOUR,ID,IDENTITY,IF,IGNORE,ILIKE,IMMEDIATE,IMMEDIATELY,IMMUTABLE,IMPLEMENTATION,IMPLICIT,IMPORT,IN,INCLUDING,INCREMENT,INDENT,INDEX,INDEXES,INDICATOR,INHERIT,INHERITS,INITIALLY,INLINE,INNER,INOUT,INPUT,INSENSITIVE,INSERT,INSTANCE,INSTANTIABLE,INSTEAD,INT,INTEGER,INTEGRITY,INTERSECT,INTERSECTION,INTERVAL,INTO,INVOKER,IS,ISNULL,ISOLATION,JOIN,K,KEY,KEY_MEMBER,KEY_TYPE,LABEL,LAG,LANGUAGE,LARGE,LAST,LAST_VALUE,LATERAL,LC_COLLATE,L
C_CTYPE,LEAD,LEADING,LEAKPROOF,LEAST,LEFT,LENGTH,LEVEL,LIBRARY,LIKE,LIKE_REGEX,LIMIT,LINK,LISTEN,LN,LOAD,LOCAL,LOCALTIME,LOCALTIMESTAMP,LOCATION,LOCATOR,LOCK,LOWER,M,MAP,MAPPING,MATCH,MATCHED,MATERIALIZED,MAX,MAXVALUE,MAX_CARDINALITY,MEMBER,MERGE,MESSAGE_LENGTH,MESSAGE_OCTET_LENGTH,MESSAGE_TEXT,METHOD,MIN,MINUTE,MINVALUE,MOD,MODE,MODIFIES,MODULE,MONTH,MORE,MOVE,MULTISET,MUMPS,NAME,NAMES,NAMESPACE,NATIONAL,NATURAL,NCHAR,NCLOB,NESTING,NEW,NEXT,NFC,NFD,NFKC,NFKD,NIL,NO,NONE,NORMALIZE,NORMALIZED,NOT,NOTHING,NOTIFY,NOTNULL,NOWAIT,NTH_VALUE,NTILE,NULL,NULLABLE,NULLIF,NULLS,NUMBER,NUMERIC,OBJECT,OCCURRENCES_REGEX,OCTETS,OCTET_LENGTH,OF,OFF,OFFSET,OIDS,OLD,ON,ONLY,OPEN,OPERATOR,OPTION,OPTIONS,OR,ORDER,ORDERING,ORDINALITY,OTHERS,OUT,OUTER,OUTPUT,OVER,OVERLAPS,OVERLAY,OVERRIDING,OWNED,OWNER,P,PAD,PARAMETER,PARAMETER_MODE,PARAMETER_NAME,PARAMETER_ORDINAL_POSITION,PARAMETER_SPECIFIC_CATALOG,PARAMETER_SPECIFIC_NAME,PARAMETER_SPECIFIC_SCHEMA,PARSER,PARTIAL,PARTITION,PASCAL,PASSING,PASSTHROUGH,PAS
SWORD,PATH,PERCENT,PERCENTILE_CONT,PERCENTILE_DISC,PERCENT_RANK,PERIOD,PERMISSION,PLACING,PLANS,PLI,PORTION,POSITION,POSITION_REGEX,POWER,PRECEDES,PRECEDING,PRECISION,PREPARE,PREPARED,PRESERVE,PRIMARY,PRIOR,PRIVILEGES,PROCEDURAL,PROCEDURE,PROGRAM,PUBLIC,QUOTE,RANGE,RANK,READ,READS,REAL,REASSIGN,RECHECK,RECOVERY,RECURSIVE,REF,REFERENCES,REFERENCING,REFRESH,REGR_AVGX,REGR_AVGY,REGR_COUNT,REGR_INTERCEPT,REGR_R2,REGR_SLOPE,REGR_SXX,REGR_SXY,REGR_SYY,REINDEX,RELATIVE,RELEASE,RENAME,REPEATABLE,REPLACE,REPLICA,REQUIRING,RESET,RESPECT,RESTART,RESTORE,RESTRICT,RESULT,RETURN,RETURNED_CARDINALITY,RETURNED_LENGTH,RETURNED_OCTET_LENGTH,RETURNED_SQLSTATE,RETURNING,RETURNS,REVOKE,RIGHT,ROLE,ROLLBACK,ROLLUP,ROUTINE,ROUTINE_CATALOG,ROUTINE_NAME,ROUTINE_SCHEMA,ROW,ROWS,ROW_COUNT,ROW_NUMBER,RULE,SAVEPOINT,SCALE,SCHEMA,SCHEMA_NAME,SCOPE,SCOPE_CATALOG,SCOPE_NAME,SCOPE_SCHEMA,SCROLL,SEARCH,SECOND,SECTION,SECURITY,SELECT,SELECTIVE,SELF,SENSITIVE,SEQUENCE,SEQUENCES,SERIALIZABLE,SERVER,SERVER_NAME,SESSION,S
ESSION_USER,SET,SETOF,SETS,SHARE,SHOW,SIMILAR,SIMPLE,SIZE,SMALLINT,SNAPSHOT,SOME,SOURCE,SPACE,SPECIFIC,SPECIFICTYPE,SPECIFIC_NAME,SQL,SQLCODE,SQLERROR,SQLEXCEPTION,SQLSTATE,SQLWARNING,SQRT,STABLE,STANDALONE,START,STATE,STATEMENT,STATIC,STATISTICS,STDDEV_POP,STDDEV_SAMP,STDIN,STDOUT,STORAGE,STRICT,STRIP,STRUCTURE,STYLE,SUBCLASS_ORIGIN,SUBMULTISET,SUBSTRING,SUBSTRING_REGEX,SUCCEEDS,SUM,SYMMETRIC,SYSID,SYSTEM,SYSTEM_TIME,SYSTEM_USER,T,TABLE,TABLES,TABLESAMPLE,TABLESPACE,TABLE_NAME,TEMP,TEMPLATE,TEMPORARY,TEXT,THEN,TIES,TIME,TIMESTAMP,TIMEZONE_HOUR,TIMEZONE_MINUTE,TO,TOKEN,TOP_LEVEL_COUNT,TRAILING,TRANSACTION,TRANSACTIONS_COMMITTED,TRANSACTIONS_ROLLED_BACK,TRANSACTION_ACTIVE,TRANSFORM,TRANSFORMS,TRANSLATE,TRANSLATE_REGEX,TRANSLATION,TREAT,TRIGGER,TRIGGER_CATALOG,TRIGGER_NAME,TRIGGER_SCHEMA,TRIM,TRIM_ARRAY,TRUE,TRUNCATE,TRUSTED,TYPE,TYPES,UESCAPE,UNBOUNDED,UNCOMMITTED,UNDER,UNENCRYPTED,UNION,UNIQUE,UNKNOWN,UNLINK,UNLISTEN,UNLOGGED,UNNAMED,UNNEST,UNTIL,UNTYPED,UPDATE,UPPER,URI,USAGE,USER,
USER_DEFINED_TYPE_CATALOG,USER_DEFINED_TYPE_CODE,USER_DEFINED_TYPE_NAME,USER_DEFINED_TYPE_SCHEMA,USING,VACUUM,VALID,VALIDATE,VALIDATOR,VALUE,VALUES,VALUE_OF,VARBINARY,VARCHAR,VARIADIC,VARYING,VAR_POP,VAR_SAMP,VERBOSE,VERSION,VERSIONING,VIEW,VIEWS,VOLATILE,WHEN,WHENEVER,WHERE,WHITESPACE,WIDTH_BUCKET,WINDOW,WITH,WITHIN,WITHOUT,WORK,WRAPPER,WRITE,XML,XMLAGG,XMLATTRIBUTES,XMLBINARY,XMLCAST,XMLCOMMENT,XMLCONCAT,XMLDECLARATION,XMLDOCUMENT,XMLELEMENT,XMLEXISTS,XMLFOREST,XMLITERATE,XMLNAMESPACES,XMLPARSE,XMLPI,XMLQUERY,XMLROOT,XMLSCHEMA,XMLSERIALIZE,XMLTABLE,XMLTEXT,XMLVALIDATE,YEAR,YES,ZONE
+a,abort,abs,absent,absolute,access,according,action,ada,add,admin,after,aggregate,all,allocate,also,alter,always,analyse,analyze,and,any,are,array,array_agg,array_max_cardinality,as,asc,asensitive,assertion,assignment,asymmetric,at,atomic,attribute,attributes,authorization,avg,backward,base64,before,begin,begin_frame,begin_partition,bernoulli,between,bigint,binary,bit,bit_length,blob,blocked,bom,boolean,both,breadth,by,c,cache,call,called,cardinality,cascade,cascaded,case,cast,catalog,catalog_name,ceil,ceiling,chain,char,character,characteristics,characters,character_length,character_set_catalog,character_set_name,character_set_schema,char_length,check,checkpoint,class,class_origin,clob,close,cluster,coalesce,cobol,collate,collation,collation_catalog,collation_name,collation_schema,collect,column,columns,column_name,command_function,command_function_code,comment,comments,commit,committed,concurrently,condition,condition_number,configuration,connect,connection,connection_name,constra
int,constraints,constraint_catalog,constraint_name,constraint_schema,constructor,contains,content,continue,control,conversion,convert,copy,corr,corresponding,cost,count,covar_pop,covar_samp,create,cross,csv,cube,cume_dist,current,current_catalog,current_date,current_default_transform_group,current_path,current_role,current_row,current_schema,current_time,current_timestamp,current_transform_group_for_type,current_user,cursor,cursor_name,cycle,data,database,datalink,date,datetime_interval_code,datetime_interval_precision,day,db,deallocate,dec,decimal,declare,default,defaults,deferrable,deferred,defined,definer,degree,delete,delimiter,delimiters,dense_rank,depth,deref,derived,desc,describe,descriptor,deterministic,diagnostics,dictionary,disable,discard,disconnect,dispatch,distinct,dlnewcopy,dlpreviouscopy,dlurlcomplete,dlurlcompleteonly,dlurlcompletewrite,dlurlpath,dlurlpathonly,dlurlpathwrite,dlurlscheme,dlurlserver,dlvalue,do,document,domain,double,drop,dynamic,dynamic_function,dynam
ic_function_code,each,element,else,empty,enable,encoding,encrypted,end,end-exec,end_frame,end_partition,enforced,enum,equals,escape,event,every,except,exception,exclude,excluding,exclusive,exec,execute,exists,exp,explain,expression,extension,external,extract,false,family,fetch,file,filter,final,first,first_value,flag,float,floor,following,for,force,foreign,fortran,forward,found,frame_row,free,freeze,from,fs,full,function,functions,fusion,g,general,generated,get,global,go,goto,grant,granted,greatest,group,grouping,groups,handler,having,header,hex,hierarchy,hold,hour,id,identity,if,ignore,ilike,immediate,immediately,immutable,implementation,implicit,import,in,including,increment,indent,index,indexes,indicator,inherit,inherits,initially,inline,inner,inout,input,insensitive,insert,instance,instantiable,instead,int,integer,integrity,intersect,intersection,interval,into,invoker,is,isnull,isolation,join,k,key,key_member,key_type,label,lag,language,large,last,last_value,lateral,lc_collate,l
c_ctype,lead,leading,leakproof,least,left,length,level,library,like,like_regex,limit,link,listen,ln,load,local,localtime,localtimestamp,location,locator,lock,lower,m,map,mapping,match,matched,materialized,max,maxvalue,max_cardinality,member,merge,message_length,message_octet_length,message_text,method,min,minute,minvalue,mod,mode,modifies,module,month,more,move,multiset,mumps,name,names,namespace,national,natural,nchar,nclob,nesting,new,next,nfc,nfd,nfkc,nfkd,nil,no,none,normalize,normalized,not,nothing,notify,notnull,nowait,nth_value,ntile,null,nullable,nullif,nulls,number,numeric,object,occurrences_regex,octets,octet_length,of,off,offset,oids,old,on,only,open,operator,option,options,or,order,ordering,ordinality,others,out,outer,output,over,overlaps,overlay,overriding,owned,owner,p,pad,parameter,parameter_mode,parameter_name,parameter_ordinal_position,parameter_specific_catalog,parameter_specific_name,parameter_specific_schema,parser,partial,partition,pascal,passing,passthrough,pas
sword,path,percent,percentile_cont,percentile_disc,percent_rank,period,permission,placing,plans,pli,portion,position,position_regex,power,precedes,preceding,precision,prepare,prepared,preserve,primary,prior,privileges,procedural,procedure,program,public,quote,range,rank,read,reads,real,reassign,recheck,recovery,recursive,ref,references,referencing,refresh,regr_avgx,regr_avgy,regr_count,regr_intercept,regr_r2,regr_slope,regr_sxx,regr_sxy,regr_syy,reindex,relative,release,rename,repeatable,replace,replica,requiring,reset,respect,restart,restore,restrict,result,return,returned_cardinality,returned_length,returned_octet_length,returned_sqlstate,returning,returns,revoke,right,role,rollback,rollup,routine,routine_catalog,routine_name,routine_schema,row,rows,row_count,row_number,rule,savepoint,scale,schema,schema_name,scope,scope_catalog,scope_name,scope_schema,scroll,search,second,section,security,select,selective,self,sensitive,sequence,sequences,serializable,server,server_name,session,s
ession_user,set,setof,sets,share,show,similar,simple,size,smallint,snapshot,some,source,space,specific,specifictype,specific_name,sql,sqlcode,sqlerror,sqlexception,sqlstate,sqlwarning,sqrt,stable,standalone,start,state,statement,static,statistics,stddev_pop,stddev_samp,stdin,stdout,storage,strict,strip,structure,style,subclass_origin,submultiset,substring,substring_regex,succeeds,sum,symmetric,sysid,system,system_time,system_user,t,table,tables,tablesample,tablespace,table_name,temp,template,temporary,text,then,ties,time,timestamp,timezone_hour,timezone_minute,to,token,top_level_count,trailing,transaction,transactions_committed,transactions_rolled_back,transaction_active,transform,transforms,translate,translate_regex,translation,treat,trigger,trigger_catalog,trigger_name,trigger_schema,trim,trim_array,true,truncate,trusted,type,types,uescape,unbounded,uncommitted,under,unencrypted,union,unique,unknown,unlink,unlisten,unlogged,unnamed,unnest,until,untyped,update,upper,uri,usage,user,
user_defined_type_catalog,user_defined_type_code,user_defined_type_name,user_defined_type_schema,using,vacuum,valid,validate,validator,value,values,value_of,varbinary,varchar,variadic,varying,var_pop,var_samp,verbose,version,versioning,view,views,volatile,when,whenever,where,whitespace,width_bucket,window,with,within,without,work,wrapper,write,xml,xmlagg,xmlattributes,xmlbinary,xmlcast,xmlcomment,xmlconcat,xmldeclaration,xmldocument,xmlelement,xmlexists,xmlforest,xmliterate,xmlnamespaces,xmlparse,xmlpi,xmlquery,xmlroot,xmlschema,xmlserialize,xmltable,xmltext,xmlvalidate,year,yes,zone
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/4d398ef2/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java b/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java
index 04365cc..ff09503 100644
--- a/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java
+++ b/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java
@@ -32,6 +32,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
+import org.apache.zeppelin.completer.CompletionType;
import org.apache.zeppelin.interpreter.InterpreterContext;
import org.apache.zeppelin.interpreter.InterpreterResult;
import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion;
@@ -295,9 +296,9 @@ public class JDBCInterpreterTest extends BasicJDBCTestCaseAdapter {
jdbcInterpreter.interpret("", interpreterContext);
- List<InterpreterCompletion> completionList = jdbcInterpreter.completion("sel", 1);
+ List<InterpreterCompletion> completionList = jdbcInterpreter.completion("sel", 3, null);
- InterpreterCompletion correctCompletionKeyword = new InterpreterCompletion("select ", "select ");
+ InterpreterCompletion correctCompletionKeyword = new InterpreterCompletion("select ", "select ", CompletionType.keyword.name());
assertEquals(1, completionList.size());
assertEquals(true, completionList.contains(correctCompletionKeyword));