cocori-ng
Version:
Cocori-ng is an Angular full of great components & utilites based on Material
115 lines • 17.8 kB
JavaScript
import { FragmentType } from './enums';
import { QueryFragment } from './queryFragment';
export default class FilterBuilder {
constructor() {
this.fragments = [];
this.filterExpression = (field, operator, value) => {
this.fragments.push(new QueryFragment(FragmentType.Filter, `${field} ${operator} ${this.getValue(value)}`));
return this;
};
this.filterPhrase = (phrase) => {
this.fragments.push(new QueryFragment(FragmentType.Filter, phrase));
return this;
};
this.and = (predicate) => {
this.fragments.push(new QueryFragment(FragmentType.Filter, `(${predicate(new FilterBuilder()).toQuery('and')})`));
return this;
};
this.or = (predicate) => {
this.fragments.push(new QueryFragment(FragmentType.Filter, `(${predicate(new FilterBuilder()).toQuery('or')})`));
return this;
};
this.toQuery = (operator) => {
if (!this.fragments || this.fragments.length < 1)
return '';
return this.fragments.map(f => f.value).join(` ${operator} `);
};
}
getValue(value) {
let type = typeof value;
if (value instanceof Date)
type = 'date';
switch (type) {
case 'string':
return `'${value}'`;
case 'date':
return `${value.toISOString()}`;
default:
return `${value}`;
}
}
}
export class QueryBuilder {
constructor() {
this.fragments = [];
this.orderBy = (fields) => {
this.clear(FragmentType.OrderBy);
this.fragments.push(new QueryFragment(FragmentType.OrderBy, `$orderby=${fields}`));
return this;
};
this.top = (top) => {
this.clear(FragmentType.Top);
this.fragments.push(new QueryFragment(FragmentType.Top, `$top=${top}`));
return this;
};
this.skip = (skip) => {
this.clear(FragmentType.Skip);
this.fragments.push(new QueryFragment(FragmentType.Skip, `$skip=${skip}`));
return this;
};
this.count = () => {
this.clear(FragmentType.Count);
this.fragments.push(new QueryFragment(FragmentType.Count, `$count=true`));
return this;
};
this.expand = (fields) => {
this.clear(FragmentType.Expand);
this.fragments.push(new QueryFragment(FragmentType.Expand, `$expand=${fields}`));
return this;
};
this.select = (fields) => {
this.clear(FragmentType.Select);
this.fragments.push(new QueryFragment(FragmentType.Select, `$select=${fields}`));
return this;
};
this.filter = (predicate, operator = 'and') => {
this.clear(FragmentType.Filter);
this.fragments.push(new QueryFragment(FragmentType.Filter, predicate(new FilterBuilder()).toQuery(operator)));
return this;
};
this.clear = (fragmentType) => {
this.fragments = this.fragments.filter(f => f.type !== fragmentType);
return this;
};
this.toQuery = () => {
if (this.fragments.length < 1)
return '';
// const sortedFragments = orderBy(this.fragments, (sf: QueryFragment) => sf.type);
const sortedFragments = this.fragments.concat().sort(this.sortBy("type"));
const nonFilterFragments = sortedFragments.filter((sf) => sf.type !== FragmentType.Filter);
const filterFragments = sortedFragments.filter((sf) => sf.type === FragmentType.Filter);
let query =
// '?' +
'' +
sortedFragments
.filter((sf) => sf.type !== FragmentType.Filter)
.map((sf) => sf.value)
.join('&');
if (filterFragments.length < 1)
return query;
else if (nonFilterFragments.length > 0)
query += '&';
query += this.parseFilters(filterFragments, 'and').trim();
return query;
};
this.sortBy = (key) => {
return (a, b) => (a[key] > b[key]) ? 1 : ((b[key] > a[key]) ? -1 : 0);
};
}
parseFilters(fragments, operator) {
if (!fragments === null || fragments.length < 1)
return '';
return '$filter=' + fragments.map(f => f.value).join(` ${operator} `);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnlCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29jb3JpLW5nL3NyYy9mZWF0dXJlLWNvcmUvc2VydmljZS9vZGF0YS1xdWVyeS1idWlsZGVyL3F1ZXJ5QnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU1oRCxNQUFNLENBQUMsT0FBTyxPQUFPLGFBQWE7SUFBbEM7UUFDVSxjQUFTLEdBQW9CLEVBQUUsQ0FBQztRQUN4QyxxQkFBZ0IsR0FBRyxDQUFDLEtBQWEsRUFBRSxRQUFnQixFQUFFLEtBQTJCLEVBQUUsRUFBRTtZQUNsRixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDakIsSUFBSSxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQ3ZGLENBQUM7WUFDRixPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQztRQUNGLGlCQUFZLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRTtZQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDcEUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUM7UUFDRixRQUFHLEdBQUcsQ0FBQyxTQUFtRCxFQUFFLEVBQUU7WUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ2pCLElBQUksYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxTQUFTLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FB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QUFHLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDdkIsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUM7SUFDSixDQUFDO0lBUlMsWUFBWSxDQUFDLFNBQTBCLEVBQUUsUUFBZ0I7UUFDL0QsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDM0QsT0FBTyxVQUFVLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7Q0FLRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZyYWdtZW50VHlwZSB9IGZyb20gJy4vZW51bXMnO1xyXG5pbXBvcnQgeyBRdWVyeUZyYWdtZW50IH0gZnJvbSAnLi9xdWVyeUZyYWdtZW50JztcclxuXHJcbi8vIGNvbnN0IG9yZGVyQnkgPSByZXF1aXJlKCdsb2Rhc2gub3JkZXJieScpO1xyXG5cclxudHlwZSBmaWx0ZXJFeHByZXNzaW9uVHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsdGVyQnVpbGRlciB7XHJcbiAgcHJpdmF0ZSBmcmFnbWVudHM6IFF1ZXJ5RnJhZ21lbnRbXSA9IFtdO1xyXG4gIGZpbHRlckV4cHJlc3Npb24gPSAoZmllbGQ6IHN0cmluZywgb3BlcmF0b3I6IHN0cmluZywgdmFsdWU6IGZpbHRlckV4cHJlc3Npb25UeXBlKSA9PiB7XHJcbiAgICB0aGlzLmZyYWdtZW50cy5wdXNoKFxyXG4gICAgICBuZXcgUXVlcnlGcmFnbWVudChGcmFnbWVudFR5cGUuRmlsdGVyLCBgJHtmaWVsZH0gJHtvcGVyYXRvcn0gJHt0aGlzLmdldFZhbHVlKHZhbHVlKX1gKVxyXG4gICAgKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH07XHJcbiAgZmlsdGVyUGhyYXNlID0gKHBocmFzZTogc3RyaW5nKSA9PiB7XHJcbiAgICB0aGlzLmZyYWdtZW50cy5wdXNoKG5ldyBRdWVyeUZyYWdtZW50KEZyYWdtZW50VHlwZS5GaWx0ZXIsIHBocmFzZSkpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfTtcclxuICBhbmQgPSAocHJlZGljYXRlOiAoZmlsdGVyOiBGaWx0ZXJCdWlsZGVyKSA9PiBGaWx0ZXJCdWlsZGVyKSA9PiB7XHJcbiAgICB0aGlzLmZyYWdtZW50cy5wdXNoKFxyXG4gICAgICBuZXcgUXVlcnlGcmFnbWVudChGcmFnbWVudFR5cGUuRmlsdGVyLCBgKCR7cHJlZGljYXRlKG5ldyBGaWx0ZXJCdWlsZGVyKCkpLnRvUXVlcnkoJ2FuZCcpfSlgKVxyXG4gICAgKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH07XHJcbiAgb3IgPSAocHJlZGljYXRlOiAoZmlsdGVyOiBGaWx0ZXJCdWlsZGVyKSA9PiBGaWx0ZXJCdWlsZGVyKSA9PiB7XHJcbiAgICB0aGlzLmZyYWdtZW50cy5wdXNoKFxyXG4gICAgICBuZXcgUXVlcnlGcmFnbWVudChGcmFnbWVudFR5cGUuRmlsdGVyLCBgKCR7cHJlZGljYXRlKG5ldyBGaWx0ZXJCdWlsZGVyKCkpLnRvUXVlcnkoJ29yJyl9KWApXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfTtcclxuICB0b1F1ZXJ5ID0gKG9wZXJhdG9yOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gICAgaWYgKCF0aGlzLmZyYWdtZW50cyB8fCB0aGlzLmZyYWdtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gJyc7XHJcbiAgICByZXR1cm4gdGhpcy5mcmFnbWVudHMubWFwKGYgPT4gZi52YWx1ZSkuam9pbihgICR7b3BlcmF0b3J9IGApO1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgZ2V0VmFsdWUodmFsdWU6IGZpbHRlckV4cHJlc3Npb25UeXBlKTogc3RyaW5nIHtcclxuICAgIGxldCB0eXBlOiBzdHJpbmcgPSB0eXBlb2YgdmFsdWU7XHJcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB0eXBlID0gJ2RhdGUnO1xyXG5cclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlICdzdHJpbmcnOlxyXG4gICAgICAgIHJldHVybiBgJyR7dmFsdWV9J2A7XHJcbiAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICAgIHJldHVybiBgJHsodmFsdWUgYXMgRGF0ZSkudG9JU09TdHJpbmcoKX1gO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFF1ZXJ5QnVpbGRlciB7XHJcbiAgcHJpdmF0ZSBmcmFnbWVudHM6IFF1ZXJ5RnJhZ21lbnRbXSA9IFtdO1xyXG4gIG9yZGVyQnkgPSAoZmllbGRzOiBzdHJpbmcpID0+IHtcclxuICAgIHRoaXMuY2xlYXIoRnJhZ21lbnRUeXBlLk9yZGVyQnkpO1xyXG4gICAgdGhpcy5mcmFnbWVudHMucHVzaChuZXcgUXVlcnlGcmFnbWVudChGcmFnbWVudFR5cGUuT3JkZXJCeSwgYCRvcmRlcmJ5PSR7ZmllbGRzfWApKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH07XHJcbiAgdG9wID0gKHRvcDogbnVtYmVyKSA9PiB7XHJcbiAgICB0aGlzLmNsZWFyKEZyYWdtZW50VHlwZS5Ub3ApO1xyXG4gICAgdGhpcy5mcmFnbWVudHMucHVzaChuZXcgUXVlcnlGcmFnbWVudChGcmFnbWVudFR5cGUuVG9wLCBgJHRvcD0ke3RvcH1gKSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9O1xyXG4gIHNraXAgPSAoc2tpcDogbnVtYmVyKSA9PiB7XHJcbiAgICB0aGlzLmNsZWFyKEZyYWdtZW50VHlwZS5Ta2lwKTtcclxuICAgIHRoaXMuZnJhZ21lbnRzLnB1c2gobmV3IFF1ZXJ5RnJhZ21lbnQoRnJhZ21lbnRUeXBlLlNraXAsIGAkc2tpcD0ke3NraXB9YCkpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfTtcclxuICBjb3VudCA9ICgpID0+IHtcclxuICAgIHRoaXMuY2xlYXIoRnJhZ21lbnRUeXBlLkNvdW50KTtcclxuICAgIHRoaXMuZnJhZ21lbnRzLnB1c2gobmV3IFF1ZXJ5RnJhZ21lbnQoRnJhZ21lbnRUeXBlLkNvdW50LCBgJGNvdW50PXRydWVgKSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9O1xyXG4gIGV4cGFuZCA9IChmaWVsZHM6IHN0cmluZykgPT4ge1xyXG4gICAgdGhpcy5jbGVhcihGcmFnbWVudFR5cGUuRXhwYW5kKTtcclxuICAgIHRoaXMuZnJhZ21lbnRzLnB1c2gobmV3IFF1ZXJ5RnJhZ21lbnQoRnJhZ21lbnRUeXBlLkV4cGFuZCwgYCRleHBhbmQ9JHtmaWVsZHN9YCkpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfTtcclxuICBzZWxlY3QgPSAoZmllbGRzOiBzdHJpbmcpID0+IHtcclxuICAgIHRoaXMuY2xlYXIoRnJhZ21lbnRUeXBlLlNlbGVjdCk7XHJcbiAgICB0aGlzLmZyYWdtZW50cy5wdXNoKG5ldyBRdWVyeUZyYWdtZW50KEZyYWdtZW50VHlwZS5TZWxlY3QsIGAkc2VsZWN0PSR7ZmllbGRzfWApKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH07XHJcbiAgZmlsdGVyID0gKHByZWRpY2F0ZTogKGZpbHRlcjogRmlsdGVyQnVpbGRlcikgPT4gRmlsdGVyQnVpbGRlciwgb3BlcmF0b3I6IHN0cmluZyA9ICdhbmQnKSA9PiB7XHJcbiAgICB0aGlzLmNsZWFyKEZyYWdtZW50VHlwZS5GaWx0ZXIpO1xyXG4gICAgdGhpcy5mcmFnbWVudHMucHVzaChcclxuICAgICAgbmV3IFF1ZXJ5RnJhZ21lbnQoRnJhZ21lbnRUeXBlLkZpbHRlciwgcHJlZGljYXRlKG5ldyBGaWx0ZXJCdWlsZGVyKCkpLnRvUXVlcnkob3BlcmF0b3IpKVxyXG4gICAgKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH07XHJcbiAgY2xlYXIgPSAoZnJhZ21lbnRUeXBlOiBGcmFnbWVudFR5cGUpID0+IHtcclxuICAgIHRoaXMuZnJhZ21lbnRzID0gdGhpcy5mcmFnbWVudHMuZmlsdGVyKGYgPT4gZi50eXBlICE9PSBmcmFnbWVudFR5cGUpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG4gIHRvUXVlcnkgPSAoKSA9PiB7XHJcbiAgICBpZiAodGhpcy5mcmFnbWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuICcnO1xyXG5cclxuICAgIC8vIGNvbnN0IHNvcnRlZEZyYWdtZW50cyA9IG9yZGVyQnkodGhpcy5mcmFnbWVudHMsIChzZjogUXVlcnlGcmFnbWVudCkgPT4gc2YudHlwZSk7XHJcblxyXG4gICAgY29uc3Qgc29ydGVkRnJhZ21lbnRzID0gdGhpcy5mcmFnbWVudHMuY29uY2F0KCkuc29ydCh0aGlzLnNvcnRCeShcInR5cGVcIikpO1xyXG4gICAgY29uc3Qgbm9uRmlsdGVyRnJhZ21lbnRzID0gc29ydGVkRnJhZ21lbnRzLmZpbHRlcigoc2Y6IFF1ZXJ5RnJhZ21lbnQpID0+IHNmLnR5cGUgIT09IEZyYWdtZW50VHlwZS5GaWx0ZXIpO1xyXG4gICAgY29uc3QgZmlsdGVyRnJhZ21lbnRzID0gc29ydGVkRnJhZ21lbnRzLmZpbHRlcigoc2Y6IFF1ZXJ5RnJhZ21lbnQpID0+IHNmLnR5cGUgPT09IEZyYWdtZW50VHlwZS5GaWx0ZXIpO1xyXG5cclxuICAgIGxldCBxdWVyeSA9XHJcbiAgICAgIC8vICc/JyArXHJcbiAgICAgICcnICtcclxuICAgICAgc29ydGVkRnJhZ21lbnRzXHJcbiAgICAgICAgLmZpbHRlcigoc2Y6IFF1ZXJ5RnJhZ21lbnQpID0+IHNmLnR5cGUgIT09IEZyYWdtZW50VHlwZS5GaWx0ZXIpXHJcbiAgICAgICAgLm1hcCgoc2Y6IFF1ZXJ5RnJhZ21lbnQpID0+IHNmLnZhbHVlKVxyXG4gICAgICAgIC5qb2luKCcmJyk7XHJcblxyXG4gICAgaWYgKGZpbHRlckZyYWdtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gcXVlcnk7XHJcbiAgICBlbHNlIGlmIChub25GaWx0ZXJGcmFnbWVudHMubGVuZ3RoID4gMCkgcXVlcnkgKz0gJyYnO1xyXG5cclxuICAgIHF1ZXJ5ICs9IHRoaXMucGFyc2VGaWx0ZXJzKGZpbHRlckZyYWdtZW50cywgJ2FuZCcpLnRyaW0oKTtcclxuXHJcbiAgICByZXR1cm4gcXVlcnk7XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBwYXJzZUZpbHRlcnMoZnJhZ21lbnRzOiBRdWVyeUZyYWdtZW50W10sIG9wZXJhdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFmcmFnbWVudHMgPT09IG51bGwgfHwgZnJhZ21lbnRzLmxlbmd0aCA8IDEpIHJldHVybiAnJztcclxuICAgIHJldHVybiAnJGZpbHRlcj0nICsgZnJhZ21lbnRzLm1hcChmID0+IGYudmFsdWUpLmpvaW4oYCAke29wZXJhdG9yfSBgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydEJ5ID0gKGtleSkgPT4ge1xyXG4gICAgcmV0dXJuIChhLCBiKSA9PiAoYVtrZXldID4gYltrZXldKSA/IDEgOiAoKGJba2V5XSA+IGFba2V5XSkgPyAtMSA6IDApO1xyXG4gIH07XHJcbn1cclxuIl19