Эх сурвалжийг харах

[spark] Fetch next rows of a result set

Romain Rigaux 11 жил өмнө
parent
commit
6f76476349

+ 3 - 2
apps/spark/src/spark/api.py

@@ -77,7 +77,7 @@ def check_status(request):
     response['status'] = 0
   except Exception, e:
     message = force_unicode(str(e))
-    if 'session not found' in message:
+    if 'session not found' in message: # if 'Invalid OperationHandle' in message --> expired
       response['status'] = -2
     else:
       response['message'] = force_unicode(str(e))
@@ -90,9 +90,10 @@ def fetch_result(request):
 
   notebook = json.loads(request.POST.get('notebook', '{}'))
   snippet = json.loads(request.POST.get('snippet', '{}'))
+  rows = json.loads(request.POST.get('rows', 100))
 
   try:
-    response['result'] = get_api(request.user, snippet).fetch_result(notebook, snippet)
+    response['result'] = get_api(request.user, snippet).fetch_result(notebook, snippet, rows)
     response['status'] = 0
   except Exception, e:
     message = force_unicode(str(e))

+ 5 - 5
apps/spark/src/spark/models.py

@@ -134,16 +134,16 @@ class HS2Api():
         'status':
           'running' if status.index in (QueryHistory.STATE.running.index, QueryHistory.STATE.submitted.index)
           else (
-             'failed' if status.index == QueryHistory.STATE.failed.index
-              else 'ready'
+             'failed' if status.index in (QueryHistory.STATE.failed.index, QueryHistory.STATE.expired.index)
+              else 'available'
           )
     }
 
-  def fetch_result(self, notebook, snippet):
+  def fetch_result(self, notebook, snippet, rows):
     db = dbms.get(self.user)
       
     handle = self._get_handle(snippet)
-    results = db.fetch(handle, start_over=False, rows=10)
+    results = db.fetch(handle, start_over=False, rows=rows)
     
     # no escaping...
     return {
@@ -196,7 +196,7 @@ class SparkApi():  # Pig, DBquery, Phoenix...
   def check_status(self, notebook, snippet):
     return {'status': 'ready'}
 
-  def fetch_result(self, notebook, snippet):
+  def fetch_result(self, notebook, snippet, rows):
     api = get_spark_api(self.user)
     session = _get_snippet_session(notebook, snippet)
     cell = snippet['result']['handle']['id']  

+ 2 - 0
apps/spark/src/spark/templates/editor.mako

@@ -238,6 +238,8 @@ ${ commonheader(_('Query'), app_name, user, "68px") | n,unicode }
                 </tr>
               </tbody>
             </table>
+            
+            <a href="javascript:void(0)" data-bind="click: function() { $data.fetchResult(100); }" class="btn">${ _('Next') }</a>            
           </div>
         </div>
       </div>

+ 25 - 20
apps/spark/static/js/spark.vm.js

@@ -23,7 +23,7 @@ var Result = function (snippet, result) {
   self.handle = ko.observable({});
   self.meta = ko.mapping.fromJS(typeof result.meta != "undefined" && result.meta != null ? result.meta : []);
   self.data = ko.mapping.fromJS(typeof result.data != "undefined" && result.data != null ? result.data : []);
-  self.logs = ko.observable('log');
+  self.logs = ko.observable('');
   
   if (typeof result.handle != "undefined" && result.handle != null) {
     $.each(result.handle, function(key, val) {
@@ -216,8 +216,8 @@ var Snippet = function (notebook, snippet) {
           if (self.status() == 'running') {
         	self.checkStatusTimeout = setTimeout(self.checkStatus, 1000);
           } 
-          else if (self.status() == 'ready') {
-        	self.fetchResult();
+          else if (self.status() == 'available') {
+        	self.fetchResult(100);
           }
 	    } else if (data.status == -2) {
 	      self.create_session();  
@@ -229,23 +229,28 @@ var Snippet = function (notebook, snippet) {
     });
   };
 
-  self.fetchResult = function() {
+  self.fetchResult = function(rows) {
     $.post("/spark/api/fetch_result", {
-        notebook: ko.mapping.toJSON(notebook),
-        snippet: ko.mapping.toJSON(self)
- 	  }, function (data) {
- 	    if (data.status == 0) {
- 	      self.result.meta(data.result.meta);           
-          self.result.data(data.result.data);
-
-          // move resultsets to n rows
-          // check if N rows fetched...
- 	    } else if (data.status == -2) {
- 	      self.create_session();  
- 	    } else {
- 	      $(document).trigger("error", data.message);
- 	    }
- 	}).fail(function (xhr, textStatus, errorThrown) {
+      notebook: ko.mapping.toJSON(notebook),
+      snippet: ko.mapping.toJSON(self),
+      rows: rows
+    }, function (data) {
+ 	  if (data.status == 0) {
+ 	    rows -= data.result.data.length;
+ 	    self.result.meta(data.result.meta);
+ 	    $.each(data.result.data, function(index, row) {
+ 	      self.result.data.push(row);  
+ 	    });
+         
+        if (data.result.hasMore && rows > 0) {
+          setTimeout(function(){ self.fetchResult(rows); }, 500);
+        }
+      } else if (data.status == -2) {
+        self.create_session();  
+      } else {
+        $(document).trigger("error", data.message);
+      }
+    }).fail(function (xhr, textStatus, errorThrown) {
       $(document).trigger("error", xhr.responseText);
     });
   };
@@ -280,7 +285,7 @@ var Snippet = function (notebook, snippet) {
         snippet: ko.mapping.toJSON(self)
  	  }, function (data) {
  	    if (data.status == 0) {
- 	      self.status('canceled'); 
+ 	      self.result.logs(data.log); // todo smarter? 
  	    } else {
  	      $(document).trigger("error", data.message);
  	    }