ts-flex-query
Version:
Flexible and type-safe data queries
72 lines • 3.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.QueryComposer = void 0;
const utils_1 = require("../../helpers/utils");
/** Creates a query text from an ODataRequest. */
class QueryComposer {
constructor(params) {
this.params = params;
}
buildFromRequest(request, partSeparator = '&') {
var _a, _b, _c, _d, _e, _f;
const actualSelect = [
...(_a = request.select) !== null && _a !== void 0 ? _a : [],
...Object.keys((_b = request.expand) !== null && _b !== void 0 ? _b : {})
];
const queryParts = {
$apply: request.apply ? QueryComposer.buildApplyPart(request.apply) : undefined,
$count: request.count || undefined,
$filter: ((_c = request.filter) === null || _c === void 0 ? void 0 : _c.value) || undefined,
$orderBy: request.orderBy && QueryComposer.buildOrderByPart(request.orderBy),
$skip: request.skip || undefined,
$top: request.top,
$select: actualSelect.length ? actualSelect.join(',') : undefined,
$expand: request.expand && Object.keys(request.expand).length ? this.buildExpandPart(request.expand) : undefined
};
const finalQueryParts = (_f = (_e = (_d = this.params).customQueryComposer) === null || _e === void 0 ? void 0 : _e.call(_d, { request, defaultParts: queryParts })) !== null && _f !== void 0 ? _f : queryParts;
return Object
.entries(finalQueryParts)
.filter((entry) => (0, utils_1.isDefined)(entry[1]))
.map((entry) => `${entry[0]}=${entry[1].toString().replace('&', '%26')}`)
.join(partSeparator);
}
static buildApplyPart(apply) {
return apply.length ? apply.map(QueryComposer.serializeApply).join('/') : undefined;
}
static serializeApply(apply) {
switch (apply.type) {
case 'groupby': {
const groupApply = QueryComposer.buildApplyPart(apply.groupApply) || '';
const groupByFields = apply.fields.join(',');
return `groupby((${groupByFields})${groupApply && ',' + groupApply})`;
}
case 'aggregate': {
const elements = apply.elements.map(QueryComposer.serializeAggregateElement).join(',');
return `aggregate(${elements})`;
}
case 'filter':
return `filter(${apply.value})`;
default:
return (0, utils_1.unexpected)(apply);
}
}
static serializeAggregateElement(element) {
return `${element.field ? element.field + ' with ' : ''}${element.aggregationFunction} as ${element.name}`;
}
buildExpandPart(expand) {
return Object
.entries(expand)
.map((v) => ({ field: v[0], request: v[1] && this.buildFromRequest(v[1], ';') }))
.map((v) => v.request ? `${v.field}(${v.request})` : v.field)
.join(',');
}
static buildOrderByPart(orderBy) {
return orderBy.length
? orderBy
.map((element) => `${element.field}${element.mode === 'asc' ? '' : ` ${element.mode}`}`)
.join(',')
: undefined;
}
}
exports.QueryComposer = QueryComposer;
//# sourceMappingURL=query-composer.js.map