Browse Source

HUE-5145 [editor] Skeleton of statement compatibility API

Romain Rigaux 9 years ago
parent
commit
3ca8d78

+ 7 - 15
desktop/libs/metadata/src/metadata/optimizer_client.py

@@ -182,21 +182,13 @@ class OptimizerApi(object):
     ])
     ])
 
 
 
 
-  def query_compatibility(self, source_platform, target_platform, query, token=None, email=None):
-    if token is None:
-      token = self._authenticate()
-
-    try:
-      data = {
-          'email': email if email is not None else self._email,
-          'token': token,
-          'sourcePlatform': source_platform,
-          'targetPlatform': target_platform,
-          'query': query
-      }
-      return self._root.post('/api/queryCompatibility', data=json.dumps(data), contenttype=_JSON_CONTENT_TYPE)
-    except RestException, e:
-      raise PopupException(e, title=_('Error while accessing Optimizer'))
+  def query_compatibility(self, source_platform, target_platform, query):
+    return self._exec('get-query-compatible', [
+        '--tenant', self._product_name,        
+        '--source-platform', source_platform,
+        '--target-platform', target_platform,
+        '--query', query,
+    ])
 
 
 
 
   def query_risk(self, query):
   def query_risk(self, query):

+ 2 - 2
desktop/libs/metadata/src/metadata/optimizer_client_tests.py

@@ -134,8 +134,8 @@ class TestOptimizerApi(object):
 
 
 
 
   def test_query_compatibility(self):
   def test_query_compatibility(self):
-    source_platform = 'MySQL'
-    target_platform = 'Hive'
+    source_platform = 'Hive'
+    target_platform = 'Impala'
     query = 'Select * from (Select item.id from item)'
     query = 'Select * from (Select item.id from item)'
 
 
     resp = self.api.query_compatibility(source_platform=source_platform, target_platform=target_platform, query=query)
     resp = self.api.query_compatibility(source_platform=source_platform, target_platform=target_platform, query=query)

+ 20 - 0
desktop/libs/notebook/src/notebook/api.py

@@ -714,3 +714,23 @@ def statement_risk(request):
   response['status'] = 0
   response['status'] = 0
 
 
   return JsonResponse(response)
   return JsonResponse(response)
+
+
+@require_POST
+@check_document_access_permission()
+@api_error_handler
+def statement_compatibility(request):
+  response = {'status': -1, 'message': _('Compatibility analysis failed.')}
+
+  notebook = json.loads(request.POST.get('notebook', '{}'))
+  snippet = json.loads(request.POST.get('snippet', '{}'))
+  source_platform = request.POST.get('sourcePlatform')
+  target_platform = request.POST.get('targetPlatform')
+
+  api = get_api(request, snippet)
+
+  response['data'] = api.statement_compatibility(notebook, snippet, source_platform=source_platform, target_platform=target_platform)
+  response['status'] = 0
+
+  return JsonResponse(response)
+

+ 3 - 1
desktop/libs/notebook/src/notebook/connectors/base.py

@@ -279,4 +279,6 @@ class Api(object):
 
 
   def export_large_data_to_hdfs(self, notebook, snippet, destination): raise NotImplementedError()
   def export_large_data_to_hdfs(self, notebook, snippet, destination): raise NotImplementedError()
 
 
-  def query_risk(self, notebook, snippet): raise NotImplementedError()
+  def statement_risk(self, notebook, snippet): raise NotImplementedError()
+
+  def statement_compatibility(self, notebook, snippet, source_platform, target_platform): raise NotImplementedError()

+ 14 - 2
desktop/libs/notebook/src/notebook/connectors/hiveserver2.py

@@ -483,18 +483,30 @@ class HS2Api(Api):
     return hql, success_url
     return hql, success_url
 
 
 
 
-  def query_risk(self, notebook, snippet):
+  def statement_risk(self, notebook, snippet):
     db = self._get_db(snippet)
     db = self._get_db(snippet)
 
 
     response = self._get_current_statement(db, snippet)
     response = self._get_current_statement(db, snippet)
     session = self._get_session(notebook, snippet['type'])
     session = self._get_session(notebook, snippet['type'])
     query = self._prepare_hql_query(snippet, response.pop('statement'), session)
     query = self._prepare_hql_query(snippet, response.pop('statement'), session)
-    
+
     api = OptimizerApi()
     api = OptimizerApi()
 
 
     return api.query_risk(query=query)
     return api.query_risk(query=query)
 
 
 
 
+  def statement_compatibility(self, notebook, snippet, source_platform, target_platform):
+    db = self._get_db(snippet)
+
+    response = self._get_current_statement(db, snippet)
+    session = self._get_session(notebook, snippet['type'])
+    query = self._prepare_hql_query(snippet, response.pop('statement'), session)
+
+    api = OptimizerApi()
+
+    return api.query_compatibility(source_platform, target_platform, query)
+
+
   def upgrade_properties(self, lang='hive', properties=None):
   def upgrade_properties(self, lang='hive', properties=None):
     upgraded_properties = copy.deepcopy(self.get_properties(lang))
     upgraded_properties = copy.deepcopy(self.get_properties(lang))
 
 

+ 4 - 2
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -1001,8 +1001,9 @@ var EditorViewModel = (function() {
       logGA('compatibility');
       logGA('compatibility');
       self.suggestion(false);
       self.suggestion(false);
 
 
-      $.post("/metadata/api/optimizer_api/query_compatibility", {
-        query: self.statement(),
+      $.post("/metadata/api/optimizer/compatibility", {
+        notebook: ko.mapping.toJSON(notebook.getContext()),
+        snippet: ko.mapping.toJSON(self.getContext()),
         sourcePlatform: self.type(),
         sourcePlatform: self.type(),
         targetPlatform: 'impala'
         targetPlatform: 'impala'
       }, function(data) {
       }, function(data) {
@@ -1307,6 +1308,7 @@ var EditorViewModel = (function() {
       self.complexity('');
       self.complexity('');
 
 
       $.post("/notebook/api/optimizer/query_risk", {
       $.post("/notebook/api/optimizer/query_risk", {
+        notebook: ko.mapping.toJSON(notebook.getContext()),
         snippet: ko.mapping.toJSON(self.getContext())
         snippet: ko.mapping.toJSON(self.getContext())
       }, function(data) {
       }, function(data) {
         if (data.status == 0) {
         if (data.status == 0) {

+ 1 - 0
desktop/libs/notebook/src/notebook/urls.py

@@ -73,6 +73,7 @@ urlpatterns += patterns('notebook.api',
   url(r'^api/notebook/export_result/?$', 'export_result', name='export_result'),
   url(r'^api/notebook/export_result/?$', 'export_result', name='export_result'),
 
 
   url(r'^api/optimizer/risk/?$', 'statement_risk', name='statement_risk'),
   url(r'^api/optimizer/risk/?$', 'statement_risk', name='statement_risk'),
+  url(r'^api/optimizer/compatibility/?$', 'statement_compatibility', name='statement_compatibility'),
 )
 )
 
 
 # Assist API
 # Assist API