flexmonster-mongo-connector
Version:
Custom data source API implementation for MongoDB
286 lines • 18.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FilterQueryBuilder = void 0;
const ClientSideFieldType_1 = require("../../utils/consts/ClientSideFieldType");
const ClientSideFilterQueries_1 = require("../../utils/consts/ClientSideFilterQueries");
const MongoFilterQueries_1 = require("../../utils/consts/MongoFilterQueries");
const DateParts_1 = require("../../utils/consts/DateParts");
class FilterQueryBuilder {
constructor() {
this._msDay = 24 * 60 * 60 * 1000;
}
buildFilterQuery(query, schema) {
let filterQuery = {};
if (Array.isArray(query)) {
this._buildClassicFilter(query, schema, filterQuery);
}
else {
filterQuery = this._buildAdvancedFilter(query, schema);
}
return filterQuery;
}
_buildClassicFilter(queryList, schema, filterQuery) {
for (let i = 0; i < queryList.length; i++) {
const field = queryList[i]["field"];
filterQuery[field.uniqueName] = this._filterField(queryList[i], schema)[field.uniqueName];
}
return;
}
_buildAdvancedFilter(query, schema) {
const operationsList = [];
const mongoFilterObject = {
[this._getMongoLogicOperator(query["type"])]: operationsList
};
this._buildAvancedFilterRecursively(query["value"], schema, operationsList);
return mongoFilterObject;
}
_buildAvancedFilterRecursively(query, schema, operationsList) {
for (let i = 0; i < query.length; i++) {
operationsList.push(this._buildAdvancedFilterItem(query[i], schema));
}
return;
}
_buildAdvancedFilterItem(query, schema) {
if (typeof query["type"] !== "undefined") {
const operationsList = [];
const mongoFilterObject = {
[this._getMongoLogicOperator(query["type"])]: operationsList
};
this._buildAvancedFilterRecursively(query["value"], schema, operationsList);
return mongoFilterObject;
}
else {
let mongoFilterQuery = this._filterField(query, schema);
if (mongoFilterQuery[0] !== undefined && Array.isArray(mongoFilterQuery[0])) {
const lastQuery = mongoFilterQuery.length > 1 && !Array.isArray(mongoFilterQuery[mongoFilterQuery.length - 1]) ? mongoFilterQuery.pop() : undefined;
const listOfOrConditions = lastQuery === undefined ? [] : [lastQuery];
const clientMemberFilterQuery = query[ClientSideFilterQueries_1.ClientSideFilterQueries.INCLUDE] !== undefined ? ClientSideFilterQueries_1.ClientSideFilterQueries.INCLUDE : ClientSideFilterQueries_1.ClientSideFilterQueries.EXCLUDE;
const negation = clientMemberFilterQuery === ClientSideFilterQueries_1.ClientSideFilterQueries.EXCLUDE;
const resultORQuery = {
[this._getMongoLogicOperator(ClientSideFilterQueries_1.ClientSideFilterQueries.OR, negation)]: listOfOrConditions
};
for (let i = 0; i < mongoFilterQuery.length; i++) {
listOfOrConditions.push({
[this._getMongoLogicOperator(ClientSideFilterQueries_1.ClientSideFilterQueries.AND, negation)]: mongoFilterQuery[i]
});
}
mongoFilterQuery = resultORQuery;
}
else if (query["query"] !== undefined) {
const resultQuery = {
[query["field"]["uniqueName"]]: mongoFilterQuery
};
mongoFilterQuery = resultQuery;
}
return mongoFilterQuery;
}
}
_getMongoLogicOperator(clientLogicOperator, negation = false) {
let mongoLogicOperator = "";
if (ClientSideFilterQueries_1.ClientSideFilterQueries.AND === clientLogicOperator) {
mongoLogicOperator = !negation ? MongoFilterQueries_1.MongoFilterQueries.AND : MongoFilterQueries_1.MongoFilterQueries.OR;
}
else if (ClientSideFilterQueries_1.ClientSideFilterQueries.OR === clientLogicOperator) {
mongoLogicOperator = !negation ? MongoFilterQueries_1.MongoFilterQueries.OR : MongoFilterQueries_1.MongoFilterQueries.AND;
}
if (mongoLogicOperator.length === 0) {
throw new Error("Invalid client filter format");
}
return mongoLogicOperator;
}
_filterField(query, schema) {
let field = query["field"];
if ((schema.fields.get(field.uniqueName).type == ClientSideFieldType_1.ClientSideFieldType.STRING
|| schema.fields.get(field.uniqueName).type == ClientSideFieldType_1.ClientSideFieldType.NUMBER)
&& query.value == null) {
return this._filterLabelField(query, schema, field);
}
else if (schema.fields.get(field.uniqueName).type == ClientSideFieldType_1.ClientSideFieldType.DATE
&& query.value == null) {
return this._filterDateField(query, schema, field);
}
else if (query.value != null) { }
return;
}
_filterLabelField(query, schema, fieldName) {
const fieldFilterObject = {};
const FLAGS = "gi";
if (query["query"]) {
query = query["query"];
if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.BEGIN]) {
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.REGEXP] = new RegExp("^" + query[ClientSideFilterQueries_1.ClientSideFilterQueries.BEGIN], FLAGS);
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_BEGIN]) {
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.REGEXP] = new RegExp("^(?!" + query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_BEGIN] + ").*", FLAGS);
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.CONTAIN]) {
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.REGEXP] = new RegExp(query[ClientSideFilterQueries_1.ClientSideFilterQueries.CONTAIN], FLAGS);
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_CONTAIN]) {
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.REGEXP] = new RegExp("^((?!" + query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_CONTAIN] + ").)*$", FLAGS);
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.END]) {
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.REGEXP] = new RegExp(query[ClientSideFilterQueries_1.ClientSideFilterQueries.END] + "$", FLAGS);
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_END]) {
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.REGEXP] = new RegExp("^(?!.*" + query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_END] + "$).*$", FLAGS);
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.EQUAL]) {
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.EQUAL] = query[ClientSideFilterQueries_1.ClientSideFilterQueries.EQUAL];
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_EQUAL]) {
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.NOT] = {
[MongoFilterQueries_1.MongoFilterQueries.EQUAL]: query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_EQUAL]
};
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.GREATER]) {
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.GREATER] = query[ClientSideFilterQueries_1.ClientSideFilterQueries.GREATER];
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.GREATER_EQUAL]) {
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.GREATER_EQUAL] = query[ClientSideFilterQueries_1.ClientSideFilterQueries.GREATER_EQUAL];
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.LESS]) {
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.LESS] = query[ClientSideFilterQueries_1.ClientSideFilterQueries.LESS];
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.LESS_EQUAL]) {
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.LESS_EQUAL] = query[ClientSideFilterQueries_1.ClientSideFilterQueries.LESS_EQUAL];
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.BETWEEN]) {
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.GREATER_EQUAL] = query[ClientSideFilterQueries_1.ClientSideFilterQueries.BETWEEN][0];
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.LESS_EQUAL] = query[ClientSideFilterQueries_1.ClientSideFilterQueries.BETWEEN][1];
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_BETWEEN]) {
fieldFilterObject[MongoFilterQueries_1.MongoFilterQueries.NOT] = {
[MongoFilterQueries_1.MongoFilterQueries.GREATER_EQUAL]: query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_BETWEEN][0],
[MongoFilterQueries_1.MongoFilterQueries.LESS_EQUAL]: query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_BETWEEN][1]
};
}
}
else {
if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.INCLUDE]) {
return this.parseIncludeExcludeMembers(query[ClientSideFilterQueries_1.ClientSideFilterQueries.INCLUDE], ClientSideFilterQueries_1.ClientSideFilterQueries.INCLUDE, fieldName, schema, false);
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.EXCLUDE]) {
return this.parseIncludeExcludeMembers(query[ClientSideFilterQueries_1.ClientSideFilterQueries.EXCLUDE], ClientSideFilterQueries_1.ClientSideFilterQueries.EXCLUDE, fieldName, schema, false);
}
}
return fieldFilterObject;
}
parseIncludeExcludeMembers(members, membersFilterQuery, fieldName, schema, isDate) {
if (members == null)
return [];
const result = [];
const membersList = [];
let member = null;
for (let i = 0; i < members.length; i++) {
member = isDate ? new Date(members[i].member) : members[i].member;
if (members[i].filter === undefined) {
membersList.push(member);
}
else {
const mongofilterQueryChunk = {
[fieldName.uniqueName]: {
[this.getMongoGroupMemberFilter(membersFilterQuery)]: [member]
}
};
result.push(this.resolveRecursiveFilter(schema, mongofilterQueryChunk, members[i].filter, membersFilterQuery === ClientSideFilterQueries_1.ClientSideFilterQueries.EXCLUDE));
}
}
const queryFromMembersList = {
[fieldName.uniqueName]: {
[this.getMongoGroupMemberFilter(membersFilterQuery)]: membersList
}
};
if (result.length === 0) {
return queryFromMembersList;
}
else {
if (membersList.length > 0)
result.push(queryFromMembersList);
return result;
}
}
getMongoGroupMemberFilter(membersFilterQuery, negation = false) {
if (ClientSideFilterQueries_1.ClientSideFilterQueries.INCLUDE === membersFilterQuery) {
return !negation ? MongoFilterQueries_1.MongoFilterQueries.INCLUDE : MongoFilterQueries_1.MongoFilterQueries.EXCLUDE;
}
else {
return !negation ? MongoFilterQueries_1.MongoFilterQueries.EXCLUDE : MongoFilterQueries_1.MongoFilterQueries.INCLUDE;
}
}
resolveRecursiveFilter(schema, mongofilterQueryChunk, filterQuery, negation) {
const listOfMongoFilterChunks = [mongofilterQueryChunk];
let reference = filterQuery;
while (reference !== undefined) {
const mongoFilterChunk = {};
reference = this.reduceFilterItemRecurcion(reference, schema, mongoFilterChunk, negation);
listOfMongoFilterChunks.push(mongoFilterChunk);
}
return listOfMongoFilterChunks;
}
reduceFilterItemRecurcion(filterQuery, schema, mongoFilterChunk, negation) {
let clientMemberQuery = filterQuery.include !== undefined ? ClientSideFilterQueries_1.ClientSideFilterQueries.INCLUDE : ClientSideFilterQueries_1.ClientSideFilterQueries.EXCLUDE;
const members = filterQuery.include !== undefined ? filterQuery.include : filterQuery.exclude;
const isDate = schema.fields.get(filterQuery.field.uniqueName).type === ClientSideFieldType_1.ClientSideFieldType.DATE;
mongoFilterChunk[filterQuery.field.uniqueName] = {
[this.getMongoGroupMemberFilter(clientMemberQuery, negation)]: [isDate ? new Date(members[0].member) : members[0].member]
};
return members[0].filter;
}
_filterDateField(query, schema, fieldName) {
const mongoFilterQuery = {};
const isIntervalDefined = this.isDateIntervalDefined(fieldName.interval);
if (query["query"]) {
query = query["query"];
if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.BEFORE]) {
mongoFilterQuery[MongoFilterQueries_1.MongoFilterQueries.LESS] = this.adjustDateFormat(query[ClientSideFilterQueries_1.ClientSideFilterQueries.BEFORE], isIntervalDefined);
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.BEFORE_EQUAL]) {
mongoFilterQuery[MongoFilterQueries_1.MongoFilterQueries.LESS] = this.adjustDateFormat(query[ClientSideFilterQueries_1.ClientSideFilterQueries.BEFORE_EQUAL] + this._msDay, isIntervalDefined);
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.EQUAL]) {
mongoFilterQuery[MongoFilterQueries_1.MongoFilterQueries.GREATER_EQUAL] = this.adjustDateFormat(query[ClientSideFilterQueries_1.ClientSideFilterQueries.EQUAL], isIntervalDefined);
mongoFilterQuery[MongoFilterQueries_1.MongoFilterQueries.LESS] = this.adjustDateFormat(query[ClientSideFilterQueries_1.ClientSideFilterQueries.EQUAL] + this._msDay, isIntervalDefined);
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_EQUAL]) {
mongoFilterQuery[MongoFilterQueries_1.MongoFilterQueries.NOT] = {
[MongoFilterQueries_1.MongoFilterQueries.GREATER_EQUAL]: this.adjustDateFormat(query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_EQUAL], isIntervalDefined),
[MongoFilterQueries_1.MongoFilterQueries.LESS]: this.adjustDateFormat(query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_EQUAL] + this._msDay, isIntervalDefined)
};
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.AFTER]) {
mongoFilterQuery[MongoFilterQueries_1.MongoFilterQueries.GREATER_EQUAL] = this.adjustDateFormat(query[ClientSideFilterQueries_1.ClientSideFilterQueries.AFTER], isIntervalDefined);
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.AFTER_EQUAL]) {
mongoFilterQuery[MongoFilterQueries_1.MongoFilterQueries.GREATER_EQUAL] = this.adjustDateFormat(query[ClientSideFilterQueries_1.ClientSideFilterQueries.AFTER_EQUAL], isIntervalDefined);
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.BETWEEN]) {
mongoFilterQuery[MongoFilterQueries_1.MongoFilterQueries.GREATER_EQUAL] = this.adjustDateFormat(query[ClientSideFilterQueries_1.ClientSideFilterQueries.BETWEEN][0], isIntervalDefined);
mongoFilterQuery[MongoFilterQueries_1.MongoFilterQueries.LESS_EQUAL] = this.adjustDateFormat(query[ClientSideFilterQueries_1.ClientSideFilterQueries.BETWEEN][1], isIntervalDefined);
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_BETWEEN]) {
mongoFilterQuery[MongoFilterQueries_1.MongoFilterQueries.NOT] = {
[MongoFilterQueries_1.MongoFilterQueries.GREATER_EQUAL]: this.adjustDateFormat(query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_BETWEEN][0], isIntervalDefined),
[MongoFilterQueries_1.MongoFilterQueries.LESS_EQUAL]: this.adjustDateFormat(query[ClientSideFilterQueries_1.ClientSideFilterQueries.NOT_BETWEEN][1], isIntervalDefined)
};
}
}
else {
if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.INCLUDE]) {
return this.parseIncludeExcludeMembers(query[ClientSideFilterQueries_1.ClientSideFilterQueries.INCLUDE], ClientSideFilterQueries_1.ClientSideFilterQueries.INCLUDE, fieldName, schema, true);
}
else if (query[ClientSideFilterQueries_1.ClientSideFilterQueries.EXCLUDE]) {
return this.parseIncludeExcludeMembers(query[ClientSideFilterQueries_1.ClientSideFilterQueries.EXCLUDE], ClientSideFilterQueries_1.ClientSideFilterQueries.EXCLUDE, fieldName, schema, true);
}
}
return mongoFilterQuery;
}
adjustDateFormat(timestamp, isIntervalDefined) {
return isIntervalDefined ? new Date(timestamp) : timestamp;
}
isDateIntervalDefined(interval) {
return interval !== undefined && DateParts_1.DateIntervals.isValid(interval);
}
}
exports.FilterQueryBuilder = FilterQueryBuilder;
//# sourceMappingURL=FilterQueryBuilder.js.map