123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- 'use strict';
- /**
- * Licensed Materials - Property of IBM
- * IBM Cognos Products: BI Cloud (C) Copyright IBM Corp. 2017, 2020
- * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
- *
- */
- define(['./ServiceBase', '../../../prompts/PromptManager', 'underscore'], function (Class, PromptManager, _) {
- 'use strict';
- //TODO Unify QueryManager between Legacy one and new Endor one
- // Declare the class
- var QueryService = Class.extend({
- init: function init(options) {
- QueryService.inherited('init', this, arguments);
- this.dashboardApi = options.dashboardApi;
- this.ajaxSvc = this.dashboardApi.getGlassCoreSvc('.Ajax');
- this.logger = this.dashboardApi.getGlassCoreSvc('.Logger');
- this.queryParameters = null;
- },
- _querySpecString: function _querySpecString(queryOptions, module) {
- if (_.isNumber(queryOptions.dataRowLimit)) {
- queryOptions.querySpec.limit = queryOptions.dataRowLimit;
- }
- if (this.queryParameters) {
- queryOptions.querySpec.parameterValues = this.queryParameters;
- }
- var metadataSubsetIds = module && module.getMetadataSubsetIds();
- if (metadataSubsetIds && metadataSubsetIds.length > 0) {
- queryOptions.querySpec.queryHints = _.extend(queryOptions.querySpec.queryHints || {}, {
- metadataSubsetIDs: metadataSubsetIds
- });
- }
- return this.isMockServer ? '\\Q' + JSON.stringify(queryOptions.querySpec) + '\\E' : JSON.stringify(queryOptions.querySpec);
- },
- /**
- * @public api to excute query against DSS.
- *
- * @param {Object} options.querySpec Mandatory: the query specification to be sent to DSS.
- * @param {Object} options.sourceIdOrModule: The sourceId or module object which we're querying
- * @param {Object} options.requestOptions: additional request options
- *
- * @returns a promise.
- */
- runQuery: function runQuery(options) {
- return this._sendRequest(options, this.getRequestId(options.sender));
- },
- runPredictQuery: function runPredictQuery(options) {
- var _this = this;
- return this._getModule(options.sourceIdOrModule).then(function (module) {
- var querySpec = _this._querySpecString(options);
- return module.queryPredictData(querySpec).then(function (response) {
- return response ? response.data : null;
- }, function (jqXHR) {
- return _this.handleQueryError(jqXHR, options, _this.runPredictQuery.bind(_this));
- });
- });
- },
- _sendRequest: function _sendRequest(options, requestId) {
- var _this2 = this;
- // reset the parameters for subsequent predict query
- if (!options.querySpec.parameterValues) {
- this.queryParameters = null;
- }
- return this._getModule(options.sourceIdOrModule).then(function (module) {
- var querySpec = _this2._querySpecString(options, module);
- var queryUserId = _this2.dashboardApi.getService('.UserProfile').userAccount.id;
- return _this2._getDataSourceModifiedTime(options.sourceIdOrModule).then(function (modTime) {
- return module.queryData(querySpec, {
- senderId: options.senderId,
- lastModified: modTime,
- queryUserId: queryUserId,
- qfb: options.requestOptions && options.requestOptions.qfb || 'none',
- qfbMode: options && options.requestOptions.qfbMode || undefined
- });
- });
- }).then(function (response) {
- var promptControlFunctions = options.promptControlFunctions;
- if (promptControlFunctions && promptControlFunctions.updatePromptSpecCache) {
- promptControlFunctions.updatePromptSpecCache(options);
- }
- var data = response ? response.data : null;
- var ETag = response ? response.getResponseHeader('ETag') : null;
- var requestTime = response ? response.getResponseHeader('x-ca-requesttime') : null;
- if (_this2.isActiveRequest(requestId, options.sender)) {
- return {
- data: data,
- requestTime: requestTime,
- ETag: ETag
- };
- } else {
- return Promise.reject(_.extend(new Error(), {
- reason: 'staleRequest'
- }));
- }
- }).catch(function (jqXHR) {
- return _this2.handleQueryError(jqXHR, options);
- });
- },
- _getModule: function _getModule(sourceIdOrModule) {
- var _this3 = this;
- var isDataModule = typeof sourceIdOrModule.queryData === 'function' || typeof sourceIdOrModule.queryPredictData === 'function';
- if (isDataModule) {
- return Promise.resolve(sourceIdOrModule);
- }
- var dataSources = this.dashboardApi.getFeature('dataSources.deprecated');
- return dataSources.getModule(sourceIdOrModule).then(function (module) {
- if (!module) {
- var dataSets = _this3.dashboardApi.getFeature('DataSets.internal');
- module = dataSets.getModule(sourceIdOrModule);
- }
- if (!module) {
- return Promise.reject(new Error('Data source with ID ' + sourceIdOrModule + ' not found.'));
- }
- return module;
- });
- },
- _getDataSourceModifiedTime: function _getDataSourceModifiedTime(sourceIdOrModule) {
- var datasource = this.dashboardApi.getFeature('DataSources').getDataSource(sourceIdOrModule);
- if (!datasource) {
- var dataSets = this.dashboardApi.getFeature('DataSets.internal');
- datasource = dataSets.getDataSource(sourceIdOrModule);
- if (!datasource) {
- return Promise.reject(new Error('Datasource with source ID: ' + sourceIdOrModule + ' not found'));
- }
- }
- return datasource.getModificationTime();
- },
- /**
- * Make the rest API call to query the map data for locations.
- * @param locations Array of locations to be mapped
- * @param useMapbox - flag to tell smarter maps to return mapbox style geojson
- */
- runGeoQuery: function runGeoQuery(payload, endpoint) {
- this.logger.debug('runGeoQuery');
- return this.ajaxSvc.ajax({
- url: endpoint || 'v1/geo/~',
- type: 'POST',
- headers: {
- 'Content-Type': 'application/json'
- },
- data: JSON.stringify(payload),
- processData: false
- }).then(function (response) {
- return response.data;
- });
- },
- /**
- * Make the rest API call to perform a top or bottom query the module.
- * @param querySpec The query specification to run
- */
- runTopBottomQuery: function runTopBottomQuery(queryOptions) {
- return this.runQuery(queryOptions);
- },
- handleQueryError: function handleQueryError(jqXHR, queryOptions, queryHandler) {
- var _this4 = this;
- var result = void 0;
- if (jqXHR && jqXHR.status && PromptManager.isPromptFault(jqXHR)) {
- if (!queryOptions.promptControlFunctions) {
- return Promise.reject(jqXHR);
- }
- var promptControlFunctions = queryOptions.promptControlFunctions;
- result = PromptManager.openPromptView({
- 'logger': this.logger,
- 'preferences': this.dashboardApi.getGlassCoreSvc('.UserProfile').preferences,
- 'promptSpec': promptControlFunctions.preparePromptSpec(jqXHR),
- 'whenSingleItemQueryReady': promptControlFunctions.whenSingleItemQueryReady.bind(this),
- 'whenColumnsMinMaxQueryReady': promptControlFunctions.whenColumnsMinMaxQueryReady.bind(this),
- 'getPromptSpec': promptControlFunctions.getPromptSpec.bind(this),
- 'isPreview': queryOptions.isPreview
- }).then(function (promptResponses) {
- var aPromptInfo = _this4._resolvePromptValues(promptResponses, promptControlFunctions);
- // re-send the request with resolved parameter.
- queryOptions.querySpec.parameterValues = aPromptInfo;
- // the parameters needs to be re-applied to the subsequent query (predict)
- _this4.queryParameters = aPromptInfo;
- return queryHandler ? queryHandler(queryOptions) : _this4.runQuery(queryOptions);
- }).catch(function (error) {
- if (error) {
- switch (error.message) {
- case 'cancel':
- case 'cancelPromptDialog':
- if (promptControlFunctions.onCancelPromptDialog) {
- promptControlFunctions.onCancelPromptDialog();
- }
- break;
- case 'unSupportedPromptType':
- if (promptControlFunctions.onUnSupportedPrompt) {
- promptControlFunctions.onUnSupportedPrompt();
- }
- break;
- }
- throw error;
- } else {
- return Promise.reject(jqXHR);
- }
- });
- } else {
- result = Promise.reject(jqXHR);
- }
- return result;
- },
- /**
- * resolve prompt values from query response and saved values.
- */
- _resolvePromptValues: function _resolvePromptValues(promptResponses, promptControlFunctions) {
- var aPromptInfo = [];
- var queryProperties = ['name', 'values', 'dataType', 'capabilities', 'modelFilterItem'];
- var savedPrompts = promptControlFunctions.getPromptSpec ? promptControlFunctions.getPromptSpec() : null;
- // push the newly resolved parameter values and save them if savePromptSpec is a function.
- _.each(promptResponses, function (promptResponse) {
- var promptResult = _.pick(promptResponse, queryProperties);
- aPromptInfo.push(promptResult);
- if (promptControlFunctions.savePromptSpec) {
- promptControlFunctions.savePromptSpec(promptResponse);
- }
- });
- // push saved parameter values when they are not in promptResponse.
- if (savedPrompts) {
- _.each(savedPrompts, function (savedPrompt) {
- if (!_.find(promptResponses, function (resolvedPrompt) {
- return savedPrompt.name === resolvedPrompt.name;
- })) {
- aPromptInfo.push(_.pick(savedPrompt, queryProperties));
- }
- });
- }
- _.each(aPromptInfo, function (promptInfo) {
- // MUN based dataType expect a useValue while all other types expect a displayValue for a parameter.
- if (promptInfo.capabilities.optional) {
- promptInfo.values = [promptInfo.values[0].mun];
- } else {
- // promptInfo.values
- if (promptInfo.dataType === 'memberUniqueName' || promptInfo.dataType === 'hierarchyUniqueName') {
- // use value (and not label)
- if (promptInfo.values[0].value) {
- promptInfo.values = _.pluck(promptInfo.values, 'value');
- } else {
- promptInfo.values = _.pluck(promptInfo.values, 'u');
- }
- } else {
- // use label
- if (promptInfo.values[0].label) {
- promptInfo.values = _.pluck(promptInfo.values, 'label');
- } else {
- promptInfo.values = _.pluck(promptInfo.values, 'd');
- }
- }
- }
- });
- return aPromptInfo;
- }
- });
- return QueryService;
- });
- //# sourceMappingURL=QueryService.js.map
|