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

HUE-8758 [frontend] Use connector instead of sourceType in the contextCatalog

Johan Ahlen 5 жил өмнө
parent
commit
94ced036a4
21 өөрчлөгдсөн 147 нэмэгдсэн , 127 устгасан
  1. 3 3
      apps/jobbrowser/src/jobbrowser/templates/job_browser.mako
  2. 2 2
      apps/oozie/src/oozie/static/oozie/js/workflow-editor.ko.js
  3. 2 1
      apps/pig/src/pig/templates/app.mako
  4. 6 6
      desktop/core/src/desktop/js/api/apiHelper.js
  5. 4 4
      desktop/core/src/desktop/js/apps/table_browser/metastoreSource.js
  6. 74 65
      desktop/core/src/desktop/js/catalog/contextCatalog.js
  7. 1 1
      desktop/core/src/desktop/js/jquery/plugins/jquery.hiveautocomplete.js
  8. 6 6
      desktop/core/src/desktop/js/ko/components/assist/assistDbSource.js
  9. 1 1
      desktop/core/src/desktop/js/ko/components/contextPopover/__snapshots__/ko.quickQueryContext.test.js.snap
  10. 9 7
      desktop/core/src/desktop/js/ko/components/contextPopover/ko.contextPopover.js
  11. 3 3
      desktop/core/src/desktop/js/ko/components/contextPopover/ko.quickQueryContext.js
  12. 17 17
      desktop/core/src/desktop/js/ko/components/ko.contextSelector.js
  13. 4 2
      desktop/core/src/desktop/js/ko/components/ko.contextSelector.test.js
  14. 6 1
      desktop/core/src/desktop/js/ko/components/simpleAceEditor/ko.simpleAceEditor.js
  15. 1 1
      desktop/core/src/desktop/static/desktop/js/jquery.hiveautocomplete.js
  16. 1 1
      desktop/libs/dashboard/src/dashboard/static/dashboard/js/search.ko.js
  17. 2 1
      desktop/libs/indexer/src/indexer/templates/importer.mako
  18. 2 1
      desktop/libs/indexer/src/indexer/templates/indexes.mako
  19. 2 1
      desktop/libs/indexer/src/indexer/templates/topics.mako
  20. 0 1
      desktop/libs/notebook/src/notebook/templates/editor_components.mako
  21. 1 2
      desktop/libs/notebook/src/notebook/templates/editor_components2.mako

