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());