UNPKG

dynolink

Version:
68 lines (67 loc) 2.99 kB
"use strict"; 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;