Skip to content

Instantly share code, notes, and snippets.

@mitchwongho
Created May 8, 2021 09:48
Show Gist options
  • Save mitchwongho/e4aa3f530e3c7b834dbd9813b24987a0 to your computer and use it in GitHub Desktop.
Save mitchwongho/e4aa3f530e3c7b834dbd9813b24987a0 to your computer and use it in GitHub Desktop.
#DynamoDB #JavaSDK #AWS
private Result getPeopleByGSI(@NotNull final String indexedReference, final String... attributes) {
// make reference the index
final DynamoDbIndex<People> index = DynamoUtil.peopleTable.index("someIndexedAttribute-index");
// Apply value to the indexed attribute (as the PartitionKey)
final QueryConditional queryConditional = QueryConditional.keyEqualTo(
Key.builder().partitionValue(indexedReference).build());
// Compose Filter expressions
final List<String> expressions = new ArrayList<>();
final Expression.Builder expressionBuilder = Expression.builder();
// Build other
if (attributes[0] != null) {
expressions.add("contains(#attribute1, :attribute1)");
expressionBuilder.putExpressionName("#attribute1", "attribute1");
expressionBuilder.putExpressionValue(":attribute1", AttributeValue.builder()
.s(type.name()).build());
}
// etc...
if (attribute[n] != null) {
expressions.add("#attributeN = :attributeN");
expressionBuilder.putExpressionName("#attributeN", "attributeN");
expressionBuilder.putExpressionValue(":attributeN", AttributeValue.builder()
.s(primary).build());
}
expressionBuilder.expression(String.join(" AND ", expressions));
final QueryEnhancedRequest.Builder requestBuilder = QueryEnhancedRequest.builder()
.queryConditional(queryConditional)
.consistentRead(false); // ⚠️ ConsistentRead is _not_ supported on queries with GSIs
final QueryEnhancedRequest request;
if (expressions.isEmpty()) {
// ⚠️ Empty Filter-Expressions are not allowed!
request = requestBuilder.build();
} else {
request = requestBuilder.filterExpression(expressionBuilder.build())
.build();
}
// Run the query
final SdkIterable<Page<People>> pagesInterable = index.query(request);
// map the pages to items
// ⚠️ Pages returned my be empty
final List<People> people = pagesInterable.stream()
.map(Page::items)
.flatMap(Collection::stream)
.collect(Collectors.toList());
return Response.ok(people).build();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment