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