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 c516b9d1a50..cb861cadfaa 100644 --- a/flink/src/main/java/org/apache/zeppelin/flink/FlinkInterpreter.java +++ b/flink/src/main/java/org/apache/zeppelin/flink/FlinkInterpreter.java @@ -245,7 +245,17 @@ public InterpreterResult interpret(String[] lines, InterpreterContext context) { Code r = null; String incomplete = ""; - for (String s : linesToRun) { + for (int l = 0; l < linesToRun.length; l++) { + String s = linesToRun[l]; + // check if next line starts with "." (but not ".." or "./") it is treated as an invocation + if (l + 1 < linesToRun.length) { + String nextLine = linesToRun[l + 1].trim(); + if (nextLine.startsWith(".") && !nextLine.startsWith("..") && !nextLine.startsWith("./")) { + incomplete += s + "\n"; + continue; + } + } + scala.tools.nsc.interpreter.Results.Result res = null; try { res = imain.interpret(incomplete + s); diff --git a/flink/src/test/java/org/apache/zeppelin/flink/FlinkInterpreterTest.java b/flink/src/test/java/org/apache/zeppelin/flink/FlinkInterpreterTest.java index 64baea44e02..d0eda26c640 100644 --- a/flink/src/test/java/org/apache/zeppelin/flink/FlinkInterpreterTest.java +++ b/flink/src/test/java/org/apache/zeppelin/flink/FlinkInterpreterTest.java @@ -54,6 +54,11 @@ public void testSimpleStatement() { assertEquals("1", result.message()); } + @Test + public void testNextlineInvoke() { + InterpreterResult result = flink.interpret("\"123\"\n .toInt", context); + assertEquals("res0: Int = 123\n", result.message()); + } @Test public void testWordCount() { 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 e09f3105137..45236ab30e2 100644 --- a/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteInterpreter.java +++ b/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteInterpreter.java @@ -286,7 +286,17 @@ private InterpreterResult interpret(String[] lines) { Code code = null; String incomplete = ""; - for (String s : linesToRun) { + for (int l = 0; l < linesToRun.length; l++) { + String s = linesToRun[l]; + // check if next line starts with "." (but not ".." or "./") it is treated as an invocation + if (l + 1 < linesToRun.length) { + String nextLine = linesToRun[l + 1].trim(); + if (nextLine.startsWith(".") && !nextLine.startsWith("..") && !nextLine.startsWith("./")) { + incomplete += s + "\n"; + continue; + } + } + try { code = getResultCode(imain.interpret(incomplete + s)); } catch (Exception e) { diff --git a/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteInterpreterTest.java b/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteInterpreterTest.java index ad393a7b12a..081dce1f1d0 100644 --- a/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteInterpreterTest.java +++ b/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteInterpreterTest.java @@ -84,6 +84,9 @@ public void testInterpret() { assertEquals(InterpreterResult.Code.SUCCESS, result.code()); assertTrue(result.message().contains(sizeVal + ": Int = " + ignite.cluster().nodes().size())); + + result = intp.interpret("\"123\"\n .toInt", INTP_CONTEXT); + assertEquals(InterpreterResult.Code.SUCCESS, result.code()); } @Test @@ -92,4 +95,5 @@ public void testInterpretInvalidInput() { assertEquals(InterpreterResult.Code.ERROR, result.code()); } + } 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 aec6d16d55a..a4ff494ce1c 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java @@ -604,7 +604,18 @@ public InterpreterResult interpretInput(String[] lines) { out.reset(); Code r = null; String incomplete = ""; - for (String s : linesToRun) { + + for (int l = 0; l < linesToRun.length; l++) { + String s = linesToRun[l]; + // check if next line starts with "." (but not ".." or "./") it is treated as an invocation + if (l + 1 < linesToRun.length) { + String nextLine = linesToRun[l + 1].trim(); + if (nextLine.startsWith(".") && !nextLine.startsWith("..") && !nextLine.startsWith("./")) { + incomplete += s + "\n"; + continue; + } + } + scala.tools.nsc.interpreter.Results.Result res = null; try { res = intp.interpret(incomplete + s); 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 daa7eeda81d..87177f15c25 100644 --- a/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java +++ b/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java @@ -117,6 +117,11 @@ public void testBasicIntp() { */ } + @Test + public void testNextLineInvocation() { + assertEquals(InterpreterResult.Code.SUCCESS, repl.interpret("\"123\"\n.toInt", context).code()); + } + @Test public void testEndWithComment() { assertEquals(InterpreterResult.Code.SUCCESS, repl.interpret("val c=1\n//comment", context).code());