@mcma/aws-dynamodb
Version:
Node module with code for using DynamoDB as the backing data storage for MCMA API handlers and workers.
36 lines (35 loc) • 1.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildFilterExpression = buildFilterExpression;
const data_1 = require("@mcma/data");
function addFilterExpression(expression, filterExpression) {
if ((0, data_1.isFilterCriteriaGroup)(filterExpression)) {
return addFilterCriteriaGroup(expression, filterExpression);
}
else {
return addFilterCriteria(expression, filterExpression);
}
}
function addFilterCriteriaGroup(expression, filterCriteriaGroup) {
return filterCriteriaGroup.children && filterCriteriaGroup.children.length
? "(" + filterCriteriaGroup.children.map(x => addFilterExpression(expression, x)).join(` ${filterCriteriaGroup.logicalOperator === "||" ? "or" : "and"} `) + ")"
: "";
}
function addFilterCriteria(expression, filterCriteria) {
let attributeNameKey;
if (!expression.expressionAttributeNames[filterCriteria.propertyName]) {
attributeNameKey = `#a${Object.keys(expression.expressionAttributeNames).length}`;
expression.expressionAttributeNames[attributeNameKey] = filterCriteria.propertyName;
}
else {
attributeNameKey = expression.expressionAttributeNames[filterCriteria.propertyName];
}
let attributeValueKey = `:a${Object.keys(expression.expressionAttributeValues).length}`;
expression.expressionAttributeValues[attributeValueKey] = filterCriteria.propertyValue;
return `#r.${attributeNameKey} ${filterCriteria.operator} ${attributeValueKey}`;
}
function buildFilterExpression(filterExpression) {
const expression = { expressionStatement: "", expressionAttributeNames: { ["#r"]: "resource" }, expressionAttributeValues: {} };
expression.expressionStatement = addFilterExpression(expression, filterExpression);
return expression;
}