flexmonster-mongo-connector
Version:
Custom data source API implementation for MongoDB
52 lines (45 loc) • 2.12 kB
text/typescript
import {SupportedAggregations} from '../../utils/consts/SupportedAggregations';
import {Delimeter} from '../../utils/consts/Delimeters';
import { MongoPipelineStages } from '../../utils/consts/MongoPipelineStages';
import {IRequestField} from '../../requests/apiRequests/IRequestArgument';
export class GroupingQueryBuilder {
constructor() {
}
public buildGroupStage(query: any) {
let groupStage: any = {};
let valuesArray = query.values;
let key = null;
let value = null;
let keyValueField = null;
let fieldValueObject: IRequestField = null;
if (valuesArray != null) {
for (let i = 0; i < valuesArray.length; i++) {
value = valuesArray[i];
fieldValueObject = value.field;
key = SupportedAggregations.numericFieldAggregations[value.func];
keyValueField = fieldValueObject.uniqueName.replace(/\./g, Delimeter.DOTS_DELIMETER);
groupStage[keyValueField + Delimeter.FIELD_DELIMETER + value.func] = {};
groupStage[keyValueField + Delimeter.FIELD_DELIMETER + value.func][key] = value.func == "count" ? 1 : "$" + fieldValueObject.uniqueName;
}
}
groupStage["_id"] = {};
if (query.by) {
this._parseRowsColumns(query.by.rows, groupStage["_id"]);
this._parseRowsColumns(query.by.cols, groupStage["_id"]);
}
return {
[MongoPipelineStages.GROUP]: groupStage
};
}
private _parseRowsColumns(query: IRequestField[], rowColumnsGroupQuery: any) {
if (query == null) return rowColumnsGroupQuery;
let key: string = null;
let fieldValueObject: IRequestField = null;
for (let i = 0; i < query.length; i++) {
fieldValueObject = query[i];
key = fieldValueObject.uniqueName.replace(/\./g, Delimeter.DOTS_DELIMETER);
rowColumnsGroupQuery[key] = "$" + fieldValueObject.uniqueName;
}
return rowColumnsGroupQuery;
}
}