Repository: zeppelin
Updated Branches:
  refs/heads/master 116005659 -> 1a3ae4265


[ZEPPELIN-2122] Add execution time for Spell

### What is this PR for?

Add execution time for spell results. See the screenshot section.

### What type of PR is it?
[Improvement]

### Todos

NONE

### What is the Jira issue?

[ZEPPELIN-2122](https://issues.apache.org/jira/browse/ZEPPELIN-2122)

### How should this be tested?

1. Install any spell (e.g the eco spell)
2. Execute and check that the paragraph has valid execution time.

### Screenshots (if appropriate)

![spell_exec2](https://cloud.githubusercontent.com/assets/4968473/25970951/803ab842-36d5-11e7-8a18-d671466e2aba.gif)

![2122_spell_execution_time](https://cloud.githubusercontent.com/assets/4968473/25967990/e9edc96a-36ca-11e7-942e-718e37063c1b.gif)

### Questions:
* Does the licenses files need update? - NO
* Is there breaking changes for older versions? - NO
* Does this needs documentation? - NO

Author: 1ambda <[email protected]>

Closes #2338 from 1ambda/ZEPPEILN-2122/add-execution-time-for-spell and 
squashes the following commits:

2417428 [1ambda] fix: Set dateStarted in run* func
0996865 [1ambda] fix: Use string instead of moment obj
bb895a5 [1ambda] fix: Set dateStarted
9fb388e [1ambda] fix: Use ISO 8601
55f8d23 [1ambda] fix: rollback Job class
c2ab88b [1ambda] feat: Persist, display execution time for spell


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

Branch: refs/heads/master
Commit: 1a3ae426579a58267ad06d4cb33afb29ac822725
Parents: 1160056
Author: 1ambda <[email protected]>
Authored: Fri May 12 05:39:00 2017 +0900
Committer: Lee moon soo <[email protected]>
Committed: Thu May 25 15:54:15 2017 +0900

----------------------------------------------------------------------
 .../java/org/apache/zeppelin/scheduler/Job.java |  8 ++++++
 .../apache/zeppelin/socket/NotebookServer.java  | 29 ++++++++++++++------
 .../notebook/paragraph/paragraph.controller.js  | 29 +++++++++++++++++---
 .../websocketEvents/websocketMsg.service.js     | 11 +++++---
 4 files changed, 60 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zeppelin/blob/1a3ae426/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java
----------------------------------------------------------------------
diff --git 
a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java 
b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java
index 549811c..d0025d8 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java
@@ -259,10 +259,18 @@ public abstract class Job {
     return dateStarted;
   }
 
+  public synchronized void setDateStarted(Date startedAt) {
+    dateStarted = startedAt;
+  }
+
   public synchronized Date getDateFinished() {
     return dateFinished;
   }
 
+  public synchronized void setDateFinished(Date finishedAt) {
+    dateFinished = finishedAt;
+  }
+
   public abstract void setResult(Object results);
 
   public synchronized String getErrorMessage() {

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/1a3ae426/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
----------------------------------------------------------------------
diff --git 
a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java 
b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
index 87d0009..5588be0 100644
--- 
a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
+++ 
b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
@@ -19,15 +19,9 @@ package org.apache.zeppelin.socket;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Queue;
-import java.util.Set;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.regex.Matcher;
@@ -1696,6 +1690,23 @@ public class NotebookServer extends WebSocketServlet
     p.setErrorMessage((String) fromMessage.get("errorMessage"));
     p.setStatusWithoutNotification(status);
 
+    // Spell uses ISO 8601 formatted string generated from moment
+    String dateStarted = (String) fromMessage.get("dateStarted");
+    String dateFinished = (String) fromMessage.get("dateFinished");
+    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
+
+    try {
+      p.setDateStarted(df.parse(dateStarted));
+    } catch (ParseException e) {
+      LOG.error("Failed parse dateStarted", e);
+    }
+
+    try {
+      p.setDateFinished(df.parse(dateFinished));
+    } catch (ParseException e) {
+      LOG.error("Failed parse dateFinished", e);
+    }
+
     addNewParagraphIfLastParagraphIsExecuted(note, p);
     if (!persistNoteWithAuthInfo(conn, note, p)) {
       return;

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/1a3ae426/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 fd21467..e333084 100644
--- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
+++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
@@ -254,12 +254,15 @@ function ParagraphCtrl ($scope, $rootScope, $route, 
$window, $routeParams, $loca
   $scope.propagateSpellResult = function (paragraphId, paragraphTitle,
                                          paragraphText, paragraphResults,
                                          paragraphStatus, 
paragraphErrorMessage,
-                                         paragraphConfig, 
paragraphSettingsParam) {
+                                         paragraphConfig, 
paragraphSettingsParam,
+                                         paragraphDateStarted, 
paragraphDateFinished) {
     websocketMsgSrv.paragraphExecutedBySpell(
       paragraphId, paragraphTitle,
       paragraphText, paragraphResults,
       paragraphStatus, paragraphErrorMessage,
-      paragraphConfig, paragraphSettingsParam)
+      paragraphConfig, paragraphSettingsParam,
+      paragraphDateStarted, paragraphDateFinished
+    )
   }
 
   $scope.handleSpellError = function (paragraphText, error,
@@ -270,10 +273,15 @@ function ParagraphCtrl ($scope, $rootScope, $route, 
$window, $routeParams, $loca
     console.error('Failed to execute interpret() in spell\n', error)
 
     if (!propagated) {
+      $scope.paragraph.dateFinished = $scope.getFormattedParagraphTime()
+    }
+
+    if (!propagated) {
       $scope.propagateSpellResult(
         $scope.paragraph.id, $scope.paragraph.title,
         paragraphText, [], $scope.paragraph.status, errorMessage,
-        $scope.paragraph.config, $scope.paragraph.settings.params)
+        $scope.paragraph.config, $scope.paragraph.settings.params,
+        $scope.paragraph.dateStarted, $scope.paragraph.dateFinished)
     }
   }
 
@@ -309,11 +317,16 @@ function ParagraphCtrl ($scope, $rootScope, $route, 
$window, $routeParams, $loca
     const paragraphText = $scope.spellTransaction.paragraphText
 
     if (!propagated) {
+      $scope.paragraph.dateFinished = $scope.getFormattedParagraphTime()
+    }
+
+    if (!propagated) {
       const propagable = SpellResult.createPropagable(resultsMsg)
       $scope.propagateSpellResult(
         $scope.paragraph.id, $scope.paragraph.title,
         paragraphText, propagable, status, '',
-        $scope.paragraph.config, $scope.paragraph.settings.params)
+        $scope.paragraph.config, $scope.paragraph.settings.params,
+        $scope.paragraph.dateStarted, $scope.paragraph.dateFinished)
     }
   }
 
@@ -331,6 +344,10 @@ function ParagraphCtrl ($scope, $rootScope, $route, 
$window, $routeParams, $loca
       // remove leading spaces
       const textWithoutMagic = splited[1].replace(/^\s+/g, '')
 
+      if (!propagated) {
+        $scope.paragraph.dateStarted = $scope.getFormattedParagraphTime()
+      }
+
       // handle actual result message in promise
       heliumService.executeSpell(magic, textWithoutMagic)
         .then(resultsMsg => {
@@ -981,6 +998,10 @@ function ParagraphCtrl ($scope, $rootScope, $route, 
$window, $routeParams, $loca
     return $scope.currentProgress || 0
   }
 
+  $scope.getFormattedParagraphTime = () => {
+    return moment().toISOString()
+  }
+
   $scope.getExecutionTime = function (pdata) {
     const end = pdata.dateFinished
     const start = pdata.dateStarted

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/1a3ae426/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js
----------------------------------------------------------------------
diff --git 
a/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js 
b/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js
index 3f7ec6b..3fa56f3 100644
--- a/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js
+++ b/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js
@@ -160,9 +160,10 @@ function websocketMsgSrv ($rootScope, websocketEvents) {
     },
 
     paragraphExecutedBySpell: function (paragraphId, paragraphTitle,
-                                       paragraphText, paragraphResultsMsg,
-                                       paragraphStatus, paragraphErrorMessage,
-                                       paragraphConfig, paragraphParams) {
+                                        paragraphText, paragraphResultsMsg,
+                                        paragraphStatus, paragraphErrorMessage,
+                                        paragraphConfig, paragraphParams,
+                                        paragraphDateStarted, 
paragraphDateFinished) {
       websocketEvents.sendNewEvent({
         op: 'PARAGRAPH_EXECUTED_BY_SPELL',
         data: {
@@ -179,7 +180,9 @@ function websocketMsgSrv ($rootScope, websocketEvents) {
           status: paragraphStatus,
           errorMessage: paragraphErrorMessage,
           config: paragraphConfig,
-          params: paragraphParams
+          params: paragraphParams,
+          dateStarted: paragraphDateStarted,
+          dateFinished: paragraphDateFinished,
         }
       })
     },

Reply via email to