diff --git a/packages/amplify-graphql-searchable-transformer/src/__tests__/__snapshots__/amplify-graphql-searchable-transformer.test.ts.snap b/packages/amplify-graphql-searchable-transformer/src/__tests__/__snapshots__/amplify-graphql-searchable-transformer.test.ts.snap index 4225f7d25a..7cb6bae26a 100644 --- a/packages/amplify-graphql-searchable-transformer/src/__tests__/__snapshots__/amplify-graphql-searchable-transformer.test.ts.snap +++ b/packages/amplify-graphql-searchable-transformer/src/__tests__/__snapshots__/amplify-graphql-searchable-transformer.test.ts.snap @@ -1226,11 +1226,18 @@ $util.toJson({}) #else $util.error(\\"Unauthorized to run aggregation on field: \${aggItem.field}\\", \\"Unauthorized\\") #end + #set( $aggregateValue = {} ) + $util.qr($aggregateValue.put(\\"filter\\", $aggFilter)) + #set( $aggsValue = {} ) + #set( $aggItemType = {} ) #if( $nonKeywordFields.contains($aggItem.field) ) - $util.qr($aggregateValues.put(\\"$aggItem.name\\", { \\"filter\\": $aggFilter, \\"aggs\\": { \\"$aggItem.name\\": { \\"$aggItem.type\\": { \\"field\\": \\"$aggItem.field\\" }}} })) + $util.qr($aggItemType.put(\\"$aggItem.type\\", { \\"field\\": \\"$aggItem.field\\" })) #else - $util.qr($aggregateValues.put(\\"$aggItem.name\\", { \\"filter\\": $aggFilter, \\"aggs\\": { \\"$aggItem.name\\": { \\"$aggItem.type\\": { \\"field\\": \\"\${aggItem.field}.keyword\\" }}} })) + $util.qr($aggItemType.put(\\"$aggItem.type\\", { \\"field\\": \\"\${aggItem.field}.keyword\\" })) #end + $util.qr($aggsValue.put(\\"$aggItem.name\\", $aggItemType)) + $util.qr($aggregateValue.put(\\"aggs\\", $aggsValue)) + $util.qr($aggregateValues.put(\\"$aggItem.name\\", $aggregateValue)) #end #if( !$util.isNullOrEmpty($ctx.stash.authFilter) ) #set( $filter = $ctx.stash.authFilter ) @@ -1405,11 +1412,18 @@ exports[`SearchableModelTransformer with datastore enabled and sort field define #else $util.error(\\"Unauthorized to run aggregation on field: \${aggItem.field}\\", \\"Unauthorized\\") #end + #set( $aggregateValue = {} ) + $util.qr($aggregateValue.put(\\"filter\\", $aggFilter)) + #set( $aggsValue = {} ) + #set( $aggItemType = {} ) #if( $nonKeywordFields.contains($aggItem.field) ) - $util.qr($aggregateValues.put(\\"$aggItem.name\\", { \\"filter\\": $aggFilter, \\"aggs\\": { \\"$aggItem.name\\": { \\"$aggItem.type\\": { \\"field\\": \\"$aggItem.field\\" }}} })) + $util.qr($aggItemType.put(\\"$aggItem.type\\", { \\"field\\": \\"$aggItem.field\\" })) #else - $util.qr($aggregateValues.put(\\"$aggItem.name\\", { \\"filter\\": $aggFilter, \\"aggs\\": { \\"$aggItem.name\\": { \\"$aggItem.type\\": { \\"field\\": \\"\${aggItem.field}.keyword\\" }}} })) + $util.qr($aggItemType.put(\\"$aggItem.type\\", { \\"field\\": \\"\${aggItem.field}.keyword\\" })) #end + $util.qr($aggsValue.put(\\"$aggItem.name\\", $aggItemType)) + $util.qr($aggregateValue.put(\\"aggs\\", $aggsValue)) + $util.qr($aggregateValues.put(\\"$aggItem.name\\", $aggregateValue)) #end #if( !$util.isNullOrEmpty($ctx.stash.authFilter) ) #set( $filter = $ctx.stash.authFilter ) @@ -1543,11 +1557,18 @@ exports[`SearchableModelTransformer with datastore enabled vtl 1`] = ` #else $util.error(\\"Unauthorized to run aggregation on field: \${aggItem.field}\\", \\"Unauthorized\\") #end + #set( $aggregateValue = {} ) + $util.qr($aggregateValue.put(\\"filter\\", $aggFilter)) + #set( $aggsValue = {} ) + #set( $aggItemType = {} ) #if( $nonKeywordFields.contains($aggItem.field) ) - $util.qr($aggregateValues.put(\\"$aggItem.name\\", { \\"filter\\": $aggFilter, \\"aggs\\": { \\"$aggItem.name\\": { \\"$aggItem.type\\": { \\"field\\": \\"$aggItem.field\\" }}} })) + $util.qr($aggItemType.put(\\"$aggItem.type\\", { \\"field\\": \\"$aggItem.field\\" })) #else - $util.qr($aggregateValues.put(\\"$aggItem.name\\", { \\"filter\\": $aggFilter, \\"aggs\\": { \\"$aggItem.name\\": { \\"$aggItem.type\\": { \\"field\\": \\"\${aggItem.field}.keyword\\" }}} })) + $util.qr($aggItemType.put(\\"$aggItem.type\\", { \\"field\\": \\"\${aggItem.field}.keyword\\" })) #end + $util.qr($aggsValue.put(\\"$aggItem.name\\", $aggItemType)) + $util.qr($aggregateValue.put(\\"aggs\\", $aggsValue)) + $util.qr($aggregateValues.put(\\"$aggItem.name\\", $aggregateValue)) #end #if( !$util.isNullOrEmpty($ctx.stash.authFilter) ) #set( $filter = $ctx.stash.authFilter ) diff --git a/packages/amplify-graphql-searchable-transformer/src/__tests__/amplify-graphql-searchable-transformer.test.ts b/packages/amplify-graphql-searchable-transformer/src/__tests__/amplify-graphql-searchable-transformer.test.ts index 7642333bd1..2992ddd82c 100644 --- a/packages/amplify-graphql-searchable-transformer/src/__tests__/amplify-graphql-searchable-transformer.test.ts +++ b/packages/amplify-graphql-searchable-transformer/src/__tests__/amplify-graphql-searchable-transformer.test.ts @@ -52,6 +52,8 @@ test('SearchableModelTransformer vtl', () => { const out = transformer.transform(validSchema); expect(parse(out.schema)).toBeDefined(); + expect(out.resolvers['Query.searchPosts.req.vtl']).toBeDefined(); + expect(out.resolvers['Query.searchPosts.req.vtl']).toContain('$util.qr($aggregateValues.put("$aggItem.name", $aggregateValue))'); expect(out.resolvers).toMatchSnapshot(); }); @@ -77,6 +79,8 @@ test('SearchableModelTransformer with datastore enabled vtl', () => { const out = transformer.transform(validSchema); expect(parse(out.schema)).toBeDefined(); + expect(out.resolvers['Query.searchPosts.req.vtl']).toBeDefined(); + expect(out.resolvers['Query.searchPosts.req.vtl']).toContain('$util.qr($aggregateValues.put("$aggItem.name", $aggregateValue))'); expect(out.resolvers['Query.searchPosts.req.vtl']).toMatchSnapshot(); expect(out.resolvers['Query.searchPosts.res.vtl']).toMatchSnapshot(); expect(out.resolvers['Query.searchPosts.res.vtl']).toContain('$util.qr($row.put("_version", $entry.get("_version")))'); diff --git a/packages/amplify-graphql-searchable-transformer/src/generate-resolver-vtl.ts b/packages/amplify-graphql-searchable-transformer/src/generate-resolver-vtl.ts index a46fc4fafd..9995e5764c 100644 --- a/packages/amplify-graphql-searchable-transformer/src/generate-resolver-vtl.ts +++ b/packages/amplify-graphql-searchable-transformer/src/generate-resolver-vtl.ts @@ -131,15 +131,7 @@ export const requestTemplate = ( + ' $util.error("Unauthorized to run aggregation on field: ${aggItem.field}", "Unauthorized")\n' + ' #end', ), - ifElse( - ref('nonKeywordFields.contains($aggItem.field)'), - qref( - '$aggregateValues.put("$aggItem.name", { "filter": $aggFilter, "aggs": { "$aggItem.name": { "$aggItem.type": { "field": "$aggItem.field" }}} })', - ), - qref( - '$aggregateValues.put("$aggItem.name", { "filter": $aggFilter, "aggs": { "$aggItem.name": { "$aggItem.type": { "field": "${aggItem.field}.keyword" }}} })', - ), - ), + generateAddAggregateValues() ]), ifElse( not(isNullOrEmpty(authFilter)), @@ -176,6 +168,27 @@ export const requestTemplate = ( ]), ); +export const generateAddAggregateValues = (): Expression => { + return compoundExpression([ + set(ref('aggregateValue'), obj({})), + qref('$aggregateValue.put("filter", $aggFilter)'), + set(ref('aggsValue'), obj({})), + set(ref('aggItemType'), obj({})), + ifElse( + ref('nonKeywordFields.contains($aggItem.field)'), + qref( + '$aggItemType.put("$aggItem.type", { "field": "$aggItem.field" })', + ), + qref( + '$aggItemType.put("$aggItem.type", { "field": "${aggItem.field}.keyword" })', + ), + ), + qref('$aggsValue.put("$aggItem.name", $aggItemType)'), + qref('$aggregateValue.put("aggs", $aggsValue)'), + qref('$aggregateValues.put("$aggItem.name", $aggregateValue)'), + ]); +}; + export const responseTemplate = (includeVersion = false): string => print( compoundExpression([ set(ref('es_items'), list([])),