angular-odata
Version:
Client side OData typescript library for Angular
118 lines • 15.2 kB
JavaScript
import { QueryOption } from '../../../types';
import { Objects, Types } from '../../../utils';
import { Expression } from './base';
import { FilterExpression } from './filter';
import { render, FieldFactory, RenderableFactory, resolve, } from './syntax';
export class CountField {
field;
values;
constructor(field, values = {}) {
this.field = field;
this.values = values;
}
get [Symbol.toStringTag]() {
return 'CountField';
}
toJson() {
return {
field: this.field.toJson(),
};
}
render({ aliases, escape, prefix, parser, options, }) {
const params = [
QueryOption.filter,
QueryOption.search,
]
.filter((key) => !Types.isEmpty(this.values[key]))
.reduce((acc, key) => {
let value = this.values[key];
if (Types.rawType(value).endsWith('Expression')) {
value = value.render({
aliases,
prefix,
escape,
parser: resolve([this.field], parser),
options,
});
}
return Object.assign(acc, { [key]: value });
}, {});
let count = `${render(this.field, {
aliases,
escape,
prefix,
parser,
options,
})}/$count`;
if (!Types.isEmpty(params)) {
count = `${count}(${Object.keys(params)
.map((key) => `$${key}=${params[key]}`)
.join(';')})`;
}
return count;
}
filter(opts) {
return this.option(QueryOption.filter, FilterExpression.factory(opts, this.values[QueryOption.filter]));
}
clone() {
const values = Object.keys(this.values).reduce((acc, key) => Object.assign(acc, { [key]: Objects.clone(this.values[key]) }), {});
return new CountField(this.field.clone(), values);
}
resolve(parser) {
return this.field.resolve(parser);
}
// Option Handler
option(name, opts) {
if (opts !== undefined)
this.values[name] = opts;
return this.values[name];
}
}
export class CountExpression extends Expression {
constructor({ children, } = {}) {
super({ children });
}
get [Symbol.toStringTag]() {
return 'CountExpression';
}
static factory(opts, current) {
return opts({
t: FieldFactory(),
e: () => new CountExpression(),
}, current);
}
_add(node) {
this._children.push(node);
return this;
}
toJson() {
const json = super.toJson();
return Object.assign(json, {});
}
static fromJson(json) {
return new CountExpression({
children: json['children'].map((c) => RenderableFactory(c)),
});
}
render({ aliases, escape, prefix, parser, options, } = {}) {
let content = this._children
.map((n) => n.render({ aliases, escape, prefix, parser, options }))
.join(`,`);
return content;
}
clone() {
return new CountExpression({
children: this._children.map((c) => c.clone()),
});
}
field(field, opts) {
let countField = new CountField(field);
if (opts !== undefined)
opts({
t: FieldFactory(),
f: countField,
});
return this._add(countField);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3F1ZXJ5L2V4cHJlc3Npb25zL2NvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBeUIsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBMkIsTUFBTSxVQUFVLENBQUM7QUFDckUsT0FBTyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBRVosaUJBQWlCLEVBQ2pCLE9BQU8sR0FDUixNQUFNLFVBQVUsQ0FBQztBQUVsQixNQUFNLE9BQU8sVUFBVTtJQUVUO0lBQ0Y7SUFGVixZQUNZLEtBQVUsRUFDWixTQUFrQyxFQUFFO1FBRGxDLFVBQUssR0FBTCxLQUFLLENBQUs7UUFDWixXQUFNLEdBQU4sTUFBTSxDQUE4QjtJQUMzQyxDQUFDO0lBRUosSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDdEIsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1NBQzNCLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLEVBQ0wsT0FBTyxFQUNQLE1BQU0sRUFDTixNQUFNLEVBQ04sTUFBTSxFQUNOLE9BQU8sR0FPUjtRQUNDLE1BQU0sTUFBTSxHQUErQjtZQUN6QyxXQUFXLENBQUMsTUFBTTtZQUNsQixXQUFXLENBQUMsTUFBTTtTQUNuQjthQUNFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMs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LEVBQUUsQ0FBQyxDQUFDO2FBQ2xFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNiLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLGVBQWUsQ0FBSTtZQUM1QixRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUMvQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUNILEtBQVUsRUFDVixJQUE0RDtRQUU1RCxJQUFJLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBSSxLQUFLLENBQUMsQ0FBQztRQUMxQyxJQUFJLElBQUksS0FBSyxTQUFTO1lBQ3BCLElBQUksQ0FBQztnQkFDSCxDQUFDLEVBQUUsWUFBWSxFQUFlO2dCQUM5QixDQUFDLEVBQUUsVUFBVTthQUNkLENBQUMsQ0FBQztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQYXJzZXIsIFBhcnNlck9wdGlvbnMsIFF1ZXJ5T3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgT2JqZWN0cywgVHlwZXMgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBRdWVyeUN1c3RvbVR5cGUgfSBmcm9tICcuLi9idWlsZGVyJztcbmltcG9ydCB7IEV4cHJlc3Npb24gfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgRmlsdGVyRXhwcmVzc2lvbiwgRmlsdGVyRXhwcmVzc2lvbkJ1aWxkZXIgfSBmcm9tICcuL2ZpbHRlcic7XG5pbXBvcnQge1xuICByZW5kZXIsXG4gIEZpZWxkRmFjdG9yeSxcbiAgUmVuZGVyYWJsZSxcbiAgUmVuZGVyYWJsZUZhY3RvcnksXG4gIHJlc29sdmUsXG59IGZyb20gJy4vc3ludGF4JztcblxuZXhwb3J0IGNsYXNzIENvdW50RmllbGQ8VD4gaW1wbGVtZW50cyBSZW5kZXJhYmxlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGZpZWxkOiBhbnksXG4gICAgcHJpdmF0ZSB2YWx1ZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICkge31cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdDb3VudEZpZWxkJztcbiAgfVxuXG4gIHRvSnNvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmllbGQ6IHRoaXMuZmllbGQudG9Kc29uKCksXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7XG4gICAgYWxpYXNlcyxcbiAgICBlc2NhcGUsXG4gICAgcHJlZml4LFxuICAgIHBhcnNlcixcbiAgICBvcHRpb25zLFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHBhcnNlcj86IFBhcnNlcjxUPjtcbiAgICBvcHRpb25zPzogUGFyc2VyT3B0aW9ucztcbiAgfSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFyYW1zOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IFtcbiAgICAgIFF1ZXJ5T3B0aW9uLmZpbHRlcixcbiAgICAgIFF1ZXJ5T3B0aW9uLnNlYXJjaCxcbiAgICBdXG4gICAgICAuZmlsdGVyKChrZXkpID0+ICFUeXBlcy5pc0VtcHR5KHRoaXMudmFsdWVzW2tleV0pKVxuICAgICAgLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgbGV0IHZhbHVlOiBhbnkgPSB0aGlzLnZhbHVlc1trZXldO1xuICAgICAgICBpZiAoVHlwZXMucmF3VHlwZSh2YWx1ZSkuZW5kc1dpdGgoJ0V4cHJlc3Npb24nKSkge1xuICAgICAgICAgIHZhbHVlID0gKHZhbHVlIGFzIEV4cHJlc3Npb248VD4pLnJlbmRlcih7XG4gICAgICAgICAgICBhbGlhc2VzLFxuICAgICAgICAgICAgcHJlZml4LFxuICAgICAgICAgICAgZXNjYXBlLFxuICAgICAgICAgICAgcGFyc2VyOiByZXNvbHZlKFt0aGlzLmZpZWxkXSwgcGFyc2VyKSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtrZXldOiB2YWx1ZSB9KTtcbiAgICAgIH0sIHt9KTtcbiAgICBsZXQgY291bnQgPSBgJHtyZW5kZXIodGhpcy5maWVsZCwge1xuICAgICAgYWxpYXNlcyxcbiAgICAgIGVzY2FwZSxcbiAgICAgIHByZWZpeCxcbiAgICAgIHBhcnNlcixcbiAgICAgIG9wdGlvbnMsXG4gICAgfSl9LyRjb3VudGA7XG4gICAgaWYgKCFUeXBlcy5pc0VtcHR5KHBhcmFtcykpIHtcbiAgICAgIGNvdW50ID0gYCR7Y291bnR9KCR7T2JqZWN0LmtleXMocGFyYW1zKVxuICAgICAgICAubWFwKChrZXkpID0+IGAkJHtrZXl9PSR7cGFyYW1zW2tleV19YClcbiAgICAgICAgLmpvaW4oJzsnKX0pYDtcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgZmlsdGVyKFxuICAgIG9wdHM6IChcbiAgICAgIGJ1aWxkZXI6IEZpbHRlckV4cHJlc3Npb25CdWlsZGVyPFQ+LFxuICAgICAgY3VycmVudD86IEZpbHRlckV4cHJlc3Npb248VD4sXG4gICAgKSA9PiBGaWx0ZXJFeHByZXNzaW9uPFQ+LFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb24oXG4gICAgICBRdWVyeU9wdGlvbi5maWx0ZXIsXG4gICAgICBGaWx0ZXJFeHByZXNzaW9uLmZhY3Rvcnk8VD4ob3B0cywgdGhpcy52YWx1ZXNbUXVlcnlPcHRpb24uZmlsdGVyXSksXG4gICAgKTtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKS5yZWR1Y2UoXG4gICAgICAoYWNjLCBrZXkpID0+XG4gICAgICAgIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtrZXldOiBPYmplY3RzLmNsb25lKHRoaXMudmFsdWVzW2tleV0pIH0pLFxuICAgICAge30sXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IENvdW50RmllbGQ8VD4odGhpcy5maWVsZC5jbG9uZSgpLCB2YWx1ZXMpO1xuICB9XG5cbiAgcmVzb2x2ZShwYXJzZXI6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnJlc29sdmUocGFyc2VyKTtcbiAgfVxuXG4gIC8vIE9wdGlvbiBIYW5kbGVyXG4gIHByaXZhdGUgb3B0aW9uPE8+KG5hbWU6IFF1ZXJ5T3B0aW9uLCBvcHRzPzogTykge1xuICAgIGlmIChvcHRzICE9PSB1bmRlZmluZWQpIHRoaXMudmFsdWVzW25hbWVdID0gb3B0cztcbiAgICByZXR1cm4gdGhpcy52YWx1ZXNbbmFtZV07XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQ291bnRFeHByZXNzaW9uQnVpbGRlcjxUPiA9IHtcbiAgdDogUmVxdWlyZWQ8VD47XG4gIGU6ICgpID0+IENvdW50RXhwcmVzc2lvbjxUPjtcbn07XG5leHBvcnQgY2xhc3MgQ291bnRFeHByZXNzaW9uPFQ+IGV4dGVuZHMgRXhwcmVzc2lvbjxUPiB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBjaGlsZHJlbixcbiAgfToge1xuICAgIGNoaWxkcmVuPzogUmVuZGVyYWJsZVtdO1xuICB9ID0ge30pIHtcbiAgICBzdXBlcih7IGNoaWxkcmVuIH0pO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnQ291bnRFeHByZXNzaW9uJztcbiAgfVxuXG4gIHN0YXRpYyBmYWN0b3J5PFQ+KFxuICAgIG9wdHM6IChcbiAgICAgIGJ1aWxkZXI6IENvdW50RXhwcmVzc2lvbkJ1aWxkZXI8VD4sXG4gICAgICBjdXJyZW50PzogQ291bnRFeHByZXNzaW9uPFQ+LFxuICAgICkgPT4gQ291bnRFeHByZXNzaW9uPFQ+LFxuICAgIGN1cnJlbnQ/OiBDb3VudEV4cHJlc3Npb248VD4sXG4gICk6IENvdW50RXhwcmVzc2lvbjxUPiB7XG4gICAgcmV0dXJuIG9wdHMoXG4gICAgICB7XG4gICAgICAgIHQ6IEZpZWxkRmFjdG9yeTxSZXF1aXJlZDxUPj4oKSxcbiAgICAgICAgZTogKCkgPT4gbmV3IENvdW50RXhwcmVzc2lvbjxUPigpLFxuICAgICAgfSxcbiAgICAgIGN1cnJlbnQsXG4gICAgKSBhcyBDb3VudEV4cHJlc3Npb248VD47XG4gIH1cblxuICBwcml2YXRlIF9hZGQobm9kZTogUmVuZGVyYWJsZSk6IENvdW50RXhwcmVzc2lvbjxhbnk+IHtcbiAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3ZlcnJpZGUgdG9Kc29uKCkge1xuICAgIGNvbnN0IGpzb24gPSBzdXBlci50b0pzb24oKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihqc29uLCB7fSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUpzb248VD4oanNvbjogeyBbbmFtZTogc3RyaW5nXTogYW55IH0pOiBDb3VudEV4cHJlc3Npb248VD4ge1xuICAgIHJldHVybiBuZXcgQ291bnRFeHByZXNzaW9uPFQ+KHtcbiAgICAgIGNoaWxkcmVuOiBqc29uWydjaGlsZHJlbiddLm1hcCgoYzogYW55KSA9PiBSZW5kZXJhYmxlRmFjdG9yeShjKSksXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgICBwcmVmaXgsXG4gICAgcGFyc2VyLFxuICAgIG9wdGlvbnMsXG4gIH06IHtcbiAgICBhbGlhc2VzPzogUXVlcnlDdXN0b21UeXBlW107XG4gICAgZXNjYXBlPzogYm9vbGVhbjtcbiAgICBwcmVmaXg/OiBzdHJpbmc7XG4gICAgcGFyc2VyPzogUGFyc2VyPFQ+O1xuICAgIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zO1xuICB9ID0ge30pOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gdGhpcy5fY2hpbGRyZW5cbiAgICAgIC5tYXAoKG4pID0+IG4ucmVuZGVyKHsgYWxpYXNlcywgZXNjYXBlLCBwcmVmaXgsIHBhcnNlciwgb3B0aW9ucyB9KSlcbiAgICAgIC5qb2luKGAsYCk7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IENvdW50RXhwcmVzc2lvbjxUPih7XG4gICAgICBjaGlsZHJlbjogdGhpcy5fY2hpbGRyZW4ubWFwKChjKSA9PiBjLmNsb25lKCkpLFxuICAgIH0pO1xuICB9XG5cbiAgZmllbGQ8Rj4oXG4gICAgZmllbGQ6IEZbXSxcbiAgICBvcHRzPzogKGU6IHsgdDogRjsgZjogQ291bnRGaWVsZDxGPiB9KSA9PiBDb3VudEV4cHJlc3Npb248Rj4sXG4gICk6IENvdW50RXhwcmVzc2lvbjxGPiB7XG4gICAgbGV0IGNvdW50RmllbGQgPSBuZXcgQ291bnRGaWVsZDxGPihmaWVsZCk7XG4gICAgaWYgKG9wdHMgIT09IHVuZGVmaW5lZClcbiAgICAgIG9wdHMoe1xuICAgICAgICB0OiBGaWVsZEZhY3Rvcnk8UmVxdWlyZWQ8Rj4+KCksXG4gICAgICAgIGY6IGNvdW50RmllbGQsXG4gICAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fYWRkKGNvdW50RmllbGQpO1xuICB9XG59XG4iXX0=