UNPKG

flexmonster-mongo-connector

Version:

MongoDB connector for Flexmonster Pivot Table and Charts

99 lines 5.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ProjectionQueryBuilder = void 0; const ClientSideFieldType_1 = require("../../utils/consts/ClientSideFieldType"); const DateParts_1 = require("../../utils/consts/DateParts"); class ProjectionQueryBuilder { constructor() { } buildProjectionStage(query, schema) { let aggregationQuery = query["aggs"]; let filterQuery = query["filter"]; let projection = {}; if (aggregationQuery !== undefined && aggregationQuery["values"] !== undefined) { let fieldValueObject = null; for (let i = 0; i < aggregationQuery["values"].length; i++) { fieldValueObject = aggregationQuery["values"][i]["field"]; if (schema.fields.get(fieldValueObject.uniqueName).type == ClientSideFieldType_1.ClientSideFieldType.DATE) { this._buildProjectionForDateField(fieldValueObject, projection); } else { projection[fieldValueObject.uniqueName] = "$" + fieldValueObject.uniqueName; } } } if (aggregationQuery !== undefined && aggregationQuery["by"] !== undefined) { this._buildProjectionFromRowsColumns(aggregationQuery["by"]["rows"], schema, projection); this._buildProjectionFromRowsColumns(aggregationQuery["by"]["cols"], schema, projection); } this._buildProjectionFromFilters(filterQuery, schema, projection); return projection; } _buildProjectionFromFilters(filters, schema, projectionQuery) { if (filters == null) return; let filterObject = null; for (let i = 0; i < filters.length; i++) { filterObject = filters[i].field; if (schema.fields.get(filterObject.uniqueName).type == ClientSideFieldType_1.ClientSideFieldType.DATE) { this._buildProjectionForDateField(filterObject, projectionQuery); } else { projectionQuery[filterObject.uniqueName] = "$" + filterObject.uniqueName; } if (filterObject.hasOwnProperty("value")) { const fieldValueObject = filterObject.value.field; projectionQuery[fieldValueObject.uniqueName] = "$" + fieldValueObject.uniqueName; } } } _buildProjectionFromRowsColumns(rowsColumns, schema, projectionQuery) { if (rowsColumns == null) return; let fieldReference = null; let fieldObject = null; for (let i = 0; i < rowsColumns.length; i++) { fieldObject = rowsColumns[i]; fieldReference = "$" + fieldObject.uniqueName; const schemaValueObject = schema.fields.get(fieldObject.uniqueName); if ((schemaValueObject === null || schemaValueObject === void 0 ? void 0 : schemaValueObject.type) == ClientSideFieldType_1.ClientSideFieldType.DATE) { this._buildProjectionForDateField(rowsColumns[i], projectionQuery); } else if (schemaValueObject) { projectionQuery[fieldObject.uniqueName] = fieldReference; } } } _buildProjectionForDateField(fieldValueObject, projectionQuery) { const fieldUniquename = fieldValueObject.uniqueName; if (projectionQuery[fieldUniquename] != null) return; let timestampObject = {}; if (fieldValueObject.interval == null || !DateParts_1.DateIntervals.isValid(fieldValueObject.interval)) { projectionQuery[fieldUniquename] = { "$toLong": "$" + fieldUniquename }; return; } else { timestampObject[DateParts_1.DateParts.YEAR] = { "$year": "$" + fieldUniquename }; timestampObject[DateParts_1.DateParts.MONTH] = { "$month": "$" + fieldUniquename }; timestampObject[DateParts_1.DateParts.DAY] = { "$dayOfMonth": "$" + fieldUniquename }; } if (fieldValueObject.interval == DateParts_1.DateIntervals.HOUR) { timestampObject[DateParts_1.DateParts.HOUR] = { "$hour": "$" + fieldUniquename }; } else if (fieldValueObject.interval == DateParts_1.DateIntervals.MINUTES) { timestampObject[DateParts_1.DateParts.HOUR] = { "$hour": "$" + fieldUniquename }; timestampObject[DateParts_1.DateParts.MINUTE] = { "$minute": "$" + fieldUniquename }; } else if (fieldValueObject.interval == DateParts_1.DateIntervals.SECONDS) { timestampObject[DateParts_1.DateParts.HOUR] = { "$hour": "$" + fieldUniquename }; timestampObject[DateParts_1.DateParts.MINUTE] = { "$minute": "$" + fieldUniquename }; timestampObject[DateParts_1.DateParts.SECOND] = { "$second": "$" + fieldUniquename }; } projectionQuery[fieldUniquename] = { "$toLong": { "$dateFromParts": timestampObject } }; } } exports.ProjectionQueryBuilder = ProjectionQueryBuilder; //# sourceMappingURL=ProjectionQueryBuilder.js.map