UNPKG

flexmonster-mongo-connector

Version:

MongoDB connector for Flexmonster Pivot Table and Charts

286 lines 18.2 kB
"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