This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 0629fac1f61 CAMEL-22040 - AWS-DDB: Support filter expressions in scan 
and query operation (#18041)
0629fac1f61 is described below

commit 0629fac1f613e370e587b2f7d6b8c6641ffbedcc
Author: Andrea Cosentino <anco...@gmail.com>
AuthorDate: Tue May 13 15:29:06 2025 +0200

    CAMEL-22040 - AWS-DDB: Support filter expressions in scan and query 
operation (#18041)
    
    Signed-off-by: Andrea Cosentino <anco...@gmail.com>
---
 .../apache/camel/catalog/components/aws2-ddb.json  |  5 ++-
 .../apache/camel/component/aws2/ddb/aws2-ddb.json  |  5 ++-
 .../camel/component/aws2/ddb/Ddb2Constants.java    |  9 +++++
 .../camel/component/aws2/ddb/QueryCommand.java     | 31 ++++++++++++++++++
 .../camel/component/aws2/ddb/ScanCommand.java      | 19 +++++++++++
 .../aws2/ddb/localstack/AWS2QueryRuleIT.java       | 37 +++++++++++++++++++++
 .../aws2/ddb/localstack/AWS2ScanRuleIT.java        | 38 ++++++++++++++++++++++
 .../endpoint/dsl/Ddb2EndpointBuilderFactory.java   | 38 ++++++++++++++++++++++
 8 files changed, 180 insertions(+), 2 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 26f67e97cfe..6d271bc7436 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
@@ -85,7 +85,10 @@
     "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" }
+    "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"
 }
   },
   "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 26f67e97cfe..6d271bc7436 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
@@ -85,7 +85,10 @@
     "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" }
+    "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"
 }
   },
   "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/Ddb2Constants.java
 
b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/Ddb2Constants.java
index 10d6cc80360..8efabe29103 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
@@ -138,4 +138,13 @@ public interface Ddb2Constants {
     @Metadata(label = "UpdateTable DescribeTable", description = 
"WriteCapacityUnits property of this table.",
               javaType = "Long")
     String WRITE_CAPACITY = "CamelAwsDdbWriteCapacity";
+    @Metadata(label = "Query Scan", description = "The Filter Expression.",
+              javaType = "String")
+    String FILTER_EXPRESSION = "CamelAwsDdbFilterExpression";
+    @Metadata(label = "Query Scan", description = "The Filter Expression 
Attribute Names.",
+              javaType = "Map<String, String>")
+    String FILTER_EXPRESSION_ATTRIBUTE_NAMES = 
"CamelAwsDdbFilterExpressionAttributeNames";
+    @Metadata(label = "Query Scan", description = "The Filter Expression 
Attribute Values.",
+              javaType = "Map<String, String>")
+    String FILTER_EXPRESSION_ATTRIBUTE_VALUES = 
"CamelAwsDdbFilterExpressionAttributeValues";
 }
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 288b30e2d9b..27152496d4d 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,6 +22,7 @@ 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;
@@ -50,6 +51,21 @@ public class QueryCommand extends AbstractDdbCommand {
             query.attributesToGet(determineAttributeNames());
         }
 
+        if (exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION) != 
null &&
+                !exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION, 
String.class).isEmpty()) {
+            query.filterExpression(determineFilterExpression());
+        }
+
+        if 
(exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_NAMES) != 
null &&
+                
!exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_NAMES, 
Map.class).isEmpty()) {
+            
query.expressionAttributeNames(determineFilterExpressionAttributeNames());
+        }
+
+        if 
(exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_VALUES) 
!= null &&
+                
!exchange.getIn().getHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_VALUES, 
Map.class).isEmpty()) {
+            
query.expressionAttributeValues(determineFilterExpressionAttributeValues());
+        }
+
         QueryResponse result = ddbClient.query(query.build());
 
         Map<Object, Object> tmp = new HashMap<>();
@@ -68,4 +84,19 @@ 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);
+    }
 }
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 61411a18de0..6e38f9d5998 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
@@ -22,6 +22,7 @@ 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;
@@ -37,6 +38,9 @@ public class ScanCommand extends AbstractDdbCommand {
         ScanResponse result = 
ddbClient.scan(ScanRequest.builder().tableName(determineTableName()).limit(determineLimit())
                 .exclusiveStartKey(determineExclusiveStartKey())
                 .attributesToGet(determineAttributesToGet())
+                .filterExpression(determineFilterExpression())
+                
.expressionAttributeNames(determineFilterExpressionAttributeNames())
+                
.expressionAttributeValues(determineFilterExpressionAttributeValues())
                 .scanFilter(determineScanFilter()).build());
 
         Map<Object, Object> tmp = new HashMap<>();
@@ -57,4 +61,19 @@ public class ScanCommand extends AbstractDdbCommand {
     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);
+    }
 }
