'use strict';

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Licensed Materials - Property of IBM
 * IBM Business Analytics (C) Copyright IBM Corp. 2019, 2020
 * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 */

/**
 * @class QueryAPI
 * @hideconstructor
 * @classdesc Query API class that is used to construct and run a query.
 */
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) {
	var Query = function () {
		function Query(dashboard, queryService, type) {
			_classCallCheck(this, Query);

			this.VERSION = '1';
			this.DEFAULT_ROW_LIMIT = 1000;
			this.DEFAULT_OFFSET = 0;

			this._dashboard = dashboard;
			this._queryService = queryService;
			this._logger = dashboard.getGlassCoreSvc('.Logger');
			this._type = type;
		}

		Query.prototype.getAPI = function getAPI() {
			if (!this.api) {
				this.api = APIFactory.createAPI(this, [QueryAPI]);
			}
			return this.api;
		};

		Query.prototype.setDataSource = function setDataSource(sourceId) {
			var dataSources = this._dashboard.getFeature('DataSources');
			this._dataSource = dataSources.getDataSource(sourceId);
			return this._dataSource.loadMetadata();
		};

		Query.prototype.addColumns = function addColumns(columnIdList) {
			var _this = this;

			if (!this._dataItems) {
				this._dataItems = [];
				this.dataItemIdsMap = {};
			}

			columnIdList.forEach(function (columnId) {
				var metadataColumn = _this._dataSource.getMetadataColumn(columnId);
				if (metadataColumn) {
					_this._dataItems.push(_this._createQueryDataItem(metadataColumn, columnId));
				} else {
					_this._logger.error('Could not find metadata column ' + columnId + ' in ' + _this._dataSource.getId());
				}
			});

			return this._dataItems;
		};

		Query.prototype.addDataItems = function addDataItems(dataItemList) {
			var _this2 = this;

			if (!this._dataItems) {
				this._dataItems = [];
				this.dataItemIdsMap = {};
			}

			if (dataItemList) {
				dataItemList.forEach(function (dataItem) {
					var metadataColumn = dataItem.getMetadataColumn();
					_this2._dataItems.push(_this2._createQueryDataItem(metadataColumn, null, dataItem));
				});
			}

			return this._dataItems;
		};

		Query.prototype._createQueryDataItem = function _createQueryDataItem(metadataColumn, columnId, dataItem) {
			var idOrigin = dataItem && dataItem.getId() || columnId;
			var dataItemId = UniqueHashIdBuilder.createUniqueHashId(idOrigin, this.dataItemIdsMap);
			this.dataItemIdsMap[dataItemId] = dataItemId;
			return new QueryDataItem(metadataColumn, dataItemId, dataItem).getAPI();
		};

		Query.prototype.addFilters = function addFilters(filters) {
			if (!this._filters) {
				this._filters = [];
			}
			if (filters && filters.length > 0) {
				var _filters;

				(_filters = this._filters).push.apply(_filters, filters);
			}
		};

		Query.prototype.addSearchTerms = function addSearchTerms(columnId) {
			var searchTermList = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];

			if (!this._searchTerms) {
				this._searchTerms = [];
			}

			if (!Array.isArray(searchTermList) || !searchTermList.length > 0) {
				return;
			}

			var filter = {
				id: columnId,
				columnId: columnId,
				values: searchTermList
			};

			if (searchTermList.length > 1) {
				filter.operator = 'in';
				filter.ignoreCase = true;
				filter.type = 'display';
			} else {
				filter.operator = 'containsignorecase';
			}

			this._searchTerms.push(filter);
		};

		Query.prototype.setLimit = function setLimit() {
			var dataRowLimit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.DEFAULT_ROW_LIMIT;

			this._dataRowLimit = dataRowLimit;
		};

		Query.prototype.setOffset = function setOffset() {
			var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.DEFAULT_OFFSET;

			this._offset = offset;
			return this._offset;
		};

		Query.prototype._toJSON = function _toJSON() {
			var _this3 = this;

			var dataItems = [];
			var projections = [];
			var querySelectionBuilder = new QuerySelectionBuilder(this._dataItems);
			if (this._dataItems) {
				this._dataItems.forEach(function (dataItem) {
					var resultItem = {
						id: dataItem.getId(),
						itemId: dataItem.getColumnId()
					};
					var selectionMap = {};
					// Use DataItemAPI to generate the selection
					//todo: second param is filterList
					_.each(querySelectionBuilder.build(dataItem, [], _this3._searchTerms), function (selection) {
						selectionMap[selection.operation] = selection;
					});

					_.each(dataItem.getCommandList(), function (command) {
						selectionMap[command.operation] = command;
					});
					var selections = _.values(selectionMap);
					if (selections && selections.length) {
						resultItem.selection = selections;
					}

					var aggregation = dataItem.getAggregation();
					if (!_.isNull(aggregation) && aggregation !== 'none' && (dataItem.getType() === 'fact' || !dataItem.hasDefaultAggregation())) {
						resultItem.aggregate = dataItem.getAggregation();
					}
					dataItems.push(resultItem);
					var projected = dataItem.getProjected();
					if (projected === undefined || projected) {
						projections.push(dataItem.getId());
					}
				});
			}

			var queryFilters = [];
			var filterQuerySpec = void 0;
			if (this._filters && this._filters.length) {
				var keptFilters = DataQueryUtils.convertExcludeEmptyValuesFilters(this._filters, this._dataSource);
				filterQuerySpec = new FilterQuerySpec();
				filterQuerySpec.addFiltersToSpec(keptFilters);
			}

			if (this._searchTerms && this._searchTerms.length) {
				filterQuerySpec = filterQuerySpec || new FilterQuerySpec();
				filterQuerySpec.addFiltersToSpec(this._searchTerms);
			}

			if (filterQuerySpec) {
				queryFilters = filterQuerySpec.getFilterSpec();
			}

			var spec = {
				version: this.VERSION,
				dataItems: dataItems,
				projections: projections,
				limit: this._dataRowLimit || this.DEFAULT_ROW_LIMIT,
				filters: queryFilters
			};

			if (this._type) {
				spec.type = this._type;
			}

			if (this._offset) {
				spec.offset = this._offset;
			}

			return spec;
		};

		Query.prototype.executeQuery = function executeQuery() {
			var requestOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

			var querySpec = this._toJSON();
			return this._queryService.executeQuery(this._dataSource.getId(), querySpec, this.constructor.name, requestOptions);
		};

		return Query;
	}();

	return Query;
});
//# sourceMappingURL=Query.js.map