Selaa lähdekoodia

[api] First pass on porting metadata API

Romain Rigaux 4 vuotta sitten
vanhempi
commit
4e65757971

+ 64 - 7
desktop/core/src/desktop/api_public.py

@@ -22,6 +22,7 @@ from rest_framework.decorators import api_view
 
 from filebrowser import views as filebrowser_views
 from indexer import api3 as indexer_api3
+from metadata import optimizer_api
 from notebook import api as notebook_api
 from notebook.conf import get_ordered_interpreters
 
@@ -36,6 +37,8 @@ from beeswax import api as beeswax_api
 LOG = logging.getLogger(__name__)
 
 
+# Core
+
 @api_view(["POST"])
 def get_config(request):
   django_request = get_django_request(request)
@@ -47,6 +50,8 @@ def get_context_namespaces(request, interface):
   return desktop_api.get_context_namespaces(django_request, interface)
 
 
+# Editor
+
 @api_view(["POST"])
 def create_notebook(request):
   django_request = get_django_request(request)
@@ -73,7 +78,8 @@ def execute(request, dialect=None):
     params = {
       'statement': django_request.POST.get('statement'),
       'interpreter': '%(type)s' % interpreter,
-      'interpreter_id': ('%(type)s' if interpreter['type'].isdigit() else '"%(type)s"') % interpreter,  # If connectors off, we expect a string
+      # If connectors off, we expect a string
+      'interpreter_id': ('%(type)s' if interpreter['type'].isdigit() else '"%(type)s"') % interpreter,
       'dialect': '%(dialect)s' % interpreter
     }
 
@@ -133,7 +139,6 @@ def get_logs(request):
 
   return notebook_api.get_logs(django_request)
 
-
 @api_view(["POST"])
 def get_sample_data(request, server=None, database=None, table=None, column=None):
   django_request = get_django_request(request)