diff --git 
a/components/camel-aws/camel-aws2-ddb/src/test/java/org/apache/camel/component/aws2/ddb/localstack/AWS2QueryRuleIT.java
 
b/components/camel-aws/camel-aws2-ddb/src/test/java/org/apache/camel/component/aws2/ddb/localstack/AWS2QueryRuleIT.java
index c9cde61bde8..32eb80652de 100644
--- 
a/components/camel-aws/camel-aws2-ddb/src/test/java/org/apache/camel/component/aws2/ddb/localstack/AWS2QueryRuleIT.java
+++ 
b/components/camel-aws/camel-aws2-ddb/src/test/java/org/apache/camel/component/aws2/ddb/localstack/AWS2QueryRuleIT.java
@@ -149,6 +149,43 @@ public class AWS2QueryRuleIT extends Aws2DDBBase {
         assertEquals(3, exchange.getIn().getHeader(Ddb2Constants.COUNT));
     }
 
+    @Test
+    public void queryItemsWithFilterExpression() {
+
+        putItem(retrieveValue, "uno");
+        putItem(retrieveValue, "dos");
+        putItem(retrieveValue, "tres");
+        putItem(notRetrieveValue, "Ignore me");
+        putItem(notRetrieveValue, "I should not be returned");
+
+        Exchange exchange = template.send("direct:start", e -> {
+            e.getIn().setHeader(Ddb2Constants.OPERATION, Ddb2Operations.Scan);
+            e.getIn().setHeader(Ddb2Constants.CONSISTENT_READ, true);
+            Map<String, Condition> keyConditions = new HashMap<>();
+            keyConditions.put(attributeName, 
Condition.builder().comparisonOperator(
+                    ComparisonOperator.EQ.toString())
+                    
.attributeValueList(AttributeValue.builder().s(retrieveValue).build())
+                    .build());
+            Collection<String> coll = new ArrayList<>();
+            coll.add("clave");
+            e.getIn().setHeader(Ddb2Constants.FILTER_EXPRESSION, "#v <> :num");
+            Map<String, AttributeValue> filterAttrValues = new HashMap<>();
+            filterAttrValues.put(":num", 
AttributeValue.builder().s("retrieve").build());
+            
e.getIn().setHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_NAMES, 
Map.of("#v", "clave"));
+            
e.getIn().setHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_VALUES, 
filterAttrValues);
+        });
+
+        assertNotNull(exchange.getIn().getHeader(Ddb2Constants.ITEMS));
+        List<Map<String, AttributeValue>> items = 
exchange.getIn().getHeader(Ddb2Constants.ITEMS, List.class);
+        assertTrue(items.get(0).containsKey("clave"));
+        assertTrue(items.get(0).containsKey("secondary_attribute"));
+        
assertTrue(items.get(0).get("clave").equals(AttributeValue.builder().s("ignore").build()));
+        assertTrue(items.get(1).containsKey("clave"));
+        
assertTrue(items.get(1).get("clave").equals(AttributeValue.builder().s("ignore").build()));
+        assertTrue(items.get(1).containsKey("secondary_attribute"));
+        assertEquals(2, exchange.getIn().getHeader(Ddb2Constants.COUNT));
+    }
+
     private void putItem(String value1, String value2) {
         final Map<String, AttributeValue> attributeMap = new HashMap<>();
         attributeMap.put(attributeName, 
AttributeValue.builder().s(value1).build());
diff --git 
a/components/camel-aws/camel-aws2-ddb/src/test/java/org/apache/camel/component/aws2/ddb/localstack/AWS2ScanRuleIT.java
 
b/components/camel-aws/camel-aws2-ddb/src/test/java/org/apache/camel/component/aws2/ddb/localstack/AWS2ScanRuleIT.java
index d8377109282..dfbe11e33f7 100644
--- 
a/components/camel-aws/camel-aws2-ddb/src/test/java/org/apache/camel/component/aws2/ddb/localstack/AWS2ScanRuleIT.java
+++ 
b/components/camel-aws/camel-aws2-ddb/src/test/java/org/apache/camel/component/aws2/ddb/localstack/AWS2ScanRuleIT.java
@@ -151,6 +151,44 @@ public class AWS2ScanRuleIT extends Aws2DDBBase {
         assertEquals(3, exchange.getIn().getHeader(Ddb2Constants.COUNT));
     }
 
+    @Test
+    public void scanWithAttributeToGetAndFilterExpression() {
+
+        putItem(notRetrieveValue, "0");
+        putItem(notRetrieveValue, "4");
+
+        putItem(retrieveValue, "1");
+        putItem(retrieveValue, "2");
+        putItem(retrieveValue, "3");
+
+        Exchange exchange = template.send("direct:start", e -> {
+            e.getIn().setHeader(Ddb2Constants.OPERATION, Ddb2Operations.Scan);
+            e.getIn().setHeader(Ddb2Constants.CONSISTENT_READ, true);
+            Map<String, Condition> keyConditions = new HashMap<>();
+            keyConditions.put(attributeName, 
Condition.builder().comparisonOperator(
+                    ComparisonOperator.EQ.toString())
+                    
.attributeValueList(AttributeValue.builder().s(retrieveValue).build())
+                    .build());
+            Collection<String> coll = new ArrayList<>();
+            coll.add("clave");
+            e.getIn().setHeader(Ddb2Constants.FILTER_EXPRESSION, "#v <> :num");
+            Map<String, AttributeValue> filterAttrValues = new HashMap<>();
+            filterAttrValues.put(":num", 
AttributeValue.builder().s("retrieve").build());
+            
e.getIn().setHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_NAMES, 
Map.of("#v", "clave"));
+            
e.getIn().setHeader(Ddb2Constants.FILTER_EXPRESSION_ATTRIBUTE_VALUES, 
filterAttrValues);
+        });
+
+        assertNotNull(exchange.getIn().getHeader(Ddb2Constants.ITEMS));
+        List<Map<String, AttributeValue>> items = 
exchange.getIn().getHeader(Ddb2Constants.ITEMS, List.class);
+        assertTrue(items.get(0).containsKey("clave"));
+        assertTrue(items.get(0).containsKey("secondary_attribute"));
+        
assertTrue(items.get(0).get("clave").equals(AttributeValue.builder().s("ignore").build()));
+        assertTrue(items.get(1).containsKey("clave"));
+        
assertTrue(items.get(1).get("clave").equals(AttributeValue.builder().s("ignore").build()));
+        assertTrue(items.get(1).containsKey("secondary_attribute"));
+        assertEquals(2, exchange.getIn().getHeader(Ddb2Constants.COUNT));
+    }
+
     private void putItem(String value1, String value2) {
         final Map<String, AttributeValue> attributeMap = new HashMap<>();
         attributeMap.put(attributeName, 
AttributeValue.builder().s(value1).build());
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 4c7c378e2db..58535e28544 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
@@ -1130,6 +1130,44 @@ public interface Ddb2EndpointBuilderFactory {
         public String awsDdbWriteCapacity() {
             return "CamelAwsDdbWriteCapacity";
         }
+        /**
+         * The Filter Expression.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: Query Scan
+         * 
+         * @return the name of the header {@code AwsDdbFilterExpression}.
+         */
+        public String awsDdbFilterExpression() {
+            return "CamelAwsDdbFilterExpression";
+        }
+        /**
+         * The Filter Expression Attribute Names.
+         * 
+         * The option is a: {@code Map<String, String>} type.
+         * 
+         * Group: Query Scan
+         * 
+         * @return the name of the header {@code
+         * AwsDdbFilterExpressionAttributeNames}.
+         */
+        public String awsDdbFilterExpressionAttributeNames() {
+            return "CamelAwsDdbFilterExpressionAttributeNames";
+        }
+        /**
+         * The Filter Expression Attribute Values.
+         * 
+         * The option is a: {@code Map<String, String>} type.
+         * 
+         * Group: Query Scan
+         * 
+         * @return the name of the header {@code
+         * AwsDdbFilterExpressionAttributeValues}.
+         */
+        public String awsDdbFilterExpressionAttributeValues() {
+            return "CamelAwsDdbFilterExpressionAttributeValues";
+        }
     }
     static Ddb2EndpointBuilder endpointBuilder(String componentName, String 
path) {
         class Ddb2EndpointBuilderImpl extends AbstractEndpointBuilder 
implements Ddb2EndpointBuilder, AdvancedDdb2EndpointBuilder {

Reply via email to