UNPKG

flexmonster-mongo-connector

Version:

Custom data source API implementation for MongoDB

153 lines 6.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.QueryBuilder = void 0; const FilterQueryBuilder_1 = require("./FilterQueryBuilder"); const ProjectionQueryBuilder_1 = require("./ProjectionQueryBuilder"); const GroupingQueryBuilder_1 = require("./GroupingQueryBuilder"); const MongoPipelineStages_1 = require("../../utils/consts/MongoPipelineStages"); class QueryBuilder { constructor() { this._filterQueryBuilder = null; this._projectionQueryBuilder = null; this._groupingQueryBuilder = null; if (QueryBuilder._queryBuilderInstance != null) throw new Error("Initialization failed: " + "use Singleton.getInstance() instead of new."); this._filterQueryBuilder = new FilterQueryBuilder_1.FilterQueryBuilder(); this._projectionQueryBuilder = new ProjectionQueryBuilder_1.ProjectionQueryBuilder(); this._groupingQueryBuilder = new GroupingQueryBuilder_1.GroupingQueryBuilder(); QueryBuilder._queryBuilderInstance = this; } static getInstance() { if (this._queryBuilderInstance == null) { this._queryBuilderInstance = new QueryBuilder(); } return this._queryBuilderInstance; } buildDrillThroughPipeline(drillThroughQuery, schema, clientSideLimit) { if (drillThroughQuery == null) throw new Error("Illegal argument exception. Query cannot be null"); const pipeline = []; const extendedQuery = { "aggs": { "by": { "rows": drillThroughQuery["fields"] } }, "filter": drillThroughQuery["filter"] }; if (extendedQuery["filter"] != null) { pipeline.push({ [MongoPipelineStages_1.MongoPipelineStages.MATCH]: this._filterQueryBuilder.buildFilterQuery(extendedQuery["filter"], schema) }); } delete extendedQuery["filter"]; pipeline.push({ [MongoPipelineStages_1.MongoPipelineStages.PROJECT]: this._projectionQueryBuilder.buildProjectionStage(extendedQuery, schema) }); pipeline.push({ [MongoPipelineStages_1.MongoPipelineStages.LIMIT]: clientSideLimit }); return pipeline; } buildFlatPipelineFacet(query, schema) { if (query == null) throw new Error("Illegal argument exception. Query cannot be null"); const pipeline = []; const grandTotalQuery = query.length === 1 ? null : query[0]; const dataRecords = query.length === 1 ? query[0] : query[1]; const extendedQuery = { "aggs": { "by": { "rows": dataRecords.clientQuery["fields"] } }, "filter": dataRecords.clientQuery["filter"] }; if (extendedQuery["filter"] != null) { pipeline.push({ "$match": this._filterQueryBuilder.buildFilterQuery(extendedQuery["filter"], schema) }); } delete extendedQuery["filter"]; pipeline.push({ [MongoPipelineStages_1.MongoPipelineStages.PROJECT]: this._projectionQueryBuilder.buildProjectionStage(extendedQuery, schema) }); const facetStage = {}; if (grandTotalQuery !== null) facetStage[grandTotalQuery.definition] = [this._groupingQueryBuilder.buildGroupStage(grandTotalQuery.clientQuery["aggs"])]; facetStage[dataRecords.definition] = [pipeline[0]]; pipeline.push({ [MongoPipelineStages_1.MongoPipelineStages.FACET]: facetStage }); return pipeline; } buildAggregationPipelineFacet(queries, schema, templateQuery, isPaginated) { if (queries == null) throw new Error("Illegal argument exception. Query cannot be null"); const pipeline = []; const intersectionQuery = templateQuery === undefined ? queries.shift() : JSON.parse(JSON.stringify(templateQuery)); if (intersectionQuery.clientQuery["filter"] != null) { pipeline.push({ [MongoPipelineStages_1.MongoPipelineStages.MATCH]: this._filterQueryBuilder.buildFilterQuery(intersectionQuery.clientQuery["filter"], schema) }); delete intersectionQuery.clientQuery["filter"]; } pipeline.push({ [MongoPipelineStages_1.MongoPipelineStages.PROJECT]: this._projectionQueryBuilder.buildProjectionStage(intersectionQuery.clientQuery, schema) }); if (intersectionQuery.clientQuery["aggs"] != null) { const facetStage = {}; for (let i = 0; i < queries.length; i++) { const query = queries[i]; const facet = [this._groupingQueryBuilder.buildGroupStage(query.clientQuery["aggs"])]; if (isPaginated !== undefined && isPaginated && (query.queryStats.chunkToLoad < query.queryStats.expectedNumberOfRecords)) { this.applyPaging(facet, { skipNumber: query.queryStats.sumOfLoadedRecords, limitNumber: query.queryStats.chunkToLoad }); } facetStage[queries[i].definition] = facet; } pipeline.push({ [MongoPipelineStages_1.MongoPipelineStages.FACET]: facetStage }); } return pipeline; } buildMembersPipeline(fieldObject, schema) { let query = { "aggs": { "by": { "rows": [fieldObject.field] } } }; let pipeline = []; if (fieldObject["filter"] !== undefined) { query["filter"] = fieldObject["filter"]; pipeline.push({ [MongoPipelineStages_1.MongoPipelineStages.MATCH]: this._filterQueryBuilder.buildFilterQuery(query["filter"], schema) }); } pipeline.push({ [MongoPipelineStages_1.MongoPipelineStages.PROJECT]: this._projectionQueryBuilder.buildProjectionStage(query, schema) }); pipeline.push(this._groupingQueryBuilder.buildGroupStage(query["aggs"])); return pipeline; } applyPaging(pipeline, pagingObject) { if (pagingObject != null) { pipeline.push({ [MongoPipelineStages_1.MongoPipelineStages.SKIP]: pagingObject.skipNumber }); pipeline.push({ [MongoPipelineStages_1.MongoPipelineStages.LIMIT]: pagingObject.limitNumber }); } } } exports.QueryBuilder = QueryBuilder; QueryBuilder._queryBuilderInstance = null; //# sourceMappingURL=QueryBuilder.js.map