diff --git a/README.md b/README.md
index 1403600..02b8e31 100644
--- a/README.md
+++ b/README.md
@@ -33,9 +33,9 @@ Tsynamo simplifies the DynamoDB API so that you don't have to write commands wit
- [Put item](#put-item)
- [Delete item](#delete-item)
- [Update item](#update-item)
+ - [Transactions](#transactions)
- [Contributors](#contributors)
-
## Requirements
- [@aws-sdk/client-dynamodb](https://www.npmjs.com/package/@aws-sdk/client-dynamodb)
@@ -72,6 +72,7 @@ export interface DDB {
};
}
```
+
> [!TIP]
> Notice that you can have multiple tables in the DDB schema. Nested attributes are supported too.
@@ -196,6 +197,7 @@ await tsynamoClient
.execute();
```
+> [!NOTE]
> This would compile as the following FilterExpression:
> `NOT eventType = "LOG_IN"`, i.e. return all events whose types is not "LOG_IN"
@@ -282,6 +284,85 @@ await tsynamoClient
.execute();
```
+### Transactions
+
+One can also utilise [DynamoDB Transaction](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transaction-apis.html) features using Tsynamo. You can perform operations to multiple tables in a single transaction command.
+
+#### Write transaction
+
+DynamoDB enables you to do multiple `Put`, `Update` and `Delete` in a single `WriteTransaction` command. One can also provide an optional `ClientRequestToken` to the transaction to ensure idempotency.
+
+```ts
+const trx = tsynamoClient.createWriteTransaction();
+
+trx.addItem({
+ Put: tsynamoClient
+ .putItem("myTable")
+ .item({ userId: "313", dataTimestamp: 1 }),
+});
+
+trx.addItem({
+ Update: tsynamoClient
+ .updateItem("myTable")
+ .keys({ userId: "313", dataTimestamp: 2 })
+ .set("tags", "=", ["a", "b", "c"]),
+});
+
+trx.addItem({
+ Delete: tsynamoClient.deleteItem("myTable").keys({
+ userId: "313",
+ dataTimestamp: 3,
+ }),
+});
+
+await trx.execute();
+```
+
+> [!IMPORTANT]
+> When passing the items into the transaction using the tsynamoClient, do not execute the individual calls! Instead just pass in the query builder as the item.
+
+> [!WARNING]
+> DynamoDB also supports doing `ConditionCheck` operations in the transaction, but Tsynamo does not yet support those.
+
+#### Read transaction
+
+Since the read transaction output can affect multiple tables, the resulting output is an array of tuples where the first item is the name of the table and the second item is the item itself (or `undefined` if the item was not found). This can be used as a discriminated union to determine the resulting item's type.
+
+```ts
+const trx = tsynamoClient.createReadTransaction();
+
+trx.addItem({
+ Get: tsynamoClient.getItem("myTable").keys({
+ userId: "123",
+ dataTimestamp: 222,
+ }),
+});
+
+trx.addItem({
+ Get: tsynamoClient.getItem("myOtherTable").keys({
+ userId: "321",
+ stringTimestamp: "222",
+ }),
+});
+
+const result = await trx.execute();
+```
+
+Then, one can loop through the result items as so:
+
+```ts
+// note that the items can be undefined if they were not found from DynamoDB
+result.forEach(([table, item]) => {
+ if (table === "myTable") {
+ // item's type is DDB["myTable"]
+ // ...
+ } else if (table === "myOtherTable") {
+ // item's type is DDB["myOtherTable"]
+ // ...
+ }
+});
+```
+
## Contributors
diff --git a/package.json b/package.json
index 815009d..45f3530 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "tsynamo",
"author": "woltsu",
- "version": "0.0.9",
+ "version": "0.0.10",
"description": "Typed query builder for DynamoDB",
"main": "dist/index.js",
"types": "dist/index.d.ts",
diff --git a/src/nodes/readTransactionNode.ts b/src/nodes/readTransactionNode.ts
new file mode 100644
index 0000000..9ed1dd2
--- /dev/null
+++ b/src/nodes/readTransactionNode.ts
@@ -0,0 +1,6 @@
+import { TransactGetItemNode } from "./transactGetItemNode";
+
+export type ReadTransactionNode = {
+ readonly kind: "ReadTransactionNode";
+ readonly transactGetItems: TransactGetItemNode[];
+};
diff --git a/src/nodes/transactGetItemNode.ts b/src/nodes/transactGetItemNode.ts
new file mode 100644
index 0000000..d128b15
--- /dev/null
+++ b/src/nodes/transactGetItemNode.ts
@@ -0,0 +1,6 @@
+import { GetNode } from "./getNode";
+
+export type TransactGetItemNode = {
+ readonly kind: "TransactGetItemNode";
+ readonly Get: GetNode;
+};
diff --git a/src/nodes/transactWriteItemNode.ts b/src/nodes/transactWriteItemNode.ts
new file mode 100644
index 0000000..c58f4db
--- /dev/null
+++ b/src/nodes/transactWriteItemNode.ts
@@ -0,0 +1,10 @@
+import { DeleteNode } from "./deleteNode";
+import { PutNode } from "./putNode";
+import { UpdateNode } from "./updateNode";
+
+export type TransactWriteItemNode = {
+ readonly kind: "TransactWriteItemNode";
+ readonly Put?: PutNode;
+ readonly Delete?: DeleteNode;
+ readonly Update?: UpdateNode;
+};
diff --git a/src/nodes/writeTransactionNode.ts b/src/nodes/writeTransactionNode.ts
new file mode 100644
index 0000000..b33074d
--- /dev/null
+++ b/src/nodes/writeTransactionNode.ts
@@ -0,0 +1,7 @@
+import { TransactWriteItemNode } from "./transactWriteItemNode";
+
+export type WriteTransactionNode = {
+ readonly kind: "WriteTransactionNode";
+ readonly transactWriteItems: TransactWriteItemNode[];
+ readonly clientRequestToken?: string;
+};
diff --git a/src/queryBuilders/__snapshots__/readTransactionBuilder.integration.test.ts.snap b/src/queryBuilders/__snapshots__/readTransactionBuilder.integration.test.ts.snap
new file mode 100644
index 0000000..4977c04
--- /dev/null
+++ b/src/queryBuilders/__snapshots__/readTransactionBuilder.integration.test.ts.snap
@@ -0,0 +1,25 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`ReadTransactionBuilder > handles transaction with gets 1`] = `
+[
+ [
+ "myTable",
+ {
+ "dataTimestamp": 222,
+ "someBoolean": true,
+ "somethingElse": 2,
+ "userId": "123",
+ },
+ ],
+ [
+ "myOtherTable",
+ {
+ "userId": "123",
+ },
+ ],
+ [
+ "myTable",
+ undefined,
+ ],
+]
+`;
diff --git a/src/queryBuilders/__snapshots__/writeTransactionBuilder.integration.test.ts.snap b/src/queryBuilders/__snapshots__/writeTransactionBuilder.integration.test.ts.snap
new file mode 100644
index 0000000..2f841ea
--- /dev/null
+++ b/src/queryBuilders/__snapshots__/writeTransactionBuilder.integration.test.ts.snap
@@ -0,0 +1,37 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`WriteTransactionBuilder > handles a transaction with a client request token 1`] = `[IdempotentParameterMismatchException: UnknownError]`;
+
+exports[`WriteTransactionBuilder > handles a transaction with failing conditions 1`] = `[TransactionCanceledException: Transaction cancelled, please refer cancellation reasons for specific reasons [ConditionalCheckFailed]]`;
+
+exports[`WriteTransactionBuilder > handles a transaction with puts 1`] = `
+[
+ {
+ "dataTimestamp": 1,
+ "userId": "9999",
+ },
+ {
+ "dataTimestamp": 2,
+ "userId": "9999",
+ },
+]
+`;
+
+exports[`WriteTransactionBuilder > handles a transaction with updates 1`] = `
+[
+ {
+ "dataTimestamp": 1,
+ "someBoolean": true,
+ "userId": "9999",
+ },
+ {
+ "dataTimestamp": 2,
+ "tags": [
+ "a",
+ "b",
+ "c",
+ ],
+ "userId": "9999",
+ },
+]
+`;
diff --git a/src/queryBuilders/deleteItemQueryBuilder.ts b/src/queryBuilders/deleteItemQueryBuilder.ts
index 50dd957..e74aa81 100644
--- a/src/queryBuilders/deleteItemQueryBuilder.ts
+++ b/src/queryBuilders/deleteItemQueryBuilder.ts
@@ -24,77 +24,77 @@ import {
export interface DeleteItemQueryBuilderInterface<
DDB,
Table extends keyof DDB,
- O
+ O extends DDB[Table]
> {
// conditionExpression
conditionExpression>(
...args: ComparatorExprArg
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
conditionExpression>(
...args: AttributeFuncExprArg
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
conditionExpression>(
...args: AttributeBeginsWithExprArg
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
conditionExpression>(
...args: AttributeContainsExprArg
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
conditionExpression>(
...args: AttributeBetweenExprArg
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
conditionExpression>(
...args: NotExprArg
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
conditionExpression>(
...args: BuilderExprArg
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
// orConditionExpression
orConditionExpression>(
...args: ComparatorExprArg
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
orConditionExpression>(
...args: AttributeFuncExprArg
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
orConditionExpression>(
...args: AttributeBeginsWithExprArg
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
orConditionExpression>(
...args: AttributeContainsExprArg
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
orConditionExpression>(
...args: AttributeBetweenExprArg
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
orConditionExpression>(
...args: NotExprArg
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
orConditionExpression>(
...args: BuilderExprArg
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
returnValues(
option: Extract
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
returnValuesOnConditionCheckFailure(
option: Extract
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
keys & PickSkRequired>(
pk: Keys
- ): DeleteItemQueryBuilderInterface;
+ ): DeleteItemQueryBuilder;
compile(): DeleteCommand;
execute(): Promise[] | undefined>;
@@ -117,7 +117,7 @@ export class DeleteItemQueryBuilder<
conditionExpression>(
...args: ExprArgs
- ): DeleteItemQueryBuilderInterface {
+ ): DeleteItemQueryBuilder {
const eB = new ExpressionBuilder({
node: { ...this.#props.node.conditionExpression },
});
@@ -135,7 +135,7 @@ export class DeleteItemQueryBuilder<
orConditionExpression>(
...args: ExprArgs
- ): DeleteItemQueryBuilderInterface {
+ ): DeleteItemQueryBuilder {
const eB = new ExpressionBuilder({
node: { ...this.#props.node.conditionExpression },
});
@@ -153,7 +153,7 @@ export class DeleteItemQueryBuilder<
returnValues(
option: Extract
- ): DeleteItemQueryBuilderInterface {
+ ): DeleteItemQueryBuilder {
return new DeleteItemQueryBuilder({
...this.#props,
node: {
@@ -168,7 +168,7 @@ export class DeleteItemQueryBuilder<
returnValuesOnConditionCheckFailure(
option: Extract
- ): DeleteItemQueryBuilderInterface {
+ ): DeleteItemQueryBuilder {
return new DeleteItemQueryBuilder({
...this.#props,
node: {
@@ -199,11 +199,16 @@ export class DeleteItemQueryBuilder<
compile = (): DeleteCommand => {
return this.#props.queryCompiler.compile(this.#props.node);
};
+
execute = async (): Promise[] | undefined> => {
const deleteCommand = this.compile();
const data = await this.#props.ddbClient.send(deleteCommand);
return data.Attributes as any;
};
+
+ public get node() {
+ return this.#props.node;
+ }
}
preventAwait(
diff --git a/src/queryBuilders/getItemQueryBuilder.ts b/src/queryBuilders/getItemQueryBuilder.ts
index 2935428..a2eceae 100644
--- a/src/queryBuilders/getItemQueryBuilder.ts
+++ b/src/queryBuilders/getItemQueryBuilder.ts
@@ -13,19 +13,19 @@ import { preventAwait } from "../util/preventAwait";
export interface GetQueryBuilderInterface {
keys & PickSkRequired>(
pk: Keys
- ): GetQueryBuilderInterface;
+ ): GetQueryBuilder;
- consistentRead(enabled: boolean): GetQueryBuilderInterface;
+ consistentRead(enabled: boolean): GetQueryBuilder;
attributes[] & string[]>(
attributes: A
- ): GetQueryBuilderInterface>;
+ ): GetQueryBuilder>;
compile(): GetCommand;
execute(): Promise | undefined>;
}
-export class GetQueryBuilder
+export class GetQueryBuilder
implements GetQueryBuilderInterface
{
readonly #props: GetQueryBuilderProps;
@@ -36,7 +36,7 @@ export class GetQueryBuilder
keys & PickSkRequired>(
keys: Keys
- ) {
+ ): GetQueryBuilder {
return new GetQueryBuilder({
...this.#props,
node: {
@@ -49,7 +49,7 @@ export class GetQueryBuilder
});
}
- consistentRead(enabled: boolean): GetQueryBuilderInterface {
+ consistentRead(enabled: boolean): GetQueryBuilder {
return new GetQueryBuilder({
...this.#props,
node: {
@@ -64,7 +64,7 @@ export class GetQueryBuilder
attributes[] & string[]>(
attributes: A
- ): GetQueryBuilderInterface> {
+ ): GetQueryBuilder> {
return new GetQueryBuilder({
...this.#props,
node: {
@@ -80,11 +80,16 @@ export class GetQueryBuilder
compile(): GetCommand {
return this.#props.queryCompiler.compile(this.#props.node);
}
+
execute = async (): Promise | undefined> => {
const command = this.compile();
const item = await this.#props.ddbClient.send(command);
return (item.Item as ExecuteOutput) ?? undefined;
};
+
+ public get node() {
+ return this.#props.node;
+ }
}
preventAwait(
diff --git a/src/queryBuilders/putItemQueryBuilder.ts b/src/queryBuilders/putItemQueryBuilder.ts
index 2ddbb42..06fa3c4 100644
--- a/src/queryBuilders/putItemQueryBuilder.ts
+++ b/src/queryBuilders/putItemQueryBuilder.ts
@@ -16,52 +16,56 @@ import {
NotExprArg,
} from "./expressionBuilder";
-export interface PutItemQueryBuilderInterface {
+export interface PutItemQueryBuilderInterface<
+ DDB,
+ Table extends keyof DDB,
+ O extends DDB[Table]
+> {
// conditionExpression
conditionExpression>(
...args: ComparatorExprArg
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
conditionExpression>(
...args: AttributeFuncExprArg
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
conditionExpression>(
...args: AttributeBeginsWithExprArg
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
conditionExpression>(
...args: AttributeContainsExprArg
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
conditionExpression>(
...args: AttributeBetweenExprArg
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
conditionExpression>(
...args: NotExprArg
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
conditionExpression>(
...args: BuilderExprArg
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
// orConditionExpression
orConditionExpression>(
...args: ComparatorExprArg
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
orConditionExpression>(
...args: AttributeFuncExprArg
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
orConditionExpression>(
...args: AttributeBeginsWithExprArg
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
orConditionExpression>(
...args: AttributeContainsExprArg
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
orConditionExpression>(
...args: AttributeBetweenExprArg
@@ -69,19 +73,19 @@ export interface PutItemQueryBuilderInterface {
orConditionExpression>(
...args: NotExprArg
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
orConditionExpression>(
...args: BuilderExprArg
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
returnValues(
option: Extract
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
item- >(
item: Item
- ): PutItemQueryBuilderInterface;
+ ): PutItemQueryBuilder;
compile(): PutCommand;
execute(): Promise[] | undefined>;
@@ -101,7 +105,7 @@ export class PutItemQueryBuilder<
conditionExpression>(
...args: ExprArgs
- ): PutItemQueryBuilderInterface {
+ ): PutItemQueryBuilder {
const eB = new ExpressionBuilder({
node: { ...this.#props.node.conditionExpression },
});
@@ -119,7 +123,7 @@ export class PutItemQueryBuilder<
orConditionExpression>(
...args: ExprArgs
- ): PutItemQueryBuilderInterface {
+ ): PutItemQueryBuilder {
const eB = new ExpressionBuilder({
node: { ...this.#props.node.conditionExpression },
});
@@ -137,7 +141,7 @@ export class PutItemQueryBuilder<
item
- >(
item: Item
- ): PutItemQueryBuilderInterface {
+ ): PutItemQueryBuilder {
return new PutItemQueryBuilder({
...this.#props,
node: {
@@ -152,7 +156,7 @@ export class PutItemQueryBuilder<
returnValues(
option: Extract
- ): PutItemQueryBuilderInterface {
+ ): PutItemQueryBuilder {
return new PutItemQueryBuilder({
...this.#props,
node: {
@@ -168,11 +172,16 @@ export class PutItemQueryBuilder<
compile = (): PutCommand => {
return this.#props.queryCompiler.compile(this.#props.node);
};
+
execute = async (): Promise[] | undefined> => {
const putCommand = this.compile();
const data = await this.#props.ddbClient.send(putCommand);
return data.Attributes as any;
};
+
+ public get node() {
+ return this.#props.node;
+ }
}
preventAwait(
diff --git a/src/queryBuilders/readTransactionBuilder.integration.test.ts b/src/queryBuilders/readTransactionBuilder.integration.test.ts
new file mode 100644
index 0000000..7dc3081
--- /dev/null
+++ b/src/queryBuilders/readTransactionBuilder.integration.test.ts
@@ -0,0 +1,49 @@
+import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb";
+import { DDB } from "../../test/testFixture";
+import { getDDBClientFor, startDDBTestContainer } from "../../test/testUtil";
+import { Tsynamo } from "../index";
+
+describe("ReadTransactionBuilder", () => {
+ let tsynamoClient: Tsynamo;
+ let ddbClient: DynamoDBDocumentClient;
+
+ beforeAll(async () => {
+ const testContainer = await startDDBTestContainer();
+ ddbClient = await getDDBClientFor(testContainer);
+
+ tsynamoClient = new Tsynamo({
+ ddbClient,
+ });
+ });
+
+ it("handles transaction with gets", async () => {
+ const trx = tsynamoClient.createReadTransaction();
+
+ trx.addItem({
+ Get: tsynamoClient.getItem("myTable").keys({
+ userId: "123",
+ dataTimestamp: 222,
+ }),
+ });
+
+ trx.addItem({
+ Get: tsynamoClient
+ .getItem("myOtherTable")
+ .keys({
+ userId: "123",
+ stringTimestamp: "111",
+ })
+ .attributes(["userId"]),
+ });
+
+ trx.addItem({
+ Get: tsynamoClient.getItem("myTable").keys({
+ userId: "1111111",
+ dataTimestamp: 2222,
+ }),
+ });
+
+ const result = await trx.execute();
+ expect(result).toMatchSnapshot();
+ });
+});
diff --git a/src/queryBuilders/readTransactionBuilder.ts b/src/queryBuilders/readTransactionBuilder.ts
new file mode 100644
index 0000000..0362ed0
--- /dev/null
+++ b/src/queryBuilders/readTransactionBuilder.ts
@@ -0,0 +1,59 @@
+import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb";
+import { ReadTransactionNode } from "../nodes/readTransactionNode";
+import { QueryCompiler } from "../queryCompiler";
+import { AllTuples } from "../typeHelpers";
+import { GetQueryBuilder } from "./getItemQueryBuilder";
+
+export interface ReadTransactionBuilderInterface {
+ addItem
(item: {
+ Get: GetQueryBuilder;
+ }): void;
+
+ /**
+ * The return value is an array of tuples, where the first item
+ * tells the name of the table, and the right item is the result
+ * item itself (or undefined if not found). The table can be used
+ * for discriminated union to determine the actual type of the result
+ * item.
+ */
+ execute(): Promise[]>;
+}
+
+export class ReadTransactionBuilder
+ implements ReadTransactionBuilderInterface
+{
+ readonly #props: ReadTransactionBuilderProps;
+ resultTables: string[] = [];
+
+ constructor(props: ReadTransactionBuilderProps) {
+ this.#props = props;
+ }
+
+ addItem(item: { Get: GetQueryBuilder }) {
+ this.resultTables.push(item.Get.node.table.table);
+
+ this.#props.node.transactGetItems.push({
+ kind: "TransactGetItemNode",
+ Get: item.Get.node,
+ });
+ }
+
+ async execute(): Promise[]> {
+ const transactionCommand = this.#props.queryCompiler.compile(
+ this.#props.node
+ );
+
+ return (
+ await this.#props.ddbClient.send(transactionCommand)
+ ).Responses?.map((o, i) => [
+ this.resultTables[i],
+ o.Item,
+ ]) as AllTuples[];
+ }
+}
+
+interface ReadTransactionBuilderProps {
+ readonly node: ReadTransactionNode;
+ readonly ddbClient: DynamoDBDocumentClient;
+ readonly queryCompiler: QueryCompiler;
+}
diff --git a/src/queryBuilders/updateItemQueryBuilder.ts b/src/queryBuilders/updateItemQueryBuilder.ts
index 6579aa7..bd64e3a 100644
--- a/src/queryBuilders/updateItemQueryBuilder.ts
+++ b/src/queryBuilders/updateItemQueryBuilder.ts
@@ -31,71 +31,71 @@ import { SetUpdateExpressionFunctionQueryBuilder } from "./setUpdateExpressionFu
export interface UpdateItemQueryBuilderInterface<
DDB,
Table extends keyof DDB,
- O
+ O extends DDB[Table]
> {
// conditionExpression
conditionExpression>(
...args: ComparatorExprArg
- ): UpdateItemQueryBuilderInterface;
+ ): UpdateItemQueryBuilder;
conditionExpression>(
...args: AttributeFuncExprArg
- ): UpdateItemQueryBuilderInterface;
+ ): UpdateItemQueryBuilder;
conditionExpression>(
...args: AttributeBeginsWithExprArg
- ): UpdateItemQueryBuilderInterface;
+ ): UpdateItemQueryBuilder;
conditionExpression>(
...args: AttributeContainsExprArg
- ): UpdateItemQueryBuilderInterface;
+ ): UpdateItemQueryBuilder;
conditionExpression>(
...args: AttributeBetweenExprArg
- ): UpdateItemQueryBuilderInterface;
+ ): UpdateItemQueryBuilder;
conditionExpression>(
...args: NotExprArg
- ): UpdateItemQueryBuilderInterface;
+ ): UpdateItemQueryBuilder;
conditionExpression>(
...args: BuilderExprArg
- ): UpdateItemQueryBuilderInterface;
+ ): UpdateItemQueryBuilder;
// orConditionExpression
orConditionExpression>(
...args: ComparatorExprArg
- ): UpdateItemQueryBuilderInterface;
+ ): UpdateItemQueryBuilder;
orConditionExpression>(
...args: AttributeFuncExprArg
- ): UpdateItemQueryBuilderInterface;
+ ): UpdateItemQueryBuilder;
orConditionExpression>(
...args: AttributeBeginsWithExprArg
- ): UpdateItemQueryBuilderInterface;
+ ): UpdateItemQueryBuilder;
orConditionExpression>(
...args: AttributeContainsExprArg
- ): UpdateItemQueryBuilderInterface;
+ ): UpdateItemQueryBuilder