flexmonster-mongo-connector
Version:
Custom data source API implementation for MongoDB
99 lines • 5.2 kB
JavaScript
;
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