Skip to content

Commit fbcd0cb

Browse files
feat(expression-builder): allow for empty arrays and objects
* docs(todo): update to post-v3 todos * feat(expression-builder): allow for empty arrays, Sets and objects * feat(expression-builder): revert for sets
1 parent 9ba3bff commit fbcd0cb

6 files changed

+30
-8
lines changed

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,21 @@ describe('expressions', () => {
4242
{},
4343
[],
4444
{ blub: undefined, other: undefined },
45+
{ emptyArr: [] },
4546
new Set(arr),
4647
]
4748

4849
const filteredObj = deepFilter(obj, (item) => item !== undefined)
49-
expect(filteredObj).toEqual([{ street: 'street', zip: 1524 }, [{ age: 25 }], new Set([arr[0], arr[1]])])
50+
expect(filteredObj).toEqual([
51+
{ street: 'street', zip: 1524 },
52+
[{ age: 25 }],
53+
[{}],
54+
{},
55+
[],
56+
{},
57+
{ emptyArr: [] },
58+
new Set([arr[0], arr[1]]),
59+
])
5060
})
5161

5262
it('use property metadata', () => {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ type BuildFilterFn = (
4040
*/
4141

4242
/**
43-
* Will walk the object tree recursively and removes all items which do not satisfy the filterFn
43+
* Will walk the object tree recursively and removes all items that do not satisfy the filterFn
4444
* @param obj
4545
* @param {(value: any) => boolean} filterFn
4646
* @returns {any}
@@ -56,7 +56,7 @@ export function deepFilter(obj: any, filterFn: (value: any) => boolean): any {
5656
}
5757
})
5858

59-
return returnArr.length ? returnArr : null
59+
return returnArr
6060
} else if (obj instanceof Set) {
6161
const returnArr: any[] = []
6262
Array.from(obj).forEach((i) => {
@@ -80,7 +80,7 @@ export function deepFilter(obj: any, filterFn: (value: any) => boolean): any {
8080
}
8181
}
8282

83-
return Object.keys(returnObj).length ? returnObj : null
83+
return returnObj
8484
} else {
8585
if (filterFn(obj)) {
8686
return obj

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export function prepareAndAddUpdateExpressions(
2121
if (updateDefFns && updateDefFns.length) {
2222
const sortedByActionKeyWord: Map<UpdateActionKeyword, UpdateExpression[]> = updateDefFns
2323
.map((updateDefFn) => {
24-
// TODO v3: investigate on how to remove any
24+
// TODO post-v3:: investigate on how to remove any
2525
// tslint:disable-next-line:no-unnecessary-type-assertion
2626
return updateDefFn(params.ExpressionAttributeNames as any, metadata)
2727
})

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,18 @@ describe('buildUpdateExpression', () => {
8181
})
8282
})
8383

84+
describe('should build set expression for empty collection', () => {
85+
it('array', () => {
86+
const exp = buildUpdateExpression('addresses', op, [[]], [], metaDataU)
87+
expect(exp).toEqual({
88+
attributeNames: { '#addresses': 'addresses' },
89+
attributeValues: { ':addresses': { L: [] } },
90+
statement: '#addresses = :addresses',
91+
type: 'SET',
92+
})
93+
})
94+
})
95+
8496
it('should build set expression for number at document path', () => {
8597
const exp = buildUpdateExpression('numberValues[0]', op, [23], [], metaDataU)
8698
expect(exp).toEqual({
@@ -144,7 +156,7 @@ describe('buildUpdateExpression', () => {
144156
const op = new UpdateActionDef('DELETE', 'removeFromSet')
145157

146158
it('should build the expression', () => {
147-
const exp = buildUpdateExpression('topics', op, [['val1', 'val2']], [], metaDataU)
159+
const exp = buildUpdateExpression('topics', op, [new Set(['val1', 'val2'])], [], metaDataU)
148160
expect(exp).toEqual({
149161
attributeNames: { '#topics': 'topics' },
150162
attributeValues: { ':topics': { SS: ['val1', 'val2'] } },

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export function buildUpdateExpression(
3636
existingValueNames: string[] | undefined,
3737
metadata: Metadata<any> | undefined,
3838
): UpdateExpression {
39-
// metadata get rid of undefined values
39+
// get rid of undefined values
4040
values = deepFilter(values, (value) => value !== undefined) || []
4141

4242
// load property metadata if model metadata was provided

src/dynamo/request/get/get.request.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export class GetRequest<T, T2 extends Partial<T> = T> extends StandardRequest<
5252
.getItem(this.params)
5353
.then(promiseTap((response) => this.logger.debug('response', response)))
5454
.then((getItemResponse) => {
55-
// TODO v3: investigate on how to remove any
55+
// TODO post-v3: investigate on how to remove any
5656
// tslint:disable-next-line:no-unnecessary-type-assertion
5757
const response: GetResponse<T2> = { ...(getItemResponse as any) }
5858

0 commit comments

Comments
 (0)