Ver código fonte

HUE-8758 [connector] Switch to using connector id in the UI where applicable

Johan Ahlen 5 anos atrás
pai
commit
65f4b01c49
58 arquivos alterados com 231 adições e 222 exclusões
  1. 1 1
      apps/about/src/about/templates/admin_wizard.mako
  2. 2 2
      apps/beeswax/src/beeswax/static/beeswax/js/beeswax.vm.js
  3. 2 2
      apps/beeswax/src/beeswax/templates/create_database.mako
  4. 2 2
      apps/beeswax/src/beeswax/templates/create_table_manually.mako
  5. 2 2
      apps/beeswax/src/beeswax/templates/execute.mako
  6. 2 2
      apps/beeswax/src/beeswax/templates/import_wizard_choose_delimiter.mako
  7. 2 2
      apps/beeswax/src/beeswax/templates/import_wizard_choose_file.mako
  8. 2 2
      apps/beeswax/src/beeswax/templates/import_wizard_define_columns.mako
  9. 3 3
      apps/jobbrowser/src/jobbrowser/templates/job_browser.mako
  10. 8 8
      apps/metastore/src/metastore/templates/metastore.mako
  11. 2 2
      apps/oozie/src/oozie/static/oozie/js/workflow-editor.ko.js
  12. 2 2
      apps/pig/src/pig/templates/app.mako
  13. 3 3
      desktop/core/src/desktop/js/api/apiHelper.js
  14. 7 7
      desktop/core/src/desktop/js/apps/notebook/editorViewModel.js
  15. 6 5
      desktop/core/src/desktop/js/apps/notebook/snippet.js
  16. 8 8
      desktop/core/src/desktop/js/apps/notebook2/editorViewModel.js
  17. 3 3
      desktop/core/src/desktop/js/apps/notebook2/execution/executable.js
  18. 1 1
      desktop/core/src/desktop/js/apps/notebook2/execution/executor.test.js
  19. 4 4
      desktop/core/src/desktop/js/apps/notebook2/notebook.test.js
  20. 5 6
      desktop/core/src/desktop/js/apps/notebook2/snippet.js
  21. 2 2
      desktop/core/src/desktop/js/apps/notebook2/snippet.test.js
  22. 4 1
      desktop/core/src/desktop/js/apps/table_browser/app.js
  23. 5 1
      desktop/core/src/desktop/js/apps/table_browser/metastoreNamespace.js
  24. 4 4
      desktop/core/src/desktop/js/apps/table_browser/metastoreSource.js
  25. 1 1
      desktop/core/src/desktop/js/apps/table_browser/metastoreTable.js
  26. 5 5
      desktop/core/src/desktop/js/apps/table_browser/metastoreViewModel.js
  27. 1 1
      desktop/core/src/desktop/js/catalog/catalogUtils.js
  28. 53 57
      desktop/core/src/desktop/js/catalog/contextCatalog.js
  29. 8 8
      desktop/core/src/desktop/js/catalog/dataCatalog.js
  30. 4 4
      desktop/core/src/desktop/js/catalog/dataCatalogEntry.js
  31. 1 1
      desktop/core/src/desktop/js/catalog/multiTableEntry.js
  32. 5 5
      desktop/core/src/desktop/js/jquery/plugins/jquery.hiveautocomplete.js
  33. 5 1
      desktop/core/src/desktop/js/ko/bindings/ko.sqlContextPopover.js
  34. 2 2
      desktop/core/src/desktop/js/ko/components/assist/assistDbEntry.js
  35. 3 3
      desktop/core/src/desktop/js/ko/components/assist/assistDbNamespace.js
  36. 2 2
      desktop/core/src/desktop/js/ko/components/assist/assistDbSource.js
  37. 1 0
      desktop/core/src/desktop/js/ko/components/assist/assistStorageEntry.js
  38. 2 2
      desktop/core/src/desktop/js/ko/components/assist/ko.assistDashboardPanel.js
  39. 8 8
      desktop/core/src/desktop/js/ko/components/assist/ko.assistDbPanel.js
  40. 8 8
      desktop/core/src/desktop/js/ko/components/assist/ko.assistEditorContextPanel.js
  41. 3 3
      desktop/core/src/desktop/js/ko/components/assist/ko.rightAssistPanel.js
  42. 1 1
      desktop/core/src/desktop/js/ko/components/contextPopover/asteriskContextTabs.js
  43. 2 2
      desktop/core/src/desktop/js/ko/components/contextPopover/dataCatalogContext.js
  44. 6 6
      desktop/core/src/desktop/js/ko/components/contextPopover/ko.contextPopover.js
  45. 2 2
      desktop/core/src/desktop/js/ko/components/contextPopover/ko.quickQueryContext.js
  46. 1 1
      desktop/core/src/desktop/js/ko/components/contextPopover/ko.quickQueryContext.test.js
  47. 4 4
      desktop/core/src/desktop/js/ko/components/ko.contextSelector.js
  48. 1 1
      desktop/core/src/desktop/js/ko/components/ko.contextSelector.test.js
  49. 1 1
      desktop/core/src/desktop/js/ko/components/ko.pollingCatalogEntriesList.js
  50. 6 6
      desktop/core/src/desktop/js/ko/components/simpleAceEditor/ko.simpleAceEditor.js
  51. 1 0
      desktop/core/src/desktop/js/sql/autocompleteResults.js
  52. 1 1
      desktop/core/src/desktop/js/sql/autocompleteResults.test.js
  53. 2 2
      desktop/core/src/desktop/js/sql/sqlUtils.js
  54. 3 3
      desktop/core/src/desktop/static/desktop/js/jquery.hiveautocomplete.js
  55. 1 1
      desktop/libs/dashboard/src/dashboard/static/dashboard/js/search.ko.js
  56. 3 3
      desktop/libs/indexer/src/indexer/templates/importer.mako
  57. 1 1
      desktop/libs/indexer/src/indexer/templates/indexes.mako
  58. 1 1
      desktop/libs/indexer/src/indexer/templates/topics.mako

+ 1 - 1
apps/about/src/about/templates/admin_wizard.mako

