Skip to content

Commit 922292b

Browse files
authored
chore(lib-dynamodb): use pagination factory from core (#6345)
1 parent fac05e1 commit 922292b

File tree

3 files changed

+28
-151
lines changed

3 files changed

+28
-151
lines changed

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/DocumentClientPaginationGenerator.java

+14-79
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,9 @@
1717

1818
import java.nio.file.Path;
1919
import java.nio.file.Paths;
20-
import java.util.Optional;
21-
import software.amazon.smithy.codegen.core.CodegenException;
2220
import software.amazon.smithy.codegen.core.Symbol;
2321
import software.amazon.smithy.codegen.core.SymbolProvider;
2422
import software.amazon.smithy.model.Model;
25-
import software.amazon.smithy.model.knowledge.PaginatedIndex;
26-
import software.amazon.smithy.model.knowledge.PaginationInfo;
2723
import software.amazon.smithy.model.shapes.OperationShape;
2824
import software.amazon.smithy.model.shapes.ServiceShape;
2925
import software.amazon.smithy.typescript.codegen.TypeScriptDependency;
@@ -36,14 +32,13 @@ final class DocumentClientPaginationGenerator implements Runnable {
3632
static final String PAGINATION_FOLDER = "pagination";
3733

3834
private final TypeScriptWriter writer;
39-
private final PaginationInfo paginatedInfo;
4035

4136
private final String operationTypeName;
4237
private final String inputTypeName;
4338
private final String outputTypeName;
4439

4540
private final String operationName;
46-
private final String methodName;
41+
4742
private final String paginationType;
4843

4944
DocumentClientPaginationGenerator(
@@ -65,14 +60,7 @@ final class DocumentClientPaginationGenerator implements Runnable {
6560

6661
// e.g. listObjects
6762
this.operationName = operationTypeName.replace("Command", "");
68-
this.methodName = Character.toLowerCase(operationName.charAt(0)) + operationName.substring(1);
6963
this.paginationType = DocumentClientUtils.CLIENT_FULL_NAME + "PaginationConfiguration";
70-
71-
PaginatedIndex paginatedIndex = PaginatedIndex.of(model);
72-
Optional<PaginationInfo> paginationInfo = paginatedIndex.getPaginationInfo(service, operation);
73-
this.paginatedInfo = paginationInfo.orElseThrow(() -> {
74-
return new CodegenException("Expected Paginator to have pagination information.");
75-
});
7664
}
7765

7866
@Override
@@ -90,13 +78,13 @@ public void run() {
9078

9179
// Import Pagination types
9280
writer.addImport("Paginator", "Paginator", TypeScriptDependency.SMITHY_TYPES);
81+
writer.addImport("createPaginator", "createPaginator", TypeScriptDependency.SMITHY_CORE);
9382
writer.addRelativeImport(paginationType, paginationType,
9483
Paths.get(".", getInterfaceFilelocation().replace(".ts", "")));
9584

9685
writer.writeDocs("@public");
9786
writer.write("export { Paginator }");
9887

99-
writeCommandRequest();
10088
writePager();
10189
}
10290

@@ -134,71 +122,18 @@ static void generateServicePaginationInterfaces(TypeScriptWriter writer) {
134122
});
135123
}
136124

137-
private String destructurePath(String path) {
138-
return "." + path.replace(".", "!.");
139-
}
140-
141125
private void writePager() {
142-
String inputTokenName = paginatedInfo.getPaginatedTrait().getInputToken().get();
143-
String outputTokenName = paginatedInfo.getPaginatedTrait().getOutputToken().get();
144-
145-
writer.writeDocs("@public\n\n"
146-
+ String.format("@param %s - {@link %s}%n", inputTypeName, inputTypeName)
147-
+ String.format("@returns {@link %s}%n", outputTypeName)
148-
);
149-
writer.openBlock(
150-
"export async function* paginate$L(config: $L, input: $L, ...additionalArguments: any): Paginator<$L>{",
151-
"}", operationName, paginationType, inputTypeName, outputTypeName, () -> {
152-
String destructuredInputTokenName = destructurePath(inputTokenName);
153-
writer.write("// ToDo: replace with actual type instead of typeof input$L", destructuredInputTokenName);
154-
writer.write("let token: typeof input$L | undefined = config.startingToken || undefined;",
155-
destructuredInputTokenName);
156-
157-
writer.write("let hasNext = true;");
158-
writer.write("let page: $L;", outputTypeName);
159-
writer.openBlock("while (hasNext) {", "}", () -> {
160-
writer.write("input$L = token;", destructuredInputTokenName);
161-
162-
if (paginatedInfo.getPageSizeMember().isPresent()) {
163-
String pageSize = paginatedInfo.getPageSizeMember().get().getMemberName();
164-
writer.write("input[$S] = config.pageSize;", pageSize);
165-
}
166-
167-
writer.openBlock("if (config.client instanceof $L) {", "}", DocumentClientUtils.CLIENT_NAME,
168-
() -> {
169-
writer.write(
170-
"page = await makePagedClientRequest(config.client, input, ...additionalArguments);");
171-
}
172-
);
173-
writer.openBlock("else {", "}", () -> {
174-
writer.write("throw new Error(\"Invalid client, expected $L | $L\");",
175-
DocumentClientUtils.CLIENT_FULL_NAME, DocumentClientUtils.CLIENT_NAME);
176-
});
177-
178-
writer.write("yield page;");
179-
writer.write("token = page$L;", destructurePath(outputTokenName));
180-
181-
writer.write("hasNext = !!(token);");
182-
});
183-
184-
writer.write("// @ts-ignore");
185-
writer.write("return undefined;");
186-
});
187-
}
188-
189-
190-
/**
191-
* Paginated command that calls CommandClient().send({...}) under the hood. This is meant for client side (browser)
192-
* environments and does not generally expose the entire service.
193-
*/
194-
private void writeCommandRequest() {
195-
writer.writeDocs("@internal");
196-
writer.openBlock(
197-
"const makePagedClientRequest = async (client: $L, input: $L, ...args: any): Promise<$L> => {",
198-
"}", DocumentClientUtils.CLIENT_NAME, inputTypeName,
199-
outputTypeName, () -> {
200-
writer.write("// @ts-ignore");
201-
writer.write("return await client.send(new $L(input), ...args);", operationTypeName);
202-
});
126+
writer.writeDocs("@public");
127+
writer.write("""
128+
export const paginate$1L: (
129+
config: $2L,
130+
input: $3L,
131+
...additionalArguments: any
132+
) => Paginator<$4L> = createPaginator<
133+
$2L,
134+
$3L,
135+
$4L
136+
>(DynamoDBDocumentClient, $1LCommand, "ExclusiveStartKey", "LastEvaluatedKey", "Limit");
137+
""", operationName, paginationType, inputTypeName, outputTypeName);
203138
}
204139
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// smithy-typescript generated code
2+
import { createPaginator } from "@smithy/core";
23
import { Paginator } from "@smithy/types";
34

45
import { QueryCommand, QueryCommandInput, QueryCommandOutput } from "../commands/QueryCommand";
@@ -9,45 +10,15 @@ import { DynamoDBDocumentPaginationConfiguration } from "./Interfaces";
910
* @public
1011
*/
1112
export { Paginator };
12-
/**
13-
* @internal
14-
*/
15-
const makePagedClientRequest = async (
16-
client: DynamoDBDocumentClient,
17-
input: QueryCommandInput,
18-
...args: any
19-
): Promise<QueryCommandOutput> => {
20-
// @ts-ignore
21-
return await client.send(new QueryCommand(input), ...args);
22-
};
2313
/**
2414
* @public
25-
*
26-
* @param QueryCommandInput - {@link QueryCommandInput}
27-
* @returns {@link QueryCommandOutput}
28-
*
2915
*/
30-
export async function* paginateQuery(
16+
export const paginateQuery: (
3117
config: DynamoDBDocumentPaginationConfiguration,
3218
input: QueryCommandInput,
3319
...additionalArguments: any
34-
): Paginator<QueryCommandOutput> {
35-
// ToDo: replace with actual type instead of typeof input.ExclusiveStartKey
36-
let token: typeof input.ExclusiveStartKey | undefined = config.startingToken || undefined;
37-
let hasNext = true;
38-
let page: QueryCommandOutput;
39-
while (hasNext) {
40-
input.ExclusiveStartKey = token;
41-
input["Limit"] = config.pageSize;
42-
if (config.client instanceof DynamoDBDocumentClient) {
43-
page = await makePagedClientRequest(config.client, input, ...additionalArguments);
44-
} else {
45-
throw new Error("Invalid client, expected DynamoDBDocument | DynamoDBDocumentClient");
46-
}
47-
yield page;
48-
token = page.LastEvaluatedKey;
49-
hasNext = !!token;
50-
}
51-
// @ts-ignore
52-
return undefined;
53-
}
20+
) => Paginator<QueryCommandOutput> = createPaginator<
21+
DynamoDBDocumentPaginationConfiguration,
22+
QueryCommandInput,
23+
QueryCommandOutput
24+
>(DynamoDBDocumentClient, QueryCommand, "ExclusiveStartKey", "LastEvaluatedKey", "Limit");
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// smithy-typescript generated code
2+
import { createPaginator } from "@smithy/core";
23
import { Paginator } from "@smithy/types";
34

45
import { ScanCommand, ScanCommandInput, ScanCommandOutput } from "../commands/ScanCommand";
@@ -9,45 +10,15 @@ import { DynamoDBDocumentPaginationConfiguration } from "./Interfaces";
910
* @public
1011
*/
1112
export { Paginator };
12-
/**
13-
* @internal
14-
*/
15-
const makePagedClientRequest = async (
16-
client: DynamoDBDocumentClient,
17-
input: ScanCommandInput,
18-
...args: any
19-
): Promise<ScanCommandOutput> => {
20-
// @ts-ignore
21-
return await client.send(new ScanCommand(input), ...args);
22-
};
2313
/**
2414
* @public
25-
*
26-
* @param ScanCommandInput - {@link ScanCommandInput}
27-
* @returns {@link ScanCommandOutput}
28-
*
2915
*/
30-
export async function* paginateScan(
16+
export const paginateScan: (
3117
config: DynamoDBDocumentPaginationConfiguration,
3218
input: ScanCommandInput,
3319
...additionalArguments: any
34-
): Paginator<ScanCommandOutput> {
35-
// ToDo: replace with actual type instead of typeof input.ExclusiveStartKey
36-
let token: typeof input.ExclusiveStartKey | undefined = config.startingToken || undefined;
37-
let hasNext = true;
38-
let page: ScanCommandOutput;
39-
while (hasNext) {
40-
input.ExclusiveStartKey = token;
41-
input["Limit"] = config.pageSize;
42-
if (config.client instanceof DynamoDBDocumentClient) {
43-
page = await makePagedClientRequest(config.client, input, ...additionalArguments);
44-
} else {
45-
throw new Error("Invalid client, expected DynamoDBDocument | DynamoDBDocumentClient");
46-
}
47-
yield page;
48-
token = page.LastEvaluatedKey;
49-
hasNext = !!token;
50-
}
51-
// @ts-ignore
52-
return undefined;
53-
}
20+
) => Paginator<ScanCommandOutput> = createPaginator<
21+
DynamoDBDocumentPaginationConfiguration,
22+
ScanCommandInput,
23+
ScanCommandOutput
24+
>(DynamoDBDocumentClient, ScanCommand, "ExclusiveStartKey", "LastEvaluatedKey", "Limit");

0 commit comments

Comments
 (0)