Browse Source

HUE-3450 [metadata] Add API to get query compatibility

$.post('/metadata/api/optimizer_api/query_compatibility', {sourcePlatform: 'MySQL', target_platform: 'Hive', query: 'Select * from (Select item.id from item)'})
Romain Rigaux 9 years ago
parent
commit
df2fd42

+ 17 - 0
desktop/libs/metadata/src/metadata/optimizer_api.py

@@ -76,6 +76,23 @@ def table_details(request):
   return JsonResponse(response)
 
 
+@require_POST
+@error_handler
+def query_compatibility(request):
+  response = {'status': -1}
+
+  source_platform = request.POST.get('sourcePlatform')
+  target_platform = request.POST.get('target_platform')
+  query = request.POST.get('query')
+
+  api = OptimizerApi()
+
+  response['table_details'] = api.query_compatibility(source_platform=source_platform, target_platform=target_platform, query=query)
+  response['status'] = 0
+
+  return JsonResponse(response)
+
+
 @require_POST
 @error_handler
 def upload_history(request):

+ 17 - 0
desktop/libs/metadata/src/metadata/optimizer_client.py

@@ -174,6 +174,23 @@ class OptimizerApi(object):
       raise PopupException(e, title=_('Error while accessing Optimizer'))
 
 
+  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 OptimizerDataAdapter(queries):
   headers = ['SQL_ID', 'ELAPSED_TIME', 'SQL_FULLTEXT']
   if queries and len(queries[0]) == 3:

+ 14 - 0
desktop/libs/metadata/src/metadata/optimizer_tests.py

@@ -131,3 +131,17 @@ class TestOptimizerApi(object):
     resp = self.api.table_details(table_name='orders', token=token)
 
     assert_equal('success', resp['status'], resp)
+
+
+  def test_query_compatibility(self):
+    source_platform = 'MySQL'
+    target_platform = 'Hive'
+    query = 'Select * from (Select item.id from item)'
+
+    resp = self.api.query_compatibility(source_platform=source_platform, target_platform=target_platform, query=query)
+
+    assert_equal('success', resp['status'], resp)
+
+    details = json.loads(resp['details']) # Auto fix suggestion is empty in most of the cases currently
+
+    assert_equal('FAIL', details['platformCompilationStatus']['Hive']['queryStatus'], resp)

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

@@ -32,5 +32,6 @@ urlpatterns = patterns('metadata.navigator_api',
 urlpatterns = patterns('metadata.optimizer_api',
   url(r'^api/optimizer_api/top_tables/?$', 'top_tables', name='top_tables'),
   url(r'^api/optimizer_api/table_details/?$', 'table_details', name='table_details'),
+  url(r'^api/optimizer_api/query_compatibility/?$', 'query_compatibility', name='query_compatibility'),
   url(r'^api/optimizer_api/upload_history/?$', 'upload_history', name='upload_history'),
 )