@drip_sync/drip
Version:
Scalable incremental sync for MongoDB aggregation pipelines
41 lines (40 loc) • 1.49 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.isObjectExpression = isObjectExpression;
exports.scopeExpression = scopeExpression;
const lodash_1 = __importDefault(require("lodash"));
const scope_operator_1 = require("./scope_operator");
const scope_path_expression_1 = require("./scope_path_expression");
const is_operator_1 = require("./is_operator");
const atoms_1 = require("./atoms");
function isPathExpression(e) {
return typeof e === "string" && e.startsWith("$");
}
function isArrayExpression(e) {
return Array.isArray(e);
}
function isObjectExpression(e) {
return (0, atoms_1.isComposite)(e) && !Array.isArray(e);
}
function scopeExpression(e, root, vars) {
// See https://www.mongodb.com/docs/manual/reference/glossary/#std-term-expression
if ((0, is_operator_1.isOperator)(e)) {
return (0, scope_operator_1.scopeOperator)(e, root, vars);
}
else if (isPathExpression(e)) {
return (0, scope_path_expression_1.scopePathExpression)(e, root, vars);
}
else if (isArrayExpression(e)) {
return e.map((ee) => scopeExpression(ee, root, vars));
}
else if (isObjectExpression(e)) {
return lodash_1.default.mapValues(e, (v) => scopeExpression(v, root, vars));
}
else {
// A constant, no need to scope
return e;
}
}