dynolink
Version:
A TypeScript ORM for DynamoDB
68 lines (67 loc) • 2.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.QueryBuilder = void 0;
const util_dynamodb_1 = require("@aws-sdk/util-dynamodb");
class QueryBuilder {
constructor(metadata) {
this.metadata = metadata;
}
build(filter) {
const ExpressionAttributeNames = {};
const ExpressionAttributeValues = {};
const KeyConditionExpressions = [];
const FilterExpressions = [];
const { key, indexName, conditions = [] } = filter;
Object.entries(key).forEach(([k, v]) => {
const name = `#pk_${k}`;
const val = `:pk_${k}`;
ExpressionAttributeNames[name] = k;
ExpressionAttributeValues[val] = (0, util_dynamodb_1.marshall)({ val: v }).val;
KeyConditionExpressions.push(`${name} = ${val}`);
});
conditions.forEach((cond, i) => {
const name = `#f_${cond.field}_${i}`;
ExpressionAttributeNames[name] = cond.field;
const op = cond.op;
if (op === 'attribute_exists' || op === 'attribute_not_exists') {
FilterExpressions.push(`${op}(${name})`);
return;
}
if (op === 'between') {
const val1 = `:val${i}_a`;
const val2 = `:val${i}_b`;
const [a, b] = cond.value;
ExpressionAttributeValues[val1] = (0, util_dynamodb_1.marshall)({ v: a }).v;
ExpressionAttributeValues[val2] = (0, util_dynamodb_1.marshall)({ v: b }).v;
FilterExpressions.push(`${name} BETWEEN ${val1} AND ${val2}`);
}
else if (op === 'in') {
const vals = cond.value.map((v, j) => {
const label = `:val${i}_${j}`;
ExpressionAttributeValues[label] = (0, util_dynamodb_1.marshall)({ val: v }).val;
return label;
});
FilterExpressions.push(`${name} IN (${vals.join(', ')})`);
}
else if (op === 'begins_with') {
const val = `:val${i}`;
ExpressionAttributeValues[val] = (0, util_dynamodb_1.marshall)({ val: cond.value }).val;
FilterExpressions.push(`begins_with(${name}, ${val})`);
}
else {
const val = `:val${i}`;
ExpressionAttributeValues[val] = (0, util_dynamodb_1.marshall)({ val: cond.value }).val;
const dynamoOp = op === '!=' ? '<>' : op;
FilterExpressions.push(`${name} ${dynamoOp} ${val}`);
}
});
return {
IndexName: indexName,
KeyConditionExpression: KeyConditionExpressions.join(' AND '),
FilterExpression: FilterExpressions.length ? FilterExpressions.join(' AND ') : undefined,
ExpressionAttributeNames,
ExpressionAttributeValues,
};
}
}
exports.QueryBuilder = QueryBuilder;