Procházet zdrojové kódy

HUE-9107 [editor] Reuse existing executables in presentation mode for editor v2

Johan Ahlen před 6 roky
rodič
revize
9b3f2df643

+ 1 - 1
desktop/core/src/desktop/js/apps/notebook2/components/executableStateHandler.js

@@ -41,7 +41,7 @@ export const attachTracker = (activeExecutable, id, target, trackedObservables)
 
   Object.keys(trackedObservables).forEach(observableAttr => {
     const sub = target[observableAttr].subscribe(val => {
-      if (ignoreObservableChange) {
+      if (ignoreObservableChange || !activeExecutable()) {
         return;
       }
       if (!activeExecutable().observerState[id]) {

+ 3 - 1
desktop/core/src/desktop/js/apps/notebook2/components/resultGrid/ko.resultGrid.js

@@ -330,7 +330,9 @@ class ResultGrid extends DisposableComponent {
             heightAfterCorrection: 0
           });
           this.disposals.push(() => {
-            $datatablesWrapper.data('plugin_jHueTableScroller').destroy();
+            if ($datatablesWrapper.data('plugin_jHueTableScroller')) {
+              $datatablesWrapper.data('plugin_jHueTableScroller').destroy();
+            }
           });
         }
       },

+ 68 - 40
desktop/core/src/desktop/js/apps/notebook2/editorViewModel.js

@@ -25,6 +25,7 @@ import hueUtils from 'utils/hueUtils';
 
 import Notebook from 'apps/notebook2/notebook';
 import Snippet from 'apps/notebook2/snippet';
+import SqlExecutable from 'apps/notebook2/execution/sqlExecutable';
 import { UPDATE_HISTORY_EVENT } from 'apps/notebook2/components/ko.queryHistory';
 
 class EditorViewModel {
@@ -513,51 +514,68 @@ class EditorViewModel {
     const selectedNotebook = this.selectedNotebook();
     const newSnippets = [];
 
-    if (this.editorType() !== 'notebook') {
+    const toPresentationMode = this.editorType() !== 'notebook';
+
+    if (toPresentationMode) {
       this.editorType('notebook');
-      this.preEditorTogglingSnippet(selectedNotebook.snippets()[0]);
-      const variables = selectedNotebook.snippets()[0].variables();
-      const statementKeys = [];
+      const sourceSnippet = selectedNotebook.snippets()[0];
+      this.preEditorTogglingSnippet(sourceSnippet);
+      const variables = sourceSnippet.variables();
+      const statementKeys = {};
       // Split statements
       selectedNotebook.type('notebook');
-      selectedNotebook
-        .snippets()[0]
-        .statementsList()
-        .forEach(sqlStatement => {
-          let presentationSnippet;
-          if (sqlStatement.hashCode() in selectedNotebook.presentationSnippets()) {
-            presentationSnippet = selectedNotebook.presentationSnippets()[sqlStatement.hashCode()]; // Persist result
-            presentationSnippet.variables(variables);
-          } else {
-            const titleParts = [];
-            const statementParts = [];
-            sqlStatement
-              .trim()
-              .split('\n')
-              .forEach(line => {
-                if (line.trim().startsWith('--') && statementParts.length === 0) {
-                  titleParts.push(line.substr(2));
-                } else {
-                  statementParts.push(line);
-                }
-              });
-            presentationSnippet = new Snippet(this, selectedNotebook, {
-              type: selectedNotebook.initialType,
-              statement_raw: statementParts.join('\n'),
-              name: titleParts.join('\n'),
-              variables: komapping.toJS(variables)
+
+      sourceSnippet.executor.executables.forEach(executable => {
+        const sqlStatement = executable.parsedStatement.statement;
+        const sqlStatementHash = sqlStatement.hashCode();
+
+        let presentationSnippet;
+
+        if (!selectedNotebook.presentationSnippets()[sqlStatementHash]) {
+          const titleParts = [];
+          const statementParts = [];
+          sqlStatement
+            .trim()
+            .split('\n')
+            .forEach(line => {
+              if (line.trim().startsWith('--') && statementParts.length === 0) {
+                titleParts.push(line.substr(2));
+              } else {
+                statementParts.push(line);
+              }
             });
-            presentationSnippet.variables = selectedNotebook.snippets()[0].variables;
-            presentationSnippet.init();
-            selectedNotebook.presentationSnippets()[sqlStatement.hashCode()] = presentationSnippet;
-          }
-          statementKeys.push(sqlStatement.hashCode());
-          newSnippets.push(presentationSnippet);
-        });
-      $.each(selectedNotebook.presentationSnippets(), key => {
+          presentationSnippet = new Snippet(this, selectedNotebook, {
+            type: selectedNotebook.initialType,
+            statement_raw: statementParts.join('\n'),
+            name: titleParts.join('\n'),
+            variables: komapping.toJS(variables)
+          });
+          window.setTimeout(() => {
+            const executableRaw = executable.toJs();
+            const reattachedExecutable = SqlExecutable.fromJs(
+              presentationSnippet.executor,
+              executableRaw
+            );
+            reattachedExecutable.result = executable.result;
+            presentationSnippet.executor.executables = [reattachedExecutable];
+            presentationSnippet.activeExecutable(reattachedExecutable);
+          }, 1000); // TODO: Make it possible to set activeSnippet on Snippet creation
+          presentationSnippet.init();
+          selectedNotebook.presentationSnippets()[sqlStatementHash] = presentationSnippet;
+        } else {
+          presentationSnippet = selectedNotebook.presentationSnippets()[sqlStatementHash];
+        }
+        presentationSnippet.variables(sourceSnippet.variables());
+        statementKeys[sqlStatement.hashCode()] = true;
+        newSnippets.push(presentationSnippet);
+      });
+
+      Object.keys(selectedNotebook.presentationSnippets()).forEach(key => {
         // Dead statements
-        if (!key in statementKeys) {
-          delete selectedNotebook.presentationSnippets()[key];
+        if (!statementKeys[key]) {
+          selectedNotebook.presentationSnippets()[key].executor.executables.forEach(executable => {
+            executable.cancelBatchChain();
+          });
         }
       });
     } else {
@@ -569,6 +587,16 @@ class EditorViewModel {
     selectedNotebook.snippets(newSnippets);
     newSnippets.forEach(snippet => {
       huePubSub.publish('editor.redraw.data', { snippet: snippet });
+      if (toPresentationMode) {
+        window.setTimeout(() => {
+          snippet.executor.executables.forEach(executable => {
+            executable.notify();
+            if (executable.result) {
+              executable.result.notify();
+            }
+          });
+        }, 1000); // TODO: Make it possible to set activeSnippet on Snippet creation
+      }
     });
   }
 

+ 4 - 0
desktop/core/src/desktop/js/apps/notebook2/execution/executionResult.js

@@ -111,6 +111,10 @@ export default class ExecutionResult {
     this.isEscaped = resultResponse.isEscaped;
     this.type = resultResponse.type;
     this.fetchedOnce = true;
+    this.notify();
+  }
+
+  notify() {
     huePubSub.publish(RESULT_UPDATED_EVENT, this);
   }
 }

+ 4 - 1
desktop/core/src/desktop/js/apps/notebook2/notebook.js

@@ -450,7 +450,10 @@ export default class Notebook {
       name: this.name(),
       onSuccessUrl: this.onSuccessUrl(),
       parentSavedQueryUuid: this.parentSavedQueryUuid(),
-      presentationSnippets: this.presentationSnippets(),
+      presentationSnippets: Object.keys(this.presentationSnippets()).reduce((result, key) => {
+        result[key] = this.presentationSnippets()[key].toJs();
+        return result;
+      }, {}),
       pubSubUrl: this.pubSubUrl(),
       result: {}, // TODO: Moved to executor but backend requires it
       sessions: await sessionManager.getAllSessions(),