Repository: zeppelin Updated Branches: refs/heads/branch-0.7 2db7ddc25 -> 9e6e65c4e
ZEPPELIN-2189. The order of dynamic forms should be the order that you create them ### What is this PR for? The order of dynamic forms should be the order that you create them. So I made the following 2 changes for this: * change the type of forms in GUI from TreeMap to LinkedHashMap * remove orderBy in paragraph-parameterizedQueryForm.html Besides, I also did some code refactoring. ### What type of PR is it? [Bug Fix | Improvement | Refactoring] ### Todos * [ ] - Task ### What is the Jira issue? * https://issues.apache.org/jira/browse/ZEPPELIN-2189 ### How should this be tested? Tested manually. ### Screenshots (if appropriate) Before  After  ### Questions: * Does the licenses files need update? * Is there breaking changes for older versions? * Does this needs documentation? Author: Jeff Zhang <zjf...@apache.org> Closes #2204 from zjffdu/ZEPPELIN-2189 and squashes the following commits: a69ab5a [Jeff Zhang] add test 167d162 [Jeff Zhang] fix code style 369900e [Jeff Zhang] ZEPPELIN-2189. The order of dynamic forms should be the order that you create them (cherry picked from commit d4085468d09a869ff42fa92e053c3bce49829a36) Signed-off-by: ahyoungryu <ahyoung...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/9e6e65c4 Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/9e6e65c4 Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/9e6e65c4 Branch: refs/heads/branch-0.7 Commit: 9e6e65c4eb6114f9881668077a3b9fdf8538014d Parents: 2db7ddc Author: Jeff Zhang <zjf...@apache.org> Authored: Fri Mar 31 10:36:39 2017 +0800 Committer: ahyoungryu <ahyoung...@apache.org> Committed: Tue Apr 4 15:08:29 2017 +0900 ---------------------------------------------------------------------- .../java/org/apache/zeppelin/display/GUI.java | 14 ++++------- .../java/org/apache/zeppelin/display/Input.java | 22 ++++++----------- .../org/apache/zeppelin/display/InputTest.java | 12 ++++----- .../zeppelin/rest/ZeppelinSparkClusterTest.java | 26 ++++++++++++++++++++ .../paragraph-parameterizedQueryForm.html | 2 +- .../java/org/apache/zeppelin/notebook/Note.java | 10 +++----- .../org/apache/zeppelin/notebook/Paragraph.java | 6 ++--- 7 files changed, 52 insertions(+), 40 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zeppelin/blob/9e6e65c4/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/GUI.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/GUI.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/GUI.java index 27640de..30a8ba7 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/GUI.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/GUI.java @@ -19,11 +19,7 @@ package org.apache.zeppelin.display; import java.io.Serializable; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; -import java.util.TreeMap; +import java.util.*; import org.apache.zeppelin.display.Input.ParamOption; @@ -33,7 +29,7 @@ import org.apache.zeppelin.display.Input.ParamOption; public class GUI implements Serializable { Map<String, Object> params = new HashMap<>(); // form parameters from client - Map<String, Input> forms = new TreeMap<>(); // form configuration + LinkedHashMap<String, Input> forms = new LinkedHashMap<>(); // form configuration public GUI() { @@ -47,11 +43,11 @@ public class GUI implements Serializable { return params; } - public Map<String, Input> getForms() { + public LinkedHashMap<String, Input> getForms() { return forms; } - public void setForms(Map<String, Input> forms) { + public void setForms(LinkedHashMap<String, Input> forms) { this.forms = forms; } @@ -105,6 +101,6 @@ public class GUI implements Serializable { } public void clear() { - this.forms = new TreeMap<>(); + this.forms = new LinkedHashMap<>(); } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/9e6e65c4/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java index 9736230..4924b2b 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java @@ -20,13 +20,7 @@ package org.apache.zeppelin.display; import org.apache.commons.lang.StringUtils; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -291,21 +285,21 @@ public class Input implements Serializable { return new Input(varName, displayName, type, arg, defaultValue, paramOptions, hidden); } - public static Map<String, Input> extractSimpleQueryParam(String script) { - Map<String, Input> params = new HashMap<>(); + public static LinkedHashMap<String, Input> extractSimpleQueryForm(String script) { + LinkedHashMap<String, Input> forms = new LinkedHashMap<>(); if (script == null) { - return params; + return forms; } String replaced = script; Matcher match = VAR_PTN.matcher(replaced); while (match.find()) { - Input param = getInputForm(match); - params.put(param.name, param); + Input form = getInputForm(match); + forms.put(form.name, form); } - params.remove("pql"); - return params; + forms.remove("pql"); + return forms; } private static final String DEFAULT_DELIMITER = ","; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/9e6e65c4/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/InputTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/InputTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/InputTest.java index 4dd16ee..b6f1e3e 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/InputTest.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/InputTest.java @@ -44,7 +44,7 @@ public class InputTest { public void testFormExtraction() { // input form String script = "${input_form=}"; - Map<String, Input> forms = Input.extractSimpleQueryParam(script); + Map<String, Input> forms = Input.extractSimpleQueryForm(script); assertEquals(1, forms.size()); Input form = forms.get("input_form"); assertEquals("input_form", form.name); @@ -54,13 +54,13 @@ public class InputTest { // input form with display name & default value script = "${input_form(Input Form)=xxx}"; - forms = Input.extractSimpleQueryParam(script); + forms = Input.extractSimpleQueryForm(script); form = forms.get("input_form"); assertEquals("xxx", form.defaultValue); // selection form script = "${select_form(Selection Form)=op1,op1|op2(Option 2)|op3}"; - form = Input.extractSimpleQueryParam(script).get("select_form"); + form = Input.extractSimpleQueryForm(script).get("select_form"); assertEquals("select_form", form.name); assertEquals("op1", form.defaultValue); assertArrayEquals(new ParamOption[]{new ParamOption("op1", null), @@ -68,7 +68,7 @@ public class InputTest { // checkbox form script = "${checkbox:checkbox_form=op1,op1|op2|op3}"; - form = Input.extractSimpleQueryParam(script).get("checkbox_form"); + form = Input.extractSimpleQueryForm(script).get("checkbox_form"); assertEquals("checkbox_form", form.name); assertEquals("checkbox", form.type); assertArrayEquals(new Object[]{"op1"}, (Object[]) form.defaultValue); @@ -77,7 +77,7 @@ public class InputTest { // checkbox form with multiple default checks script = "${checkbox:checkbox_form(Checkbox Form)=op1|op3,op1(Option 1)|op2|op3}"; - form = Input.extractSimpleQueryParam(script).get("checkbox_form"); + form = Input.extractSimpleQueryForm(script).get("checkbox_form"); assertEquals("checkbox_form", form.name); assertEquals("Checkbox Form", form.displayName); assertEquals("checkbox", form.type); @@ -87,7 +87,7 @@ public class InputTest { // checkbox form with no default check script = "${checkbox:checkbox_form(Checkbox Form)=,op1(Option 1)|op2(Option 2)|op3(Option 3)}"; - form = Input.extractSimpleQueryParam(script).get("checkbox_form"); + form = Input.extractSimpleQueryForm(script).get("checkbox_form"); assertEquals("checkbox_form", form.name); assertEquals("Checkbox Form", form.displayName); assertEquals("checkbox", form.type); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/9e6e65c4/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java index 1602b64..7affdd8 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java @@ -22,6 +22,7 @@ import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -456,4 +457,29 @@ public class ZeppelinSparkClusterTest extends AbstractTestRestApi { int version = Integer.parseInt(split[0]) * 10 + Integer.parseInt(split[1]); return version; } + + @Test + public void testZeppelinContextDynamicForms() throws IOException { + Note note = ZeppelinServer.notebook.createNote(anonymous); + Paragraph p = note.addParagraph(AuthenticationInfo.ANONYMOUS); + note.setName("note"); + Map config = p.getConfig(); + config.put("enabled", true); + p.setConfig(config); + String code = "%spark.spark z.input(\"my_input\", \"default_name\")\n" + + "z.select(\"my_select\", \"select_2\"," + + "Seq((\"1\", \"select_1\"), (\"2\", \"select_2\")))\n" + + "z.checkbox(\"my_checkbox\", Seq(\"check_1\"), " + + "Seq((\"1\", \"check_1\"), (\"2\", \"check_2\")))"; + p.setText(code); + p.setAuthenticationInfo(anonymous); + note.run(p.getId()); + waitForFinish(p); + + assertEquals(Status.FINISHED, p.getStatus()); + Iterator<String> formIter = p.settings.getForms().keySet().iterator(); + assert(formIter.next().equals("my_input")); + assert(formIter.next().equals("my_select")); + assert(formIter.next().equals("my_checkbox")); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/9e6e65c4/zeppelin-web/src/app/notebook/paragraph/paragraph-parameterizedQueryForm.html ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph-parameterizedQueryForm.html b/zeppelin-web/src/app/notebook/paragraph/paragraph-parameterizedQueryForm.html index 2d0d170..37b43b6 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph-parameterizedQueryForm.html +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph-parameterizedQueryForm.html @@ -15,7 +15,7 @@ limitations under the License. ng-show="!paragraph.config.tableHide" class=" paragraphForm form-horizontal row"> <div class="form-group col-sm-6 col-md-6 col-lg-4" - ng-repeat="formulaire in paragraph.settings.forms | toArray | orderBy:'name.toString()'" + ng-repeat="formulaire in paragraph.settings.forms | toArray" ng-init="loadForm(formulaire, paragraph.settings.params)"> <label class="control-label input-sm" ng-class="{'disable': paragraph.status == 'RUNNING' || paragraph.status == 'PENDING' }">{{formulaire.name}}</label> <div> http://git-wip-us.apache.org/repos/asf/zeppelin/blob/9e6e65c4/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java index e019ee5..fbac2e3 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java @@ -21,11 +21,7 @@ import static java.lang.String.format; import java.io.IOException; import java.io.Serializable; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -317,8 +313,8 @@ public class Note implements Serializable, ParagraphJobListener { interpreterSettingManager); Map<String, Object> config = new HashMap<>(srcParagraph.getConfig()); - Map<String, Object> param = new HashMap<>(srcParagraph.settings.getParams()); - Map<String, Input> form = new HashMap<>(srcParagraph.settings.getForms()); + Map<String, Object> param = srcParagraph.settings.getParams(); + LinkedHashMap<String, Input> form = srcParagraph.settings.getForms(); newParagraph.setConfig(config); newParagraph.settings.setParams(param); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/9e6e65c4/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 cb6e0c7..c96280f 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 @@ -138,7 +138,7 @@ public class Paragraph extends Job implements Serializable, Cloneable { public Paragraph cloneParagraphForUser(String user) { Paragraph p = new Paragraph(); p.settings.setParams(Maps.newHashMap(settings.getParams())); - p.settings.setForms(Maps.newHashMap(settings.getForms())); + p.settings.setForms(Maps.newLinkedHashMap(settings.getForms())); p.setConfig(Maps.newHashMap(config)); p.setTitle(getTitle()); p.setText(getText()); @@ -388,8 +388,8 @@ public class Paragraph extends Job implements Serializable, Cloneable { settings.clear(); } else if (repl.getFormType() == FormType.SIMPLE) { String scriptBody = getScriptBody(); - Map<String, Input> inputs = Input.extractSimpleQueryParam(scriptBody); // inputs will be built - // from script body + // inputs will be built from script body + LinkedHashMap<String, Input> inputs = Input.extractSimpleQueryForm(scriptBody); final AngularObjectRegistry angularRegistry = repl.getInterpreterGroup().getAngularObjectRegistry();