Skip to content

Commit 9207355

Browse files
fix(update-expression-builder): index in attribute path
closes #200
1 parent 559420f commit 9207355

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

src/dynamo/expression/update-expression-builder.spec.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,16 @@ describe('buildUpdateExpression', () => {
2626
})
2727
})
2828

29+
it('should build expression for number at document path ', () => {
30+
const exp = buildUpdateExpression('numberValues[0]', op, [23], [], metaDataU)
31+
expect(exp).toEqual({
32+
attributeNames: { '#numberValues': 'numberValues' },
33+
attributeValues: { ':numberValues_at_0': { N: '23' } },
34+
statement: '#numberValues[0] = #numberValues[0] + :numberValues_at_0',
35+
type: 'SET',
36+
})
37+
})
38+
2939
it('should throw when not number', () => {
3040
expect(() => buildUpdateExpression('age', op, ['notANumber'], [], metaDataS)).toThrow()
3141
})
@@ -43,6 +53,16 @@ describe('buildUpdateExpression', () => {
4353
})
4454
})
4555

56+
it('should build expression for number at document path ', () => {
57+
const exp = buildUpdateExpression('numberValues[0]', op, [23], [], metaDataU)
58+
expect(exp).toEqual({
59+
attributeNames: { '#numberValues': 'numberValues' },
60+
attributeValues: { ':numberValues_at_0': { N: '23' } },
61+
statement: '#numberValues[0] = #numberValues[0] - :numberValues_at_0',
62+
type: 'SET',
63+
})
64+
})
65+
4666
it('should throw when not number', () => {
4767
expect(() => buildUpdateExpression('age', op, ['notANumber'], [], metaDataS)).toThrow()
4868
})

src/dynamo/expression/update-expression-builder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ function buildDefaultExpression(
100100
// special case: [same as in buildDefaultConditionExpression]
101101
// we have the metadata for an Array/Set of an Object,
102102
// but only get a single item when using `attribute('myCollectionProp[0]').set({})`
103-
if (operator.action === 'set' && /\[\d+\]$/.test(attributePath)) {
103+
if (/\[\d+\]$/.test(attributePath)) {
104104
attribute = toDbOne(values[0], getPropertyPath(propertyMetadata, attributePath), alterCollectionPropertyMetadataForSingleItem(propertyMetadata))
105105
} else {
106106
attribute = toDbOne(values[0], propertyMetadata)

src/dynamo/request/update/update.request.spec.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ describe('update request', () => {
5353
expect(req.params.ReturnValues).toEqual('UPDATED_OLD')
5454
})
5555

56-
it('should add operations', () => {
56+
it('should add operation 1', () => {
5757
const now = new Date()
5858
const request = new UpdateRequest(<any>null, UpdateModel, 'myId')
5959
request.operations(update<UpdateModel>('lastUpdated').set(now))
@@ -64,6 +64,16 @@ describe('update request', () => {
6464
':lastUpdated': { S: now.toISOString() },
6565
})
6666
})
67+
it('should add operation 2', () => {
68+
const request = new UpdateRequest(<any>null, UpdateModel, 'myId')
69+
request.operations(update('numberValues[1]').incrementBy(42))
70+
71+
expect(request.params.UpdateExpression).toBe('SET #numberValues[1] = #numberValues[1] + :numberValues_at_1')
72+
expect(request.params.ExpressionAttributeNames).toEqual({ '#numberValues': 'numberValues' })
73+
expect(request.params.ExpressionAttributeValues).toEqual({
74+
':numberValues_at_1': { N: '42' },
75+
})
76+
})
6777

6878
it('should allow to add multiple operations', () => {
6979
const request = new UpdateRequest(<any>null, UpdateModel, 'myId').operations(

0 commit comments

Comments
 (0)