Query.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. 'use strict';
  2. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  3. /**
  4. * Licensed Materials - Property of IBM
  5. * IBM Business Analytics (C) Copyright IBM Corp. 2019, 2020
  6. * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  7. */
  8. /**
  9. * @class QueryAPI
  10. * @hideconstructor
  11. * @classdesc Query API class that is used to construct and run a query.
  12. */
  13. define(['underscore', '../../../lib/@waca/dashboard-common/dist/core/APIFactory', './QueryDataItem', './api/QueryAPI', '../../../filters/FilterQuerySpec', './QuerySelectionBuilder', '../../content/dataQueryExecution/DataQueryUtils', '../../../lib/@waca/dashboard-common/dist/core/UniqueHashIdBuilder'], function (_, APIFactory, QueryDataItem, QueryAPI, FilterQuerySpec, QuerySelectionBuilder, DataQueryUtils, UniqueHashIdBuilder) {
  14. var Query = function () {
  15. function Query(dashboard, queryService, type) {
  16. _classCallCheck(this, Query);
  17. this.VERSION = '1';
  18. this.DEFAULT_ROW_LIMIT = 1000;
  19. this.DEFAULT_OFFSET = 0;
  20. this._dashboard = dashboard;
  21. this._queryService = queryService;
  22. this._logger = dashboard.getGlassCoreSvc('.Logger');
  23. this._type = type;
  24. }
  25. Query.prototype.getAPI = function getAPI() {
  26. if (!this.api) {
  27. this.api = APIFactory.createAPI(this, [QueryAPI]);
  28. }
  29. return this.api;
  30. };
  31. Query.prototype.setDataSource = function setDataSource(sourceId) {
  32. var dataSources = this._dashboard.getFeature('DataSources');
  33. this._dataSource = dataSources.getDataSource(sourceId);
  34. return this._dataSource.loadMetadata();
  35. };
  36. Query.prototype.addColumns = function addColumns(columnIdList) {
  37. var _this = this;
  38. if (!this._dataItems) {
  39. this._dataItems = [];
  40. this.dataItemIdsMap = {};
  41. }
  42. columnIdList.forEach(function (columnId) {
  43. var metadataColumn = _this._dataSource.getMetadataColumn(columnId);
  44. if (metadataColumn) {
  45. _this._dataItems.push(_this._createQueryDataItem(metadataColumn, columnId));
  46. } else {
  47. _this._logger.error('Could not find metadata column ' + columnId + ' in ' + _this._dataSource.getId());
  48. }
  49. });
  50. return this._dataItems;
  51. };
  52. Query.prototype.addDataItems = function addDataItems(dataItemList) {
  53. var _this2 = this;
  54. if (!this._dataItems) {
  55. this._dataItems = [];
  56. this.dataItemIdsMap = {};
  57. }
  58. if (dataItemList) {
  59. dataItemList.forEach(function (dataItem) {
  60. var metadataColumn = dataItem.getMetadataColumn();
  61. _this2._dataItems.push(_this2._createQueryDataItem(metadataColumn, null, dataItem));
  62. });
  63. }
  64. return this._dataItems;
  65. };
  66. Query.prototype._createQueryDataItem = function _createQueryDataItem(metadataColumn, columnId, dataItem) {
  67. var idOrigin = dataItem && dataItem.getId() || columnId;
  68. var dataItemId = UniqueHashIdBuilder.createUniqueHashId(idOrigin, this.dataItemIdsMap);
  69. this.dataItemIdsMap[dataItemId] = dataItemId;
  70. return new QueryDataItem(metadataColumn, dataItemId, dataItem).getAPI();
  71. };
  72. Query.prototype.addFilters = function addFilters(filters) {
  73. if (!this._filters) {
  74. this._filters = [];
  75. }
  76. if (filters && filters.length > 0) {
  77. var _filters;
  78. (_filters = this._filters).push.apply(_filters, filters);
  79. }
  80. };
  81. Query.prototype.addSearchTerms = function addSearchTerms(columnId) {
  82. var searchTermList = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
  83. if (!this._searchTerms) {
  84. this._searchTerms = [];
  85. }
  86. if (!Array.isArray(searchTermList) || !searchTermList.length > 0) {
  87. return;
  88. }
  89. var filter = {
  90. id: columnId,
  91. columnId: columnId,
  92. values: searchTermList
  93. };
  94. if (searchTermList.length > 1) {
  95. filter.operator = 'in';
  96. filter.ignoreCase = true;
  97. filter.type = 'display';
  98. } else {
  99. filter.operator = 'containsignorecase';
  100. }
  101. this._searchTerms.push(filter);
  102. };
  103. Query.prototype.setLimit = function setLimit() {
  104. var dataRowLimit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.DEFAULT_ROW_LIMIT;
  105. this._dataRowLimit = dataRowLimit;
  106. };
  107. Query.prototype.setOffset = function setOffset() {
  108. var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.DEFAULT_OFFSET;
  109. this._offset = offset;
  110. return this._offset;
  111. };
  112. Query.prototype._toJSON = function _toJSON() {
  113. var _this3 = this;
  114. var dataItems = [];
  115. var projections = [];
  116. var querySelectionBuilder = new QuerySelectionBuilder(this._dataItems);
  117. if (this._dataItems) {
  118. this._dataItems.forEach(function (dataItem) {
  119. var resultItem = {
  120. id: dataItem.getId(),
  121. itemId: dataItem.getColumnId()
  122. };
  123. var selectionMap = {};
  124. // Use DataItemAPI to generate the selection
  125. //todo: second param is filterList
  126. _.each(querySelectionBuilder.build(dataItem, [], _this3._searchTerms), function (selection) {
  127. selectionMap[selection.operation] = selection;
  128. });
  129. _.each(dataItem.getCommandList(), function (command) {
  130. selectionMap[command.operation] = command;
  131. });
  132. var selections = _.values(selectionMap);
  133. if (selections && selections.length) {
  134. resultItem.selection = selections;
  135. }
  136. var aggregation = dataItem.getAggregation();
  137. if (!_.isNull(aggregation) && aggregation !== 'none' && (dataItem.getType() === 'fact' || !dataItem.hasDefaultAggregation())) {
  138. resultItem.aggregate = dataItem.getAggregation();
  139. }
  140. dataItems.push(resultItem);
  141. var projected = dataItem.getProjected();
  142. if (projected === undefined || projected) {
  143. projections.push(dataItem.getId());
  144. }
  145. });
  146. }
  147. var queryFilters = [];
  148. var filterQuerySpec = void 0;
  149. if (this._filters && this._filters.length) {
  150. var keptFilters = DataQueryUtils.convertExcludeEmptyValuesFilters(this._filters, this._dataSource);
  151. filterQuerySpec = new FilterQuerySpec();
  152. filterQuerySpec.addFiltersToSpec(keptFilters);
  153. }
  154. if (this._searchTerms && this._searchTerms.length) {
  155. filterQuerySpec = filterQuerySpec || new FilterQuerySpec();
  156. filterQuerySpec.addFiltersToSpec(this._searchTerms);
  157. }
  158. if (filterQuerySpec) {
  159. queryFilters = filterQuerySpec.getFilterSpec();
  160. }
  161. var spec = {
  162. version: this.VERSION,
  163. dataItems: dataItems,
  164. projections: projections,
  165. limit: this._dataRowLimit || this.DEFAULT_ROW_LIMIT,
  166. filters: queryFilters
  167. };
  168. if (this._type) {
  169. spec.type = this._type;
  170. }
  171. if (this._offset) {
  172. spec.offset = this._offset;
  173. }
  174. return spec;
  175. };
  176. Query.prototype.executeQuery = function executeQuery() {
  177. var requestOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  178. var querySpec = this._toJSON();
  179. return this._queryService.executeQuery(this._dataSource.getId(), querySpec, this.constructor.name, requestOptions);
  180. };
  181. return Query;
  182. }();
  183. return Query;
  184. });
  185. //# sourceMappingURL=Query.js.map