VisQueryDefinition.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. 'use strict';
  2. /*
  3. *+------------------------------------------------------------------------+
  4. *| Licensed Materials - Property of IBM
  5. *| IBM Cognos Products: BI Dashboard
  6. *| (C) Copyright IBM Corp. 2017
  7. *|
  8. *| US Government Users Restricted Rights - Use, duplication or disclosure
  9. *| restricted by GSA ADP Schedule Contract with IBM Corp.
  10. *+------------------------------------------------------------------------+
  11. */
  12. /*
  13. * This Class defines a Query Definitio Object that supports multiple layers
  14. */
  15. define(['../../../lib/@waca/core-client/js/core-client/ui/core/Class', 'underscore'], function (Class, _) {
  16. 'use strict';
  17. var SingleQueryDefinition = null;
  18. SingleQueryDefinition = Class.extend({
  19. _dataItems: [],
  20. _projections: [],
  21. _filters: [],
  22. _fields: [],
  23. _layerId: null,
  24. _hasCategoricalSlots: {},
  25. _queryHints: {},
  26. _augmentations: [],
  27. /**
  28. *Initialization for one layer query definition
  29. */
  30. init: function init(layerId, dataItems, projections, filters, hints, hasCategoricalSlots, augmentations) {
  31. this.setDataItems(dataItems);
  32. this.setProjections(projections);
  33. this.setFiltres(filters);
  34. this.setLayerId(layerId);
  35. this.setQueryHints(hints);
  36. this.setAugmentations(augmentations);
  37. },
  38. /**
  39. *@return {String} Unique layer ID
  40. */
  41. getLayerId: function getLayerId() {
  42. return this._layerId;
  43. },
  44. /**
  45. *@param {String} layerId
  46. *Set a layer unique ID
  47. */
  48. setLayerId: function setLayerId(layerId) {
  49. this._layerId = layerId;
  50. },
  51. /**
  52. *@return {String} Unique layer ID
  53. */
  54. getDataItems: function getDataItems() {
  55. return this._dataItems;
  56. },
  57. /**
  58. *@param {Array of JSONObject} dataItems An array of data items included in the query definition
  59. *Set a data items
  60. */
  61. setDataItems: function setDataItems(dataItems) {
  62. this._dataItems = dataItems || [];
  63. },
  64. /**
  65. *@param {JSONObject} dataItem Add a data item object to query definition
  66. */
  67. addDataItems: function addDataItems(dataItem) {
  68. this._dataItems = this._addArrayElement(this._dataItems, dataItem);
  69. },
  70. /**
  71. *@return {Array of JSONObject} An array of projections included in the query definition
  72. */
  73. getProjections: function getProjections() {
  74. return this._projections;
  75. },
  76. /**
  77. *@param {Array of JSONObject}
  78. *Set an array of projections
  79. */
  80. setProjections: function setProjections(projections) {
  81. this._projections = projections || [];
  82. },
  83. /**
  84. *@param {JSONObject} Add a projection object to query definition
  85. */
  86. addProjections: function addProjections(projection) {
  87. this._addArrayElement(this._projections, projection);
  88. },
  89. /**
  90. *@return {Array of JSONObject} An array of local filters object included in the query definition
  91. */
  92. getFilters: function getFilters() {
  93. return this._filters;
  94. },
  95. /**
  96. *@param {Array of JSONObject} filters
  97. *Set an arry of local filters
  98. */
  99. setFiltres: function setFiltres(filters) {
  100. this._filters = filters || [];
  101. },
  102. /**
  103. *@param {JSONObject} Add a filter object to query definition
  104. */
  105. addFilters: function addFilters(filter) {
  106. this._filters = this._addArrayElement(this._filters, filter);
  107. },
  108. setQueryHints: function setQueryHints(hints) {
  109. this._queryHints = hints;
  110. },
  111. getQueryHints: function getQueryHints() {
  112. return this._queryHints;
  113. },
  114. setAugmentations: function setAugmentations(augmentations) {
  115. this._augmentations = augmentations;
  116. },
  117. getAugmentations: function getAugmentations() {
  118. return this._augmentations;
  119. },
  120. getSynDataFilters: function getSynDataFilters() {
  121. return this.synDataFilters;
  122. },
  123. setSynDataFilters: function setSynDataFilters(synDataFilters) {
  124. this.synDataFilters = synDataFilters;
  125. },
  126. _addArrayElement: function _addArrayElement(array, item, singleID) {
  127. if (item) {
  128. if (!_.isArray(item)) {
  129. if (item.layerId) delete item.layerId;
  130. array.push(item);
  131. } else {
  132. _.each(item, function (entry) {
  133. if (item.layerId) delete entry.layerId;
  134. });
  135. if (singleID) {
  136. item = _.pluck(item, 'id');
  137. }
  138. array = array.concat(item);
  139. }
  140. }
  141. return array;
  142. }
  143. });
  144. /*Query definition object used by client to build final query spec
  145. * Internally, this object contains an array of query definition defined for
  146. * one layer
  147. */
  148. var VisQueryDefinition = Class.extend({
  149. /**
  150. *Initialization for query definition
  151. *load all query context
  152. */
  153. init: function init(queryContext) {
  154. this._queryDefinitions = [];
  155. //Initialize layers
  156. _.each(queryContext.layers, function (layer) {
  157. this.addQueryDefinitionByLayer(layer.getId());
  158. }.bind(this));
  159. this._addLayeredEntities(queryContext);
  160. this._addSharedEntities(queryContext);
  161. _.each(this._queryDefinitions, function (def) {
  162. def.setProjections(_.pluck(def.getProjections(), 'id'));
  163. });
  164. },
  165. /**
  166. *@param {object} - queryContext that contains layered entities and common entities
  167. */
  168. _addLayeredEntities: function _addLayeredEntities(queryContext) {
  169. _.map(queryContext.layeredEntities, function (querySpecMember, querySpecMemberType) {
  170. _.each(querySpecMember, function (value) {
  171. this._addEntity(this.getQueryDefinitionByLayer(value.layerId), querySpecMemberType, value);
  172. }.bind(this));
  173. }.bind(this));
  174. },
  175. _addSharedEntities: function _addSharedEntities(queryContext) {
  176. _.map(queryContext.commonEntities, function (querySpecMember, querySpecMemberType) {
  177. _.each(this._queryDefinitions, function (queryDef) {
  178. _.each(querySpecMember, function (value) {
  179. this._addEntity(queryDef, querySpecMemberType, value);
  180. }.bind(this));
  181. }.bind(this));
  182. }.bind(this));
  183. },
  184. _addEntity: function _addEntity(queryDef, entryType, value) {
  185. if (!queryDef) {
  186. return;
  187. }
  188. //TODO:Each Entry could have its own hanlder
  189. switch (entryType) {
  190. case 'dataItems':
  191. queryDef.addDataItems(value);
  192. break;
  193. case 'projections':
  194. queryDef.addProjections(value);
  195. break;
  196. case 'filters':
  197. queryDef.addFilters(value);
  198. break;
  199. case 'queryHints':
  200. queryDef.setQueryHints(value);
  201. break;
  202. case 'augmentations':
  203. queryDef.setAugmentations(value);
  204. break;
  205. default:
  206. //console.warn('unrecognized definition element');
  207. }
  208. },
  209. //Create single layer definition object it is not defined
  210. addQueryDefinitionByLayer: function addQueryDefinitionByLayer(layerId) {
  211. var oLayerQueryDef = this.getQueryDefinitionByLayer(layerId);
  212. if (!oLayerQueryDef) {
  213. this._queryDefinitions.push(new SingleQueryDefinition(layerId));
  214. }
  215. },
  216. getQueryDefinitionByLayer: function getQueryDefinitionByLayer(layerId) {
  217. return _.find(this._queryDefinitions, function (entry) {
  218. return entry.getLayerId() === layerId;
  219. });
  220. },
  221. clearQueryDefinitions: function clearQueryDefinitions() {
  222. this._queryDefinitions = [];
  223. },
  224. /**
  225. *Return the Query definitions object that support multiple layers
  226. */
  227. getQueryDefinitions: function getQueryDefinitions() {
  228. return this._queryDefinitions;
  229. }
  230. });
  231. return VisQueryDefinition;
  232. });
  233. //# sourceMappingURL=VisQueryDefinition.js.map