浏览代码

HUE-8740 [sqlalchemy] Set None Database names to empty string

Possible when querying via Apache Phoenix
Romain 6 年之前
父节点
当前提交
5dd28c6c43

+ 8 - 3
desktop/libs/notebook/src/notebook/connectors/sql_alchemy.py

@@ -234,17 +234,18 @@ class SqlAlchemyApi(Api):
     response = {'status': -1}
 
     if database is None:
-      response['databases'] = assist.get_databases()
+      response['databases'] = [db or 'NULL' for db in assist.get_databases()]
     elif table is None:
       tables_meta = []
+      database = self._fix_phoenix_empty_database(database)
       for t in assist.get_tables(database):
         tables_meta.append({'name': t, 'type': 'Table', 'comment': ''})
       response['tables_meta'] = tables_meta
     elif column is None:
+      database = self._fix_phoenix_empty_database(database)
       columns = assist.get_columns(database, table)
       response['columns'] = [col['name'] for col in columns]
-      response['extended_columns'] = [
-        {
+      response['extended_columns'] = [{
           'autoincrement': col.get('autoincrement'),
           'comment': col.get('comment'),
           'default': col.get('default'),
@@ -298,6 +299,10 @@ class SqlAlchemyApi(Api):
     return "SELECT * FROM `%s`.`%s` LIMIT 1000" % (database, table)
 
 
+  def _fix_phoenix_empty_database(self, database):
+    return None if self.options['url'].startswith('phoenix://') and database == 'NULL' else database
+
+
 class Assist():
 
   def __init__(self, db, engine):

+ 25 - 0
desktop/libs/notebook/src/notebook/connectors/sql_alchemy_tests.py

@@ -106,3 +106,28 @@ class TestApi():
 
       assert_equal(data['data'], [['row1'], ['row2']])
       assert_equal(data['meta'](), [{'type': 'BIGINT_TYPE'}])
+
+
+class TestAutocomplete():
+
+  def setUp(self):
+    self.client = make_logged_in_client(username="test", groupname="default", recreate=True, is_superuser=False)
+
+    self.user = rewrite_user(User.objects.get(username="test"))
+    grant_access("test", "default", "notebook")
+
+
+  def test_empty_database_names(self):
+    interpreter = {
+      'options': {'url': 'phoenix://'}
+    }
+
+    snippet = Mock()
+    with patch('notebook.connectors.sql_alchemy.create_engine') as create_engine:
+      with patch('notebook.connectors.sql_alchemy.inspect') as inspect:
+        with patch('notebook.connectors.sql_alchemy.Assist') as Assist:
+          Assist.return_value=Mock(get_databases=Mock(return_value=['SYSTEM', None]))
+
+          data = SqlAlchemyApi(self.user, interpreter).autocomplete(snippet)
+
+          assert_equal(data['databases'], ['SYSTEM', 'NULL'])

+ 2 - 2
desktop/libs/notebook/src/notebook/urls.py

@@ -60,7 +60,7 @@ urlpatterns += [
   url(r'^api/cancel_statement/?$', notebook_api.cancel_statement, name='cancel_statement'),
   url(r'^api/close_statement/?$', notebook_api.close_statement, name='close_statement'),
   url(r'^api/get_logs/?$', notebook_api.get_logs, name='get_logs'),
-  
+
   url(r'^api/explain/?$', notebook_api.explain, name='explain'),
   url(r'^api/format/?$', notebook_api.format, name='format'),
   url(r'^api/get_external_statement/?$', notebook_api.get_external_statement, name='get_external_statement'),
@@ -103,4 +103,4 @@ urlpatterns += [
   url(r'^api/describe/(?P<database>\w+)/?$', notebook_api.describe, name='api_describe_database'),
   url(r'^api/describe/(?P<database>\w+)/(?P<table>[\w_\-]+)/?$', notebook_api.describe, name='api_describe_table'),
   url(r'^api/describe/(?P<database>\w+)/(?P<table>\w+)/stats(?:/(?P<column>\w+))?/?$', notebook_api.describe, name='api_describe_column'),
-]
+]