+ 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: {
-        sourceType: 'impala',
+        connector: { type: '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: {
-        sourceType: 'jobs',
+        connector: { type: '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: {
-                sourceType: 'jobs',
+                connector: { type: 'jobs' },
                 cluster: cluster,
                 onClusterSelect: onClusterSelect
               }

+ 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({ sourceType: 'oozie' }).done(function (context) { self.availableNamespaces(context.namespaces) });
-  contextCatalog.getComputes({ sourceType: 'oozie' }).done(self.availableComputes);
+  contextCatalog.getNamespaces({ connector: { type: 'oozie' } }).done(function (context) { self.availableNamespaces(context.namespaces) });
+  contextCatalog.getComputes({ connector: { type: 'oozie' } }).done(self.availableComputes);
 
 
   self.previewColumns = ko.observable("");

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

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

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

@@ -2526,33 +2526,33 @@ class ApiHelper {
   /**
    * @param {Object} options
    * @param {boolean} [options.silenceErrors]
-   * @param {string} options.sourceType
+   * @param {Connector} options.connector
    * @return {Promise}
    */
   fetchContextNamespaces(options) {
-    const url = '/desktop/api2/context/namespaces/' + options.sourceType;
+    const url = '/desktop/api2/context/namespaces/' + options.connector.type;
     return simpleGet(url, undefined, options);
   }
 
   /**
    * @param {Object} options
    * @param {boolean} [options.silenceErrors]
-   * @param {string} options.sourceType
+   * @param {Connector} options.connector
    * @return {Promise}
    */
   fetchContextComputes(options) {
-    const url = '/desktop/api2/context/computes/' + options.sourceType;
+    const url = '/desktop/api2/context/computes/' + options.connector.type;
     return simpleGet(url, undefined, options);
   }
 
   /**
    * @param {Object} options
    * @param {boolean} [options.silenceErrors]
-   * @param {string} options.sourceType
+   * @param {Connector} options.connector
    * @return {Promise}
    */
   fetchContextClusters(options) {
-    const url = '/desktop/api2/context/clusters/' + options.sourceType;
+    const url = '/desktop/api2/context/clusters/' + options.connector.type;
     return simpleGet(url, undefined, options);
   }
 

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

@@ -18,7 +18,7 @@ import $ from 'jquery';
 import * as ko from 'knockout';
 
 import apiHelper from 'api/apiHelper';
-import contextCatalog from 'catalog/contextCatalog';
+import contextCatalog, { NAMESPACES_REFRESHED_EVENT } from 'catalog/contextCatalog';
 import huePubSub from 'utils/huePubSub';
 import MetastoreNamespace from 'apps/table_browser/metastoreNamespace';
 import {
@@ -148,8 +148,8 @@ class MetastoreSource {
         });
     };
 
-    huePubSub.subscribe('context.catalog.namespaces.refreshed', sourceType => {
-      if (this.type !== sourceType) {
+    huePubSub.subscribe(NAMESPACES_REFRESHED_EVENT, connectorType => {
+      if (this.type !== connectorType) {
         return;
       }
       const previousState = getCurrentState();
@@ -203,7 +203,7 @@ class MetastoreSource {
   loadNamespaces() {
     this.loading(true);
     contextCatalog
-      .getNamespaces({ sourceType: this.type })
+      .getNamespaces({ connector: this.connector() })
       .done(context => {
         const namespacesWithComputes = context.namespaces.filter(
           namespace => namespace.computes.length

+ 74 - 65
desktop/core/src/desktop/js/catalog/contextCatalog.js

@@ -20,6 +20,10 @@ import localforage from 'localforage';
 import apiHelper from 'api/apiHelper';
 import huePubSub from 'utils/huePubSub';
 
+export const REFRESH_CONTEXT_CATALOG_EVENT = 'context.catalog.refresh';
+export const CONTEXT_CATALOG_REFRESHED_EVENT = 'context.catalog.refreshed';
+export const NAMESPACES_REFRESHED_EVENT = 'context.catalog.namespaces.refreshed';
+
 /**
  * @typedef {Object} ContextCompute
  * @property {string} id
@@ -52,7 +56,7 @@ class ContextCatalog {
 
     const addPubSubs = () => {
       if (typeof huePubSub !== 'undefined') {
-        huePubSub.subscribe('context.catalog.refresh', () => {
+        huePubSub.subscribe(REFRESH_CONTEXT_CATALOG_EVENT, () => {
           const namespacesToRefresh = Object.keys(self.namespaces);
           self.namespaces = {};
           self.namespacePromises = {};
@@ -62,9 +66,9 @@ class ContextCatalog {
 
           self.clusters = {};
           self.clusterPromises = {};
-          huePubSub.publish('context.catalog.refreshed');
-          namespacesToRefresh.forEach(sourceType => {
-            huePubSub.publish('context.catalog.namespaces.refreshed', sourceType);
+          huePubSub.publish(CONTEXT_CATALOG_REFRESHED_EVENT);
+          namespacesToRefresh.forEach(connectorType => {
+            huePubSub.publish(NAMESPACES_REFRESHED_EVENT, connectorType);
           });
         });
       } else {
@@ -84,17 +88,17 @@ class ContextCatalog {
     return self.store;
   }
 
-  saveLater(contextType, sourceType, entry) {
+  saveLater(contextType, connectorType, entry) {
     const self = this;
     window.setTimeout(() => {
-      self.getStore().setItem(sourceType + '_' + contextType, {
+      self.getStore().setItem(connectorType + '_' + contextType, {
         version: CONTEXT_CATALOG_VERSION,
         entry: entry
       });
     }, 1000);
   }
 
-  getSaved(contextType, sourceType) {
+  getSaved(contextType, connectorType) {
     const self = this;
     const deferred = $.Deferred();
 
@@ -104,7 +108,7 @@ class ContextCatalog {
 
     self
       .getStore()
-      .getItem(sourceType + '_' + contextType)
+      .getItem(connectorType + '_' + contextType)
       .then(saved => {
         if (saved && saved.version === CONTEXT_CATALOG_VERSION) {
           deferred.resolve(saved.entry);
@@ -122,34 +126,35 @@ class ContextCatalog {
 
   /**
    * @param {Object} options
-   * @param {string} options.sourceType
+   * @param {Connector} options.connector
    * @param {boolean} [options.clearCache] - Default False
    * @param {boolean} [options.silenceErrors] - Default False
    * @return {Promise}
    */
   getNamespaces(options) {
     const self = this;
+    const connectorType = options.connector.type;
 
-    const notifyForRefresh = self.namespacePromises[options.sourceType] && options.clearCache;
+    const notifyForRefresh = self.namespacePromises[connectorType] && options.clearCache;
     if (options.clearCache) {
-      self.namespacePromises[options.sourceType] = undefined;
-      self.namespaces[options.sourceType] = undefined;
+      self.namespacePromises[connectorType] = undefined;
+      self.namespaces[connectorType] = undefined;
     }
 
-    if (self.namespacePromises[options.sourceType]) {
-      return self.namespacePromises[options.sourceType];
+    if (self.namespacePromises[connectorType]) {
+      return self.namespacePromises[connectorType];
     }
 
-    if (self.namespaces[options.sourceType]) {
-      self.namespacePromises[options.sourceType] = $.Deferred()
-        .resolve(self.namespaces[options.sourceType])
+    if (self.namespaces[connectorType]) {
+      self.namespacePromises[connectorType] = $.Deferred()
+        .resolve(self.namespaces[connectorType])
         .promise();
-      return self.namespacePromises[options.sourceType];
+      return self.namespacePromises[connectorType];
     }
 
     const deferred = $.Deferred();
 
-    self.namespacePromises[options.sourceType] = deferred.promise();
+    self.namespacePromises[connectorType] = deferred.promise();
 
     const startingNamespaces = {};
     const pollTimeout = -1;
@@ -159,8 +164,8 @@ class ContextCatalog {
       window.setTimeout(() => {
         if (Object.keys(startingNamespaces).length) {
           apiHelper.fetchContextNamespaces(options).done(namespaces => {
-            if (namespaces[options.sourceType]) {
-              const namespaces = namespaces[options.sourceType];
+            if (namespaces[connectorType]) {
+              const namespaces = namespaces[connectorType];
               if (namespaces) {
                 let statusChanged = false;
                 namespaces.forEach(namespace => {
@@ -171,7 +176,7 @@ class ContextCatalog {
                   }
                 });
                 if (statusChanged) {
-                  huePubSub.publish('context.catalog.namespaces.refreshed', options.sourceType);
+                  huePubSub.publish(NAMESPACES_REFRESHED_EVENT, connectorType);
                 }
                 if (Object.keys(startingNamespaces).length) {
                   pollForStarted();
@@ -196,9 +201,9 @@ class ContextCatalog {
 
     const fetchNamespaces = () => {
       apiHelper.fetchContextNamespaces(options).done(namespaces => {
-        if (namespaces[options.sourceType]) {
+        if (namespaces[connectorType]) {
           const dynamic = namespaces.dynamicClusters;
-          namespaces = namespaces[options.sourceType];
+          namespaces = namespaces[connectorType];
           if (namespaces) {
             namespaces.forEach(namespace => {
               namespace.computes.forEach(compute => {
@@ -210,24 +215,24 @@ class ContextCatalog {
                 }
               });
             });
-            self.namespaces[options.sourceType] = {
+            self.namespaces[connectorType] = {
               namespaces: namespaces.filter(namespace => namespace.name),
               dynamic: dynamic,
               hueTimestamp: Date.now()
             };
-            deferred.resolve(self.namespaces[options.sourceType]);
+            deferred.resolve(self.namespaces[connectorType]);
             if (notifyForRefresh) {
-              huePubSub.publish('context.catalog.namespaces.refreshed', options.sourceType);
+              huePubSub.publish(NAMESPACES_REFRESHED_EVENT, connectorType);
             }
 
-            if (self.namespaces[options.sourceType].namespaces.length) {
+            if (self.namespaces[connectorType].namespaces.length) {
               self.saveLater(
                 NAMESPACES_CONTEXT_TYPE,
-                options.sourceType,
-                self.namespaces[options.sourceType]
+                connectorType,
+                self.namespaces[connectorType]
               );
             } else {
-              self.getStore().removeItem(options.sourceType + '_' + NAMESPACES_CONTEXT_TYPE);
+              self.getStore().removeItem(connectorType + '_' + NAMESPACES_CONTEXT_TYPE);
             }
           } else {
             deferred.reject();
@@ -240,22 +245,22 @@ class ContextCatalog {
 
     if (!options.clearCache) {
       self
-        .getSaved(NAMESPACES_CONTEXT_TYPE, options.sourceType)
+        .getSaved(NAMESPACES_CONTEXT_TYPE, connectorType)
         .done(namespaces => {
-          self.namespaces[options.sourceType] = namespaces;
-          deferred.resolve(self.namespaces[options.sourceType]);
+          self.namespaces[connectorType] = namespaces;
+          deferred.resolve(self.namespaces[connectorType]);
         })
         .fail(fetchNamespaces);
     } else {
       fetchNamespaces();
     }
 
-    return self.namespacePromises[options.sourceType];
+    return self.namespacePromises[connectorType];
   }
 
   /**
    * @param {Object} options
-   * @param {string} options.sourceType
+   * @param {Connector} options.connector
    * @param {boolean} [options.silenceErrors] - Default False
    * @param {boolean} [options.clearCache] - Default False
    * @return {Promise}
@@ -263,31 +268,33 @@ class ContextCatalog {
   getComputes(options) {
     const self = this;
 
+    const connectorType = options.connector.type;
+
     if (options.clearCache) {
-      self.computePromises[options.sourceType] = undefined;
-      self.computes[options.sourceType] = undefined;
+      self.computePromises[connectorType] = undefined;
+      self.computes[connectorType] = undefined;
     }
 
-    if (self.computePromises[options.sourceType]) {
-      return self.computePromises[options.sourceType];
+    if (self.computePromises[connectorType]) {
+      return self.computePromises[connectorType];
     }
 
-    if (self.computes[options.sourceType]) {
-      self.computePromises[options.sourceType] = $.Deferred()
-        .resolve(self.computes[options.sourceType])
+    if (self.computes[connectorType]) {
+      self.computePromises[connectorType] = $.Deferred()
+        .resolve(self.computes[connectorType])
         .promise();
-      return self.computePromises[options.sourceType];
+      return self.computePromises[connectorType];
     }
 
     const deferred = $.Deferred();
-    self.computePromises[options.sourceType] = deferred.promise();
+    self.computePromises[connectorType] = deferred.promise();
 
     apiHelper.fetchContextComputes(options).done(computes => {
-      if (computes[options.sourceType]) {
-        computes = computes[options.sourceType];
+      if (computes[connectorType]) {
+        computes = computes[connectorType];
         if (computes) {
-          self.computes[options.sourceType] = computes;
-          deferred.resolve(self.computes[options.sourceType]);
+          self.computes[connectorType] = computes;
+          deferred.resolve(self.computes[connectorType]);
           // TODO: save
         } else {
           deferred.reject();
@@ -297,42 +304,44 @@ class ContextCatalog {
       }
     });
 
-    return self.computePromises[options.sourceType];
+    return self.computePromises[connectorType];
   }
 
   /**
    * @param {Object} options
-   * @param {string} options.sourceType
+   * @param {Connector} options.connector
    * @param {boolean} [options.silenceErrors] - Default False
    * @return {Promise}
    */
   getClusters(options) {
     const self = this;
 
-    if (self.clusterPromises[options.sourceType]) {
-      return self.clusterPromises[options.sourceType];
+    const connectorType = options.connector.type;
+
+    if (self.clusterPromises[connectorType]) {
+      return self.clusterPromises[connectorType];
     }
 
-    if (self.clusters[options.sourceType]) {
-      self.clusterPromises[options.sourceType] = $.Deferred()
-        .resolve(self.clusters[options.sourceType])
+    if (self.clusters[connectorType]) {
+      self.clusterPromises[connectorType] = $.Deferred()
+        .resolve(self.clusters[connectorType])
         .promise();
-      return self.clusterPromises[options.sourceType];
+      return self.clusterPromises[connectorType];
     }
 
     const deferred = $.Deferred();
-    self.clusterPromises[options.sourceType] = deferred.promise();
+    self.clusterPromises[connectorType] = deferred.promise();
 
     apiHelper.fetchContextClusters(options).done(clusters => {
-      if (clusters && clusters[options.sourceType]) {
-        self.clusters[options.sourceType] = clusters[options.sourceType];
-        deferred.resolve(self.clusters[options.sourceType]);
+      if (clusters && clusters[connectorType]) {
+        self.clusters[connectorType] = clusters[connectorType];
+        deferred.resolve(self.clusters[connectorType]);
       } else {
         deferred.reject();
       }
     });
 
-    return self.clusterPromises[options.sourceType];
+    return self.clusterPromises[connectorType];
   }
 }
 
@@ -341,7 +350,7 @@ const contextCatalog = new ContextCatalog();
 export default {
   /**
    * @param {Object} options
-   * @param {string} options.sourceType
+   * @param {Connector} options.connector
    * @param {boolean} [options.clearCache] - Default False
    * @param {boolean} [options.silenceErrors] - Default False
    * @return {Promise}
@@ -350,7 +359,7 @@ export default {
 
   /**
    * @param {Object} options
-   * @param {string} options.sourceType
+   * @param {Connector} options.connector
    * @param {boolean} [options.silenceErrors] - Default False
    * @return {Promise}
    */
@@ -358,7 +367,7 @@ export default {
 
   /**
    * @param {Object} options
-   * @param {string} options.sourceType // TODO: rename?
+   * @param {Connector} options.connector
    * @param {boolean} [options.silenceErrors] - Default False
    * @return {Promise}
    */

+ 1 - 1
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({ sourceType: options.apiHelperType }).done(context => {
+    contextCatalog.getNamespaces({ connector: { type: options.apiHelperType } }).done(context => {
       if (context.namespaces && context.namespaces.length) {
         self.namespaceDeferred.resolve(context.namespaces[0]);
       } else {

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

@@ -19,7 +19,7 @@ import * as ko from 'knockout';
 
 import apiHelper from 'api/apiHelper';
 import AssistDbNamespace from 'ko/components/assist/assistDbNamespace';
-import contextCatalog from 'catalog/contextCatalog';
+import contextCatalog, { NAMESPACES_REFRESHED_EVENT } from 'catalog/contextCatalog';
 import huePubSub from 'utils/huePubSub';
 
 class AssistDbSource {
@@ -108,14 +108,14 @@ class AssistDbSource {
 
     self.hasNamespaces = ko.pureComputed(() => self.namespaces().length > 0);
 
-    huePubSub.subscribe('context.catalog.namespaces.refreshed', sourceType => {
-      if (self.sourceType !== sourceType) {
+    huePubSub.subscribe(NAMESPACES_REFRESHED_EVENT, connectorType => {
+      if (self.connector.type !== connectorType) {
         return;
       }
 
       self.loading(true);
       contextCatalog
-        .getNamespaces({ sourceType: self.sourceType })
+        .getNamespaces({ connector: self.connector })
         .done(context => {
           const newNamespaces = [];
           const existingNamespaceIndex = {};
@@ -159,11 +159,11 @@ class AssistDbSource {
     self.loading(true);
 
     if (refresh) {
-      contextCatalog.getComputes({ sourceType: self.sourceType, clearCache: true });
+      contextCatalog.getComputes({ connector: self.connector, clearCache: true });
     }
 
     return contextCatalog
-      .getNamespaces({ sourceType: self.sourceType, clearCache: refresh })
+      .getNamespaces({ connector: self.connector, clearCache: refresh })
       .done(context => {
         const assistNamespaces = [];
         let activeNamespace;

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

@@ -36,7 +36,7 @@ exports[`ko.quickQueryContext.js should render component 1`] = `
       component: {
         name: 'hue-context-selector',
         params: {
-          sourceType: connector().type,
+          connector: connector,
           compute: compute,
           namespace: namespace,
           availableDatabases: availableDatabases,

+ 9 - 7
desktop/core/src/desktop/js/ko/components/contextPopover/ko.contextPopover.js

@@ -33,7 +33,7 @@ import ResizeHelper from './resizeHelper';
 import StorageContext from './storageContext';
 import { ASSIST_KEY_COMPONENT } from 'ko/components/assist/ko.assistKey';
 import componentUtils from 'ko/components/componentUtils';
-import { GET_KNOWN_CONFIG_EVENT } from 'utils/hueConfig';
+import { findEditorConnector, GET_KNOWN_CONFIG_EVENT } from 'utils/hueConfig';
 import { DOCUMENT_CONTEXT_FOOTER } from './ko.documentContextFooter';
 
 export const CONTEXT_POPOVER_CLASS = 'hue-popover';
@@ -922,12 +922,14 @@ class SqlContextContentsGlobalSearch {
     }
 
     if (self.isCatalogEntry) {
-      contextCatalog.getNamespaces({ sourceType: sourceType }).done(context => {
-        // TODO: Connector, Namespace and compute selection for global search results?
-        const connector = {}; // TODO: Add connector to global search
-        if (sourceType === 'hive' || sourceType === 'impala') {
-          connector.optimizer = 'api';
-        }
+      // TODO: Connector, Namespace and compute selection for global search results?
+      let connector = findEditorConnector(connector => connector.type === sourceType);
+
+      if (!connector) {
+        // TODO: Global search results are referring to dialect and not type
+        connector = findEditorConnector(connector => connector.dialect === sourceType);
+      }
+      contextCatalog.getNamespaces({ connector: connector }).done(context => {
         dataCatalog
           .getEntry({
             namespace: context.namespaces[0],

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

@@ -17,7 +17,7 @@
 import * as ko from 'knockout';
 
 import { MULTI_NAME as SIMPLE_ACE_MULTI } from 'ko/components/simpleAceEditor/ko.simpleAceEditor';
-import { NAME as CONTEXT_SELECTOR } from 'ko/components/ko.contextSelector';
+import { CONTEXT_SELECTOR_COMPONENT } from 'ko/components/ko.contextSelector';
 import { NAME as DROP_DOWN } from 'ko/components/ko.dropDown';
 import { NAME as EXECUTABLE_ACTIONS } from 'apps/notebook2/components/ko.executableActions';
 import { NAME as SIMPLE_RESULT_GRID } from 'apps/notebook2/components/resultGrid/ko.simpleResultGrid';
@@ -48,9 +48,9 @@ const TEMPLATE = `
   <!-- ko if: connector() -->
     <div class="margin-left-10" style="display: inline-block" data-bind="
       component: {
-        name: '${ CONTEXT_SELECTOR }',
+        name: '${ CONTEXT_SELECTOR_COMPONENT }',
         params: {
-          sourceType: connector().type,
+          connector: connector,
           compute: compute,
           namespace: namespace,
           availableDatabases: availableDatabases,

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

@@ -19,13 +19,16 @@ import * as ko from 'knockout';
 
 import apiHelper from 'api/apiHelper';
 import componentUtils from './componentUtils';
-import contextCatalog from 'catalog/contextCatalog';
+import contextCatalog, {
+  CONTEXT_CATALOG_REFRESHED_EVENT,
+  NAMESPACES_REFRESHED_EVENT
+} from 'catalog/contextCatalog';
 import dataCatalog from 'catalog/dataCatalog';
 import huePubSub from 'utils/huePubSub';
 import I18n from 'utils/i18n';
 import { ASSIST_SET_DATABASE_EVENT } from './assist/events';
 
-export const NAME = 'hue-context-selector';
+export const CONTEXT_SELECTOR_COMPONENT = 'hue-context-selector';
 
 const TEMPLATE = `
   <!-- ko if: loadingContext -->
@@ -132,7 +135,7 @@ const TYPES = Object.keys(TYPES_INDEX).map(key => {
 
 /**
  * This is a component for compute, namespace and database selection. All parameters are optional except the
- * sourceType, if for instance no database and namespace observables are provided it will only show compute
+ * connector, if for instance no database and namespace observables are provided it will only show compute
  * selection.
  *
  * If it's desired to just show namespaces for a given compute you can force hide the compute selection by
@@ -150,7 +153,6 @@ const TYPES = Object.keys(TYPES_INDEX).map(key => {
  *   } --><!-- /ko -->
  *
  * @param {Object} params
- * @param {ko.observable|string} params.sourceType
  * @param {ko.observable} [params.cluster]
  * @param {ko.observable} [params.compute]
  * @param {ko.observable} [params.namespace]
@@ -172,15 +174,13 @@ const TYPES = Object.keys(TYPES_INDEX).map(key => {
  */
 const HueContextSelector = function(params) {
   const self = this;
-
-  self.sourceType = params.sourceType;
-  self.connector = params.connector;
-
-  // TODO: Use connector in HueContextSelector
-  if (!self.connector || !ko.unwrap(self.connector)) {
-    self.connector = ko.observable({ type: params.sourceType });
+  if (!params.connector || !ko.unwrap(params.connector)) {
+    throw new Error('No connector with type provided');
   }
+
   self.disposals = [];
+
+  self.connector = params.connector;
   self.hideLabels = params.hideLabels;
 
   TYPES.forEach(type => {
@@ -216,8 +216,8 @@ const HueContextSelector = function(params) {
 
   let refreshThrottle = -1;
 
-  const refresh = function(sourceType) {
-    if (!sourceType || ko.unwrap(self.connector).type === sourceType) {
+  const refresh = function(connectorType) {
+    if (!connectorType || ko.unwrap(self.connector).type === connectorType) {
       window.clearTimeout(refreshThrottle);
       refreshThrottle = window.setTimeout(() => {
         TYPES.forEach(self.reload.bind(self));
@@ -225,8 +225,8 @@ const HueContextSelector = function(params) {
     }
   };
 
-  const namespaceRefreshSub = huePubSub.subscribe('context.catalog.namespaces.refreshed', refresh);
-  const contextCatalogRefreshSub = huePubSub.subscribe('context.catalog.refreshed', refresh);
+  const namespaceRefreshSub = huePubSub.subscribe(NAMESPACES_REFRESHED_EVENT, refresh);
+  const contextCatalogRefreshSub = huePubSub.subscribe(CONTEXT_CATALOG_REFRESHED_EVENT, refresh);
   self.disposals.push(() => {
     window.clearTimeout(refreshThrottle);
     namespaceRefreshSub.remove();
@@ -330,7 +330,7 @@ HueContextSelector.prototype.reload = function(type) {
   if (self[type.name]) {
     self[type.loading](true);
     self[type.lastPromise] = contextCatalog[type.contextCatalogFn]({
-      sourceType: ko.unwrap(self.connector).type
+      connector: ko.unwrap(self.connector)
     })
       .done(available => {
         // Namespaces response differs slightly from the others
@@ -497,4 +497,4 @@ HueContextSelector.prototype.dispose = function() {
   }
 };
 
-componentUtils.registerComponent(NAME, HueContextSelector, TEMPLATE);
+componentUtils.registerComponent(CONTEXT_SELECTOR_COMPONENT, HueContextSelector, TEMPLATE);

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

@@ -15,13 +15,15 @@
 // limitations under the License.
 
 import { koSetup } from 'jest/koTestUtils';
-import { NAME } from './ko.contextSelector';
+import { CONTEXT_SELECTOR_COMPONENT } from './ko.contextSelector';
 
 describe('ko.contextSelector.js', () => {
   const setup = koSetup();
 
   it('should render component', async () => {
-    const element = await setup.renderComponent(NAME, {});
+    const element = await setup.renderComponent(CONTEXT_SELECTOR_COMPONENT, {
+      connector: { type: 'foo' }
+    });
 
     expect(element.innerHTML).toMatchSnapshot();
   });

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

@@ -103,12 +103,17 @@ class SimpleAceEditor {
       const autocomplete = ko.unwrap(params.autocomplete);
       let connector = ko.unwrap(autocomplete.connector);
 
-      if (!connector) {
+      if (!connector || !connector.type) {
         const type =
           autocomplete.type.indexOf('Query') !== -1
             ? autocomplete.type.replace('Query', '')
             : autocomplete.type;
         connector = findEditorConnector(connector => connector.type === type);
+
+        // TODO: Temporary fix for dashboard
+        if (!connector) {
+          connector = { type: type };
+        }
       }
 
       const snippet = {

+ 1 - 1
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({ sourceType: options.apiHelperType }).done(function (context) {
+      contextCatalog.getNamespaces({ connector: { type: options.apiHelperType } }).done(function (context) {
         if (context.namespaces && context.namespaces.length) {
           self.namespaceDeferred.resolve(context.namespaces[0]);
         } else {

+ 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({ sourceType: collection.engine || 'solr' }).done(function (context) {
+  contextCatalog.getNamespaces({ connector: { type: collection.engine || 'solr' } }).done(function (context) {
     // TODO: Namespace selection
     self.activeNamespace(context.namespaces[0]);
     self.activeCompute(context.namespaces[0].computes[0]);

+ 2 - 1
desktop/libs/indexer/src/indexer/templates/importer.mako

@@ -2526,7 +2526,8 @@ ${ commonheader(_("Importer"), "indexer", user, request, "60px") | n,unicode }
 
       self.computeSetDeferred = $.Deferred();
 
-      contextCatalog.getNamespaces({ sourceType: vm.sourceType }).done(function (context) {
+      // TODO: Use connectors in the importer
+      contextCatalog.getNamespaces({ connector: { type: vm.sourceType } }).done(function (context) {
         self.namespaces(context.namespaces);
         if (!vm.namespaceId || !context.namespaces.some(function (namespace) {
           if (namespace.id === vm.namespaceId) {

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

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

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

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

+ 0 - 1
desktop/libs/notebook/src/notebook/templates/editor_components.mako

@@ -903,7 +903,6 @@ ${ sqlSyntaxDropdown.sqlSyntaxDropdown() }
       name: 'hue-context-selector',
       params: {
         connector: connector,
-        sourceType: type,
         compute: compute,
         namespace: namespace,
         availableDatabases: availableDatabases,

+ 1 - 2
desktop/libs/notebook/src/notebook/templates/editor_components2.mako

@@ -669,10 +669,9 @@
     <!-- ko component: {
       name: 'hue-context-selector',
       params: {
-        sourceType: dialect,
+        connector: connector,
         compute: compute,
         namespace: namespace,
-        connector: connector,
         availableDatabases: availableDatabases,
         database: database,
         hideDatabases: !isSqlDialect()