Эх сурвалжийг харах

HUE-7877 [dashboard] Add Explore from SQL step 2

Romain Rigaux 7 жил өмнө
parent
commit
74d800e9a8

+ 1 - 2
apps/beeswax/src/beeswax/dashboard_api.py

@@ -24,8 +24,7 @@ LOG = logging.getLogger(__name__)
 
 
 class HiveDashboardApi(SQLDashboardApi):
-  pass
 
   @classmethod
   def _supports_median(self):
-    return False
+    return False

+ 0 - 1
apps/impala/src/impala/dashboard_api.py

@@ -24,7 +24,6 @@ LOG = logging.getLogger(__name__)
 
 
 class ImpalaDashboardApi(SQLDashboardApi):
-  pass
 
   @classmethod
   def _supports_median(self):

+ 5 - 4
desktop/libs/dashboard/src/dashboard/dashboard_api.py

@@ -21,7 +21,7 @@ import logging
 LOG = logging.getLogger(__name__)
 
 
-def get_engine(user, engine='solr', facet=None):
+def get_engine(user, engine='solr', facet=None, source='data'):
   if isinstance(engine, dict):
     engine = engine.get('engine', 'solr')
 
@@ -31,15 +31,16 @@ def get_engine(user, engine='solr', facet=None):
   if engine != 'solr':
     if engine == 'impala':
       from impala.dashboard_api import ImpalaDashboardApi
-      return ImpalaDashboardApi(user, engine)
+      return ImpalaDashboardApi(user, engine, source=source)
     elif engine == 'hive':
       from beeswax.dashboard_api import HiveDashboardApi
-      return HiveDashboardApi(user, engine)
+      return HiveDashboardApi(user, engine, source=source)
     else:
       from notebook.dashboard_api import SQLDashboardApi
-      return SQLDashboardApi(user, engine)
+      return SQLDashboardApi(user, engine, source=source)
   else:
     from search.dashboard_api import SearchApi
+    # Could add source to Solr at some point, to behave like a 'view', but need state in query history or URL params
     return SearchApi(user)
 
 

+ 8 - 5
desktop/libs/dashboard/src/dashboard/models.py

@@ -52,7 +52,7 @@ QUERY_FACET = {'is_enabled': False, 'query': ''}
 
 class Collection2(object):
 
-  def __init__(self, user, name='Default', data=None, document=None, engine='solr'):
+  def __init__(self, user, name='Default', data=None, document=None, engine='solr', source='data'):
     self.document = document
 
     if document is not None:
@@ -61,7 +61,7 @@ class Collection2(object):
       self.data = json.loads(data)
     else:
       self.data = {
-          'collection': self.get_default(user, name, engine),
+          'collection': self.get_default(user, name, engine, source=source),
           'layout': []
       }
 
@@ -103,6 +103,8 @@ class Collection2(object):
       props['collection']['enabled'] = True
     if 'engine' not in props['collection']:
       props['collection']['engine'] = 'solr'
+    if 'source' not in props['collection']:
+      props['collection']['source'] = 'data'
     if 'leafletmap' not in props['collection']['template']:
       props['collection']['template']['leafletmap'] = {'latitudeField': None, 'longitudeField': None, 'labelField': None}
     if 'moreLikeThis' not in props['collection']['template']:
@@ -168,7 +170,7 @@ class Collection2(object):
 
     return props
 
-  def get_default(self, user, name, engine='solr'):
+  def get_default(self, user, name, engine='solr', source='data'):
     fields = self.fields_data(user, name, engine)
     id_field = [field['name'] for field in fields if field.get('isId')]
 
@@ -216,6 +218,7 @@ class Collection2(object):
       'id': None,
       'name': name,
       'engine': engine,
+      'source': source,
       'label': name,
       'enabled': False,
       'template': TEMPLATE,
@@ -256,8 +259,8 @@ class Collection2(object):
   def fields(self, user):
     return sorted([str(field.get('name', '')) for field in self.fields_data(user)])
 
-  def fields_data(self, user, name, engine='solr'):
-    api = get_engine(user, engine)
+  def fields_data(self, user, name, engine='solr', source='data'):
+    api = get_engine(user, engine, source=source)
     try:
       schema_fields = api.fields(name)
       schema_fields = schema_fields['schema']['fields']

+ 5 - 2
desktop/libs/dashboard/src/dashboard/views.py

@@ -156,11 +156,14 @@ def new_search(request):
 
 def browse(request, name, is_mobile=False):
   engine = request.GET.get('engine', 'solr')
-  collections = get_engine(request.user, engine).datasets()
+  source = request.GET.get('source', 'data')
+  # get engine
+  # get name
+  collections = get_engine(request.user, engine, source=source).datasets()
   if not collections and engine == 'solr':
     return no_collections(request)
 
-  collection = Collection2(user=request.user, name=name, engine=engine)
+  collection = Collection2(user=request.user, name=name, engine=engine, source=source)
   query = {'qs': [{'q': ''}], 'fqs': [], 'start': 0}
 
   template = 'search.mako'

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

