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

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


The following commit(s) were added to refs/heads/camel-4.8.x by this push:
     new 42c97716dd2 CAMEL-22029 - aws dynamodb scan and query not implemented 
with attributes-to-get (#17932)
42c97716dd2 is described below

commit 42c97716dd268f8921f9fa6f1befa318a9441fcf
Author: Andrea Cosentino <[email protected]>
AuthorDate: Wed Apr 30 14:37:12 2025 +0200

    CAMEL-22029 - aws dynamodb scan and query not implemented with 
attributes-to-get (#17932)
    
    Signed-off-by: Andrea Cosentino <[email protected]>
---
 .../camel/component/aws2/ddb/QueryCommand.java     |  7 ++++
 .../camel/component/aws2/ddb/ScanCommand.java      |  7 ++++
 .../aws2/ddb/localstack/AWS2QueryRuleIT.java       | 37 +++++++++++++++++++--
 .../aws2/ddb/localstack/AWS2ScanRuleIT.java        | 38 ++++++++++++++++++++--
 4 files changed, 85 insertions(+), 4 deletions(-)

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 0c0e415f2c9..288b30e2d9b 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
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.aws2.ddb;
 
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -43,6 +44,12 @@ public class QueryCommand extends AbstractDdbCommand {
             
query.indexName(exchange.getIn().getHeader(Ddb2Constants.INDEX_NAME, 
String.class));
         }
 
+        //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());
+        }
+
         QueryResponse result = ddbClient.query(query.build());
 
         Map<Object, Object> tmp = new HashMap<>();
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 406300e83d4..61411a18de0 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,6 +16,7 @@
  */
 package org.apache.camel.component.aws2.ddb;
 
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -35,6 +36,7 @@ public class ScanCommand extends AbstractDdbCommand {
     public void execute() {
         ScanResponse result = 
ddbClient.scan(ScanRequest.builder().tableName(determineTableName()).limit(determineLimit())
                 .exclusiveStartKey(determineExclusiveStartKey())
+                .attributesToGet(determineAttributesToGet())
                 .scanFilter(determineScanFilter()).build());
 
         Map<Object, Object> tmp = new HashMap<>();
@@ -50,4 +52,9 @@ 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);
+    }
 }
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 770da6d50d1..c9cde61bde8 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
@@ -16,8 +16,7 @@
  */
 package org.apache.camel.component.aws2.ddb.localstack;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 import org.apache.camel.EndpointInject;
 import org.apache.camel.Exchange;
@@ -116,6 +115,40 @@ public class AWS2QueryRuleIT extends Aws2DDBBase {
         assertEquals(3, exchange.getIn().getHeader(Ddb2Constants.COUNT));
     }
 
+    @Test
+    public void queryItemsWithAttributesToGet() {
+
+        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.Query);
+            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());
+            e.getIn().setHeader(Ddb2Constants.KEY_CONDITIONS, keyConditions);
+            Collection<String> coll = new ArrayList<>();
+            coll.add("clave");
+            e.getIn().setHeader(Ddb2Constants.ATTRIBUTE_NAMES, coll);
+        });
+
+        assertNotNull(exchange.getIn().getHeader(Ddb2Constants.ITEMS));
+        List<Map<String, AttributeValue>> items = 
exchange.getIn().getHeader(Ddb2Constants.ITEMS, List.class);
+        assertTrue(items.get(0).containsKey("clave"));
+        assertFalse(items.get(0).containsKey("secondary_attribute"));
+        assertTrue(items.get(1).containsKey("clave"));
+        assertFalse(items.get(1).containsKey("secondary_attribute"));
+        assertTrue(items.get(2).containsKey("clave"));
+        assertFalse(items.get(2).containsKey("secondary_attribute"));
+        assertEquals(3, 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 8268eaa7afe..d8377109282 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
@@ -16,8 +16,7 @@
  */
 package org.apache.camel.component.aws2.ddb.localstack;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 import org.apache.camel.EndpointInject;
 import org.apache.camel.Exchange;
@@ -117,6 +116,41 @@ public class AWS2ScanRuleIT extends Aws2DDBBase {
         assertEquals(3, exchange.getIn().getHeader(Ddb2Constants.COUNT));
     }
 
+    @Test
+    public void scanWithAttributeToGet() {
+
+        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.SCAN_FILTER, keyConditions);
+            e.getIn().setHeader(Ddb2Constants.ATTRIBUTE_NAMES, coll);
+        });
+
+        assertNotNull(exchange.getIn().getHeader(Ddb2Constants.ITEMS));
+        List<Map<String, AttributeValue>> items = 
exchange.getIn().getHeader(Ddb2Constants.ITEMS, List.class);
+        assertTrue(items.get(0).containsKey("clave"));
+        assertFalse(items.get(0).containsKey("secondary_attribute"));
+        assertTrue(items.get(1).containsKey("clave"));
+        assertFalse(items.get(1).containsKey("secondary_attribute"));
+        assertTrue(items.get(2).containsKey("clave"));
+        assertFalse(items.get(2).containsKey("secondary_attribute"));
+        assertEquals(3, 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());

Reply via email to