Skip to content

Commit 75133e0

Browse files
Merge pull request #123 from shiftcode/#16-updateExpression-ifnotexists
feat(update): ifNotExists option for update.set
2 parents 0213cc6 + b811569 commit 75133e0

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

src/dynamo/expression/prepare-and-add-update-expressions.function.spec.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,19 @@ describe('PrepareExpressions function', () => {
5353
})
5454
})
5555

56+
it('set (ifNotExists)', () => {
57+
const now = new Date()
58+
59+
prepareAndAddUpdateExpressions(metadata, params, [update<UpdateModel>('lastUpdated').set(now, true)])
60+
expect(params.UpdateExpression).toBe('SET #lastUpdated = if_not_exists(#lastUpdated, :lastUpdated)')
61+
expect(params.ExpressionAttributeNames).toEqual({ '#lastUpdated': 'lastUpdated' })
62+
expect(params.ExpressionAttributeValues).toEqual({
63+
':lastUpdated': {
64+
S: now.toISOString(),
65+
},
66+
})
67+
})
68+
5669
it('set (nested map)', () => {
5770
prepareAndAddUpdateExpressions(metadata, params, [update('info.details').set('the new detail')])
5871
expect(params.UpdateExpression).toBe('SET #info.#details = :info__details')

src/dynamo/expression/type/update-expression-definition-chain.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export interface UpdateExpressionDefinitionChainTyped<T, K extends keyof T> {
1616
* - persons.age
1717
* - places[0].address.street
1818
*/
19-
set: (value: T[K]) => UpdateExpressionDefinitionFunction
19+
set: (value: T[K], ifNotExists?: boolean) => UpdateExpressionDefinitionFunction
2020

2121
/**
2222
* appends one or more values to the start or end of a list, value must be of type L(ist)
@@ -78,7 +78,7 @@ export interface UpdateExpressionDefinitionChain {
7878
* - persons.age
7979
* - places[0].address.street
8080
*/
81-
set: (value: any) => UpdateExpressionDefinitionFunction
81+
set: (value: any, ifNotExists?: boolean) => UpdateExpressionDefinitionFunction
8282

8383
/**
8484
* appends one or more values to the start or end of a list, value must be of type L(ist)

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,12 @@ function buildDefaultExpression(
8484
statement = `${namePlaceholder} = ${namePlaceholder} - ${valuePlaceholder}`
8585
break
8686
case 'set':
87-
statement = `${namePlaceholder} = ${valuePlaceholder}`
87+
const ifNotExists = values.length > 1 && !!values[values.length - 1] || false
88+
if (ifNotExists) {
89+
statement = `${namePlaceholder} = if_not_exists(${namePlaceholder}, ${valuePlaceholder})`
90+
} else {
91+
statement = `${namePlaceholder} = ${valuePlaceholder}`
92+
}
8893
break
8994
case 'appendToList':
9095
const position = values.length > 1 ? values[values.length - 1] || 'END' : 'END'

0 commit comments

Comments
 (0)