Repository: incubator-zeppelin
Updated Branches:
  refs/heads/master 0c50712e3 -> c7633afdb


[ZEPPELIN-428] Support Python programmatic access to dynamic form

https://issues.apache.org/jira/browse/ZEPPELIN-428

This is what it looks like:
![image](https://cloud.githubusercontent.com/assets/8969467/11176543/f5a5f8a6-8bf2-11e5-9f26-ba0d7a9148af.png)

![image](https://cloud.githubusercontent.com/assets/8969467/11176547/f8d554a4-8bf2-11e5-8ced-c03eaa84f504.png)

Author: Felix Cheung <[email protected]>

Closes #437 from felixcheung/pyz and squashes the following commits:

8a7045e [Felix Cheung] add doc for python dynamic form
de00d17 [Felix Cheung] fix type conversion
816319c [Felix Cheung]  pyspark new methods


Project: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/commit/c7633afd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/tree/c7633afd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/diff/c7633afd

Branch: refs/heads/master
Commit: c7633afdb09ed43984f7c9842b736bb4744708db
Parents: 0c50712
Author: Felix Cheung <[email protected]>
Authored: Tue Nov 17 23:46:10 2015 -0800
Committer: Lee moon soo <[email protected]>
Committed: Thu Nov 19 22:35:38 2015 +0900

----------------------------------------------------------------------
 docs/manual/dynamicform.md                      | 48 ++++++++++++++++++++
 .../main/resources/python/zeppelin_pyspark.py   | 16 +++++++
 2 files changed, 64 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/c7633afd/docs/manual/dynamicform.md
----------------------------------------------------------------------
diff --git a/docs/manual/dynamicform.md b/docs/manual/dynamicform.md
index 36cadef..dc46a5e 100644
--- a/docs/manual/dynamicform.md
+++ b/docs/manual/dynamicform.md
@@ -67,12 +67,60 @@ Here're some examples.
 
 Text input form
 
+You can do this in Scala
+```scala
+%spark
+println("Hello "+z.input("name"))
+```
+
+Or Python
+```python
+%pyspark
+print("Hello "+z.input("name"))
+```
+
 <img src="../../assets/themes/zeppelin/img/screenshots/form_input_prog.png" />
 
 Text input form with default value
 
+Scala
+```scala
+%spark
+println("Hello "+z.input("name", "sun"))
+```
+
+Python
+```python
+%pyspark
+print("Hello "+z.input("name", "sun"))
+```
+
 <img 
src="../../assets/themes/zeppelin/img/screenshots/form_input_default_prog.png" 
/>
 
 Select form
 
+Scala
+```scala
+%spark
+println("Hello "+z.select("day", Seq(("1","mon"),
+                                    ("2","tue"),
+                                    ("3","wed"),
+                                    ("4","thurs"),
+                                    ("5","fri"),
+                                    ("6","sat"),
+                                    ("7","sun"))))
+```
+
+Python
+```python
+%pyspark
+print("Hello "+z.select("day", [("1","mon"),
+                                ("2","tue"),
+                                ("3","wed"),
+                                ("4","thurs"),
+                                ("5","fri"),
+                                ("6","sat"),
+                                ("7","sun")]))
+```
+
 <img src="../../assets/themes/zeppelin/img/screenshots/form_select_prog.png" />

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/c7633afd/spark/src/main/resources/python/zeppelin_pyspark.py
----------------------------------------------------------------------
diff --git a/spark/src/main/resources/python/zeppelin_pyspark.py 
b/spark/src/main/resources/python/zeppelin_pyspark.py
index e57190e..b8daa3d 100644
--- a/spark/src/main/resources/python/zeppelin_pyspark.py
+++ b/spark/src/main/resources/python/zeppelin_pyspark.py
@@ -78,6 +78,22 @@ class PyZeppelinContext(dict):
   def get(self, key):
     return self.__getitem__(key)
 
+  def input(self, name, defaultValue = ""):
+    return self.z.input(name, defaultValue)
+
+  def select(self, name, options, defaultValue = ""):
+    # auto_convert to ArrayList doesn't match the method signature on JVM side
+    tuples = map(lambda items: self.__tupleToScalaTuple2(items), options)
+    iterables = 
gateway.jvm.scala.collection.JavaConversions.collectionAsScalaIterable(tuples)
+    return self.z.select(name, defaultValue, iterables)
+
+  def __tupleToScalaTuple2(self, tuple):
+    if (len(tuple) == 2):
+      return gateway.jvm.scala.Tuple2(tuple[0], tuple[1])
+    else:
+      raise IndexError("options must be a list of tuple of 2")
+
+
 class SparkVersion(object):
   SPARK_1_4_0 = 140
   SPARK_1_3_0 = 130

Reply via email to