@@ -142,7 +147,6 @@ def get_sample_data(request, server=None, database=None, table=None, column=None
 
   return notebook_api.get_sample_data(django_request, server, database, table, column)
 
-
 @api_view(["POST"])
 def autocomplete(request, server=None, database=None, table=None, column=None, nested=None):
   django_request = get_django_request(request)
@@ -151,7 +155,6 @@ def autocomplete(request, server=None, database=None, table=None, column=None, n
 
   return notebook_api.autocomplete(django_request, server, database, table, column, nested)
 
-
 @api_view(["POST"])
 def describe(request, database, table=None, column=None):
   django_request = get_django_request(request)
@@ -172,7 +175,7 @@ def analyze_table(request, dialect, database, table, columns=None):
     return HttpResponse(status=204)
 
 
-# Storage API
+# Storage
 
 @api_view(["GET"])
 def storage_view(request, path):
@@ -189,7 +192,7 @@ def storage_upload_file(request):
   django_request = get_django_request(request)
   return filebrowser_views.upload_file(django_request)
 
-# Importer API
+# Importer
 
 @api_view(["POST"])
 def guess_format(request):
@@ -206,7 +209,7 @@ def importer_submit(request):
   django_request = get_django_request(request)
   return indexer_api3.importer_submit(django_request)
 
-# Connector API
+# Connector
 
 @api_view(["GET"])
 def get_connector_types(request):
@@ -249,6 +252,60 @@ def install_connector_examples(request):
   return connector_api.install_connector_examples(django_request)
 
 
+# Metadata
+
+@api_view(["POST"])
+def predict(request):
+  django_request = get_django_request(request)
+  return optimizer_api.predict(django_request)
+
+@api_view(["POST"])
+def query_risk(request):
+  django_request = get_django_request(request)
+  return optimizer_api.query_risk(django_request)
+
+@api_view(["POST"])
+def query_compatibility(request):
+  django_request = get_django_request(request)
+  return optimizer_api.query_compatibility(django_request)
+
+@api_view(["POST"])
+def similar_queries(request):
+  django_request = get_django_request(request)
+  return optimizer_api.similar_queries(django_request)
+
+
+@api_view(["POST"])
+def top_databases(request):
+  django_request = get_django_request(request)
+  return optimizer_api.top_databases(django_request)
+
+@api_view(["POST"])
+def top_tables(request):
+  django_request = get_django_request(request)
+  return optimizer_api.top_tables(django_request)
+
+@api_view(["POST"])
+def top_columns(request):
+  django_request = get_django_request(request)
+  return optimizer_api.top_columns(django_request)
+
+@api_view(["POST"])
+def top_joins(request):
+  django_request = get_django_request(request)
+  return optimizer_api.top_joins(django_request)
+
+@api_view(["POST"])
+def top_filters(request):
+  django_request = get_django_request(request)
+  return optimizer_api.top_filters(django_request)
+
+@api_view(["POST"])
+def top_aggs(request):
+  django_request = get_django_request(request)
+  return optimizer_api.top_aggs(django_request)
+
+
 # Utils
 
 def _get_interpreter_from_dialect(dialect, user):

+ 25 - 3
desktop/core/src/desktop/api_public_urls.py

@@ -54,7 +54,11 @@ urlpatterns += [
 
   re_path(r'^editor/describe/(?P<database>[^/]*)/?$', api_public.describe, name='editor_describe_database'),
   re_path(r'^editor/describe/(?P<database>[^/]*)/(?P<table>[\w_\-]+)/?$', api_public.describe, name='editor_describe_table'),
-  re_path(r'^editor/describe/(?P<database>[^/]*)/(?P<table>\w+)/stats(?:/(?P<column>\w+))?/?$', api_public.describe, name='editor_describe_column'),
+  re_path(
+    r'^editor/describe/(?P<database>[^/]*)/(?P<table>\w+)/stats(?:/(?P<column>\w+))?/?$',
+    api_public.describe,
+    name='editor_describe_column'
+  ),
 
   re_path(r'^editor/autocomplete/?$', api_public.autocomplete, name='editor_autocomplete_databases'),
   re_path(
@@ -93,7 +97,11 @@ urlpatterns += [
 ]
 
 urlpatterns += [
-  re_path(r'^(?P<dialect>.+)/analyze/(?P<database>\w+)/(?P<table>\w+)(?:/(?P<columns>\w+))?/?$', api_public.analyze_table, name='dialect_analyze_table'),
+  re_path(
+    r'^(?P<dialect>.+)/analyze/(?P<database>\w+)/(?P<table>\w+)(?:/(?P<columns>\w+))?/?$',
+    api_public.analyze_table,
+    name='dialect_analyze_table'
+  ),
 ]
 
 # Slack install API for using CORS by default
@@ -118,4 +126,18 @@ urlpatterns += [
   re_path(r'^connector/instance/test/?$', api_public.test_connector, name='connector_test'),
 
   re_path(r'^connector/examples/install/?$', api_public.install_connector_examples, name='connector_install_examples'),
-]
+]
+
+urlpatterns += [
+  re_path(r'^api/optimizer/top_databases/?$', api_public.top_databases, name='top_databases'),
+  re_path(r'^api/optimizer/top_tables/?$', api_public.top_tables, name='top_tables'),
+  re_path(r'^api/optimizer/top_columns/?$', api_public.top_columns, name='top_columns'),
+  re_path(r'^api/optimizer/top_joins/?$', api_public.top_joins, name='top_joins'),
+  re_path(r'^api/optimizer/top_filters/?$', api_public.top_filters, name='top_filters'),
+  re_path(r'^api/optimizer/top_aggs/?$', api_public.top_aggs, name='top_aggs'),
+
+  re_path(r'^api/optimizer/query_risk/?$', api_public.query_risk, name='query_risk'),
+  re_path(r'^api/optimizer/predict/?$', api_public.predict, name='predict'),
+  re_path(r'^api/optimizer/query_compatibility/?$', api_public.query_compatibility, name='query_compatibility'),
+  re_path(r'^api/optimizer/similar_queries/?$', api_public.similar_queries, name='similar_queries'),
+]