Bläddra i källkod

[notebook] Core of the autocomplete API

For Hiveserver2 interface only currently.
Not plugged in the UI yet
Romain Rigaux 10 år sedan
förälder
incheckning
ce43d37

+ 7 - 1
apps/beeswax/src/beeswax/api.py

@@ -89,6 +89,12 @@ def autocomplete(request, database=None, table=None, column=None, nested=None):
   if (request.user.is_superuser or request.user.has_hue_permission(action="impersonate", app="security")) and 'doas' in request.GET:
     do_as = User.objects.get(username=request.GET.get('doas'))
   db = dbms.get(do_as, query_server)
+
+  response = _autocomplete(db, database, table, column, nested)
+  return JsonResponse(response)
+
+
+def _autocomplete(db, database=None, table=None, column=None, nested=None):
   response = {}
 
   try:
@@ -118,7 +124,7 @@ def autocomplete(request, database=None, table=None, column=None, nested=None):
     response['code'] = 500
     response['error'] = e.message
 
-  return JsonResponse(response)
+  return response
 
 
 @error_handler

+ 4 - 0
apps/beeswax/src/beeswax/urls.py

@@ -58,6 +58,8 @@ urlpatterns += patterns(
   'beeswax.api',
 
   url(r'^api/session/$', 'get_session', name='api_get_session'),
+
+  # Deprecated by Notebook API
   url(r'^api/autocomplete/$', 'autocomplete', name='api_autocomplete_databases'),
   url(r'^api/autocomplete/(?P<database>\w+)$', 'autocomplete', name='api_autocomplete_tables'),
   url(r'^api/autocomplete/(?P<database>\w+)/$', 'autocomplete', name='api_autocomplete_tables'),
@@ -66,8 +68,10 @@ urlpatterns += patterns(
   url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)/(?P<column>\w+)$', 'autocomplete', name='api_autocomplete_column'),
   url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)/(?P<column>\w+)/$', 'autocomplete', name='api_autocomplete_column'),
   url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)/(?P<column>\w+)/(?P<nested>.+)$', 'autocomplete', name='api_autocomplete_nested'),
+
   url(r'^api/design/(?P<design_id>\d+)?$', 'save_query_design', name='api_save_design'),
   url(r'^api/design/(?P<design_id>\d+)/get$', 'fetch_saved_design', name='api_fetch_saved_design'),
+
   url(r'^api/query/(?P<query_history_id>\d+)/get$', 'fetch_query_history', name='api_fetch_query_history'),
   url(r'^api/query/parameters$', 'parameters', name='api_parameters'),
   url(r'^api/query/execute/(?P<design_id>\d+)?$', 'execute', name='api_execute'),

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

@@ -267,3 +267,23 @@ def close_statement(request):
   response['message'] = _('Statement closed !')
 
   return JsonResponse(response)
+
+
+@require_POST
+@check_document_access_permission()
+def autocomplete(request, database=None, table=None, column=None, nested=None):
+  response = {'status': -1}
+
+  # Passed by check_document_access_permission but unused by APIs
+  notebook = json.loads(request.POST.get('notebook', '{}'))
+  snippet = json.loads(request.POST.get('snippet', '{}'))
+
+  try:
+    autocomplete_data = get_api(request.user, snippet, request.fs, request.jt).autocomplete(snippet, database, table, column, nested)
+    response.update(autocomplete_data)
+  except QueryExpired:
+    pass
+
+  response['status'] = 0
+
+  return JsonResponse(response)

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

@@ -145,7 +145,7 @@ class Api(object):
     return 'No logs'
 
   def autocomplete(self, database=None, table=None, column=None, nested=None):
-    pass
+    return {}
 
   def progress(self, snippet, logs=None):
     return 50

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

@@ -22,6 +22,7 @@ from desktop.lib.exceptions_renderable import PopupException
 from desktop.lib.i18n import force_unicode
 
 from beeswax import data_export
+from beeswax.api import _autocomplete
 from beeswax.design import hql_query
 from beeswax import conf as beeswax_conf
 from beeswax.models import QUERY_TYPES, HiveServerQueryHandle, QueryHistory, HiveServerQueryHistory
@@ -183,3 +184,7 @@ class HS2Api(Api):
 
   def get_jobs(self, log):
     return _parse_out_hadoop_jobs(log)
+
+  def autocomplete(self, snippet, database=None, table=None, column=None, nested=None):
+    db = self._get_db(snippet)
+    return _autocomplete(db, database, table, column, nested)

+ 29 - 0
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -592,6 +592,35 @@ var Snippet = function (vm, notebook, snippet) {
     });
   };
 
+  self.autocomplete = function (database, table, column, nested) {
+    var path = "";
+    if (database) {
+      path += database + "/";
+    }
+    if (table) {
+      path += table + "/";
+    }
+    if (column) {
+      path += column + "/";
+    }
+    if (nested) {
+      path += nested + "/";
+    }
+
+    $.post("/notebook/api/autocomplete/" + path, {
+      notebook: ko.mapping.toJSON(notebook.getContext()),
+      snippet: ko.mapping.toJSON(self.getContext()),
+    }, function (data) {
+      if (data.status == 0) {
+        console.log(data)
+      } else {
+        self._ajaxError(data);
+      }
+    }).fail(function (xhr, textStatus, errorThrown) {
+      $(document).trigger("error", xhr.responseText);
+    });
+  };
+
   self.init = function () {
     if (self.status() == 'running') {
       self.checkStatus();

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

@@ -48,3 +48,15 @@ urlpatterns += patterns('notebook.api',
   url(r'^api/notebook/open$', 'open_notebook', name='open_notebook'),
   url(r'^api/notebook/close$', 'close_notebook', name='close_notebook'),
 )
+
+# Assist API
+urlpatterns += patterns('notebook.api',
+  url(r'^api/autocomplete/$', 'autocomplete', name='api_autocomplete_databases'),
+  url(r'^api/autocomplete/(?P<database>\w+)$', 'autocomplete', name='api_autocomplete_tables'),
+  url(r'^api/autocomplete/(?P<database>\w+)/$', 'autocomplete', name='api_autocomplete_tables'),
+  url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)$', 'autocomplete', name='api_autocomplete_columns'),
+  url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)/$', 'autocomplete', name='api_autocomplete_columns'),
+  url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)/(?P<column>\w+)$', 'autocomplete', name='api_autocomplete_column'),
+  url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)/(?P<column>\w+)/$', 'autocomplete', name='api_autocomplete_column'),
+  url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)/(?P<column>\w+)/(?P<nested>.+)$', 'autocomplete', name='api_autocomplete_nested'),
+)