@@ -703,8 +703,15 @@ def export_result(request):
       'allowed': True
     }
   elif data_format == 'search-index':
+    ## Get query history id
+
     if is_embedded:
       if destination == '__hue__':
+        notebook_id = notebook['id'] or request.GET.get('editor', request.GET.get('notebook'))
+        response['watch_url'] = reverse('search:browse', kwargs={'name': notebook_id, 'source': 'query'})
+        response['status'] = 0        
+        return JsonResponse(response)
+
         destination = _get_snippet_name(notebook, unique=True, table_format=True)
         live_indexing = True
       else:
@@ -739,6 +746,7 @@ def export_result(request):
       notebook_id = notebook['id'] or request.GET.get('editor', request.GET.get('notebook'))
       response['watch_url'] = reverse('notebook:execute_and_watch') + '?action=index_query&notebook=' + str(notebook_id) + '&snippet=0&destination=' + destination
       response['status'] = 0
+
     request.audit = {
       'operation': 'EXPORT',
       'operationText': 'User %s exported to Search index: %s' % (request.user.username, destination),

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

@@ -211,16 +211,7 @@ class Notebook(object):
 
 
 def get_api(request, snippet):
-  from notebook.connectors.dataeng import DataEngApi
-  from notebook.connectors.hbase import HBaseApi
-  from notebook.connectors.hiveserver2 import HS2Api
-  from notebook.connectors.jdbc import JdbcApi
-  from notebook.connectors.rdbms import RdbmsApi
   from notebook.connectors.oozie_batch import OozieApi
-  from notebook.connectors.solr import SolrApi
-  from notebook.connectors.spark_shell import SparkApi
-  from notebook.connectors.spark_batch import SparkBatchApi
-  from notebook.connectors.text import TextApi
 
   if snippet.get('wasBatchExecuted'):
     return OozieApi(user=request.user, request=request)
@@ -254,24 +245,33 @@ def get_api(request, snippet):
     interface = 'dataeng'
 
   if interface == 'hiveserver2':
+    from notebook.connectors.hiveserver2 import HS2Api
     return HS2Api(user=request.user, request=request)
   elif interface == 'oozie':
     return OozieApi(user=request.user, request=request)
   elif interface == 'livy':
+    from notebook.connectors.spark_shell import SparkApi
     return SparkApi(request.user)
   elif interface == 'livy-batch':
+    from notebook.connectors.spark_batch import SparkBatchApi
     return SparkBatchApi(request.user)
   elif interface == 'text' or interface == 'markdown':
+    from notebook.connectors.text import TextApi
     return TextApi(request.user)
   elif interface == 'rdbms':
+    from notebook.connectors.rdbms import RdbmsApi
     return RdbmsApi(request.user, interpreter=snippet['type'])
   elif interface == 'dataeng':
+    from notebook.connectors.dataeng import DataEngApi
     return DataEngApi(user=request.user, request=request, cluster_name=cluster.get_interface())
   elif interface == 'jdbc' or interface == 'teradata':
+    from notebook.connectors.jdbc import JdbcApi
     return JdbcApi(request.user, interpreter=interpreter)
   elif interface == 'solr':
+    from notebook.connectors.solr import SolrApi
     return SolrApi(request.user, interpreter=interpreter)
   elif interface == 'hbase':
+    from notebook.connectors.hbase import HBaseApi
     return HBaseApi(request.user)
   elif interface == 'pig':
     return OozieApi(user=request.user, request=request) # Backward compatibility until Hue 4

+ 9 - 4
desktop/libs/notebook/src/notebook/dashboard_api.py

@@ -45,9 +45,10 @@ class MockRequest():
 
 class SQLDashboardApi(DashboardApi):
 
-  def __init__(self, user, engine):
-    self.user = user
+  def __init__(self, user, engine, source='data'):
+    super(SQLDashboardApi, self).__init__(user)
     self.engine = engine
+    self.source = source
     self.async = engine == 'hive' or engine == 'impala'
 
   def query(self, dashboard, query, facet=None):
@@ -203,6 +204,7 @@ class SQLDashboardApi(DashboardApi):
     return self._convert_result(result, dashboard, facet, query)
 
 
+  # This method currently behaves more like a static method
   def datasets(self, show_all=False):
     snippet = {'type': self.engine}
     # Ideally from left assist at some point instead
@@ -211,8 +213,11 @@ class SQLDashboardApi(DashboardApi):
     return [table['name'] for table in get_api(MockRequest(self.user), snippet).autocomplete(snippet, database=database)['tables_meta']]
 
 
-  def fields(self, dashboard):
-    database, table = self._get_database_table_names(dashboard)
+  # This method currently behaves more like a static method
+  def fields(self, name):
+    # self.source
+    # get query if source == 'query' + default DB
+    database, table = self._get_database_table_names(name)
     snippet = {'type': self.engine}
 
     table_metadata = get_api(MockRequest(self.user), snippet).autocomplete(snippet, database, table)