odatafy-mongodb
Version:
convert oData requests through odatafy to MongoDB queries
157 lines (156 loc) • 5.87 kB
JavaScript
;
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getQuery = exports.getQueryFromUrl = void 0;
var url_1 = __importDefault(require("url"));
var filterGenerator_1 = require("./filterGenerator");
var limitGenerator_1 = require("./limitGenerator");
var skipGenerator_1 = require("./skipGenerator");
var sortGenerator_1 = require("./sortGenerator");
var selectGenerator_1 = require("./selectGenerator");
var lookupGenerator_1 = require("./lookupGenerator");
var computeGenerator_1 = require("./computeGenerator");
var searchGenerator_1 = require("./searchGenerator");
/**
* Get MongoDB aggregation query from a given url can be obtained by nodes req.url
* @param oDataUrl - the url format ?param=value
* @param opts options for getting the url
* @returns MongoDB aggregation query
*/
function getQueryFromUrl(oDataUrl, opts) {
var query = url_1.default.parse(oDataUrl, true).query;
var validParams = [
"filter",
"orderby",
"skip",
"top",
"expand",
"compute",
"select",
"search",
];
var params = Object.keys(query);
var parseParameters = {};
validParams.forEach(function (param) {
//check if url
if (params.includes(param) && params.includes("$" + param)) {
throw new Error("Malformed oData url, cannot contain param: ".concat(param, " and param: $").concat(param));
}
if (params.includes(param) || params.includes("$" + param)) {
parseParameters[param] = query[params.includes(param) ? param : "$" + param];
}
});
return getQuery(parseParameters, opts);
}
exports.getQueryFromUrl = getQueryFromUrl;
/**
* Get a MongoDB based on oData url paramaters
* @param parameters parameters
* @param opts options for getting the url
* @returns MongoDB aggregaion pipeline
*/
function getQuery(parameters, opts) {
var pipeline = [];
var countPipeline = [];
if (parameters.expand) {
pipeline.push.apply(pipeline, __spreadArray([], __read((0, lookupGenerator_1.generateLookupFromExpand)(parameters.expand, (opts === null || opts === void 0 ? void 0 : opts.expandMapping) ? opts.expandMapping : {})), false));
}
if (parameters.compute) {
pipeline.push((0, computeGenerator_1.generateComputeStageFromComputedExpr)(parameters.compute));
}
if (parameters.filter) {
pipeline.push((0, filterGenerator_1.generateMatchFromFilterExpr)(parameters.filter));
}
/* copy to count query */
if ((opts === null || opts === void 0 ? void 0 : opts.returnDataCountQuery) || (opts === null || opts === void 0 ? void 0 : opts.returnCountOnly)) {
countPipeline = __spreadArray([], __read(pipeline), false);
}
if (parameters.search) {
var searchExpr = (0, searchGenerator_1.generateSearchFromSearchExpr)(parameters.search, opts === null || opts === void 0 ? void 0 : opts.regexSearchFields);
pipeline.push(searchExpr);
countPipeline.push(searchExpr);
}
if (parameters.skip) {
pipeline.push((0, skipGenerator_1.generateSkipFromSkipExpr)(parameters.skip));
}
if (parameters.top) {
pipeline.push((0, limitGenerator_1.generateLimitFromTopExpr)(parameters.top));
}
if (parameters.select) {
pipeline.push((0, selectGenerator_1.generateProjectFromSelectExpr)(parameters.select));
}
if (parameters.orderby) {
pipeline.push((0, sortGenerator_1.generateSortFromOrderbyExpr)(parameters.orderby));
}
//add default steps if pipline must not be empty - i.e. in mongoose an empty pipeline returns an error
if (!(opts === null || opts === void 0 ? void 0 : opts.returnEmptyPipeline) && pipeline.length == 0) {
pipeline.push({
$addFields: {
odatafyMongoDBTempField: "",
},
}, {
$project: {
odatafyMongoDBTempField: 0,
},
});
countPipeline = __spreadArray([], __read(pipeline), false);
}
countPipeline.push({
$count: "count",
});
if (opts === null || opts === void 0 ? void 0 : opts.returnCountOnly) {
return countPipeline;
}
if (opts === null || opts === void 0 ? void 0 : opts.returnDataCountQuery) {
return [
{
$facet: {
data: pipeline,
countTmp: countPipeline,
},
},
{
$addFields: {
countTmp2: {
$first: "$countTmp",
},
},
},
{
$project: {
data: "$data",
count: "$countTmp2.count",
},
},
];
}
return pipeline;
}
exports.getQuery = getQuery;