Explorar el Código

HUE-9028 [editor] Fix issue with re-execution of a statement in Notebook 2

Johan Ahlen hace 6 años
padre
commit
9a02e0d38d

+ 11 - 10
desktop/core/src/desktop/js/api/apiHelper.js

@@ -2077,7 +2077,7 @@ class ApiHelper {
    */
   executeStatement(options) {
     const executable = options.executable;
-    const url = EXECUTE_API_PREFIX + executable.sourceType;
+    const url = EXECUTE_API_PREFIX + executable.executor.sourceType();
 
     const promise = new Promise((resolve, reject) => {
       this.simplePost(
@@ -2276,17 +2276,18 @@ class ApiHelper {
    *
    * @return {Promise}
    */
-  closeStatement(options) {
+  async closeStatement(options) {
     const executable = options.executable;
 
-    return this.simplePost(
-      '/notebook/api/close_statement',
-      ApiHelper.adaptExecutableToNotebook({
-        sourceType: executable.sourceType,
-        handle: executable.handle
-      }),
-      options
-    );
+    return new Promise((resolve, reject) => {
+      this.simplePost(
+        '/notebook/api/close_statement',
+        ApiHelper.adaptExecutableToNotebook(executable),
+        options
+      )
+        .done(resolve)
+        .fail(reject);
+    });
   }
 
   /**

+ 4 - 4
desktop/core/src/desktop/js/apps/notebook2/components/ko.snippetExecuteActions.js

@@ -64,6 +64,7 @@ class SnippetExecuteActions extends DisposableComponent {
     this.activeExecutable = params.activeExecutable;
     this.status = ko.observable(EXECUTION_STATUS.ready);
     this.hasMoreToExecute = ko.observable(false);
+    this.beforeExecute = params.beforeExecute;
 
     this.subscribe(EXECUTABLE_UPDATED_EVENT, executable => {
       if (this.activeExecutable() === executable) {
@@ -94,12 +95,11 @@ class SnippetExecuteActions extends DisposableComponent {
     this.stopping(false);
   }
 
-  execute() {
+  async execute() {
+    this.beforeExecute();
     const executable = this.activeExecutable();
     if (executable) {
-      if (!executable.isReady()) {
-        executable.close();
-      }
+      await executable.reset();
       executable.execute();
     }
   }

+ 24 - 8
desktop/core/src/desktop/js/apps/notebook2/execution/executable.js

@@ -90,11 +90,15 @@ export default class Executable {
   }
 
   isReady() {
-    return this.status === EXECUTION_STATUS.ready;
+    return (
+      this.status === EXECUTION_STATUS.ready ||
+      this.status === EXECUTION_STATUS.closed ||
+      this.status === EXECUTION_STATUS.canceled
+    );
   }
 
   async execute() {
-    if (this.status !== EXECUTION_STATUS.ready) {
+    if (!this.isReady()) {
       return;
     }
     this.executeStarted = Date.now();
@@ -202,7 +206,19 @@ export default class Executable {
     }
   }
 
+  async reset() {
+    this.result = undefined;
+    this.logs.reset();
+    if (!this.isReady()) {
+      try {
+        await this.close();
+      } catch (err) {}
+    }
+    this.setProgress(0);
+  }
+
   async close() {
+    console.log('closing');
     while (this.cancellables.length) {
       const nextCancellable = this.cancellables.pop();
       try {
@@ -212,11 +228,11 @@ export default class Executable {
       }
     }
 
-    return new Promise(resolve => {
-      apiHelper.closeStatement({ executable: this }).finally(() => {
-        this.setStatus(EXECUTION_STATUS.closed);
-        resolve();
-      });
-    });
+    try {
+      await apiHelper.closeStatement({ executable: this, silenceErrors: true });
+    } catch (err) {
+      console.warn('Failed closing statement');
+    }
+    this.setStatus(EXECUTION_STATUS.closed);
   }
 }

+ 7 - 0
desktop/core/src/desktop/js/apps/notebook2/execution/executionLogs.js

@@ -32,6 +32,13 @@ export default class ExecutionLogs {
     this.jobs = [];
   }
 
+  reset() {
+    this.fullLog = '';
+    this.logLines = 0;
+    this.jobs = [];
+    huePubSub.publish(LOGS_UPDATED_EVENT, this);
+  }
+
   async fetchLogs(finalFetch) {
     const logDetails = await apiHelper.fetchLogs(this);
 

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

@@ -1008,6 +1008,10 @@ export default class Snippet {
       isSqlEngine: this.isSqlDialect
     });
 
+    this.beforeExecute = () => {
+      huePubSub.publish(REFRESH_STATEMENT_LOCATIONS_EVENT, this);
+    };
+
     huePubSub.subscribe(EXECUTABLE_UPDATED_EVENT, executable => {
       if (this.activeExecutable() === executable) {
         this.status(executable.status);

+ 8 - 4
desktop/core/src/desktop/js/parse/jison/sqlStatementsParser.jison

@@ -117,7 +117,9 @@ SqlStatementsParser
    }
  | 'EOF'
    {
-     return [];
+     var result = [];
+     parser.addEntry(result, 'statement', $1, @1);
+     return result;
    }
  ;
 
@@ -186,8 +188,10 @@ parser.handleTrailingStatements = function (result, emptyStatements) {
 }
 
 parser.removeTrailingWhiteSpace = function (result) {
-  var lastStatement = result[result.length - 1];
-  if (/^\s+$/.test(lastStatement.statement)) {
-    result.pop()
+  if (result.length > 1) {
+      var lastStatement = result[result.length - 1];
+      if (/^\s+$/.test(lastStatement.statement)) {
+        result.pop()
+      }
   }
 }

+ 6 - 1
desktop/core/src/desktop/js/parse/spec/sqlStatementsParserSpec.js

@@ -68,7 +68,12 @@ describe('sqlStatementsParser.js', () => {
   };
 
   it('should split "" correctly', () => {
-    testParser('', []);
+    testParser('', [
+      {
+        statement: '',
+        location: { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }
+      }
+    ]);
   });
 
   it('should split ";" correctly', () => {

+ 8 - 4
desktop/core/src/desktop/js/parse/sqlStatementsParser.js

@@ -135,7 +135,9 @@ case 5:
 break;
 case 6:
 
-     return [];
+     var result = [];
+     parser.addEntry(result, 'statement', $$[$0], _$[$0]);
+     return result;
    
 break;
 case 7:
@@ -356,9 +358,11 @@ parser.handleTrailingStatements = function (result, emptyStatements) {
 }
 
 parser.removeTrailingWhiteSpace = function (result) {
-  var lastStatement = result[result.length - 1];
-  if (/^\s+$/.test(lastStatement.statement)) {
-    result.pop()
+  if (result.length > 1) {
+      var lastStatement = result[result.length - 1];
+      if (/^\s+$/.test(lastStatement.statement)) {
+        result.pop()
+      }
   }
 }
 /* generated by jison-lex 0.3.4 */

+ 1 - 1
desktop/libs/notebook/src/notebook/templates/editor_components2.mako

@@ -1335,7 +1335,7 @@
 
   <script type ="text/html" id="snippet-execution-controls${ suffix }">
     <div class="snippet-actions clearfix">
-      <div class="pull-left" data-bind="component: { name: 'snippet-execute-actions', params: { activeExecutable: activeExecutable } }" />
+      <div class="pull-left" data-bind="component: { name: 'snippet-execute-actions', params: { activeExecutable: activeExecutable, beforeExecute: beforeExecute } }" />
       <!-- ko if: isSqlDialect() && !$root.isPresentationMode() -->
       <div class="pull-right" data-bind="component: { name: 'snippet-editor-actions', params: { snippet: $data } }" />
       <!-- /ko -->