@@ -321,7 +321,7 @@ ${ layout.menubar(section='quick_start') }
     self.installConnectorDataExample = function(connector, event) {
       self.isInstallingSample(true);
       $.post("${ url('notebook:install_examples') }", {
-          connector: connector.type
+          connector: connector.id
         }, function(data) {
           if (data.message) {
             $(document).trigger('info', data.message);

+ 2 - 2
apps/beeswax/src/beeswax/static/beeswax/js/beeswax.vm.js

@@ -86,13 +86,13 @@ function BeeswaxViewModel(server, apiHelper) {
   });
 
   huePubSub.subscribe("assist.database.selected", function (entry) {
-    if (entry.getConnector().type === type && self.database() !== entry.name) {
+    if (entry.getConnector().id === type && self.database() !== entry.name) {
       self.database(entry.name);
     }
   });
 
   huePubSub.subscribe("assist.database.set", function (entry) {
-    if (entry.getConnector().type === type && self.database() !== entry.name) {
+    if (entry.getConnector().id === type && self.database() !== entry.name) {
       self.database(entry.name);
     }
   });

+ 2 - 2
apps/beeswax/src/beeswax/templates/create_database.mako

@@ -225,11 +225,11 @@ ${layout.metastore_menubar()}
       self.apiHelper.withTotalStorage('assist', 'assist_panel_visible', self.isLeftPanelVisible, true);
 
       huePubSub.subscribe("assist.table.selected", function (entry) {
-        location.href = '/metastore/table/' + entry.path[0] + '/' + entry.name + '?source=' + entry.getConnector().type + '&namespace=' + entry.namespace.id;
+        location.href = '/metastore/table/' + entry.path[0] + '/' + entry.name + '?source=' + entry.getConnector().id + '&namespace=' + entry.namespace.id;
       });
 
       huePubSub.subscribe("assist.database.selected", function (entry) {
-        location.href = '/metastore/tables/' + entry.name + '?source=' + entry.getConnector().type + '&namespace=' + entry.namespace.id;
+        location.href = '/metastore/tables/' + entry.name + '?source=' + entry.getConnector().id + '&namespace=' + entry.namespace.id;
       });
     }
 

+ 2 - 2
apps/beeswax/src/beeswax/templates/create_table_manually.mako

@@ -545,11 +545,11 @@ ${ layout.metastore_menubar() }
       self.apiHelper.withTotalStorage('assist', 'assist_panel_visible', self.isLeftPanelVisible, true);
 
       huePubSub.subscribe("assist.table.selected", function (entry) {
-        location.href = '/metastore/table/' + entry.path[0] + '/' + entry.name + '?source=' + entry.getConnector().type + '&namespace=' + entry.namespace.id;
+        location.href = '/metastore/table/' + entry.path[0] + '/' + entry.name + '?source=' + entry.getConnector().id + '&namespace=' + entry.namespace.id;
       });
 
       huePubSub.subscribe("assist.database.selected", function (entry) {
-        location.href = '/metastore/tables/' + entry.name + '?source=' + entry.getConnector().type + '&namespace=' + entry.namespace.id;
+        location.href = '/metastore/tables/' + entry.name + '?source=' + entry.getConnector().id + '&namespace=' + entry.namespace.id;
       });
     }
 

+ 2 - 2
apps/beeswax/src/beeswax/templates/execute.mako

@@ -2805,7 +2805,7 @@ viewModel = new BeeswaxViewModel("${app_name}", apiHelper);
 ko.applyBindings(viewModel, $("#beeswax-execute")[0]);
 
 var handleAssistSelection = function (entry) {
-  if (entry.getConnector().type === snippetType && snippet.database() !== entry.name) {
+  if (entry.getConnector().id === snippetType && snippet.database() !== entry.name) {
     snippet.database(entry.name);
   }
 };
@@ -2814,7 +2814,7 @@ huePubSub.subscribe("assist.database.set", handleAssistSelection);
 huePubSub.subscribe("assist.database.selected", handleAssistSelection);
 
 if (! snippet.database()) {
-  huePubSub.publish("assist.get.database", { connector: { type: snippetType }, callback: handleAssistSelection });
+  huePubSub.publish("assist.get.database", { connector: { id: snippetType }, callback: handleAssistSelection });
 }
 
 shareViewModel = initSharing("#documentShareModal");

+ 2 - 2
apps/beeswax/src/beeswax/templates/import_wizard_choose_delimiter.mako

@@ -186,11 +186,11 @@ ${ layout.metastore_menubar() }
 
 
       huePubSub.subscribe("assist.table.selected", function (entry) {
-        location.href = '/metastore/table/' + entry.path[0] + '/' + entry.name + '?source=' + entry.getConnector().type + '&namespace=' + entry.namespace.id;
+        location.href = '/metastore/table/' + entry.path[0] + '/' + entry.name + '?source=' + entry.getConnector().id + '&namespace=' + entry.namespace.id;
       });
 
       huePubSub.subscribe("assist.database.selected", function (entry) {
-        location.href = '/metastore/tables/' + entry.name + '?source=' + entry.getConnector().type + '&namespace=' + entry.namespace.id;
+        location.href = '/metastore/tables/' + entry.name + '?source=' + entry.getConnector().id + '&namespace=' + entry.namespace.id;
       });
     }
 

+ 2 - 2
apps/beeswax/src/beeswax/templates/import_wizard_choose_file.mako

@@ -193,11 +193,11 @@ ${ layout.metastore_menubar() }
 
 
       huePubSub.subscribe("assist.table.selected", function (entry) {
-        location.href = '/metastore/table/' + entry.path[0] + '/' + entry.name + '?source=' + entry.getConnector().type + '&namespace=' + entry.namespace.id;
+        location.href = '/metastore/table/' + entry.path[0] + '/' + entry.name + '?source=' + entry.getConnector().id + '&namespace=' + entry.namespace.id;
       });
 
       huePubSub.subscribe("assist.database.selected", function (entry) {
-        location.href = '/metastore/tables/' + entry.name + '?source=' + entry.getConnector().type + '&namespace=' + entry.namespace.id;
+        location.href = '/metastore/tables/' + entry.name + '?source=' + entry.getConnector().id + '&namespace=' + entry.namespace.id;
       });
     }
 

+ 2 - 2
apps/beeswax/src/beeswax/templates/import_wizard_define_columns.mako

@@ -221,11 +221,11 @@ ${ layout.metastore_menubar() }
 
 
       huePubSub.subscribe("assist.table.selected", function (entry) {
-        location.href = '/metastore/table/' + entry.path[0] + '/' + entry.name + '?source=' + entry.getConnector().type + '&namespace=' + entry.namespace.id;
+        location.href = '/metastore/table/' + entry.path[0] + '/' + entry.name + '?source=' + entry.getConnector().id + '&namespace=' + entry.namespace.id;
       });
 
       huePubSub.subscribe("assist.database.selected", function (entry) {
-        location.href = '/metastore/tables/' + entry.name + '?source=' + entry.getConnector().type + '&namespace=' + entry.namespace.id;
+        location.href = '/metastore/tables/' + entry.name + '?source=' + entry.getConnector().id + '&namespace=' + entry.namespace.id;
       });
     }
 

+ 3 - 3
apps/jobbrowser/src/jobbrowser/templates/job_browser.mako

@@ -88,7 +88,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
     <!-- ko component: {
       name: 'hue-context-selector',
       params: {
-        connector: { type: 'impala' },
+        connector: { id: 'impala' },
         compute: compute,
         ##namespace: namespace,
         ##availableDatabases: availableDatabases,
@@ -101,7 +101,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
     <!-- ko component: {
       name: 'hue-context-selector',
       params: {
-        connector: { type: 'jobs' },
+        connector: { id: 'jobs' },
         cluster: cluster,
         onClusterSelect: onClusterSelect,
         hideLabels: true
@@ -164,7 +164,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
             <!-- ko component: {
               name: 'hue-context-selector',
               params: {
-                connector: { type: 'jobs' },
+                connector: { id: 'jobs' },
                 cluster: cluster,
                 onClusterSelect: onClusterSelect
               }

+ 8 - 8
apps/metastore/src/metastore/templates/metastore.mako

@@ -372,9 +372,9 @@ ${ components.menubar(is_embeddable) }
         </div>
 
         % if is_embeddable:
-          <button href="javascript: void(0);" class="btn btn-default" data-bind="publish: { 'open.link': '${ url('indexer:importer_prefill', source_type='manual', target_type='database') }' + '/?sourceType=' + catalogEntry().getConnector().type + '&namespace=' + catalogEntry().namespace.id + '&compute=' + catalogEntry().compute.id  }" title="${_('Create a new database')}"><i class="fa fa-plus"></i> ${_('New')}</button>
+          <button href="javascript: void(0);" class="btn btn-default" data-bind="publish: { 'open.link': '${ url('indexer:importer_prefill', source_type='manual', target_type='database') }' + '/?sourceType=' + catalogEntry().getConnector().id + '&namespace=' + catalogEntry().namespace.id + '&compute=' + catalogEntry().compute.id  }" title="${_('Create a new database')}"><i class="fa fa-plus"></i> ${_('New')}</button>
         % elif ENABLE_NEW_CREATE_TABLE.get():
-          <button class="btn btn-default" data-bind="attr: { 'href': '${ url('indexer:importer_prefill', source_type='manual', target_type='database') }' + '/?sourceType=' + catalogEntry().getConnector().type + '&namespace=' + catalogEntry().namespace.id + '&compute=' + catalogEntry().compute.id }" title="${_('Create a new database')}"><i class="fa fa-plus"></i> ${_('New')}</button>
+          <button class="btn btn-default" data-bind="attr: { 'href': '${ url('indexer:importer_prefill', source_type='manual', target_type='database') }' + '/?sourceType=' + catalogEntry().getConnector().id + '&namespace=' + catalogEntry().namespace.id + '&compute=' + catalogEntry().compute.id }" title="${_('Create a new database')}"><i class="fa fa-plus"></i> ${_('New')}</button>
         % else:
           <button href="${ url('beeswax:create_database') }" class="btn btn-default" title="${_('Create a new database')}"><i class="fa fa-plus"></i> ${_('New')}</button>
         % endif
@@ -504,9 +504,9 @@ ${ components.menubar(is_embeddable) }
         % if has_write_access:
           <button id="dropBtn" class="btn toolbarBtn" title="${_('Drop the selected tables')}" data-bind="click: function () { $('#dropTable').modal('show'); }, disable: selectedTables().length === 0"><i class="fa fa-times"></i>  ${_('Drop')}</button>
           % if is_embeddable:
-            <button href="javascript: void(0);" class="btn btn-default" data-bind="publish: { 'open.link': '${ url('indexer:importer_prefill', source_type='all', target_type='table') }' + catalogEntry.name + '/?sourceType=' + catalogEntry.getConnector().type + '&namespace=' + catalogEntry.namespace.id + '&compute=' + catalogEntry.compute.id }" title="${_('Create a new table')}"><i class="fa fa-plus"></i> ${_('New')}</button>
+            <button href="javascript: void(0);" class="btn btn-default" data-bind="publish: { 'open.link': '${ url('indexer:importer_prefill', source_type='all', target_type='table') }' + catalogEntry.name + '/?sourceType=' + catalogEntry.getConnector().id + '&namespace=' + catalogEntry.namespace.id + '&compute=' + catalogEntry.compute.id }" title="${_('Create a new table')}"><i class="fa fa-plus"></i> ${_('New')}</button>
           % elif ENABLE_NEW_CREATE_TABLE.get():
-            <button class="btn btn-default" data-bind="attr: { 'href': '${ url('indexer:importer_prefill', source_type='all', target_type='table') }' + catalogEntry.name + '/?sourceType=' + catalogEntry.getConnector().type + '&namespace=' + catalogEntry.namespace.id + '&compute=' + catalogEntry.compute.id }" title="${_('Create a new table')}"><i class="fa fa-plus"></i> ${_('New')}</button>
+            <button class="btn btn-default" data-bind="attr: { 'href': '${ url('indexer:importer_prefill', source_type='all', target_type='table') }' + catalogEntry.name + '/?sourceType=' + catalogEntry.getConnector().id + '&namespace=' + catalogEntry.namespace.id + '&compute=' + catalogEntry.compute.id }" title="${_('Create a new table')}"><i class="fa fa-plus"></i> ${_('New')}</button>
           % else:
             <button class="btn btn-default" data-bind="attr: { 'href': '/beeswax/create/import_wizard/' + catalogEntry.name }" title="${_('Create a new table from a file')}"><i class="fa fa-stack"></i> ${_('New from file')}</button>
             <button class="btn btn-default" data-bind="attr: { 'href': '/beeswax/create/create_table/' + catalogEntry.name }" title="${_('Create a new table manually')}"><i class="fa fa-plus"></i> ${_('New manually')}</button>
@@ -764,14 +764,14 @@ ${ components.menubar(is_embeddable) }
     <!-- /ko -->
     <!-- ko foreach: topJoins -->
     <tr>
-      <td><a href="javascript:void(0);" data-bind="text: tableName, sqlContextPopover: { sourceType: $parents[1].catalogEntry.getConnector().type, namespace: parents[1].catalogEntry.namespace, compute: parents[1].catalogEntry.compute, path: tablePath, offset: { top: -3, left: 3 }}"></a></td>
+      <td><a href="javascript:void(0);" data-bind="text: tableName, sqlContextPopover: { sourceType: $parents[1].catalogEntry.getConnector().id, namespace: parents[1].catalogEntry.namespace, compute: parents[1].catalogEntry.compute, path: tablePath, offset: { top: -3, left: 3 }}"></a></td>
       <td>
         <table class="metastore-join-column-table">
           <tbody data-bind="foreach: joinCols">
           <tr>
-            <td><a href="javascript:void(0);" data-bind="text: target, sqlContextPopover: { sourceType: $parents[2].catalogEntry.getConnector().type, namespace: $parents[2].catalogEntry.namespace, compute: parents[2].catalogEntry.compute, path: targetPath, offset: { top: -3, left: 3 }}"></a></td>
+            <td><a href="javascript:void(0);" data-bind="text: target, sqlContextPopover: { sourceType: $parents[2].catalogEntry.getConnector().id, namespace: $parents[2].catalogEntry.namespace, compute: parents[2].catalogEntry.compute, path: targetPath, offset: { top: -3, left: 3 }}"></a></td>
             <td class="metastore-join-arrow"><i class="fa fa-arrows-h"></i></td>
-            <td><a href="javascript:void(0);" data-bind="text: source, sqlContextPopover: { sourceType: $parents[2].catalogEntry.getConnector().type, namespace: $parents[2].catalogEntry.namespace, compute: parents[2].catalogEntry.compute, path: sourcePath, offset: { top: -3, left: 3 }}"></a></td>
+            <td><a href="javascript:void(0);" data-bind="text: source, sqlContextPopover: { sourceType: $parents[2].catalogEntry.getConnector().id, namespace: $parents[2].catalogEntry.namespace, compute: parents[2].catalogEntry.compute, path: sourcePath, offset: { top: -3, left: 3 }}"></a></td>
           </tr>
           </tbody>
         </table>
@@ -1034,7 +1034,7 @@ ${ components.menubar(is_embeddable) }
   }
 
   function queryAndWatch(catalogEntry) {
-    queryAndWatchUrl('/notebook/browse/' + catalogEntry.path.join('/') + '/', catalogEntry.getConnector().type,
+    queryAndWatchUrl('/notebook/browse/' + catalogEntry.path.join('/') + '/', catalogEntry.getConnector().id,
             catalogEntry.namespace && catalogEntry.namespace.id, catalogEntry.compute)
   }
 </script>

+ 2 - 2
apps/oozie/src/oozie/static/oozie/js/workflow-editor.ko.js

@@ -530,8 +530,8 @@ var WorkflowEditorViewModel = function (layout_json, workflow_json, credentials_
   self.availableComputes = ko.observableArray();
   self.compute = ko.observable();
 
-  contextCatalog.getNamespaces({ connector: { type: 'oozie' } }).done(function (context) { self.availableNamespaces(context.namespaces) });
-  contextCatalog.getComputes({ connector: { type: 'oozie' } }).done(self.availableComputes);
+  contextCatalog.getNamespaces({ connector: { id: 'oozie' } }).done(function (context) { self.availableNamespaces(context.namespaces) });
+  contextCatalog.getComputes({ connector: { id: 'oozie' } }).done(self.availableComputes);
 
 
   self.previewColumns = ko.observable("");

+ 2 - 2
apps/pig/src/pig/templates/app.mako

@@ -1016,13 +1016,13 @@ ${ commonshare() | n,unicode }
 
     % if autocomplete_base_url != '':
       var apiHelper = window.apiHelper;
-      var connector = { type: 'hive' };
+      var connector = { id: 'hive' };
       contextCatalog.getNamespaces({ connector: connector }).done(function (context) {
         // TODO: Namespace and compute selection
         dataCatalog.getChildren({
           namespace: context.namespaces[0],
           compute: context.namespaces[0].computes[0],
-          connector: { type: 'hive' },
+          connector: { id: 'hive' },
           path: ['default'],
           silenceErrors: true
         }).done(function (childEntries) {

+ 3 - 3
desktop/core/src/desktop/js/api/apiHelper.js

@@ -2530,7 +2530,7 @@ class ApiHelper {
    * @return {Promise}
    */
   fetchContextNamespaces(options) {
-    const url = '/desktop/api2/context/namespaces/' + options.connector.type;
+    const url = '/desktop/api2/context/namespaces/' + options.connector.id;
     return simpleGet(url, undefined, options);
   }
 
@@ -2541,7 +2541,7 @@ class ApiHelper {
    * @return {Promise}
    */
   fetchContextComputes(options) {
-    const url = '/desktop/api2/context/computes/' + options.connector.type;
+    const url = '/desktop/api2/context/computes/' + options.connector.id;
     return simpleGet(url, undefined, options);
   }
 
@@ -2552,7 +2552,7 @@ class ApiHelper {
    * @return {Promise}
    */
   fetchContextClusters(options) {
-    const url = '/desktop/api2/context/clusters/' + options.connector.type;
+    const url = '/desktop/api2/context/clusters/' + options.connector.id;
     return simpleGet(url, undefined, options);
   }
 

+ 7 - 7
desktop/core/src/desktop/js/apps/notebook/editorViewModel.js

@@ -50,16 +50,16 @@ class EditorViewModel {
     self.editorType = ko.observable(options.editor_type);
     self.activeConnector = ko.observable();
 
-    const updateConnector = type => {
-      if (type) {
-        self.activeConnector(findEditorConnector(connector => connector.type === type));
+    const updateConnector = id => {
+      if (id) {
+        self.activeConnector(findEditorConnector(connector => connector.id === id));
       }
     };
 
     updateConnector(self.editorType());
 
     self.editorType.subscribe(newVal => {
-      if (!this.activeConnector() || this.activeConnector().type !== newVal) {
+      if (!this.activeConnector() || this.activeConnector().id !== newVal) {
         updateConnector(newVal);
       }
 
@@ -606,17 +606,17 @@ class EditorViewModel {
     };
 
     self.newNotebook = function(editorType, callback, queryTab) {
-      const type = editorType || options.editor_type;
+      const connectorId = editorType || options.editor_type;
 
       if (!self.isNotificationManager()) {
-        self.activeConnector(findEditorConnector(connector => connector.type === type));
+        self.activeConnector(findEditorConnector(connector => connector.id === connectorId));
         huePubSub.publish(ACTIVE_SNIPPET_CONNECTOR_CHANGED_EVENT, self.activeConnector());
       }
 
       $.post(
         '/notebook/api/create_notebook',
         {
-          type: type,
+          type: connectorId,
           directory_uuid: window.location.getParameter('directory_uuid'),
           gist: self.isNotificationManager() ? undefined : window.location.getParameter('gist')
         },

+ 6 - 5
desktop/core/src/desktop/js/apps/notebook/snippet.js

@@ -185,16 +185,16 @@ class Snippet {
 
     self.connector = ko.observable();
 
-    const updateConnector = type => {
-      if (type) {
-        self.connector(findEditorConnector(connector => connector.type === type));
+    const updateConnector = id => {
+      if (id) {
+        self.connector(findEditorConnector(connector => connector.id === id));
       }
     };
 
     updateConnector(self.type());
 
     self.type.subscribe(type => {
-      if (!self.connector() || self.connector().type !== type) {
+      if (!self.connector() || self.connector().id !== type) {
         updateConnector(type);
       }
       self.status('ready');
@@ -209,6 +209,7 @@ class Snippet {
       return {
         optimizer: self.type() === 'hive' || self.type() === 'impala' ? 'api' : 'off',
         type: self.type(),
+        id: self.type(),
         dialect: self.type(),
         is_sql: self.isSqlDialect()
       };
@@ -460,7 +461,7 @@ class Snippet {
     self.handleAssistSelection = function(entry) {
       if (ignoreNextAssistDatabaseUpdate) {
         ignoreNextAssistDatabaseUpdate = false;
-      } else if (entry.getConnector().type === self.connector().type) {
+      } else if (entry.getConnector().id === self.connector().id) {
         if (self.namespace() !== entry.namespace) {
           self.namespace(entry.namespace);
         }

+ 8 - 8
desktop/core/src/desktop/js/apps/notebook2/editorViewModel.js

@@ -77,15 +77,15 @@ class EditorViewModel {
       }
     });
 
-    this.editorType = ko.pureComputed(() => this.activeConnector() && this.activeConnector().type);
+    this.editorType = ko.pureComputed(() => this.activeConnector() && this.activeConnector().id);
     this.editorTitle = ko.pureComputed(
       () => this.activeConnector() && this.activeConnector().displayName
     );
 
     this.activeConnector.subscribe(connector => {
       if (connector) {
-        if (window.location.getParameter('type') !== connector.type) {
-          hueUtils.changeURLParameter('type', connector.type);
+        if (window.location.getParameter('type') !== connector.id) {
+          hueUtils.changeURLParameter('type', connector.id);
         }
         this.notifyDialectChange(connector.dialect, connector.is_sql);
       }
@@ -315,17 +315,17 @@ class EditorViewModel {
     huePubSub.publish('recalculate.name.description.width');
   }
 
-  async newNotebook(editorType, callback, queryTab) {
-    const connector = findEditorConnector(connector => connector.type === editorType);
+  async newNotebook(connectorId, callback, queryTab) {
+    const connector = findEditorConnector(connector => connector.id === connectorId);
     if (!connector) {
-      console.warn('No connector found for type ' + editorType);
+      console.warn('No connector found for ID ' + connectorId);
     } else {
       huePubSub.publish(ACTIVE_SNIPPET_CONNECTOR_CHANGED_EVENT, connector);
     }
 
     return new Promise((resolve, reject) => {
       $.post('/notebook/api/create_notebook', {
-        type: editorType,
+        type: connectorId,
         directory_uuid: window.location.getParameter('directory_uuid'),
         gist: this.isNotificationManager() ? undefined : window.location.getParameter('gist')
       })
@@ -334,7 +334,7 @@ class EditorViewModel {
           if (this.editorMode() && !this.isNotificationManager()) {
             const snippet =
               this.selectedNotebook().snippets().length === 0
-                ? this.selectedNotebook().newSnippet(editorType)
+                ? this.selectedNotebook().newSnippet(connectorId)
                 : this.selectedNotebook().snippets()[0];
             if (
               queryTab &&

+ 3 - 3
desktop/core/src/desktop/js/apps/notebook2/execution/executable.js

@@ -403,10 +403,10 @@ export default class Executable {
       };
     }
 
-    const session = await sessionManager.getSession({ type: this.executor.connector().type });
+    const session = await sessionManager.getSession({ type: this.executor.connector().id });
     const statement = this.getStatement();
     const snippet = {
-      type: this.executor.connector().type,
+      type: this.executor.connector().id,
       result: {
         handle: this.handle
       },
@@ -424,7 +424,7 @@ export default class Executable {
     };
 
     const notebook = {
-      type: this.executor.connector().type,
+      type: this.executor.connector().id,
       snippets: [snippet],
       id: this.notebookId,
       uuid: hueUtils.UUID(),

+ 1 - 1
desktop/core/src/desktop/js/apps/notebook2/execution/executor.test.js

@@ -30,7 +30,7 @@ describe('executor.js', () => {
       compute: { id: 'compute' },
       namespace: { id: 'namespace' },
       database: 'default',
-      connector: () => ({ type: 'impala' }),
+      connector: () => ({ id: 'impala' }),
       statement: statement,
       isSqlEngine: true
     });

+ 4 - 4
desktop/core/src/desktop/js/apps/notebook2/notebook.test.js

@@ -49,14 +49,14 @@ describe('notebook.js', () => {
   });
 
   it('should serialize a notebook to JSON', async () => {
-    const connectors = [{ type: 'hive', dialect: 'hive' }, { type: 'impala', dialect: 'impala' }];
+    const connectors = [{ id: 'hive', dialect: 'hive' }, { id: 'impala', dialect: 'impala' }];
     const spy = jest
       .spyOn(hueConfig, 'findEditorConnector')
       .mockImplementation(connectors.find.bind(connectors));
 
     const notebook = new Notebook(viewModel, {});
-    notebook.addSnippet({ connector: { dialect: 'hive', type: 'hive' } });
-    notebook.addSnippet({ connector: { dialect: 'impala', type: 'impala' } });
+    notebook.addSnippet({ connector: { dialect: 'hive', id: 'hive' } });
+    notebook.addSnippet({ connector: { dialect: 'impala', id: 'impala' } });
 
     expect(spy).toHaveBeenCalled();
 
@@ -73,7 +73,7 @@ describe('notebook.js', () => {
 
   it('should serialize a notebook context to JSON', async () => {
     const notebook = new Notebook(viewModel, {});
-    const connectors = [{ type: 'hive', dialect: 'hive' }, { type: 'impala', dialect: 'impala' }];
+    const connectors = [{ id: 'hive', dialect: 'hive' }, { id: 'impala', dialect: 'impala' }];
     jest
       .spyOn(hueConfig, 'findEditorConnector')
       .mockImplementation(connectors.find.bind(connectors));

+ 5 - 6
desktop/core/src/desktop/js/apps/notebook2/snippet.js

@@ -200,7 +200,7 @@ export default class Snippet {
     this.connector = ko.observable();
 
     this.connector.subscribe(connector => {
-      sessionManager.getSession({ type: connector.type }).then(() => {
+      sessionManager.getSession({ type: connector.id }).then(() => {
         this.status(STATUS.ready);
       });
     });
@@ -208,7 +208,7 @@ export default class Snippet {
     this.initializeConnector(snippetRaw);
 
     this.dialect = ko.pureComputed(() => this.connector() && this.connector().dialect);
-    this.connectorType = ko.pureComputed(() => this.connector() && this.connector().type);
+    this.connectorType = ko.pureComputed(() => this.connector() && this.connector().id);
 
     this.isSqlDialect = ko.pureComputed(() => this.connector() && this.connector().is_sql);
     this.defaultLimit = ko.observable(snippetRaw.defaultLimit);
@@ -1291,7 +1291,7 @@ export default class Snippet {
   handleAssistSelection(entry) {
     if (this.ignoreNextAssistDatabaseUpdate) {
       this.ignoreNextAssistDatabaseUpdate = false;
-    } else if (entry.getConnector().type === this.connector().type) {
+    } else if (entry.getConnector().id === this.connector().id) {
       if (this.namespace() !== entry.namespace) {
         this.namespace(entry.namespace);
       }
@@ -1316,9 +1316,8 @@ export default class Snippet {
   }
 
   initializeConnector(snippetRaw) {
-    const connectorTypeToFind =
-      (snippetRaw.connector && snippetRaw.connector.type) || snippetRaw.type;
-    let foundConnector = findEditorConnector(connector => connector.type === connectorTypeToFind);
+    const connectorIdToFind = (snippetRaw.connector && snippetRaw.connector.id) || snippetRaw.type;
+    let foundConnector = findEditorConnector(connector => connector.id === connectorIdToFind);
 
     if (!foundConnector) {
       // If not found by type pick the first by dialect

+ 2 - 2
desktop/core/src/desktop/js/apps/notebook2/snippet.test.js

@@ -49,13 +49,13 @@ describe('snippet.js', () => {
   });
 
   it('should serialize a snippet context to JSON', async () => {
-    const connectors = [{ type: 'hive', dialect: 'hive' }];
+    const connectors = [{ id: 'hive', dialect: 'hive' }];
     const spy = jest
       .spyOn(hueConfig, 'findEditorConnector')
       .mockImplementation(connectors.find.bind(connectors));
 
     const notebook = new Notebook(viewModel, {});
-    const snippet = notebook.addSnippet({ connector: { dialect: 'hive', type: 'hive' } });
+    const snippet = notebook.addSnippet({ connector: { dialect: 'hive', id: 'hive' } });
 
     expect(spy).toHaveBeenCalled();
 

+ 4 - 1
desktop/core/src/desktop/js/apps/table_browser/app.js

@@ -140,7 +140,10 @@ huePubSub.subscribe('app.dom.loaded', app => {
 
   if (location.getParameter('refresh') === 'true') {
     // TODO: Use connectors in the table browser
-    const connector = {};
+    const connector = {
+      id: viewModel.source().type,
+      dialect: viewModel.source().type
+    };
     if (viewModel.source().type === 'hive' || viewModel.source().type === 'impala') {
       connector.optimizer = 'api';
     }

+ 5 - 1
desktop/core/src/desktop/js/apps/table_browser/metastoreNamespace.js

@@ -62,7 +62,11 @@ class MetastoreNamespace {
       });
 
     // TODO: Use connectors in the table browser
-    const connector = { type: this.sourceType };
+    const connector = {
+      type: this.sourceType,
+      id: this.sourceType,
+      dialect: this.sourceType
+    };
     if (this.sourceType === 'hive' || this.sourceType === 'impala') {
       connector.optimizer = 'api';
     }

+ 4 - 4
desktop/core/src/desktop/js/apps/table_browser/metastoreSource.js

@@ -59,7 +59,7 @@ class MetastoreSource {
       }
     };
 
-    this.connector = ko.observable(findEditorConnector(connector => connector.type === this.type));
+    this.connector = ko.observable(findEditorConnector(connector => connector.id === this.type));
 
     huePubSub.subscribe(ASSIST_DB_PANEL_IS_READY_EVENT, () => {
       this.lastLoadNamespacesDeferred.done(() => {
@@ -148,8 +148,8 @@ class MetastoreSource {
         });
     };
 
-    huePubSub.subscribe(NAMESPACES_REFRESHED_EVENT, connectorType => {
-      if (this.type !== connectorType) {
+    huePubSub.subscribe(NAMESPACES_REFRESHED_EVENT, connectorId => {
+      if (this.type !== connectorId) {
         return;
       }
       const previousState = getCurrentState();
@@ -159,7 +159,7 @@ class MetastoreSource {
     huePubSub.subscribe('data.catalog.entry.refreshed', details => {
       const refreshedEntry = details.entry;
 
-      if (refreshedEntry.getConnector().type !== this.type) {
+      if (refreshedEntry.getConnector().id !== this.type) {
         return;
       }
 

+ 1 - 1
desktop/core/src/desktop/js/apps/table_browser/metastoreTable.js

@@ -394,7 +394,7 @@ class MetastoreTable {
       '/metastore/table/' +
         this.catalogEntry.path.join('/') +
         '/load?source_type=' +
-        this.catalogEntry.getConnector().type
+        this.catalogEntry.getConnector().id
     )
       .done(data => {
         $('#import-data-modal').html(data['data']);

+ 5 - 5
desktop/core/src/desktop/js/apps/table_browser/metastoreViewModel.js

@@ -117,9 +117,9 @@ class MetastoreViewModel {
     this.currentTab = ko.observable('');
 
     huePubSub.subscribe('assist.database.selected', entry => {
-      if (this.source().type !== entry.getConnector().type) {
+      if (this.source().type !== entry.getConnector().id) {
         const found = this.sources().some(source => {
-          if (source.type === entry.getConnector().type) {
+          if (source.type === entry.getConnector().id) {
             this.source(source);
             return true;
           }
@@ -273,9 +273,9 @@ class MetastoreViewModel {
   }
 
   loadTableDef(entry, callback) {
-    if (this.source().type !== entry.getConnector().type) {
+    if (this.source().type !== entry.getConnector().id) {
       const found = this.sources().some(source => {
-        if (source.type === entry.getConnector().type) {
+        if (source.type === entry.getConnector().id) {
           this.source(source);
           return true;
         }
@@ -493,7 +493,7 @@ class MetastoreViewModel {
 
           dataCatalog
             .getEntry({
-              connector: findEditorConnector(connector => connector.type === this.source().type),
+              connector: findEditorConnector(connector => connector.id === this.source().type),
               namespace: namespace.namespace,
               compute: namespace.compute,
               path: [pathParts[1], pathParts[2]]

+ 1 - 1
desktop/core/src/desktop/js/catalog/catalogUtils.js

@@ -31,7 +31,7 @@ const fetchAndSave = (apiHelperFunction, attributeName, entry, apiOptions) => {
       ? apiHelper[apiHelperFunction].bind(apiHelper)
       : apiHelperFunction;
   return func({
-    sourceType: entry.getConnector().type,
+    sourceType: entry.getConnector().id,
     compute: entry.compute,
     path: entry.path, // Set for DataCatalogEntry
     paths: entry.paths, // Set for MultiTableEntry

+ 53 - 57
desktop/core/src/desktop/js/catalog/contextCatalog.js

@@ -133,28 +133,28 @@ class ContextCatalog {
    */
   getNamespaces(options) {
     const self = this;
-    const connectorType = options.connector.type;
+    const connectorId = options.connector.id;
 
-    const notifyForRefresh = self.namespacePromises[connectorType] && options.clearCache;
+    const notifyForRefresh = self.namespacePromises[connectorId] && options.clearCache;
     if (options.clearCache) {
-      self.namespacePromises[connectorType] = undefined;
-      self.namespaces[connectorType] = undefined;
+      self.namespacePromises[connectorId] = undefined;
+      self.namespaces[connectorId] = undefined;
     }
 
-    if (self.namespacePromises[connectorType]) {
-      return self.namespacePromises[connectorType];
+    if (self.namespacePromises[connectorId]) {
+      return self.namespacePromises[connectorId];
     }
 
-    if (self.namespaces[connectorType]) {
-      self.namespacePromises[connectorType] = $.Deferred()
-        .resolve(self.namespaces[connectorType])
+    if (self.namespaces[connectorId]) {
+      self.namespacePromises[connectorId] = $.Deferred()
+        .resolve(self.namespaces[connectorId])
         .promise();
-      return self.namespacePromises[connectorType];
+      return self.namespacePromises[connectorId];
     }
 
     const deferred = $.Deferred();
 
-    self.namespacePromises[connectorType] = deferred.promise();
+    self.namespacePromises[connectorId] = deferred.promise();
 
     const startingNamespaces = {};
     const pollTimeout = -1;
@@ -164,8 +164,8 @@ class ContextCatalog {
       window.setTimeout(() => {
         if (Object.keys(startingNamespaces).length) {
           apiHelper.fetchContextNamespaces(options).done(namespaces => {
-            if (namespaces[connectorType]) {
-              const namespaces = namespaces[connectorType];
+            if (namespaces[connectorId]) {
+              const namespaces = namespaces[connectorId];
               if (namespaces) {
                 let statusChanged = false;
                 namespaces.forEach(namespace => {
@@ -176,7 +176,7 @@ class ContextCatalog {
                   }
                 });
                 if (statusChanged) {
-                  huePubSub.publish(NAMESPACES_REFRESHED_EVENT, connectorType);
+                  huePubSub.publish(NAMESPACES_REFRESHED_EVENT, connectorId);
                 }
                 if (Object.keys(startingNamespaces).length) {
                   pollForStarted();
@@ -201,9 +201,9 @@ class ContextCatalog {
 
     const fetchNamespaces = () => {
       apiHelper.fetchContextNamespaces(options).done(namespaces => {
-        if (namespaces[connectorType]) {
+        if (namespaces[connectorId]) {
           const dynamic = namespaces.dynamicClusters;
-          namespaces = namespaces[connectorType];
+          namespaces = namespaces[connectorId];
           if (namespaces) {
             namespaces.forEach(namespace => {
               namespace.computes.forEach(compute => {
@@ -215,24 +215,20 @@ class ContextCatalog {
                 }
               });
             });
-            self.namespaces[connectorType] = {
+            self.namespaces[connectorId] = {
               namespaces: namespaces.filter(namespace => namespace.name),
               dynamic: dynamic,
               hueTimestamp: Date.now()
             };
-            deferred.resolve(self.namespaces[connectorType]);
+            deferred.resolve(self.namespaces[connectorId]);
             if (notifyForRefresh) {
-              huePubSub.publish(NAMESPACES_REFRESHED_EVENT, connectorType);
+              huePubSub.publish(NAMESPACES_REFRESHED_EVENT, connectorId);
             }
 
-            if (self.namespaces[connectorType].namespaces.length) {
-              self.saveLater(
-                NAMESPACES_CONTEXT_TYPE,
-                connectorType,
-                self.namespaces[connectorType]
-              );
+            if (self.namespaces[connectorId].namespaces.length) {
+              self.saveLater(NAMESPACES_CONTEXT_TYPE, connectorId, self.namespaces[connectorId]);
             } else {
-              self.getStore().removeItem(connectorType + '_' + NAMESPACES_CONTEXT_TYPE);
+              self.getStore().removeItem(connectorId + '_' + NAMESPACES_CONTEXT_TYPE);
             }
           } else {
             deferred.reject();
@@ -245,17 +241,17 @@ class ContextCatalog {
 
     if (!options.clearCache) {
       self
-        .getSaved(NAMESPACES_CONTEXT_TYPE, connectorType)
+        .getSaved(NAMESPACES_CONTEXT_TYPE, connectorId)
         .done(namespaces => {
-          self.namespaces[connectorType] = namespaces;
-          deferred.resolve(self.namespaces[connectorType]);
+          self.namespaces[connectorId] = namespaces;
+          deferred.resolve(self.namespaces[connectorId]);
         })
         .fail(fetchNamespaces);
     } else {
       fetchNamespaces();
     }
 
-    return self.namespacePromises[connectorType];
+    return self.namespacePromises[connectorId];
   }
 
   /**
@@ -268,33 +264,33 @@ class ContextCatalog {
   getComputes(options) {
     const self = this;
 
-    const connectorType = options.connector.type;
+    const connectorId = options.connector.id;
 
     if (options.clearCache) {
-      self.computePromises[connectorType] = undefined;
-      self.computes[connectorType] = undefined;
+      self.computePromises[connectorId] = undefined;
+      self.computes[connectorId] = undefined;
     }
 
-    if (self.computePromises[connectorType]) {
-      return self.computePromises[connectorType];
+    if (self.computePromises[connectorId]) {
+      return self.computePromises[connectorId];
     }
 
-    if (self.computes[connectorType]) {
-      self.computePromises[connectorType] = $.Deferred()
-        .resolve(self.computes[connectorType])
+    if (self.computes[connectorId]) {
+      self.computePromises[connectorId] = $.Deferred()
+        .resolve(self.computes[connectorId])
         .promise();
-      return self.computePromises[connectorType];
+      return self.computePromises[connectorId];
     }
 
     const deferred = $.Deferred();
-    self.computePromises[connectorType] = deferred.promise();
+    self.computePromises[connectorId] = deferred.promise();
 
     apiHelper.fetchContextComputes(options).done(computes => {
-      if (computes[connectorType]) {
-        computes = computes[connectorType];
+      if (computes[connectorId]) {
+        computes = computes[connectorId];
         if (computes) {
-          self.computes[connectorType] = computes;
-          deferred.resolve(self.computes[connectorType]);
+          self.computes[connectorId] = computes;
+          deferred.resolve(self.computes[connectorId]);
           // TODO: save
         } else {
           deferred.reject();
@@ -304,7 +300,7 @@ class ContextCatalog {
       }
     });
 
-    return self.computePromises[connectorType];
+    return self.computePromises[connectorId];
   }
 
   /**
@@ -316,32 +312,32 @@ class ContextCatalog {
   getClusters(options) {
     const self = this;
 
-    const connectorType = options.connector.type;
+    const connectorId = options.connector.id;
 
-    if (self.clusterPromises[connectorType]) {
-      return self.clusterPromises[connectorType];
+    if (self.clusterPromises[connectorId]) {
+      return self.clusterPromises[connectorId];
     }
 
-    if (self.clusters[connectorType]) {
-      self.clusterPromises[connectorType] = $.Deferred()
-        .resolve(self.clusters[connectorType])
+    if (self.clusters[connectorId]) {
+      self.clusterPromises[connectorId] = $.Deferred()
+        .resolve(self.clusters[connectorId])
         .promise();
-      return self.clusterPromises[connectorType];
+      return self.clusterPromises[connectorId];
     }
 
     const deferred = $.Deferred();
-    self.clusterPromises[connectorType] = deferred.promise();
+    self.clusterPromises[connectorId] = deferred.promise();
 
     apiHelper.fetchContextClusters(options).done(clusters => {
-      if (clusters && clusters[connectorType]) {
-        self.clusters[connectorType] = clusters[connectorType];
-        deferred.resolve(self.clusters[connectorType]);
+      if (clusters && clusters[connectorId]) {
+        self.clusters[connectorId] = clusters[connectorId];
+        deferred.resolve(self.clusters[connectorId]);
       } else {
         deferred.reject();
       }
     });
 
-    return self.clusterPromises[connectorType];
+    return self.clusterPromises[connectorId];
   }
 }
 

+ 8 - 8
desktop/core/src/desktop/js/catalog/dataCatalog.js

@@ -129,8 +129,8 @@ export class DataCatalog {
    */
   constructor(connector) {
     const self = this;
-    if (!connector || !connector.type) {
-      throw new Error('DataCatalog created without connector or type');
+    if (!connector || !connector.id) {
+      throw new Error('DataCatalog created without connector or id');
     }
     self.connector = connector;
 
@@ -138,10 +138,10 @@ export class DataCatalog {
     self.temporaryEntries = {};
     self.multiTableEntries = {};
     self.store = localforage.createInstance({
-      name: 'HueDataCatalog_' + self.connector.type + '_' + STORAGE_POSTFIX
+      name: 'HueDataCatalog_' + self.connector.id + '_' + STORAGE_POSTFIX
     });
     self.multiTableStore = localforage.createInstance({
-      name: 'HueDataCatalog_' + self.connector.type + '_multiTable_' + STORAGE_POSTFIX
+      name: 'HueDataCatalog_' + self.connector.id + '_multiTable_' + STORAGE_POSTFIX
     });
   }
 
@@ -824,12 +824,12 @@ const sourceBoundCatalogs = {};
  * @return {DataCatalog}
  */
 const getCatalog = function(connector) {
-  if (!connector || !connector.type) {
-    throw new Error('getCatalog called without connector with type');
+  if (!connector || !connector.id) {
+    throw new Error('getCatalog called without connector with id');
   }
   return (
-    sourceBoundCatalogs[connector.type] ||
-    (sourceBoundCatalogs[connector.type] = new DataCatalog(connector))
+    sourceBoundCatalogs[connector.id] ||
+    (sourceBoundCatalogs[connector.id] = new DataCatalog(connector))
   );
 };
 

+ 4 - 4
desktop/core/src/desktop/js/catalog/dataCatalogEntry.js

@@ -230,7 +230,7 @@ class DataCatalogEntry {
       typeof options.path === 'string' && options.path
         ? options.path.split('.')
         : options.path || [];
-    self.name = self.path.length ? self.path[self.path.length - 1] : self.getConnector().type;
+    self.name = self.path.length ? self.path[self.path.length - 1] : self.getConnector().id;
     self.isTemporary = options.isTemporary;
 
     self.definition = options.definition;
@@ -1045,7 +1045,7 @@ class DataCatalogEntry {
     } else {
       apiHelper
         .updateSourceMetadata({
-          sourceType: self.getConnector().type,
+          sourceType: self.getConnector().id,
           path: self.path,
           properties: {
             comment: comment
@@ -1178,7 +1178,7 @@ class DataCatalogEntry {
    * @return {string} - 'impala', 'hive', 'solr', etc.
    */
   getDialect() {
-    return this.getConnector().dialect || this.getConnector().type; // .type for editor v1
+    return this.getConnector().dialect || this.getConnector().id; // .id for editor v1
   }
 
   /**
@@ -1664,7 +1664,7 @@ class DataCatalogEntry {
     if (options && options.operation && options.operation !== 'default') {
       return catalogUtils.applyCancellable(
         apiHelper.fetchSample({
-          sourceType: self.getConnector().type,
+          sourceType: self.getConnector().id,
           compute: self.compute,
           path: self.path,
           silenceErrors: options && options.silenceErrors,

+ 1 - 1
desktop/core/src/desktop/js/catalog/multiTableEntry.js

@@ -175,7 +175,7 @@ class MultiTableEntry {
    * @return {string} - 'impala', 'hive', 'solr', etc.
    */
   getDialect() {
-    return this.getConnector().dialect || this.getConnector().type; // .type for editor v1
+    return this.getConnector().dialect || this.getConnector().id; // .id for editor v1
   }
 
   /**

+ 5 - 5
desktop/core/src/desktop/js/jquery/plugins/jquery.hiveautocomplete.js

@@ -58,7 +58,7 @@ function Plugin(element, options) {
   if (self.options.namespace) {
     self.namespaceDeferred.resolve(self.options.namespace);
   } else {
-    contextCatalog.getNamespaces({ connector: { type: options.apiHelperType } }).done(context => {
+    contextCatalog.getNamespaces({ connector: { id: options.apiHelperType } }).done(context => {
       if (context.namespaces && context.namespaces.length) {
         self.namespaceDeferred.resolve(context.namespaces[0]);
       } else {
@@ -194,7 +194,7 @@ Plugin.prototype.init = function() {
           // TODO: Use connectors in hiveautocomplete
           dataCatalog
             .getChildren({
-              connector: { type: self.options.apiHelperType },
+              connector: { id: self.options.apiHelperType },
               namespace: namespace,
               compute: compute,
               path: path
@@ -326,7 +326,7 @@ Plugin.prototype.init = function() {
     $.when(self.namespaceDeferred, self.computeDeferred).done((namespace, compute) => {
       dataCatalog
         .getChildren({
-          connector: { type: self.options.apiHelperType }, // TODO: Use connectors in hiveautocomplete
+          connector: { id: self.options.apiHelperType }, // TODO: Use connectors in hiveautocomplete
           namespace: namespace,
           compute: compute,
           path: []
@@ -348,7 +348,7 @@ Plugin.prototype.init = function() {
         .getEntry({
           namespace: namespace,
           compute: compute,
-          connector: { type: self.options.apiHelperType },
+          connector: { id: self.options.apiHelperType },
           path: [database]
         })
         .done(entry => {
@@ -364,7 +364,7 @@ Plugin.prototype.init = function() {
         .getEntry({
           namespace: namespace,
           compute: compute,
-          connector: { type: self.options.apiHelperType },
+          connector: { id: self.options.apiHelperType },
           path: [database, table]
         })
         .done(entry => {

+ 5 - 1
desktop/core/src/desktop/js/ko/bindings/ko.sqlContextPopover.js

@@ -54,7 +54,11 @@ ko.bindingHandlers.sqlContextPopover = {
             !options.connector &&
             (options.sourceType === 'hive' || options.sourceType === 'impala')
           ) {
-            options.connector = { optimizer: 'api' };
+            options.connector = {
+              optimizer: 'api',
+              id: options.sourceType,
+              dialect: options.sourceType
+            };
           }
           dataCatalog.getEntry(options).done(entry => {
             const $source = $(element);

+ 2 - 2
desktop/core/src/desktop/js/ko/components/assist/assistDbEntry.js

@@ -478,7 +478,7 @@ class AssistDbEntry {
         '/metastore/tables/' +
         self.catalogEntry.name +
         '?source=' +
-        self.catalogEntry.getConnector().type +
+        self.catalogEntry.getConnector().id +
         '&namespace=' +
         self.catalogEntry.namespace.id;
     } else if (self.catalogEntry.isTableOrView()) {
@@ -488,7 +488,7 @@ class AssistDbEntry {
         '/' +
         self.catalogEntry.name +
         '?source=' +
-        self.catalogEntry.getConnector().type +
+        self.catalogEntry.getConnector().id +
         '&namespace=' +
         self.catalogEntry.namespace.id;
     } else {

+ 3 - 3
desktop/core/src/desktop/js/ko/components/assist/assistDbNamespace.js

@@ -148,7 +148,7 @@ class AssistDbNamespace {
         if (!self.navigationSettings.rightAssist) {
           const entry = self.selectedDatabase().catalogEntry;
           apiHelper.setInTotalStorage(
-            'assist_' + entry.getConnector().type + '_' + entry.namespace.id,
+            'assist_' + entry.getConnector().id + '_' + entry.namespace.id,
             'lastSelectedDb',
             entry.name
           );
@@ -156,7 +156,7 @@ class AssistDbNamespace {
         }
       } else {
         apiHelper.setInTotalStorage(
-          'assist_' + self.connector.type + '_' + self.namespace.id,
+          'assist_' + self.connector.id + '_' + self.namespace.id,
           'lastSelectedDb',
           ''
         );
@@ -273,7 +273,7 @@ class AssistDbNamespace {
       huePubSub.subscribe('data.catalog.entry.refreshed', details => {
         if (
           self.namespace.id !== details.entry.namespace.id ||
-          details.entry.getConnector().type !== self.sourceType
+          details.entry.getConnector().id !== self.sourceType
         ) {
           return;
         }

+ 2 - 2
desktop/core/src/desktop/js/ko/components/assist/assistDbSource.js

@@ -108,8 +108,8 @@ class AssistDbSource {
 
     self.hasNamespaces = ko.pureComputed(() => self.namespaces().length > 0);
 
-    huePubSub.subscribe(NAMESPACES_REFRESHED_EVENT, connectorType => {
-      if (self.connector.type !== connectorType) {
+    huePubSub.subscribe(NAMESPACES_REFRESHED_EVENT, connectorId => {
+      if (self.connector.id !== connectorId) {
         return;
       }
 

+ 1 - 0
desktop/core/src/desktop/js/ko/components/assist/assistStorageEntry.js

@@ -354,6 +354,7 @@ class AssistStorageEntry {
     type = type.replace(/adl.*/i, 'adls');
     type = type.replace(/abfs.*/i, 'abfs');
 
+    // TODO: connector.id for browser connectors
     const connector = findBrowserConnector(connector => connector.type === type);
     if (connector) {
       const rootPath = getRootFilePath(connector);

+ 2 - 2
desktop/core/src/desktop/js/ko/components/assist/ko.assistDashboardPanel.js

@@ -86,7 +86,7 @@ class AssistDashboardPanel {
         .getEntry({
           namespace: collection.activeNamespace,
           compute: collection.activeCompute,
-          connector: { type: sourceType }, // TODO: Use connectors in assist dashboard panel
+          connector: { id: sourceType }, // TODO: Use connectors in assist dashboard panel
           path: [fakeParentName],
           definition: { type: 'database' }
         })
@@ -103,7 +103,7 @@ class AssistDashboardPanel {
             .getEntry({
               namespace: collection.activeNamespace,
               compute: collection.activeCompute,
-              connector: { type: sourceType }, // TODO: Use connectors in assist dashboard panel
+              connector: { id: sourceType }, // TODO: Use connectors in assist dashboard panel
               path: [
                 fakeParentName,
                 collectionName.indexOf('.') > -1 ? collectionName.split('.')[1] : collectionName

+ 8 - 8
desktop/core/src/desktop/js/ko/components/assist/ko.assistDbPanel.js

@@ -617,7 +617,7 @@ class AssistDbPanel {
       window.setTimeout(() => {
         let foundSource;
         this.sources().some(source => {
-          if (source.sourceType === catalogEntry.getConnector().type) {
+          if (source.sourceType === catalogEntry.getConnector().id) {
             foundSource = source;
             return true;
           }
@@ -641,7 +641,7 @@ class AssistDbPanel {
               .getEntry({
                 namespace: assistDbNamespace.namespace,
                 compute: assistDbNamespace.compute(),
-                connector: { type: 'solr' },
+                connector: { id: 'solr' },
                 path: []
               })
               .done(entry => {
@@ -657,16 +657,16 @@ class AssistDbPanel {
       });
     } else if (!this.isSolr && !this.isStreams) {
       huePubSub.subscribe(ASSIST_SET_DATABASE_EVENT, databaseDef => {
-        if (!databaseDef.connector || !this.sourceIndex[databaseDef.connector.type]) {
+        if (!databaseDef.connector || !this.sourceIndex[databaseDef.connector.id]) {
           return;
         }
-        this.selectedSource(this.sourceIndex[databaseDef.connector.type]);
+        this.selectedSource(this.sourceIndex[databaseDef.connector.id]);
         this.setDatabaseWhenLoaded(databaseDef.namespace, databaseDef.name);
       });
 
       const getSelectedDatabase = connector => {
         const deferred = $.Deferred();
-        const assistDbSource = this.sourceIndex[connector.type];
+        const assistDbSource = this.sourceIndex[connector.id];
         if (assistDbSource) {
           assistDbSource.loadedDeferred.done(() => {
             if (assistDbSource.selectedNamespace()) {
@@ -678,7 +678,7 @@ class AssistDbPanel {
                 } else {
                   let lastSelectedDb = apiHelper.getFromTotalStorage(
                     'assist_' +
-                      connector.type +
+                      connector.id +
                       '_' +
                       assistDbSource.selectedNamespace().namespace.id,
                     'lastSelectedDb'
@@ -845,10 +845,10 @@ class AssistDbPanel {
       const connectors = filterEditorConnectors(connector => connector.is_sql);
       connectors.forEach(connector => {
         const source =
-          this.sourceIndex[connector.type] ||
+          this.sourceIndex[connector.id] ||
           new AssistDbSource({
             i18n: this.i18n,
-            type: connector.type, // TODO: Remove redundant
+            type: connector.id, // TODO: Remove redundant
             name: connector.name, // TODO: Remove redundant
             connector: connector,
             nonSqlType: false,

+ 8 - 8
desktop/core/src/desktop/js/ko/components/assist/ko.assistEditorContextPanel.js

@@ -584,19 +584,19 @@ class AssistEditorContextPanel {
     };
 
     huePubSub.subscribe('data.catalog.entry.refreshed', details => {
-      const sourceType = details.entry.getConnector().type;
-      if (sources[sourceType]) {
+      const connectorId = details.entry.getConnector().id;
+      if (sources[connectorId]) {
         let completeRefresh = false;
         if (details.entry.isSource()) {
-          sources[sourceType].databaseIndex = {};
-          sources[sourceType].activeTableIndex = {};
+          sources[connectorId].databaseIndex = {};
+          sources[connectorId].activeTableIndex = {};
           completeRefresh = true;
         } else if (
           details.entry.isDatabase() &&
-          sources[sourceType].databaseIndex[details.entry.name]
+          sources[connectorId].databaseIndex[details.entry.name]
         ) {
-          const dbEntry = sources[sourceType].databaseIndex[details.entry.name];
-          const activeTableIndex = sources[sourceType].activeTableIndex;
+          const dbEntry = sources[connectorId].databaseIndex[details.entry.name];
+          const activeTableIndex = sources[connectorId].activeTableIndex;
           Object.keys(activeTableIndex).forEach(tableKey => {
             const tableEntry = activeTableIndex[tableKey];
             if (tableEntry.parent === dbEntry) {
@@ -605,7 +605,7 @@ class AssistEditorContextPanel {
             }
           });
         } else if (details.entry.isTableOrView()) {
-          const activeTableIndex = sources[sourceType].activeTableIndex;
+          const activeTableIndex = sources[connectorId].activeTableIndex;
           if (activeTableIndex[details.entry.getQualifiedPath()]) {
             delete activeTableIndex[details.entry.getQualifiedPath()];
             completeRefresh = true;

+ 3 - 3
desktop/core/src/desktop/js/ko/components/assist/ko.rightAssistPanel.js

@@ -116,7 +116,7 @@ class RightAssistPanel {
       () => this.connector() && this.connector().is_sql
     );
     this.dashboardAssistantTabAvailable = ko.pureComputed(
-      () => this.connector() && this.connector().type === 'dashboard'
+      () => this.connector() && this.connector().id === 'dashboard'
     );
     this.functionsTabAvailable = ko.pureComputed(
       () =>
@@ -186,7 +186,7 @@ class RightAssistPanel {
     const updateContentsForConnector = connector => {
       this.connector(connector);
       this.schedulesTabAvailable(false);
-      if (connector && connector.type !== 'dashboard') {
+      if (connector && connector.id !== 'dashboard') {
         if (window.ENABLE_QUERY_SCHEDULING) {
           huePubSub.subscribeOnce('set.current.app.view.model', viewModel => {
             // Async
@@ -205,7 +205,7 @@ class RightAssistPanel {
 
     const onAppChange = appName => {
       if (appName === 'dashboard') {
-        updateContentsForConnector({ type: appName, is_sql: false });
+        updateContentsForConnector({ id: appName, is_sql: false });
       }
     };
     huePubSub.publish('get.current.app.name', onAppChange);

+ 1 - 1
desktop/core/src/desktop/js/ko/components/contextPopover/asteriskContextTabs.js

@@ -97,7 +97,7 @@ class AsteriskData {
           .getEntry({
             namespace: namespace,
             compute: compute,
-            connector: { type: sourceType }, // TODO: Add connector to asteriskContextTabs
+            connector: { id: sourceType }, // TODO: Add connector to asteriskContextTabs
             path: path
           })
           .done(entry => {

+ 2 - 2
desktop/core/src/desktop/js/ko/components/contextPopover/dataCatalogContext.js

@@ -193,7 +193,7 @@ class DataCatalogContext {
       '/hue/dashboard/browse/' +
         self.catalogEntry().path.join('.') +
         '?engine=' +
-        self.catalogEntry().getConnector().type
+        self.catalogEntry().getConnector().id
     );
     huePubSub.publish('context.popover.hide');
     huePubSub.publish('global.search.close');
@@ -207,7 +207,7 @@ class DataCatalogContext {
         (self.catalogEntry().isTableOrView() ? '/' : 's/') +
         self.catalogEntry().path.join('/') +
         '?source_type=' +
-        self.catalogEntry().getConnector().type +
+        self.catalogEntry().getConnector().id +
         '&namespace=' +
         self.catalogEntry().namespace.id
     );

+ 6 - 6
desktop/core/src/desktop/js/ko/components/contextPopover/ko.contextPopover.js

@@ -908,14 +908,14 @@ class SqlContextContentsGlobalSearch {
       adaptedData.identifierChain.push({ name: part });
     });
 
-    let sourceType = params.data.sourceType && params.data.sourceType.toLowerCase();
+    let connectorId = params.data.sourceType && params.data.sourceType.toLowerCase();
 
-    if (!sourceType || sourceType === 'hive') {
+    if (!connectorId || connectorId === 'hive') {
       huePubSub.publish(GET_KNOWN_CONFIG_EVENT, clusterConfig => {
         if (clusterConfig) {
           const defaultEditor = clusterConfig['default_sql_interpreter'];
-          if (!sourceType || (sourceType === 'hive' && defaultEditor === 'impala')) {
-            sourceType = defaultEditor;
+          if (!connectorId || (connectorId === 'hive' && defaultEditor === 'impala')) {
+            connectorId = defaultEditor;
           }
         }
       });
@@ -923,11 +923,11 @@ class SqlContextContentsGlobalSearch {
 
     if (self.isCatalogEntry) {
       // TODO: Connector, Namespace and compute selection for global search results?
-      let connector = findEditorConnector(connector => connector.type === sourceType);
+      let connector = findEditorConnector(connector => connector.id === connectorId);
 
       if (!connector) {
         // TODO: Global search results are referring to dialect and not type
-        connector = findEditorConnector(connector => connector.dialect === sourceType);
+        connector = findEditorConnector(connector => connector.dialect === connectorId);
       }
       contextCatalog.getNamespaces({ connector: connector }).done(context => {
         dataCatalog

+ 2 - 2
desktop/core/src/desktop/js/ko/components/contextPopover/ko.quickQueryContext.js

@@ -122,7 +122,7 @@ class QuickQueryContext extends DisposableComponent {
       () => !this.namespace() || !this.compute() || !this.database()
     );
     this.dialect = ko.pureComputed(() => this.connector() && this.connector().dialect);
-    this.type = ko.pureComputed(() => this.connector() && this.connector().type);
+    this.type = ko.pureComputed(() => this.connector() && this.connector().id);
     this.defaultLimit = ko.observable(10);
 
     this.executor = new Executor({
@@ -167,7 +167,7 @@ class QuickQueryContext extends DisposableComponent {
     const found =
       this.connector() &&
       this.availableConnectors().some(connector => {
-        if (connector.type === this.connector().type) {
+        if (connector.id === this.connector().id) {
           this.connector(connector);
           return true;
         }

+ 1 - 1
desktop/core/src/desktop/js/ko/components/contextPopover/ko.quickQueryContext.test.js

@@ -27,7 +27,7 @@ describe('ko.quickQueryContext.js', () => {
   it('should render component', async () => {
     const connectorsSpy = jest
       .spyOn(hueConfig, 'filterEditorConnectors')
-      .mockImplementation(() => [{ type: 'impala' }]);
+      .mockImplementation(() => [{ id: 'impala' }]);
     const computeSpy = jest
       .spyOn(apiHelper, 'fetchContextComputes')
       .mockImplementation(() => $.Deferred().resolve({}));

+ 4 - 4
desktop/core/src/desktop/js/ko/components/ko.contextSelector.js

@@ -216,8 +216,8 @@ const HueContextSelector = function(params) {
 
   let refreshThrottle = -1;
 
-  const refresh = function(connectorType) {
-    if (!connectorType || ko.unwrap(self.connector).type === connectorType) {
+  const refresh = function(connectorId) {
+    if (!connectorId || ko.unwrap(self.connector).id === connectorId) {
       window.clearTimeout(refreshThrottle);
       refreshThrottle = window.setTimeout(() => {
         TYPES.forEach(self.reload.bind(self));
@@ -245,7 +245,7 @@ const HueContextSelector = function(params) {
   if (self.database) {
     huePubSub.subscribe('data.catalog.entry.refreshed', details => {
       if (details.entry.isSource()) {
-        if (ko.unwrap(self.connector).type === details.entry.getConnector().type) {
+        if (ko.unwrap(self.connector).id === details.entry.getConnector().id) {
           self.reloadDatabases();
         }
       }
@@ -445,7 +445,7 @@ HueContextSelector.prototype.reloadDatabases = function() {
                 .always(() => {
                   let lastSelectedDb = apiHelper.getFromTotalStorage(
                     'assist_' +
-                      ko.unwrap(self.connector).type +
+                      ko.unwrap(self.connector).id +
                       '_' +
                       self[TYPES_INDEX.namespace.name]().id,
                     'lastSelectedDb'

+ 1 - 1
desktop/core/src/desktop/js/ko/components/ko.contextSelector.test.js

@@ -22,7 +22,7 @@ describe('ko.contextSelector.js', () => {
 
   it('should render component', async () => {
     const element = await setup.renderComponent(CONTEXT_SELECTOR_COMPONENT, {
-      connector: { type: 'foo' }
+      connector: { id: 'foo' }
     });
 
     expect(element.innerHTML).toMatchSnapshot();

+ 1 - 1
desktop/core/src/desktop/js/ko/components/ko.pollingCatalogEntriesList.js

@@ -142,7 +142,7 @@ class PollingCatalogEntriesList {
       .getEntry({
         namespace: ko.unwrap(self.namespace),
         compute: ko.unwrap(self.compute),
-        connector: { type: ko.unwrap(self.sourceType) }, // TODO: Use connectors in polling catalog entries list
+        connector: { id: ko.unwrap(self.sourceType) }, // TODO: Use connectors in polling catalog entries list
         path: ko.unwrap(self.path)
       })
       .done(catalogEntry => {

+ 6 - 6
desktop/core/src/desktop/js/ko/components/simpleAceEditor/ko.simpleAceEditor.js

@@ -26,7 +26,7 @@ import SolrQueryAutocompleter from './solrQueryAutocompleter';
 import SqlAutocompleter from 'sql/sqlAutocompleter';
 import sqlWorkerHandler from 'sql/sqlWorkerHandler';
 import AceGutterHandler from 'ko/bindings/ace/aceGutterHandler';
-import { findEditorConnector } from '../../../utils/hueConfig';
+import { findEditorConnector } from 'utils/hueConfig';
 
 export const NAME = 'hue-simple-ace-editor';
 export const MULTI_NAME = 'hue-simple-ace-editor-multi';
@@ -103,16 +103,16 @@ class SimpleAceEditor {
       const autocomplete = ko.unwrap(params.autocomplete);
       let connector = ko.unwrap(autocomplete.connector);
 
-      if (!connector || !connector.type) {
-        const type =
+      if (!connector || !connector.id) {
+        const connectorId =
           autocomplete.type.indexOf('Query') !== -1
             ? autocomplete.type.replace('Query', '')
             : autocomplete.type;
-        connector = findEditorConnector(connector => connector.type === type);
+        connector = findEditorConnector(connector => connector.id === connectorId);
 
         // TODO: Temporary fix for dashboard
         if (!connector) {
-          connector = { type: type };
+          connector = { id: connectorId };
         }
       }
 
@@ -120,7 +120,7 @@ class SimpleAceEditor {
         autocompleteSettings: {
           temporaryOnly: params.temporaryOnly
         },
-        type: ko.observable(connector.type),
+        type: ko.observable(connector.id),
         dialect: ko.observable(connector.dialect),
         connector: ko.observable(connector),
         id: ko.observable($element.attr('id')),

+ 1 - 0
desktop/core/src/desktop/js/sql/autocompleteResults.js

@@ -1337,6 +1337,7 @@ class AutocompleteResults {
         fetchFunction = 'fetchAbfsPath';
         path = path.substring(6);
         if (path === '/') {
+          // TODO: connector.id for browsers
           const connector = findBrowserConnector(connector => connector.type === 'abfs');
           const rootPath = getRootFilePath(connector);
           if (rootPath) {

+ 1 - 1
desktop/core/src/desktop/js/sql/autocompleteResults.test.js

@@ -236,7 +236,7 @@ describe('AutocompleteResults.js', () => {
         return 'hive';
       },
       connector: function() {
-        return { type: 'hive' };
+        return { id: 'hive' };
       },
       database: function() {
         return 'default';

+ 2 - 2
desktop/core/src/desktop/js/sql/sqlUtils.js

@@ -734,7 +734,7 @@ const resolveCatalogEntry = options => {
       // TODO: Use connectors in sqlUtils
       dataCatalog
         .getChildren({
-          connector: { type: options.sourceType },
+          connector: { id: options.sourceType },
           namespace: options.namespace,
           compute: options.compute,
           path: identifierChainToPath(nextTable.identifierChain),
@@ -771,7 +771,7 @@ const resolveCatalogEntry = options => {
       .getEntry({
         namespace: options.namespace,
         compute: options.compute,
-        connector: { type: options.sourceType }, // TODO: Use connector in sqlUtils
+        connector: { id: options.sourceType }, // TODO: Use connector in sqlUtils
         path: [],
         cachedOnly: options && options.cachedOnly,
         cancellable: options && options.cancellable,

+ 3 - 3
desktop/core/src/desktop/static/desktop/js/jquery.hiveautocomplete.js

@@ -53,7 +53,7 @@
     if (self.options.namespace) {
       self.namespaceDeferred.resolve(self.options.namespace);
     } else {
-      contextCatalog.getNamespaces({ connector: { type: options.apiHelperType } }).done(function (context) {
+      contextCatalog.getNamespaces({ connector: { id: options.apiHelperType } }).done(function (context) {
         if (context.namespaces && context.namespaces.length) {
           self.namespaceDeferred.resolve(context.namespaces[0]);
         } else {
@@ -273,7 +273,7 @@
     self.getDatabases = function (callback) {
       var self = this;
       $.when(self.namespaceDeferred, self.computeDeferred).done(function (namespace, compute) {
-        dataCatalog.getChildren({ connector: { type: self.options.apiHelperType }, namespace: namespace, compute: compute, path: [] }).done(function (dbEntries) {
+        dataCatalog.getChildren({ connector: { id: self.options.apiHelperType }, namespace: namespace, compute: compute, path: [] }).done(function (dbEntries) {
           callback($.map(dbEntries, function (entry) { return entry.name }));
         });
       })
@@ -281,7 +281,7 @@
 
     // TODO: Use connector for hive autocomplete
     const connector = {
-      type: self.options.apiHelperType
+      id: self.options.apiHelperType
     };
 
     self.getTables = function (database, callback) {

+ 1 - 1
desktop/libs/dashboard/src/dashboard/static/dashboard/js/search.ko.js

@@ -559,7 +559,7 @@ var Collection = function (vm, collection) {
   self.activeNamespace = ko.observable();
   self.activeCompute = ko.observable();
 
-  contextCatalog.getNamespaces({ connector: { type: collection.engine || 'solr' } }).done(function (context) {
+  contextCatalog.getNamespaces({ connector: { id: collection.engine || 'solr' } }).done(function (context) {
     // TODO: Namespace selection
     self.activeNamespace(context.namespaces[0]);
     self.activeCompute(context.namespaces[0].computes[0]);

+ 3 - 3
desktop/libs/indexer/src/indexer/templates/importer.mako

@@ -1668,7 +1668,7 @@ ${ commonheader(_("Importer"), "indexer", user, request, "60px") | n,unicode }
           var handle = dataCatalog.addTemporaryTable({
             namespace: self.namespace(),
             compute: self.compute(),
-            connector: { type: self.sourceType }, // TODO: Migrate importer to connectors
+            connector: { id: self.sourceType }, // TODO: Migrate importer to connectors
             name: tableName,
             columns: temporaryColumns,
             sample: self.sample()
@@ -2143,7 +2143,7 @@ ${ commonheader(_("Importer"), "indexer", user, request, "60px") | n,unicode }
           wizard.computeSetDeferred.done(function () {
             dataCatalog.getEntry({
               compute: wizard.compute(),
-              connector: { type: self.sourceType }, // TODO: Use connectors in the importer
+              connector: { id: self.sourceType }, // TODO: Use connectors in the importer
               namespace: wizard.namespace(),
               path: self.outputFormat() === 'table' ? [self.databaseName(), self.tableName()] : [],
             }).done(function (catalogEntry) {
@@ -2527,7 +2527,7 @@ ${ commonheader(_("Importer"), "indexer", user, request, "60px") | n,unicode }
       self.computeSetDeferred = $.Deferred();
 
       // TODO: Use connectors in the importer
-      contextCatalog.getNamespaces({ connector: { type: vm.sourceType } }).done(function (context) {
+      contextCatalog.getNamespaces({ connector: { id: vm.sourceType } }).done(function (context) {
         self.namespaces(context.namespaces);
         if (!vm.namespaceId || !context.namespaces.some(function (namespace) {
           if (namespace.id === vm.namespaceId) {

+ 1 - 1
desktop/libs/indexer/src/indexer/templates/indexes.mako

@@ -645,7 +645,7 @@ ${ commonheader(_("Index Browser"), "search", user, request, "60px") | n,unicode
       self.activeCompute = ko.observable();
 
       // TODO: Use connectors in indexes
-      contextCatalog.getNamespaces({ connector: { type: 'solr' }}).done(function (context) {
+      contextCatalog.getNamespaces({ connector: { id: 'solr' }}).done(function (context) {
         // TODO: Namespace selection
         self.activeNamespace(context.namespaces[0]);
         self.activeCompute(context.namespaces[0].computes[0]);

+ 1 - 1
desktop/libs/indexer/src/indexer/templates/topics.mako

@@ -576,7 +576,7 @@ ${ commonheader(_("Streams Browser"), "search", user, request, "60px") | n,unico
       self.activeCompute = ko.observable();
 
       // TODO: Use connectors in topics
-      contextCatalog.getNamespaces({ connector: { type: 'solr' } }).done(function (context) {
+      contextCatalog.getNamespaces({ connector: { id: 'solr' } }).done(function (context) {
         // TODO: Namespace selection
         self.activeNamespace(context.namespaces[0]);
         self.activeCompute(context.namespaces[0].computes[0]);