This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch CAMEL-22805-part-2 in repository https://gitbox.apache.org/repos/asf/camel.git
commit 8df32657b8e7cd686672d0f45f18153f5a032bb1 Author: Andrea Cosentino <[email protected]> AuthorDate: Thu Jan 8 14:58:28 2026 +0100 CAMEL-22829 - Camel-AWS components: Avoid duplicated code and add pagination to producer operation where it makes sense - AWS DynamoDB Signed-off-by: Andrea Cosentino <[email protected]> --- .../apache/camel/catalog/components/aws2-ddb.json | 41 ++++++------- .../apache/camel/component/aws2/ddb/aws2-ddb.json | 41 ++++++------- .../component/aws2/ddb/AbstractDdbCommand.java | 69 ++++++++++++++++++++++ .../camel/component/aws2/ddb/Ddb2Constants.java | 4 ++ .../camel/component/aws2/ddb/QueryCommand.java | 58 ++++++------------ .../camel/component/aws2/ddb/ScanCommand.java | 64 ++++++++++---------- .../aws2/ddbstream/Ddb2StreamConstants.java | 16 +++++ .../aws2/ddbstream/Ddb2StreamConsumer.java | 9 ++- .../endpoint/dsl/Ddb2EndpointBuilderFactory.java | 13 ++++ 9 files changed, 201 insertions(+), 114 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ddb.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ddb.json index 4a5cb9a705c6..25ed85cdf059 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ddb.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ddb.json @@ -70,26 +70,27 @@ "CamelAwsDdbKeyConditions": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, Condition>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "This header specify the selection criteria for the query, and merge together the two old headers CamelAwsDdbHashKeyValue and CamelAwsDdbScanRangeKeyCondition", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Con [...] "CamelAwsDdbKeySchema": { "index": 14, "kind": "header", "displayName": "", "group": "DeleteTable DescribeTable", "label": "DeleteTable DescribeTable", "required": false, "javaType": "List<KeySchemaElement>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The KeySchema that identifies the primary key for this table. From Camel 2.16.0 the type of this header is List and not KeySchema", "constantName": "org.apache.camel.component.aws2.d [...] "CamelAwsDdbLastEvaluatedKey": { "index": 15, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "Key", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Primary key of the item where the query operation stopped, inclusive of the previous result set.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#LAST_EVALUATED_KEY" }, - "CamelAwsDdbLimit": { "index": 16, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The maximum number of items to return.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#LIMIT" }, - "CamelAwsDdbOperation": { "index": 17, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "org.apache.camel.component.aws2.ddb.Ddb2Operations", "enum": [ "BatchGetItems", "DeleteItem", "DeleteTable", "DescribeTable", "GetItem", "PutItem", "Query", "Scan", "UpdateItem", "UpdateTable" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apac [...] - "CamelAwsDdbProvisionedThroughput": { "index": 18, "kind": "header", "displayName": "", "group": "DeleteTable DescribeTable", "label": "DeleteTable DescribeTable", "required": false, "javaType": "software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughputDescription", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The value of the ProvisionedThroughput property for this table", "constantName": "org.apache.camel.component.aws2 [...] - "CamelAwsDdbReadCapacity": { "index": 19, "kind": "header", "displayName": "", "group": "UpdateTable DescribeTable", "label": "UpdateTable DescribeTable", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "ReadCapacityUnits property of this table.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#READ_CAPACITY" }, - "CamelAwsDdbReturnValues": { "index": 20, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Use this parameter if you want to get the attribute name-value pairs before or after they are modified(NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW).", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#RETURN_VALUES" }, - "CamelAwsDdbScannedCount": { "index": 21, "kind": "header", "displayName": "", "group": "Scan", "label": "Scan", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Number of items in the complete scan before any filters are applied.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#SCANNED_COUNT" }, - "CamelAwsDdbScanIndexForward": { "index": 22, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Specifies forward or backward traversal of the index.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#SCAN_INDEX_FORWARD" }, - "CamelAwsDdbScanFilter": { "index": 23, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, Condition>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Evaluates the scan results and returns only the desired values.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#SCAN_FILTER" }, - "CamelAwsDdbStartKey": { "index": 24, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, AttributeValue>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Primary key of the item from which to continue an earlier query.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#START_KEY" }, - "CamelAwsDdbTableName": { "index": 25, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Table Name for this operation.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#TABLE_NAME" }, - "CamelAwsDdbTableSize": { "index": 26, "kind": "header", "displayName": "", "group": "DeleteTable DescribeTable", "label": "DeleteTable DescribeTable", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The table size in bytes.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#TABLE_SIZE" }, - "CamelAwsDdbTableStatus": { "index": 27, "kind": "header", "displayName": "", "group": "DeleteTable DescribeTable", "label": "DeleteTable DescribeTable", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The status of the table: CREATING, UPDATING, DELETING, ACTIVE", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#TABLE_STATUS" }, - "CamelAwsDdbUpdateCondition": { "index": 28, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, ExpectedAttributeValue>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Designates an attribute for a conditional modification.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#UPDATE_CONDITION" }, - "CamelAwsDdbUpdateValues": { "index": 29, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, AttributeValueUpdate>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Map of attribute name to the new value and action for the update.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#UPDATE_VALUES" }, - "CamelAwsDdbUnprocessedKeys": { "index": 30, "kind": "header", "displayName": "", "group": "BatchGetItems", "label": "BatchGetItems", "required": false, "javaType": "Map<String,KeysAndAttributes>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Contains a map of tables and their respective keys that were not processed with the current response.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#UNPROCESSED_KEYS" }, - "CamelAwsDdbWriteCapacity": { "index": 31, "kind": "header", "displayName": "", "group": "UpdateTable DescribeTable", "label": "UpdateTable DescribeTable", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "WriteCapacityUnits property of this table.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#WRITE_CAPACITY" }, - "CamelAwsDdbFilterExpression": { "index": 32, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Filter Expression.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#FILTER_EXPRESSION" }, - "CamelAwsDdbFilterExpressionAttributeNames": { "index": 33, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Filter Expression Attribute Names.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#FILTER_EXPRESSION_ATTRIBUTE_NAMES" }, - "CamelAwsDdbFilterExpressionAttributeValues": { "index": 34, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Filter Expression Attribute Values.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#FILTER_EXPRESSION_ATTRIBUTE_VALUES" }, - "CamelAwsDdbProjectExpression": { "index": 35, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Project Expression.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#PROJECT_EXPRESSION" } + "CamelAwsDdbIsTruncated": { "index": 16, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the response has more results (is truncated). If true, use LAST_EVALUATED_KEY as START_KEY for the next page.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#IS_TRUNCATED" }, + "CamelAwsDdbLimit": { "index": 17, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The maximum number of items to return.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#LIMIT" }, + "CamelAwsDdbOperation": { "index": 18, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "org.apache.camel.component.aws2.ddb.Ddb2Operations", "enum": [ "BatchGetItems", "DeleteItem", "DeleteTable", "DescribeTable", "GetItem", "PutItem", "Query", "Scan", "UpdateItem", "UpdateTable" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apac [...] + "CamelAwsDdbProvisionedThroughput": { "index": 19, "kind": "header", "displayName": "", "group": "DeleteTable DescribeTable", "label": "DeleteTable DescribeTable", "required": false, "javaType": "software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughputDescription", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The value of the ProvisionedThroughput property for this table", "constantName": "org.apache.camel.component.aws2 [...] + "CamelAwsDdbReadCapacity": { "index": 20, "kind": "header", "displayName": "", "group": "UpdateTable DescribeTable", "label": "UpdateTable DescribeTable", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "ReadCapacityUnits property of this table.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#READ_CAPACITY" }, + "CamelAwsDdbReturnValues": { "index": 21, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Use this parameter if you want to get the attribute name-value pairs before or after they are modified(NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW).", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#RETURN_VALUES" }, + "CamelAwsDdbScannedCount": { "index": 22, "kind": "header", "displayName": "", "group": "Scan", "label": "Scan", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Number of items in the complete scan before any filters are applied.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#SCANNED_COUNT" }, + "CamelAwsDdbScanIndexForward": { "index": 23, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Specifies forward or backward traversal of the index.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#SCAN_INDEX_FORWARD" }, + "CamelAwsDdbScanFilter": { "index": 24, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, Condition>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Evaluates the scan results and returns only the desired values.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#SCAN_FILTER" }, + "CamelAwsDdbStartKey": { "index": 25, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, AttributeValue>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Primary key of the item from which to continue an earlier query.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#START_KEY" }, + "CamelAwsDdbTableName": { "index": 26, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Table Name for this operation.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#TABLE_NAME" }, + "CamelAwsDdbTableSize": { "index": 27, "kind": "header", "displayName": "", "group": "DeleteTable DescribeTable", "label": "DeleteTable DescribeTable", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The table size in bytes.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#TABLE_SIZE" }, + "CamelAwsDdbTableStatus": { "index": 28, "kind": "header", "displayName": "", "group": "DeleteTable DescribeTable", "label": "DeleteTable DescribeTable", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The status of the table: CREATING, UPDATING, DELETING, ACTIVE", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#TABLE_STATUS" }, + "CamelAwsDdbUpdateCondition": { "index": 29, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, ExpectedAttributeValue>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Designates an attribute for a conditional modification.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#UPDATE_CONDITION" }, + "CamelAwsDdbUpdateValues": { "index": 30, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, AttributeValueUpdate>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Map of attribute name to the new value and action for the update.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#UPDATE_VALUES" }, + "CamelAwsDdbUnprocessedKeys": { "index": 31, "kind": "header", "displayName": "", "group": "BatchGetItems", "label": "BatchGetItems", "required": false, "javaType": "Map<String,KeysAndAttributes>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Contains a map of tables and their respective keys that were not processed with the current response.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#UNPROCESSED_KEYS" }, + "CamelAwsDdbWriteCapacity": { "index": 32, "kind": "header", "displayName": "", "group": "UpdateTable DescribeTable", "label": "UpdateTable DescribeTable", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "WriteCapacityUnits property of this table.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#WRITE_CAPACITY" }, + "CamelAwsDdbFilterExpression": { "index": 33, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Filter Expression.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#FILTER_EXPRESSION" }, + "CamelAwsDdbFilterExpressionAttributeNames": { "index": 34, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Filter Expression Attribute Names.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#FILTER_EXPRESSION_ATTRIBUTE_NAMES" }, + "CamelAwsDdbFilterExpressionAttributeValues": { "index": 35, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Filter Expression Attribute Values.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#FILTER_EXPRESSION_ATTRIBUTE_VALUES" }, + "CamelAwsDdbProjectExpression": { "index": 36, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Project Expression.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#PROJECT_EXPRESSION" } }, "properties": { "tableName": { "index": 0, "kind": "path", "displayName": "Table Name", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ddb.Ddb2Configuration", "configurationField": "configuration", "description": "The name of the table currently worked with." }, diff --git a/components/camel-aws/camel-aws2-ddb/src/generated/resources/META-INF/org/apache/camel/component/aws2/ddb/aws2-ddb.json b/components/camel-aws/camel-aws2-ddb/src/generated/resources/META-INF/org/apache/camel/component/aws2/ddb/aws2-ddb.json index 4a5cb9a705c6..25ed85cdf059 100644 --- a/components/camel-aws/camel-aws2-ddb/src/generated/resources/META-INF/org/apache/camel/component/aws2/ddb/aws2-ddb.json +++ b/components/camel-aws/camel-aws2-ddb/src/generated/resources/META-INF/org/apache/camel/component/aws2/ddb/aws2-ddb.json @@ -70,26 +70,27 @@ "CamelAwsDdbKeyConditions": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, Condition>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "This header specify the selection criteria for the query, and merge together the two old headers CamelAwsDdbHashKeyValue and CamelAwsDdbScanRangeKeyCondition", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Con [...] "CamelAwsDdbKeySchema": { "index": 14, "kind": "header", "displayName": "", "group": "DeleteTable DescribeTable", "label": "DeleteTable DescribeTable", "required": false, "javaType": "List<KeySchemaElement>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The KeySchema that identifies the primary key for this table. From Camel 2.16.0 the type of this header is List and not KeySchema", "constantName": "org.apache.camel.component.aws2.d [...] "CamelAwsDdbLastEvaluatedKey": { "index": 15, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "Key", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Primary key of the item where the query operation stopped, inclusive of the previous result set.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#LAST_EVALUATED_KEY" }, - "CamelAwsDdbLimit": { "index": 16, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The maximum number of items to return.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#LIMIT" }, - "CamelAwsDdbOperation": { "index": 17, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "org.apache.camel.component.aws2.ddb.Ddb2Operations", "enum": [ "BatchGetItems", "DeleteItem", "DeleteTable", "DescribeTable", "GetItem", "PutItem", "Query", "Scan", "UpdateItem", "UpdateTable" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apac [...] - "CamelAwsDdbProvisionedThroughput": { "index": 18, "kind": "header", "displayName": "", "group": "DeleteTable DescribeTable", "label": "DeleteTable DescribeTable", "required": false, "javaType": "software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughputDescription", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The value of the ProvisionedThroughput property for this table", "constantName": "org.apache.camel.component.aws2 [...] - "CamelAwsDdbReadCapacity": { "index": 19, "kind": "header", "displayName": "", "group": "UpdateTable DescribeTable", "label": "UpdateTable DescribeTable", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "ReadCapacityUnits property of this table.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#READ_CAPACITY" }, - "CamelAwsDdbReturnValues": { "index": 20, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Use this parameter if you want to get the attribute name-value pairs before or after they are modified(NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW).", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#RETURN_VALUES" }, - "CamelAwsDdbScannedCount": { "index": 21, "kind": "header", "displayName": "", "group": "Scan", "label": "Scan", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Number of items in the complete scan before any filters are applied.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#SCANNED_COUNT" }, - "CamelAwsDdbScanIndexForward": { "index": 22, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Specifies forward or backward traversal of the index.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#SCAN_INDEX_FORWARD" }, - "CamelAwsDdbScanFilter": { "index": 23, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, Condition>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Evaluates the scan results and returns only the desired values.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#SCAN_FILTER" }, - "CamelAwsDdbStartKey": { "index": 24, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, AttributeValue>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Primary key of the item from which to continue an earlier query.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#START_KEY" }, - "CamelAwsDdbTableName": { "index": 25, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Table Name for this operation.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#TABLE_NAME" }, - "CamelAwsDdbTableSize": { "index": 26, "kind": "header", "displayName": "", "group": "DeleteTable DescribeTable", "label": "DeleteTable DescribeTable", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The table size in bytes.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#TABLE_SIZE" }, - "CamelAwsDdbTableStatus": { "index": 27, "kind": "header", "displayName": "", "group": "DeleteTable DescribeTable", "label": "DeleteTable DescribeTable", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The status of the table: CREATING, UPDATING, DELETING, ACTIVE", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#TABLE_STATUS" }, - "CamelAwsDdbUpdateCondition": { "index": 28, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, ExpectedAttributeValue>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Designates an attribute for a conditional modification.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#UPDATE_CONDITION" }, - "CamelAwsDdbUpdateValues": { "index": 29, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, AttributeValueUpdate>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Map of attribute name to the new value and action for the update.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#UPDATE_VALUES" }, - "CamelAwsDdbUnprocessedKeys": { "index": 30, "kind": "header", "displayName": "", "group": "BatchGetItems", "label": "BatchGetItems", "required": false, "javaType": "Map<String,KeysAndAttributes>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Contains a map of tables and their respective keys that were not processed with the current response.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#UNPROCESSED_KEYS" }, - "CamelAwsDdbWriteCapacity": { "index": 31, "kind": "header", "displayName": "", "group": "UpdateTable DescribeTable", "label": "UpdateTable DescribeTable", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "WriteCapacityUnits property of this table.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#WRITE_CAPACITY" }, - "CamelAwsDdbFilterExpression": { "index": 32, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Filter Expression.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#FILTER_EXPRESSION" }, - "CamelAwsDdbFilterExpressionAttributeNames": { "index": 33, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Filter Expression Attribute Names.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#FILTER_EXPRESSION_ATTRIBUTE_NAMES" }, - "CamelAwsDdbFilterExpressionAttributeValues": { "index": 34, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Filter Expression Attribute Values.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#FILTER_EXPRESSION_ATTRIBUTE_VALUES" }, - "CamelAwsDdbProjectExpression": { "index": 35, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Project Expression.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#PROJECT_EXPRESSION" } + "CamelAwsDdbIsTruncated": { "index": 16, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the response has more results (is truncated). If true, use LAST_EVALUATED_KEY as START_KEY for the next page.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#IS_TRUNCATED" }, + "CamelAwsDdbLimit": { "index": 17, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The maximum number of items to return.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#LIMIT" }, + "CamelAwsDdbOperation": { "index": 18, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "org.apache.camel.component.aws2.ddb.Ddb2Operations", "enum": [ "BatchGetItems", "DeleteItem", "DeleteTable", "DescribeTable", "GetItem", "PutItem", "Query", "Scan", "UpdateItem", "UpdateTable" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apac [...] + "CamelAwsDdbProvisionedThroughput": { "index": 19, "kind": "header", "displayName": "", "group": "DeleteTable DescribeTable", "label": "DeleteTable DescribeTable", "required": false, "javaType": "software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughputDescription", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The value of the ProvisionedThroughput property for this table", "constantName": "org.apache.camel.component.aws2 [...] + "CamelAwsDdbReadCapacity": { "index": 20, "kind": "header", "displayName": "", "group": "UpdateTable DescribeTable", "label": "UpdateTable DescribeTable", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "ReadCapacityUnits property of this table.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#READ_CAPACITY" }, + "CamelAwsDdbReturnValues": { "index": 21, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Use this parameter if you want to get the attribute name-value pairs before or after they are modified(NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW).", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#RETURN_VALUES" }, + "CamelAwsDdbScannedCount": { "index": 22, "kind": "header", "displayName": "", "group": "Scan", "label": "Scan", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Number of items in the complete scan before any filters are applied.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#SCANNED_COUNT" }, + "CamelAwsDdbScanIndexForward": { "index": 23, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Specifies forward or backward traversal of the index.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#SCAN_INDEX_FORWARD" }, + "CamelAwsDdbScanFilter": { "index": 24, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, Condition>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Evaluates the scan results and returns only the desired values.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#SCAN_FILTER" }, + "CamelAwsDdbStartKey": { "index": 25, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, AttributeValue>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Primary key of the item from which to continue an earlier query.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#START_KEY" }, + "CamelAwsDdbTableName": { "index": 26, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Table Name for this operation.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#TABLE_NAME" }, + "CamelAwsDdbTableSize": { "index": 27, "kind": "header", "displayName": "", "group": "DeleteTable DescribeTable", "label": "DeleteTable DescribeTable", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The table size in bytes.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#TABLE_SIZE" }, + "CamelAwsDdbTableStatus": { "index": 28, "kind": "header", "displayName": "", "group": "DeleteTable DescribeTable", "label": "DeleteTable DescribeTable", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The status of the table: CREATING, UPDATING, DELETING, ACTIVE", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#TABLE_STATUS" }, + "CamelAwsDdbUpdateCondition": { "index": 29, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, ExpectedAttributeValue>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Designates an attribute for a conditional modification.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#UPDATE_CONDITION" }, + "CamelAwsDdbUpdateValues": { "index": 30, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, AttributeValueUpdate>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Map of attribute name to the new value and action for the update.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#UPDATE_VALUES" }, + "CamelAwsDdbUnprocessedKeys": { "index": 31, "kind": "header", "displayName": "", "group": "BatchGetItems", "label": "BatchGetItems", "required": false, "javaType": "Map<String,KeysAndAttributes>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Contains a map of tables and their respective keys that were not processed with the current response.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#UNPROCESSED_KEYS" }, + "CamelAwsDdbWriteCapacity": { "index": 32, "kind": "header", "displayName": "", "group": "UpdateTable DescribeTable", "label": "UpdateTable DescribeTable", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "WriteCapacityUnits property of this table.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#WRITE_CAPACITY" }, + "CamelAwsDdbFilterExpression": { "index": 33, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Filter Expression.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#FILTER_EXPRESSION" }, + "CamelAwsDdbFilterExpressionAttributeNames": { "index": 34, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Filter Expression Attribute Names.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#FILTER_EXPRESSION_ATTRIBUTE_NAMES" }, + "CamelAwsDdbFilterExpressionAttributeValues": { "index": 35, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Filter Expression Attribute Values.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#FILTER_EXPRESSION_ATTRIBUTE_VALUES" }, + "CamelAwsDdbProjectExpression": { "index": 36, "kind": "header", "displayName": "", "group": "Query Scan", "label": "Query Scan", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Project Expression.", "constantName": "org.apache.camel.component.aws2.ddb.Ddb2Constants#PROJECT_EXPRESSION" } }, "properties": { "tableName": { "index": 0, "kind": "path", "displayName": "Table Name", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ddb.Ddb2Configuration", "configurationField": "configuration", "description": "The name of the table currently worked with." }, diff --git a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/AbstractDdbCommand.java b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/AbstractDdbCommand.java index 2dd3f967d6f9..b21b64b138af 100644 --- a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/AbstractDdbCommand.java +++ b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/AbstractDdbCommand.java @@ -96,4 +96,73 @@ public abstract class AbstractDdbCommand { protected Integer determineLimit() { return exchange.getIn().getHeader(Ddb2Constants.LIMIT, Integer.class); } + + /** + * Gets the filter expression from the exchange header. + */ + protected String determineFilterExpression() { + return exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION, String.class); + } + + /** + * Gets the filter expression attribute names from the exchange header. + */ + @SuppressWarnings("unchecked") + protected Map<String, String> determineFilterExpressionAttributeNames() { + return exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_NAMES, Map.class); + } + + /** + * Gets the filter expression attribute values from the exchange header. + */ + @SuppressWarnings("unchecked") + protected Map<String, AttributeValue> determineFilterExpressionAttributeValues() { + return exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_VALUES, Map.class); + } + + /** + * Gets the projection expression from the exchange header. + */ + protected String determineProjectExpression() { + return exchange.getIn().getHeader(Ddb2Constants.PROJECT_EXPRESSION, String.class); + } + + /** + * Gets the index name from the exchange header. + */ + protected String determineIndexName() { + return exchange.getIn().getHeader(Ddb2Constants.INDEX_NAME, String.class); + } + + /** + * Checks if the filter expression is set and not empty. + */ + protected boolean hasFilterExpression() { + String filterExpression = exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION, String.class); + return filterExpression != null && !filterExpression.isEmpty(); + } + + /** + * Checks if the filter expression attribute names are set and not empty. + */ + protected boolean hasFilterExpressionAttributeNames() { + Map<?, ?> names = exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_NAMES, Map.class); + return names != null && !names.isEmpty(); + } + + /** + * Checks if the filter expression attribute values are set and not empty. + */ + protected boolean hasFilterExpressionAttributeValues() { + Map<?, ?> values = exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_VALUES, Map.class); + return values != null && !values.isEmpty(); + } + + /** + * Checks if the projection expression is set and not empty. + */ + protected boolean hasProjectExpression() { + String projectExpression = exchange.getIn().getHeader(Ddb2Constants.PROJECT_EXPRESSION, String.class); + return projectExpression != null && !projectExpression.isEmpty(); + } } diff --git a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/Ddb2Constants.java b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/Ddb2Constants.java index 6521c8c5ec5e..36cc035a252e 100644 --- a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/Ddb2Constants.java +++ b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/Ddb2Constants.java @@ -88,6 +88,10 @@ public interface Ddb2Constants { "the previous result set.", javaType = "Key") String LAST_EVALUATED_KEY = "CamelAwsDdbLastEvaluatedKey"; + @Metadata(label = "Query Scan", + description = "Whether the response has more results (is truncated). If true, use LAST_EVALUATED_KEY as START_KEY for the next page.", + javaType = "Boolean") + String IS_TRUNCATED = "CamelAwsDdbIsTruncated"; @Metadata(description = "The maximum number of items to return.", javaType = "Integer") String LIMIT = "CamelAwsDdbLimit"; @Metadata(description = "The operation to perform.", javaType = "org.apache.camel.component.aws2.ddb.Ddb2Operations") diff --git a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/QueryCommand.java b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/QueryCommand.java index 8ab32e8b28bc..b4b45e476704 100644 --- a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/QueryCommand.java +++ b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/QueryCommand.java @@ -22,7 +22,6 @@ import java.util.Map; import org.apache.camel.Exchange; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; -import software.amazon.awssdk.services.dynamodb.model.AttributeValue; import software.amazon.awssdk.services.dynamodb.model.Condition; import software.amazon.awssdk.services.dynamodb.model.QueryRequest; import software.amazon.awssdk.services.dynamodb.model.QueryResponse; @@ -35,39 +34,39 @@ public class QueryCommand extends AbstractDdbCommand { @Override public void execute() { - QueryRequest.Builder query = QueryRequest.builder().tableName(determineTableName()) - .attributesToGet(determineAttributeNames()).consistentRead(determineConsistentRead()) - .keyConditions(determineKeyConditions()).exclusiveStartKey(determineExclusiveStartKey()) - .limit(determineLimit()).scanIndexForward(determineScanIndexForward()); + QueryRequest.Builder query = QueryRequest.builder() + .tableName(determineTableName()) + .consistentRead(determineConsistentRead()) + .keyConditions(determineKeyConditions()) + .exclusiveStartKey(determineExclusiveStartKey()) + .limit(determineLimit()) + .scanIndexForward(determineScanIndexForward()); // Check if we have set an Index Name - if (exchange.getIn().getHeader(Ddb2Constants.INDEX_NAME, String.class) != null) { - query.indexName(exchange.getIn().getHeader(Ddb2Constants.INDEX_NAME, String.class)); + String indexName = determineIndexName(); + if (indexName != null) { + query.indexName(indexName); } - //skip adding attribute-to-get from 'CamelAwsDdbAttributeNames' if the header is null or empty list. - if (exchange.getIn().getHeader(Ddb2Constants.ATTRIBUTE_NAMES) != null && - !exchange.getIn().getHeader(Ddb2Constants.ATTRIBUTE_NAMES, Collection.class).isEmpty()) { - query.attributesToGet(determineAttributeNames()); + // Skip adding attribute-to-get from 'CamelAwsDdbAttributeNames' if the header is null or empty list. + Collection<String> attributeNames = determineAttributeNames(); + if (attributeNames != null && !attributeNames.isEmpty()) { + query.attributesToGet(attributeNames); } - if (exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION) != null && - !exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION, String.class).isEmpty()) { + if (hasFilterExpression()) { query.filterExpression(determineFilterExpression()); } - if (exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_NAMES) != null && - !exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_NAMES, Map.class).isEmpty()) { + if (hasFilterExpressionAttributeNames()) { query.expressionAttributeNames(determineFilterExpressionAttributeNames()); } - if (exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_VALUES) != null && - !exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_VALUES, Map.class).isEmpty()) { + if (hasFilterExpressionAttributeValues()) { query.expressionAttributeValues(determineFilterExpressionAttributeValues()); } - if (exchange.getIn().getHeader(Ddb2Constants.PROJECT_EXPRESSION) != null && - !exchange.getIn().getHeader(Ddb2Constants.PROJECT_EXPRESSION, Map.class).isEmpty()) { + if (hasProjectExpression()) { query.projectionExpression(determineProjectExpression()); } @@ -76,6 +75,7 @@ public class QueryCommand extends AbstractDdbCommand { Map<Object, Object> tmp = new HashMap<>(); tmp.put(Ddb2Constants.ITEMS, result.items()); tmp.put(Ddb2Constants.LAST_EVALUATED_KEY, result.hasLastEvaluatedKey() ? result.lastEvaluatedKey() : null); + tmp.put(Ddb2Constants.IS_TRUNCATED, result.hasLastEvaluatedKey()); tmp.put(Ddb2Constants.CONSUMED_CAPACITY, result.consumedCapacity()); tmp.put(Ddb2Constants.COUNT, result.count()); addToResults(tmp); @@ -89,24 +89,4 @@ public class QueryCommand extends AbstractDdbCommand { private Map<String, Condition> determineKeyConditions() { return exchange.getIn().getHeader(Ddb2Constants.KEY_CONDITIONS, Map.class); } - - @SuppressWarnings("unchecked") - private String determineFilterExpression() { - return exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION, String.class); - } - - @SuppressWarnings("unchecked") - private Map<String, String> determineFilterExpressionAttributeNames() { - return exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_NAMES, Map.class); - } - - @SuppressWarnings("unchecked") - private Map<String, AttributeValue> determineFilterExpressionAttributeValues() { - return exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_VALUES, Map.class); - } - - @SuppressWarnings("unchecked") - private String determineProjectExpression() { - return exchange.getIn().getHeader(Ddb2Constants.PROJECT_EXPRESSION, String.class); - } } diff --git a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/ScanCommand.java b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/ScanCommand.java index 98999342f83d..2242e299ec6f 100644 --- a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/ScanCommand.java +++ b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/ScanCommand.java @@ -16,13 +16,11 @@ */ package org.apache.camel.component.aws2.ddb; -import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.apache.camel.Exchange; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; -import software.amazon.awssdk.services.dynamodb.model.AttributeValue; import software.amazon.awssdk.services.dynamodb.model.Condition; import software.amazon.awssdk.services.dynamodb.model.ScanRequest; import software.amazon.awssdk.services.dynamodb.model.ScanResponse; @@ -35,18 +33,41 @@ public class ScanCommand extends AbstractDdbCommand { @Override public void execute() { - ScanResponse result = ddbClient.scan(ScanRequest.builder().tableName(determineTableName()).limit(determineLimit()) + ScanRequest.Builder scan = ScanRequest.builder() + .tableName(determineTableName()) + .limit(determineLimit()) .exclusiveStartKey(determineExclusiveStartKey()) - .attributesToGet(determineAttributesToGet()) - .filterExpression(determineFilterExpression()) - .expressionAttributeNames(determineFilterExpressionAttributeNames()) - .expressionAttributeValues(determineFilterExpressionAttributeValues()) - .projectionExpression(determineProjectExpression()) - .scanFilter(determineScanFilter()).build()); + .attributesToGet(determineAttributeNames()) + .scanFilter(determineScanFilter()); + + // Check if we have set an Index Name + String indexName = determineIndexName(); + if (indexName != null) { + scan.indexName(indexName); + } + + if (hasFilterExpression()) { + scan.filterExpression(determineFilterExpression()); + } + + if (hasFilterExpressionAttributeNames()) { + scan.expressionAttributeNames(determineFilterExpressionAttributeNames()); + } + + if (hasFilterExpressionAttributeValues()) { + scan.expressionAttributeValues(determineFilterExpressionAttributeValues()); + } + + if (hasProjectExpression()) { + scan.projectionExpression(determineProjectExpression()); + } + + ScanResponse result = ddbClient.scan(scan.build()); Map<Object, Object> tmp = new HashMap<>(); tmp.put(Ddb2Constants.ITEMS, result.items()); tmp.put(Ddb2Constants.LAST_EVALUATED_KEY, result.hasLastEvaluatedKey() ? result.lastEvaluatedKey() : null); + tmp.put(Ddb2Constants.IS_TRUNCATED, result.hasLastEvaluatedKey()); tmp.put(Ddb2Constants.CONSUMED_CAPACITY, result.consumedCapacity()); tmp.put(Ddb2Constants.COUNT, result.count()); tmp.put(Ddb2Constants.SCANNED_COUNT, result.scannedCount()); @@ -57,29 +78,4 @@ public class ScanCommand extends AbstractDdbCommand { private Map<String, Condition> determineScanFilter() { return exchange.getIn().getHeader(Ddb2Constants.SCAN_FILTER, Map.class); } - - @SuppressWarnings("unchecked") - private Collection<String> determineAttributesToGet() { - return exchange.getIn().getHeader(Ddb2Constants.ATTRIBUTE_NAMES, Collection.class); - } - - @SuppressWarnings("unchecked") - private String determineFilterExpression() { - return exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION, String.class); - } - - @SuppressWarnings("unchecked") - private Map<String, String> determineFilterExpressionAttributeNames() { - return exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_NAMES, Map.class); - } - - @SuppressWarnings("unchecked") - private Map<String, AttributeValue> determineFilterExpressionAttributeValues() { - return exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_VALUES, Map.class); - } - - @SuppressWarnings("unchecked") - private String determineProjectExpression() { - return exchange.getIn().getHeader(Ddb2Constants.PROJECT_EXPRESSION, String.class); - } } diff --git a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddbstream/Ddb2StreamConstants.java b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddbstream/Ddb2StreamConstants.java index 74dd4a682020..44be65c57a6a 100644 --- a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddbstream/Ddb2StreamConstants.java +++ b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddbstream/Ddb2StreamConstants.java @@ -30,4 +30,20 @@ public interface Ddb2StreamConstants { description = "A globally unique identifier for the event that was recorded in this stream record.", javaType = "String") String EVENT_ID = "CamelAwsDdbStreamEventId"; + @Metadata(label = "consumer", + description = "The type of data modification that was performed on the DynamoDB table (INSERT, MODIFY, REMOVE).", + javaType = "String") + String EVENT_NAME = "CamelAwsDdbStreamEventName"; + @Metadata(label = "consumer", + description = "The sequence number of the stream record.", + javaType = "String") + String SEQUENCE_NUMBER = "CamelAwsDdbStreamSequenceNumber"; + @Metadata(label = "consumer", + description = "The approximate date and time when the stream record was created.", + javaType = "java.time.Instant") + String APPROXIMATE_CREATION_DATE_TIME = "CamelAwsDdbStreamApproximateCreationDateTime"; + @Metadata(label = "consumer", + description = "The size of the stream record, in bytes.", + javaType = "Long") + String SIZE_BYTES = "CamelAwsDdbStreamSizeBytes"; } diff --git a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddbstream/Ddb2StreamConsumer.java b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddbstream/Ddb2StreamConsumer.java index 19c0e184af83..f4906d6a1530 100644 --- a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddbstream/Ddb2StreamConsumer.java +++ b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddbstream/Ddb2StreamConsumer.java @@ -58,7 +58,7 @@ public class Ddb2StreamConsumer extends ScheduledBatchPollingConsumer { Map<String, String> shardIterators = shardIteratorHandler.getShardIterators(); - // okay we have some response from azure so lets mark the consumer as ready + // okay we have some response from DynamoDB Streams so lets mark the consumer as ready forceConsumerAsReady(); for (Entry<String, String> shardIteratorEntry : shardIterators.entrySet()) { @@ -129,6 +129,13 @@ public class Ddb2StreamConsumer extends ScheduledBatchPollingConsumer { ex.getMessage().setBody(record, Record.class); ex.getMessage().setHeader(Ddb2StreamConstants.EVENT_SOURCE, record.eventSource()); ex.getMessage().setHeader(Ddb2StreamConstants.EVENT_ID, record.eventID()); + ex.getMessage().setHeader(Ddb2StreamConstants.EVENT_NAME, record.eventNameAsString()); + if (record.dynamodb() != null) { + ex.getMessage().setHeader(Ddb2StreamConstants.SEQUENCE_NUMBER, record.dynamodb().sequenceNumber()); + ex.getMessage().setHeader(Ddb2StreamConstants.APPROXIMATE_CREATION_DATE_TIME, + record.dynamodb().approximateCreationDateTime()); + ex.getMessage().setHeader(Ddb2StreamConstants.SIZE_BYTES, record.dynamodb().sizeBytes()); + } return ex; } diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Ddb2EndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Ddb2EndpointBuilderFactory.java index 287aea319a04..f96a2a52bb1d 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Ddb2EndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Ddb2EndpointBuilderFactory.java @@ -933,6 +933,19 @@ public interface Ddb2EndpointBuilderFactory { public String awsDdbLastEvaluatedKey() { return "CamelAwsDdbLastEvaluatedKey"; } + /** + * Whether the response has more results (is truncated). If true, use + * LAST_EVALUATED_KEY as START_KEY for the next page. + * + * The option is a: {@code Boolean} type. + * + * Group: Query Scan + * + * @return the name of the header {@code AwsDdbIsTruncated}. + */ + public String awsDdbIsTruncated() { + return "CamelAwsDdbIsTruncated"; + } /** * The maximum number of items to return. *
