Services or capabilities described in Amazon Web Services documentation might vary by Region. To see the differences applicable to the China Regions,
see Getting Started with Amazon Web Services in China
(PDF).
TryDax.js
import { DynamoDB, waitUntilTableExists, waitUntilTableNotExists } from "@aws-sdk/client-dynamodb";
import { DaxDocument, daxPaginateScan, daxPaginateQuery } from "@amazon-dax-sdk/lib-dax";
import { DynamoDBDocument, paginateQuery, paginateScan } from "@aws-sdk/lib-dynamodb";
const region = "us-east-1";
const tableName = "TryDaxTable";
// Determine the client (DynamoDB or DAX)
let client = DynamoDBDocument.from(new DynamoDB({ region }));
if (process.argv.length > 2) {
client = new DaxDocument({ region, endpoint: process.argv[2] });
}
// Function to create table
async function createTable() {
const dynamodb = new DynamoDB({ region });
const params = {
TableName: tableName,
KeySchema: [
{ AttributeName: "pk", KeyType: "HASH" },
{ AttributeName: "sk", KeyType: "RANGE" },
],
AttributeDefinitions: [
{ AttributeName: "pk", AttributeType: "N" },
{ AttributeName: "sk", AttributeType: "N" },
],
ProvisionedThroughput: { ReadCapacityUnits: 25, WriteCapacityUnits: 25 },
};
try {
console.log("Attempting to create table; please wait...");
await dynamodb.createTable(params);
await waitUntilTableExists({ client: dynamodb, maxWaitTime: 30 }, { TableName: tableName });
console.log("Successfully created table. Table status: ACTIVE");
} catch (err) {
console.error("Error in table creation:", err);
}
}
// Function to insert data
async function writeData() {
console.log("Writing data to the table...");
const someData = "X".repeat(10);
for (let ipk = 1; ipk <= 20; ipk++) {
console.log("Writing 20 items for partition key: ", ipk)
for (let isk = 1; isk <= 20; isk++) {
try {
await client.put({ TableName: tableName, Item: { pk: ipk, sk: isk, someData } });
} catch (err) {
console.error("Error inserting data:", err);
}
}
}
}
// Function to test GetItem
async function getItemTest() {
console.log("Running GetItem Test");
for (let i = 0; i < 5; i++) {
const startTime = performance.now();
const promises = [];
for (let ipk = 1; ipk <= 20; ipk++) {
for (let isk = 1; isk <= 20; isk++) {
promises.push(client.get({ TableName: tableName, Key: { pk: ipk, sk: isk } }));
}
}
await Promise.all(promises);
const endTime = performance.now();
const iterTime = (endTime - startTime) * 1000;
const totalTime = iterTime.toFixed(2).padStart(3, ' ');
const avgTime = (iterTime / 400).toFixed(2).padStart(3, ' ');
console.log(`\tTotal time: ${totalTime} \u00B5s - Avg time: ${avgTime} \u00B5s`);
}
}
// Function to test Query
async function queryTest() {
console.log("Running Query Test");
for (let i = 0; i < 5; i++) {
const startTime = performance.now();
const promises = [];
for (let pk = 1; pk <= 5; pk++) {
const params = {
TableName: tableName,
KeyConditionExpression: "pk = :pkval and sk between :skval1 and :skval2",
ExpressionAttributeValues: { ":pkval": pk, ":skval1": 1, ":skval2": 2 },
};
promises.push(client.query(params));
}
await Promise.all(promises);
const endTime = performance.now();
const iterTime = (endTime - startTime) * 1000;
const totalTime = iterTime.toFixed(2).padStart(3, ' ');
const avgTime = (iterTime / 5).toFixed(2).padStart(3, ' ');
console.log(`\tTotal time: ${totalTime} \u00B5s - Avg time: ${avgTime} \u00B5s`);
}
}
// Function to test Scan
async function scanTest() {
console.log("Running Scan Test");
for (let i = 0; i < 5; i++) {
const startTime = performance.now();
const promises = [];
for (let pk = 1; pk <= 5; pk++) {
const params = {
TableName: tableName,
FilterExpression: "pk = :pkval and sk between :skval1 and :skval2",
ExpressionAttributeValues: { ":pkval": pk, ":skval1": 1, ":skval2": 2 },
};
promises.push(client.scan(params));
}
await Promise.all(promises);
const endTime = performance.now();
const iterTime = (endTime - startTime) * 1000;
const totalTime = iterTime.toFixed(2).padStart(3, ' ');
const avgTime = (iterTime / 5).toFixed(2).padStart(3, ' ');
console.log(`\tTotal time: ${totalTime} \u00B5s - Avg time: ${avgTime} \u00B5s`);
}
}
// Function to test Pagination
async function paginationTest() {
console.log("Running Pagination Test");
console.log("Scan Pagination");
const scanParams = { TableName: tableName };
const paginator = process.argv.length > 2 ? daxPaginateScan : paginateScan;
for await (const page of paginator({ client, pageSize: 3 }, scanParams)) {
console.log(page.Items);
}
console.log("Query Pagination");
const queryParams = {
TableName: tableName,
KeyConditionExpression: "pk = :pkval and sk between :skval1 and :skval2",
ExpressionAttributeValues: { ":pkval": 1, ":skval1": 1, ":skval2": 10 },
};
const queryPaginator = process.argv.length > 2 ? daxPaginateQuery : paginateQuery;
for await (const page of queryPaginator({ client, pageSize: 3 }, queryParams)) {
console.log(page.Items);
}
}
// Function to delete the table
async function deleteTable() {
const dynamodb = new DynamoDB({ region });
console.log("Attempting to delete table; please wait...")
try {
await dynamodb.deleteTable({ TableName: tableName });
await waitUntilTableNotExists({ client: dynamodb, maxWaitTime: 30 }, { TableName: tableName });
console.log("Successfully deleted table.");
} catch (err) {
console.error("Error deleting table:", err);
}
}
// Execute functions sequentially
(async function () {
await createTable();
await writeData();
await getItemTest();
await queryTest();
await scanTest();
await paginationTest();
await deleteTable();
})();