dynamodb prefix 스캔 조회방식 추가
This commit is contained in:
@@ -57,7 +57,17 @@ public abstract class BaseDynamoDBRepository<T> implements DynamoDBRepository<T>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<T> findAll(Key key) {
|
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) {
|
protected <T> T deepCopy(T source, Class<T> valueType) {
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ public class DynamoDBOperations {
|
|||||||
return table.getItem(key);
|
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);
|
DynamoDbTable<T> table = getTable(itemClass);
|
||||||
QueryConditional queryConditional = QueryConditional.keyEqualTo(key);
|
QueryConditional queryConditional = QueryConditional.keyEqualTo(key);
|
||||||
|
|
||||||
@@ -125,6 +125,59 @@ public class DynamoDBOperations {
|
|||||||
.toList();
|
.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 문자열을 객체로 변환하고 트랜잭션에 추가
|
* JSON 문자열을 객체로 변환하고 트랜잭션에 추가
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user