浏览代码

HUE-5406 [editor] Support editing last statement of a multi query without restarting

Romain Rigaux 8 年之前
父节点
当前提交
10410e0

+ 5 - 3
desktop/libs/notebook/src/notebook/connectors/hiveserver2.py

@@ -626,6 +626,8 @@ DROP TABLE IF EXISTS `%(table)s`;
     statements_count = snippet['result']['handle'].get('statements_count', 1)
 
     statements = self._get_statements(snippet['statement'])
+    previous_statement_hash = hashlib.sha224(statements[statement_id]['statement']).hexdigest()
+    non_edited_statement = previous_statement_hash == snippet['result']['handle'].get('previous_statement_hash') or not snippet['result']['handle'].get('previous_statement_hash')
 
     if snippet['result']['handle'].get('has_more_statements'):
       try:
@@ -634,11 +636,11 @@ DROP TABLE IF EXISTS `%(table)s`;
       except:
         LOG.warn('Could not close previous multiquery query')
 
-      previous_statement_hash = hashlib.sha224(statements[statement_id]['statement']).hexdigest()
-      if previous_statement_hash == snippet['result']['handle'].get('previous_statement_hash') or not snippet['result']['handle'].get('previous_statement_hash'):
+      if non_edited_statement:
         statement_id += 1
     else:
-      statement_id = 0
+      if non_edited_statement:
+        statement_id = 0
 
 
     resp = {

+ 36 - 1
desktop/libs/notebook/src/notebook/connectors/tests/tests_hiveserver2.py

@@ -22,7 +22,7 @@ import re
 import time
 
 from nose.plugins.skip import SkipTest
-from nose.tools import assert_equal, assert_true, assert_false
+from nose.tools import assert_equal, assert_true
 
 from django.contrib.auth.models import User
 from django.core.urlresolvers import reverse
@@ -433,6 +433,41 @@ class TestHiveserver2Api(object):
     assert_equal(jobs[0]['finished'], True)
 
 
+  def test_get_current_statement(self):
+    snippet = json.loads("""
+        {
+            "status": "running",
+            "database": "default",
+            "id": "d70d31ee-a62a-4854-b2b1-b852f6a390f5",
+            "result": {
+                "type": "table",
+                "handle": {
+                  "statement_id": 0,
+                  "statements_count": 1,
+                  "has_more_statements": false
+                },
+                "id": "ca11fcb1-11a5-f534-8200-050c8e1e57e3"
+            },
+            "statement": "%(statement)s",
+            "type": "hive",
+            "properties": {
+                "files": [],
+                "functions": [],
+                "settings": []
+            }
+        }
+      """ % {'statement': "SELECT * FROM sample_07;"}
+    )
+
+    statement = self.api._get_current_statement(MockDb(), snippet)
+
+    assert_equal('7d283ad4794a3d2efd48a3ab44b1d9672625837c7dfc73f010ce82ab', statement['previous_statement_hash'])
+
+
+def MockDb():
+  def close_operation(handle): pass
+
+
 class TestHiveserver2ApiWithHadoop(BeeswaxSampleProvider):
 
   @classmethod