This is an automated email from the ASF dual-hosted git repository. zjffdu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/zeppelin.git
The following commit(s) were added to refs/heads/master by this push: new 5806756 [ZEPPELIN-4354]. Enhance z.angular for more flexiable data sharing 5806756 is described below commit 580675617caeccd71a2f3a7b67cb8b55795a3009 Author: Jeff Zhang <zjf...@apache.org> AuthorDate: Fri Sep 27 14:43:48 2019 +0800 [ZEPPELIN-4354]. Enhance z.angular for more flexiable data sharing ### What is this PR for? This PR enhance method `z.angular` in `%spark.r` and `%spark.pyspark` so that angular variables defined in frontend can be shared in backend `%spark`, `%spark.r`, `%spark.pyspark` ### What type of PR is it? [ Improvement | Feature ] ### Todos * [ ] - Task ### What is the Jira issue? * https://issues.apache.org/jira/browse/ZEPPELIN-4354 ### How should this be tested? * CI pass ### Screenshots (if appropriate) ![image](https://user-images.githubusercontent.com/164491/67553926-e694f480-f740-11e9-826c-4e16034d659c.png) ### Questions: * Does the licenses files need update? No * Is there breaking changes for older versions? No * Does this needs documentation? No Author: Jeff Zhang <zjf...@apache.org> Closes #3464 from zjffdu/ZEPPELIN-4354 and squashes the following commits: 34b11e746 [Jeff Zhang] [ZEPPELIN-4354]. Enhance z.angular for more flexiable data sharing --- .../src/main/resources/python/zeppelin_context.py | 6 +++ .../apache/zeppelin/spark/SparkRInterpreter.java | 21 ++++++-- .../src/main/resources/R/zeppelin_sparkr.R | 8 +++ .../zeppelin/display/AngularObjectRegistry.java | 4 +- .../zeppelin/interpreter/BaseZeppelinContext.java | 59 +++++++++++++++++----- 5 files changed, 77 insertions(+), 21 deletions(-) diff --git a/python/src/main/resources/python/zeppelin_context.py b/python/src/main/resources/python/zeppelin_context.py index dc97c14..e2c0b8c 100644 --- a/python/src/main/resources/python/zeppelin_context.py +++ b/python/src/main/resources/python/zeppelin_context.py @@ -61,6 +61,12 @@ class PyZeppelinContext(object): def get(self, key): return self.__getitem__(key) + def angular(self, key, noteId = None, paragraphId = None): + return self.z.angular(key, noteId, paragraphId) + + def angularBind(self, key, value, noteId = None, paragraphId = None): + return self.z.angularBind(key, value, noteId, paragraphId) + def getInterpreterContext(self): return self.z.getInterpreterContext() diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkRInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkRInterpreter.java index 4afb484..3f76306 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkRInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkRInterpreter.java @@ -22,6 +22,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.spark.SparkContext; import org.apache.spark.SparkRBackend; import org.apache.spark.api.java.JavaSparkContext; +import org.apache.zeppelin.interpreter.AbstractInterpreter; +import org.apache.zeppelin.interpreter.BaseZeppelinContext; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; @@ -44,7 +46,7 @@ import static org.apache.zeppelin.spark.ZeppelinRDisplay.render; /** * R and SparkR interpreter with visualization support. */ -public class SparkRInterpreter extends Interpreter { +public class SparkRInterpreter extends AbstractInterpreter { private static final Logger logger = LoggerFactory.getLogger(SparkRInterpreter.class); private String renderOptions; @@ -54,7 +56,6 @@ public class SparkRInterpreter extends Interpreter { private AtomicBoolean rbackendDead = new AtomicBoolean(false); private SparkContext sc; private JavaSparkContext jsc; - private String secret; public SparkRInterpreter(Properties property) { super(property); @@ -120,7 +121,7 @@ public class SparkRInterpreter extends Interpreter { } @Override - public InterpreterResult interpret(String lines, InterpreterContext interpreterContext) + public InterpreterResult internalInterpret(String lines, InterpreterContext interpreterContext) throws InterpreterException { Utils.printDeprecateMessage(sparkInterpreter.getSparkVersion(), interpreterContext, properties); @@ -185,8 +186,13 @@ public class SparkRInterpreter extends Interpreter { @Override public void close() throws InterpreterException { - zeppelinR.close(); - this.sparkInterpreter.close(); + if (this.zeppelinR != null) { + zeppelinR.close(); + } + if (this.sparkInterpreter != null) { + this.sparkInterpreter.close(); + this.sparkInterpreter = null; + } } @Override @@ -217,6 +223,11 @@ public class SparkRInterpreter extends Interpreter { } @Override + public BaseZeppelinContext getZeppelinContext() { + return sparkInterpreter.getZeppelinContext(); + } + + @Override public List<InterpreterCompletion> completion(String buf, int cursor, InterpreterContext interpreterContext) { return new ArrayList<>(); diff --git a/spark/interpreter/src/main/resources/R/zeppelin_sparkr.R b/spark/interpreter/src/main/resources/R/zeppelin_sparkr.R index 5f64dfe..f720d56 100644 --- a/spark/interpreter/src/main/resources/R/zeppelin_sparkr.R +++ b/spark/interpreter/src/main/resources/R/zeppelin_sparkr.R @@ -66,6 +66,14 @@ z.put <- function(name, object) { z.get <- function(name) { SparkR:::callJMethod(.zeppelinContext, "get", name) } +z.angular <- function(name, noteId=NULL, paragraphId=NULL) { + SparkR:::callJMethod(.zeppelinContext, "angular", name, noteId, paragraphId) +} + +z.angularBind <- function(name, value, noteId=NULL, paragraphId=NULL) { + SparkR:::callJMethod(.zeppelinContext, "angularBind", name, value, noteId, paragraphId) +} + z.input <- function(name, value) { SparkR:::callJMethod(.zeppelinContext, "input", name, value) } diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/AngularObjectRegistry.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/AngularObjectRegistry.java index 930ed7c..c2e86b6 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/AngularObjectRegistry.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/AngularObjectRegistry.java @@ -35,9 +35,7 @@ public class AngularObjectRegistry { private final String GLOBAL_KEY = "_GLOBAL_"; private AngularObjectRegistryListener listener; private String interpreterId; - - - AngularObjectListener angularObjectListener; + private AngularObjectListener angularObjectListener; public AngularObjectRegistry(final String interpreterId, final AngularObjectRegistryListener listener) { diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java index abf2e0a..1b5ead4 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java @@ -407,19 +407,12 @@ public abstract class BaseZeppelinContext { runNote(context.getNoteId()); } - private AngularObject getAngularObject(String name, InterpreterContext interpreterContext) { + private AngularObject getAngularObject(String name, + String noteId, + String paragraphId, + InterpreterContext interpreterContext) { AngularObjectRegistry registry = interpreterContext.getAngularObjectRegistry(); - String noteId = interpreterContext.getNoteId(); - // try get local object - AngularObject paragraphAo = registry.get(name, noteId, interpreterContext.getParagraphId()); - AngularObject noteAo = registry.get(name, noteId, null); - - AngularObject ao = paragraphAo != null ? paragraphAo : noteAo; - - if (ao == null) { - // then global object - ao = registry.get(name, null, null); - } + AngularObject ao = registry.get(name, noteId, paragraphId); return ao; } @@ -432,7 +425,27 @@ public abstract class BaseZeppelinContext { */ @ZeppelinApi public Object angular(String name) { - AngularObject ao = getAngularObject(name, interpreterContext); + AngularObject ao = getAngularObject(name, interpreterContext.getNoteId(), + interpreterContext.getParagraphId(), interpreterContext); + if (ao == null) { + return null; + } else { + return ao.get(); + } + } + + public Object angular(String name, String noteId) { + AngularObject ao = getAngularObject(name, noteId, + interpreterContext.getParagraphId(), interpreterContext); + if (ao == null) { + return null; + } else { + return ao.get(); + } + } + + public Object angular(String name, String noteId, String paragraphId) { + AngularObject ao = getAngularObject(name, noteId, paragraphId, interpreterContext); if (ao == null) { return null; } else { @@ -601,6 +614,7 @@ public abstract class BaseZeppelinContext { * * @param name name of the variable * @param o value + * @param noteId */ public void angularBind(String name, Object o, String noteId) throws TException { AngularObjectRegistry registry = interpreterContext.getAngularObjectRegistry(); @@ -613,6 +627,25 @@ public abstract class BaseZeppelinContext { } /** + * Create angular variable in notebook scope and bind with front end Angular display system. + * If variable exists, it'll be overwritten. + * + * @param name name of the variable + * @param o value + * @param noteId + * @param paragraphId + */ + public void angularBind(String name, Object o, String noteId, String paragraphId) throws TException { + AngularObjectRegistry registry = interpreterContext.getAngularObjectRegistry(); + + if (registry.get(name, noteId, paragraphId) == null) { + registry.add(name, o, noteId, paragraphId); + } else { + registry.get(name, noteId, paragraphId).set(o); + } + } + + /** * Create angular variable in notebook scope and bind with front end Angular display * system. * If variable exists, value will be overwritten and watcher will be added.