浏览代码

HUE-3690 [editor] Unify loading a saved query

Romain Rigaux 9 年之前
父节点
当前提交
491a247

+ 4 - 1
desktop/core/src/desktop/api2.py

@@ -135,7 +135,10 @@ def get_document(request):
   with_dependencies = request.GET.get('dependencies', 'false').lower() == 'true'
 
   if uuid:
-    document = Document2.objects.get_by_uuid(user=request.user, uuid=uuid)
+    if uuid.isdigit():
+      document = Document2.objects.document(user=request.user, doc_id=uuid)
+    else:
+      document = Document2.objects.get_by_uuid(user=request.user, uuid=uuid)
   else:  # Find by path
     document = Document2.objects.get_by_path(user=request.user, path=path)
 

+ 2 - 2
desktop/core/src/desktop/models.py

@@ -897,9 +897,9 @@ class Document2Manager(models.Manager, Document2QueryMixin):
   def get_query_set(self):
     return Document2QuerySet(self.model, using=self._db)
 
-  # TODO prevent get
+  # TODO prevent get() in favor of this
   def document(self, user, doc_id):
-    return self.documents(user, include_trashed=True).get(id=doc_id)
+    return self.documents(user, include_trashed=True, include_history=True).get(id=doc_id)
 
   def get_by_natural_key(self, uuid, version, is_history):
     return self.get(uuid=uuid, version=version, is_history=is_history)

+ 1 - 1
desktop/libs/notebook/src/notebook/connectors/rdbms.py

@@ -50,7 +50,7 @@ class RdbmsApi(Api):
 
     table = db.execute_statement(snippet['statement'])  # TODO: execute statement stub in Rdbms
 
-    data = table.rows()
+    data = list(table.rows())
     has_result_set = data is not None
 
     return {

+ 20 - 10
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -334,6 +334,9 @@
     });
 
     self.variables = ko.mapping.fromJS(typeof snippet.variables != "undefined" && snippet.variables != null ? snippet.variables : []);
+    self.variables.subscribe(function (newValue) {
+      $(document).trigger("updateResultHeaders", self);
+    });
     self.variableNames = ko.computed(function () {
       var re = /(?:^|\W)\${(\w+)(?!\w)}/g;
 
@@ -372,11 +375,13 @@
         self.variables.push(ko.mapping.fromJS({'name': item, 'value': ''}));
       });
 
-      self.variables.sort(function (left, right) {
-        var leftIndex = newVal.indexOf(left.name());
-        var rightIndex = newVal.indexOf(right.name());
-        return leftIndex == rightIndex ? 0 : (leftIndex < rightIndex ? -1 : 1);
-      });
+      if (toDelete.length > 0 || toAdd.length > 0) { // Only re-update observable when changed
+        self.variables.sort(function (left, right) {
+          var leftIndex = newVal.indexOf(left.name());
+          var rightIndex = newVal.indexOf(right.name());
+          return leftIndex == rightIndex ? 0 : (leftIndex < rightIndex ? -1 : 1);
+        });
+      }
     });
     self.statement = ko.computed(function () {
       var statement = self.isSqlDialect() && self.selectedStatement() ? self.selectedStatement() : self.statement_raw();
@@ -1036,8 +1041,8 @@
       return $.grep(self.dependents(), function(doc) { return doc.type() == 'oozie-workflow2' ;})
     });
 
-    self.loadingHistory = ko.observable(true);
     self.history = ko.observableArray(typeof notebook.fetchedHistory != "undefined" && notebook.fetchedHistory != null ? notebook.fetchedHistory : []);
+    self.loadingHistory = ko.observable(self.history().length == 0);
     // TODO: Move fetchHistory and clearHistory into the Snippet and drop self.selectedSnippet
     self.getSession = function (session_type) {
       var _s = null;
@@ -1436,7 +1441,7 @@
   };
 
 
-  function EditorViewModel(notebooks, options, i18n) {
+  function EditorViewModel(editor_id, notebooks, options, i18n) {
     var self = this;
     self.i18n = i18n;
     self.user = options.user;
@@ -1568,7 +1573,10 @@
     };
 
     self.init = function () {
-      if (notebooks.length > 0) {
+      if (editor_id) {
+        self.openNotebook(editor_id);
+      }
+      else if (notebooks.length > 0) {
         self.loadNotebook(notebooks[0]);
         if (self.selectedNotebook().snippets().length === 0 && self.editorMode) { // Add snippet in new Editor
           self.selectedNotebook().newSnippet();
@@ -1596,9 +1604,11 @@
         data: true,
         dependencies: true
       }, function (data) {
-    	data.data.dependents = data.dependents
+        data.data.dependents = data.dependents
         var notebook = data.data;
-        notebook.fetchedHistory = self.selectedNotebook().history();
+        if (self.selectedNotebook()) { // Do not reload history on each query reload
+          notebook.fetchedHistory = self.selectedNotebook().history();
+        }
         self.loadNotebook(notebook);
         hueUtils.changeURL('/notebook/editor?editor=' + data.document.id);
       });

+ 5 - 7
desktop/libs/notebook/src/notebook/templates/editor_components.mako

@@ -2888,7 +2888,7 @@ ${ hueIcons.symbols() }
       var i18n = {
         errorLoadingDatabases: "${ _('There was a problem loading the databases') }"
       }
-      viewModel = new EditorViewModel(${ notebooks_json | n,unicode }, VIEW_MODEL_OPTIONS, i18n);
+      viewModel = new EditorViewModel(${ editor_id or 'null' }, ${ notebooks_json | n,unicode }, VIEW_MODEL_OPTIONS, i18n);
       ko.applyBindings(viewModel);
       viewModel.init();
 
@@ -2954,12 +2954,10 @@ ${ hueIcons.symbols() }
         redrawFixedHeaders(200);
       });
 
-      if (viewModel.editorMode) {
-        viewModel.selectedNotebook().snippets()[0].variables.subscribe(function (newValue) {
-          hideFixedHeaders();
-          redrawFixedHeaders(200);
-        });
-      }
+      $(document).on("updateResultHeaders", function (e) {
+        hideFixedHeaders();
+        redrawFixedHeaders(200);
+      });
 
       $(document).on("showAuthModal", function (e, data) {
         viewModel.authSessionUsername('${ user.username }');

+ 5 - 2
desktop/libs/notebook/src/notebook/views.py

@@ -90,10 +90,11 @@ def editor(request):
   editor_type = request.GET.get('type', 'hive')
   directory_uuid = request.GET.get('directory_uuid')
 
+  notebooks_json = '{}'
+
   if editor_id:  # Open existing saved editor document
     editor = Notebook(document=Document2.objects.get(id=editor_id))
     editor_type = editor.get_data()['type'].rsplit('-', 1)[-1]
-    editor = upgrade_session_properties(request, notebook=editor)
   else:  # Create new editor
     editor = Notebook()
     data = editor.get_data()
@@ -102,9 +103,11 @@ def editor(request):
     data['type'] = 'query-%s' % editor_type  # TODO: Add handling for non-SQL types
     data['directoryUuid'] = directory_uuid
     editor.data = json.dumps(data)
+    notebooks_json = json.dumps([editor.get_data()])
 
   return render('editor.mako', request, {
-      'notebooks_json': json.dumps([editor.get_data()]),
+      'editor_id': editor_id or None,
+      'notebooks_json': notebooks_json,
       'options_json': json.dumps({
           'languages': [{"name": "%s SQL" % editor_type.title(), "type": editor_type}],
           'mode': 'editor',