소스 검색

HUE-2472 [impala] Stabilize result retrieval

Fixed address pushState
Changed result retrieval logic
Fixed and undefined js error for renderNavigator
Enrico Berti 11 년 전
부모
커밋
33f88c0
2개의 변경된 파일90개의 추가작업 그리고 74개의 파일을 삭제
  1. 88 73
      apps/beeswax/src/beeswax/templates/execute.mako
  2. 2 1
      apps/beeswax/static/js/beeswax.vm.js

+ 88 - 73
apps/beeswax/src/beeswax/templates/execute.mako

@@ -403,6 +403,7 @@ ${layout.menubar(section='query')}
                 </tr>
                 </thead>
               </table>
+              <a class="pointer" data-bind="visible: $root.scrollNotWorking() && $root.hasMoreResults(), click: manualFetch" style="padding: 10px">${ _('Show more results...') }</a>
             </div>
 
             <div data-bind="css: {'hide': !$root.design.results.empty() || $root.design.results.expired()}" id="resultEmpty">
@@ -1385,6 +1386,7 @@ function reinitializeTable(max) {
   function fn(){
     var container = $($("a[data-toggle='tab']:not(.sidetab)").parent(".active").find("a").attr("href"));
     if ($("#results .dataTables_wrapper").height() > 0) {
+
       $("#results .dataTables_wrapper").jHueTableScroller({
         minHeight: $(window).height() - 150,
         heightAfterCorrection: 0
@@ -1976,6 +1978,7 @@ function resizeLogs() {
 // Result Datatable
 function cleanResultsTable() {
   if (dataTable) {
+    viewModel.design.results.rows([]);
     dataTable.fnClearTable();
     dataTable.fnDestroy();
     viewModel.design.results.columns.valueHasMutated();
@@ -1993,91 +1996,93 @@ function addRowNumberToResults(data, startIndex) {
   return _tmpdata;
 }
 
+var _scrollTimeout = -1;
+function datatableScroll() {
+ viewModel.scrollNotWorking(false);
+
+  // Automatic results grower
+  var dataTableEl = $("#results .dataTables_wrapper");
+  var _lastScrollPosition = dataTableEl.data("scrollPosition") != null ? dataTableEl.data("scrollPosition") : 0;
+  window.clearTimeout(_scrollTimeout);
+  _scrollTimeout = window.setTimeout(function(){
+    dataTableEl.data("scrollPosition", dataTableEl.scrollTop());
+    if (_lastScrollPosition !=  dataTableEl.scrollTop() && dataTableEl.scrollTop() + dataTableEl.outerHeight() + 20 > dataTableEl[0].scrollHeight && dataTable) {
+      dataTableEl.animate({opacity: '0.55'}, 200);
+      viewModel.fetchResults();
+    }
+  }, 100);
+}
+
 var firstFnDrawcallback = false;
 
-function addResults(viewModel, dataTable, index, pageSize) {
-  if (index == 0) {
+function addResults(viewModel, dataTable, startRow, nextRow) {
+  if (startRow == 0) {
     firstFnDrawcallback = true;
   }
-  if (viewModel.hasMoreResults() && index + pageSize > viewModel.design.results.rows().length) {
-    $(document).one('fetched.results', function () {
-      $.totalStorage(hac_getTotalStorageUserPrefix() + "${app_name}_temp_query", null);
-    });
-    dataTable.fnAddData(addRowNumberToResults(viewModel.design.results.rows.slice(index, index + pageSize), index));
-    viewModel.fetchResults();
-  } else {
-    dataTable.fnAddData(addRowNumberToResults(viewModel.design.results.rows.slice(index, index + pageSize), index));
-  }
+  dataTable.fnAddData(addRowNumberToResults(viewModel.design.results.rows.slice(startRow, nextRow), startRow));
 }
 
 function resultsTable(e, data) {
-  if (!dataTable && viewModel.design.results.columns().length > 0) {
-    dataTable = $("#resultTable").dataTable({
-      "bPaginate": false,
-      "bLengthChange": false,
-      "bInfo": false,
-      "bDestroy": true,
-      "bAutoWidth": false,
-      "oLanguage": {
-        "sEmptyTable": "${_('No data available')}",
-        "sZeroRecords": "${_('No matching records')}"
-      },
-      "fnDrawCallback": function (oSettings) {
-        reinitializeTableExtenders();
-        if (firstFnDrawcallback) {
-          firstFnDrawcallback = false;
-          window.setTimeout(reinitializeTable, 100);
-        }
-      },
-      "aoColumnDefs": [
-        {
-          "sType": "numeric",
-          "aTargets": [ "sort-numeric" ]
+  $("#results .dataTables_wrapper").animate({opacity: '1'}, 50);
+  $.totalStorage(hac_getTotalStorageUserPrefix() + "${app_name}_temp_query", null);
+  if (viewModel.design.results.columns().length > 0) {
+    if (!dataTable) {
+      dataTable = $("#resultTable").dataTable({
+        "bPaginate": false,
+        "bLengthChange": false,
+        "bInfo": false,
+        "bDestroy": true,
+        "bAutoWidth": false,
+        "oLanguage": {
+          "sEmptyTable": "${_('No data available')}",
+          "sZeroRecords": "${_('No matching records')}"
         },
-        {
-          "sType": "string",
-          "aTargets": [ "sort-string" ]
+        "fnDrawCallback": function (oSettings) {
+          reinitializeTableExtenders();
+          if (firstFnDrawcallback) {
+            firstFnDrawcallback = false;
+            window.setTimeout(reinitializeTable, 100);
+          }
         },
-        {
-          "sType": "date",
-          "aTargets": [ "sort-date" ]
-        }
-      ]
-    });
-    $(".dataTables_filter").hide();
-    reinitializeTable();
-    var _options = '<option value="-1">${ _("Please select a column")}</option>';
-    $(viewModel.design.results.columns()).each(function(cnt, item){
-      if (cnt > 0){
-        _options += '<option value="'+(cnt + 1)+'">'+ item.name +'</option>';
-      }
-    });
-    $(".blueprintSelect").html(_options);
-
-    // Automatic results grower
-    var dataTableEl = $("#results .dataTables_wrapper");
-    var index = 0;
-    var pageSize = 100;
-    var _scrollTimeout = -1;
-    dataTableEl.on("scroll", function (e) {
-      var _lastScrollPosition = dataTableEl.data("scrollPosition") != null ? dataTableEl.data("scrollPosition") : 0;
-      window.clearTimeout(_scrollTimeout);
-      _scrollTimeout = window.setTimeout(function(){
-        dataTableEl.data("scrollPosition", dataTableEl.scrollTop());
-        if (_lastScrollPosition !=  dataTableEl.scrollTop() && dataTableEl.scrollTop() + dataTableEl.outerHeight() + 20 > dataTableEl[0].scrollHeight && dataTable) {
-          dataTableEl.animate({opacity: '0.55'}, 200);
-          addResults(viewModel, dataTable, index, pageSize);
-          index += pageSize;
-          dataTableEl.animate({opacity: '1'}, 50);
+        "aoColumnDefs": [
+          {
+            "sType": "numeric",
+            "aTargets": [ "sort-numeric" ]
+          },
+          {
+            "sType": "string",
+            "aTargets": [ "sort-string" ]
+          },
+          {
+            "sType": "date",
+            "aTargets": [ "sort-date" ]
+          }
+        ]
+      });
+      $(".dataTables_filter").hide();
+      reinitializeTable();
+      var _options = '<option value="-1">${ _("Please select a column")}</option>';
+      $(viewModel.design.results.columns()).each(function(cnt, item){
+        if (cnt > 0){
+          _options += '<option value="'+(cnt + 1)+'">'+ item.name +'</option>';
         }
-      }, 100);
-    });
-    addResults(viewModel, dataTable, index, pageSize);
-    index += pageSize;
-    dataTableEl.jHueScrollUp();
+      });
+      $(".blueprintSelect").html(_options);
+
+      // Automatic results grower
+      var dataTableEl = $("#results .dataTables_wrapper");
+      dataTableEl.on("scroll", datatableScroll);
+    }
+
+    addResults(viewModel, dataTable, data.start_row, data.next_row);
   }
 }
 
+function manualFetch() {
+  $("#results .dataTables_wrapper").css("opacity", "0.55");
+  viewModel.fetchResults();
+}
+
 $(document).on('execute.query', cleanResultsTable);
 $(document).on('explain.query', cleanResultsTable);
 $(document).on('fetched.results', resultsTable);
@@ -2183,6 +2188,8 @@ $(document).on('saved.results', function() {
 
 // Querying and click events.
 function tryExecuteQuery() {
+  viewModel.scrollNotWorking(true);
+  $("#results .dataTables_wrapper").off("scroll", datatableScroll);
   $(".jHueTableExtenderClonedContainer").hide();
   $(".tooltip").remove();
   var query = getHighlightedQuery() || codeMirror.getValue();
@@ -2206,6 +2213,7 @@ function tryExecuteQuery() {
 }
 
 function tryExecuteNextStatement() {
+  viewModel.scrollNotWorking(true);
   var query = getHighlightedQuery() || codeMirror.getValue();
 
   // If we highlight a part of query, we update the query and restart the query history
@@ -2225,6 +2233,7 @@ function tryExecuteNextStatement() {
 }
 
 function tryExecuteParameterizedQuery() {
+  viewModel.scrollNotWorking(true);
   $(".tooltip").remove();
   viewModel.executeQuery();
   routie('query');
@@ -2654,7 +2663,13 @@ function getDatabases(callback){
       else {
         $.totalStorage(hac_getTotalStorageUserPrefix() + "${app_name}_last_database", null);
       }
-      renderNavigator();
+      var _waitForNavigatorInit = -1;
+      _waitForNavigatorInit = window.setInterval(function () {
+        if (typeof renderNavigator != "undefined") {
+          renderNavigator();
+          window.clearInterval(_waitForNavigatorInit);
+        }
+      }, 100);
     }, 200)
   });
   hac_getDatabases(function (dbs) {

+ 2 - 1
apps/beeswax/static/js/beeswax.vm.js

@@ -84,6 +84,7 @@ function BeeswaxViewModel(server) {
   // Use a view model attribute so that we don't have to override KO.
   // This allows Hue to disable the execute button until the query placeholder dies.
   self.queryEditorBlank = ko.observable(false);
+  self.scrollNotWorking = ko.observable(true);
 
   self.canExecute = ko.computed(function() {
     return !self.design.isRunning() && self.design.isFinished();
@@ -502,7 +503,7 @@ function BeeswaxViewModel(server) {
         self.design.watch.errors.removeAll();
         if (data.status == 0) {
           if (typeof history.pushState != 'undefined') {
-            history.pushState(null, null, '/beeswax/execute/query/' + data.id + '#query/logs');
+            history.pushState(null, null, '/' + self.server() + '/execute/query/' + data.id + '#query/logs');
           }
           self.design.results.url('/' + self.server() + '/results/' + data.id + '/0?format=json');
           self.design.watch.url(data.watch_url);