@gooddata/gooddata-js
Version:
GoodData JavaScript SDK
252 lines (251 loc) • 12.2 kB
JavaScript
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
// (C) 2007-2018 GoodData Corporation
var get_1 = __importDefault(require("lodash/get"));
var find_1 = __importDefault(require("lodash/find"));
var omit_1 = __importDefault(require("lodash/omit"));
var cloneDeep_1 = __importDefault(require("lodash/cloneDeep"));
var REQUEST_DEFAULTS = {
types: ["attribute", "metric", "fact"],
paging: {
offset: 0,
},
};
var LOAD_DATE_DATASET_DEFAULTS = {
includeUnavailableDateDataSetsCount: true,
includeAvailableDateAttributes: true,
};
/**
* Convert specific params in options to "requiredDataSets" structure. For more details look into
* res file https://github.com/gooddata/gdc-bear/blob/develop/resources/specification/internal/catalog.res
*
* @param options Supported keys in options are:
* <ul>
* <li>dataSetIdentifier - in value is string identifier of dataSet - this leads to CUSTOM type
* <li>returnAllDateDataSets - true value means to return ALL values without dataSet differentiation
* <li>returnAllRelatedDateDataSets - only related date dataSets are loaded across all dataSets
* <li>by default we get PRODUCTION dataSets
* </ul>
* @returns {Object} "requiredDataSets" object hash.
*/
var getRequiredDataSets = function (options) {
if (get_1.default(options, "returnAllRelatedDateDataSets")) {
return {};
}
if (get_1.default(options, "returnAllDateDataSets")) {
return { requiredDataSets: { type: "ALL" } };
}
if (get_1.default(options, "dataSetIdentifier")) {
return {
requiredDataSets: {
type: "CUSTOM",
customIdentifiers: [get_1.default(options, "dataSetIdentifier")],
},
};
}
return { requiredDataSets: { type: "PRODUCTION" } };
};
var buildItemDescriptionObjects = function (_a) {
var columns = _a.columns, definitions = _a.definitions;
if (!columns) {
return [];
}
return columns.map(function (column) {
var definition = find_1.default(definitions, function (_a) {
var metricDefinition = _a.metricDefinition;
return metricDefinition.identifier === column;
});
var maql = get_1.default(definition, "metricDefinition.expression");
if (maql) {
return { expression: maql };
}
return { uri: column };
});
};
var isStoredItemDescription = function (itemDescription) {
return !!itemDescription.uri;
};
var isAdHocItemDescription = function (itemDescription) {
return !!itemDescription.expression;
};
var unwrapItemDescriptionObject = function (itemDescription) {
if (isStoredItemDescription(itemDescription)) {
return itemDescription.uri;
}
if (isAdHocItemDescription(itemDescription)) {
return itemDescription.expression;
}
throw new Error("Item description can only have expression or uri");
};
var CatalogueModule = /** @class */ (function () {
function CatalogueModule(xhr, execution) {
this.xhr = xhr;
this.execution = execution;
}
CatalogueModule.prototype.loadItems = function (projectId, options) {
var _this = this;
if (options === void 0) { options = {}; }
var request = omit_1.default(__assign({}, REQUEST_DEFAULTS, options, getRequiredDataSets(options)), ["dataSetIdentifier", "returnAllDateDataSets", "attributesMap"]);
var mdObj = get_1.default(cloneDeep_1.default(options), "bucketItems");
var attributesMap = get_1.default(options, "attributesMap");
var hasBuckets = get_1.default(mdObj, "buckets") !== undefined;
if (hasBuckets) {
return this.loadItemDescriptions(projectId, mdObj, attributesMap).then(function (bucketItems) {
return _this.loadCatalog(projectId, __assign({}, request, { bucketItems: bucketItems }));
});
}
return this.loadCatalog(projectId, request);
};
CatalogueModule.prototype.loadDateDataSets = function (projectId, options) {
return __awaiter(this, void 0, void 0, function () {
var mdObj, bucketItems, _a, omittedOptions, request;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
mdObj = cloneDeep_1.default(options).bucketItems;
if (!mdObj) return [3 /*break*/, 2];
return [4 /*yield*/, this.loadItemDescriptions(projectId, mdObj, get_1.default(options, "attributesMap"), true)];
case 1:
_a = _b.sent();
return [3 /*break*/, 3];
case 2:
_a = undefined;
_b.label = 3;
case 3:
bucketItems = _a;
omittedOptions = [
"filter",
"types",
"paging",
"dataSetIdentifier",
"returnAllDateDataSets",
"returnAllRelatedDateDataSets",
"attributesMap",
];
// includeObjectsWithTags has higher priority than excludeObjectsWithTags,
// so when present omit excludeObjectsWithTags
if (options.includeObjectsWithTags) {
omittedOptions.push("excludeObjectsWithTags");
}
request = omit_1.default(__assign({}, LOAD_DATE_DATASET_DEFAULTS, REQUEST_DEFAULTS, options, getRequiredDataSets(options), { bucketItems: bucketItems }), omittedOptions);
return [2 /*return*/, this.requestDateDataSets(projectId, request)];
}
});
});
};
/**
* Loads item description objects and returns them
*
* @internal
* @private
*
* @param projectId {string}
* @param mdObj metadata object containing buckets, visualization class, properties etc.
* @param attributesMap contains map of attributes where the keys are the attributes display forms URIs
* @param removeDateItems {boolean} skip date items
* @return ItemDescription which is either `{ uri: string }` or `{ expression: string }`
*/
CatalogueModule.prototype.loadItemDescriptionObjects = function (projectId, mdObj, attributesMap, removeDateItems) {
if (removeDateItems === void 0) { removeDateItems = false; }
return __awaiter(this, void 0, void 0, function () {
var definitionsAndColumns;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.execution.mdToExecutionDefinitionsAndColumns(projectId, mdObj, { attributesMap: attributesMap, removeDateItems: removeDateItems })];
case 1:
definitionsAndColumns = _a.sent();
return [2 /*return*/, buildItemDescriptionObjects(definitionsAndColumns)];
}
});
});
};
/**
* ItemDescription is either URI or MAQL expression
* https://github.com/gooddata/gdc-bear/blob/185.4/resources/specification/md/obj.res#L284
*
* @param projectId {string}
* @param mdObj metadata object containing buckets, visualization class, properties etc.
* @param attributesMap contains map of attributes where the keys are the attributes display forms URIs
* @param removeDateItems {boolean} skip date items
* @deprecated
*/
CatalogueModule.prototype.loadItemDescriptions = function (projectId, mdObj, attributesMap, removeDateItems) {
if (removeDateItems === void 0) { removeDateItems = false; }
return __awaiter(this, void 0, void 0, function () {
var itemDescriptions;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.loadItemDescriptionObjects(projectId, mdObj, attributesMap, removeDateItems)];
case 1:
itemDescriptions = _a.sent();
return [2 /*return*/, itemDescriptions.map(unwrapItemDescriptionObject)];
}
});
});
};
CatalogueModule.prototype.requestDateDataSets = function (projectId, dateDataSetsRequest) {
var uri = "/gdc/internal/projects/" + projectId + "/loadDateDataSets";
return this.xhr
.post(uri, { data: { dateDataSetsRequest: dateDataSetsRequest } })
.then(function (r) { return r.getData(); })
.then(function (data) { return data.dateDataSetsResponse; });
};
CatalogueModule.prototype.loadCatalog = function (projectId, catalogRequest) {
var uri = "/gdc/internal/projects/" + projectId + "/loadCatalog";
return this.xhr
.post(uri, { data: { catalogRequest: catalogRequest } })
.then(function (r) { return r.getData(); })
.then(function (data) { return data.catalogResponse; });
};
return CatalogueModule;
}());
exports.CatalogueModule = CatalogueModule;