dynamodb prefix 스캔 조회방식 추가
This commit is contained in:
@@ -57,7 +57,17 @@ public abstract class BaseDynamoDBRepository<T> implements DynamoDBRepository<T>
|
||||
|
||||
@Override
|
||||
public List<T> findAll(Key key) {
|
||||
return operations.getItems(key, entityClass);
|
||||
return operations.getQueryItems(key, entityClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<T> findAllScan(String prefix) {
|
||||
return operations.getItemsScanBegins(prefix, entityClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<T> findAllScan(String prefix, String sortKey) {
|
||||
return operations.getItemsScanBegins(prefix, sortKey, entityClass);
|
||||
}
|
||||
|
||||
protected <T> T deepCopy(T source, Class<T> valueType) {
|
||||
|
||||
@@ -115,7 +115,7 @@ public class DynamoDBOperations {
|
||||
return table.getItem(key);
|
||||
}
|
||||
|
||||
public <T> List<T> getItems(Key key, Class<T> itemClass){
|
||||
public <T> List<T> getQueryItems(Key key, Class<T> itemClass){
|
||||
DynamoDbTable<T> table = getTable(itemClass);
|
||||
QueryConditional queryConditional = QueryConditional.keyEqualTo(key);
|
||||
|
||||
@@ -125,6 +125,59 @@ public class DynamoDBOperations {
|
||||
.toList();
|
||||
}
|
||||
|
||||
public <T> List<T> getItemsScanBegins(String prefix, Class<T> itemClass){
|
||||
DynamoDbTable<T> table = getTable(itemClass);
|
||||
|
||||
TableSchema<T> schema = table.tableSchema();
|
||||
String partitionKeyName = schema.tableMetadata().primaryPartitionKey();
|
||||
|
||||
Expression filterExpression = Expression.builder()
|
||||
.expression("begins_with(#pk, :prefix)")
|
||||
.putExpressionName("#pk", partitionKeyName)
|
||||
.putExpressionValue(":prefix", AttributeValue.builder().s(prefix).build())
|
||||
.build();
|
||||
|
||||
return table.scan(r -> r.filterExpression(filterExpression))
|
||||
.items()
|
||||
.stream()
|
||||
.toList();
|
||||
}
|
||||
|
||||
public <T> List<T> getItemsScanBegins(String prefix, String sortKeyPrefix, Class<T> entityClass) {
|
||||
DynamoDbTable<T> table = getTable(entityClass);
|
||||
|
||||
// 파티션 키 및 정렬 키 속성 이름 가져오기
|
||||
TableSchema<T> schema = table.tableSchema();
|
||||
String partitionKeyName = schema.tableMetadata().primaryPartitionKey();
|
||||
String sortKeyName = String.valueOf(schema.tableMetadata().primarySortKey().get());
|
||||
|
||||
// 표현식 빌더 초기화
|
||||
Expression.Builder expressionBuilder = Expression.builder();
|
||||
StringBuilder expressionString = new StringBuilder();
|
||||
|
||||
// 파티션 키 조건 추가
|
||||
expressionString.append("begins_with(#pk, :prefix)");
|
||||
expressionBuilder.putExpressionName("#pk", partitionKeyName);
|
||||
expressionBuilder.putExpressionValue(":prefix", AttributeValue.builder().s(prefix).build());
|
||||
|
||||
// 정렬 키 조건 추가 (테이블에 정렬 키가 있는 경우)
|
||||
if (sortKeyName != null && sortKeyPrefix != null && !sortKeyPrefix.isEmpty()) {
|
||||
expressionString.append(" AND begins_with(#sk, :sortPrefix)");
|
||||
expressionBuilder.putExpressionName("#sk", sortKeyName);
|
||||
expressionBuilder.putExpressionValue(":sortPrefix", AttributeValue.builder().s(sortKeyPrefix).build());
|
||||
}
|
||||
|
||||
// 필터 표현식 완성
|
||||
Expression filterExpression = expressionBuilder
|
||||
.expression(expressionString.toString())
|
||||
.build();
|
||||
|
||||
return table.scan(r -> r.filterExpression(filterExpression))
|
||||
.items()
|
||||
.stream()
|
||||
.toList();
|
||||
}
|
||||
|
||||
/**
|
||||
* JSON 문자열을 객체로 변환하고 트랜잭션에 추가
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user