Skip to content

Commit 8c3e139

Browse files
committed
Handle new Sort.unsorted() sorting strategy
Spring-Data no longer passes in `null` if no sorting order is given by the caller but uses `Sort.unsorted()` which incorrectly causes an Exception. This should also solve #99
1 parent c71a89b commit 8c3e139

File tree

3 files changed

+66
-66
lines changed

3 files changed

+66
-66
lines changed

src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/AbstractDynamoDBQueryCriteria.java

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,15 @@
1515
*/
1616
package org.socialsignin.spring.data.dynamodb.repository.query;
1717

18-
import java.io.Serializable;
19-
import java.time.Instant;
20-
import java.util.ArrayList;
21-
import java.util.Arrays;
22-
import java.util.Collection;
23-
import java.util.Date;
24-
import java.util.HashMap;
25-
import java.util.HashSet;
26-
import java.util.List;
27-
import java.util.Map;
28-
import java.util.Map.Entry;
29-
18+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperFieldModel;
19+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel;
20+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMarshaller;
21+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression;
22+
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
23+
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator;
24+
import com.amazonaws.services.dynamodbv2.model.Condition;
25+
import com.amazonaws.services.dynamodbv2.model.QueryRequest;
26+
import com.amazonaws.services.dynamodbv2.model.Select;
3027
import org.socialsignin.spring.data.dynamodb.core.DynamoDBOperations;
3128
import org.socialsignin.spring.data.dynamodb.marshaller.Date2IsoDynamoDBMarshaller;
3229
import org.socialsignin.spring.data.dynamodb.marshaller.Instant2IsoDynamoDBMarshaller;
@@ -40,20 +37,21 @@
4037
import org.springframework.util.LinkedMultiValueMap;
4138
import org.springframework.util.MultiValueMap;
4239

43-
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperFieldModel;
44-
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel;
45-
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMarshaller;
46-
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression;
47-
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
48-
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator;
49-
import com.amazonaws.services.dynamodbv2.model.Condition;
50-
import com.amazonaws.services.dynamodbv2.model.QueryRequest;
51-
import com.amazonaws.services.dynamodbv2.model.Select;
40+
import java.time.Instant;
41+
import java.util.ArrayList;
42+
import java.util.Arrays;
43+
import java.util.Collection;
44+
import java.util.Date;
45+
import java.util.HashMap;
46+
import java.util.HashSet;
47+
import java.util.List;
48+
import java.util.Map;
49+
import java.util.Map.Entry;
5250

5351
/**
5452
* @author Michael Lavelle
5553
*/
56-
public abstract class AbstractDynamoDBQueryCriteria<T, ID extends Serializable> implements DynamoDBQueryCriteria<T, ID> {
54+
public abstract class AbstractDynamoDBQueryCriteria<T, ID> implements DynamoDBQueryCriteria<T, ID> {
5755

5856
protected Class<T> clazz;
5957
private DynamoDBEntityInformation<T, ID> entityInformation;
@@ -71,6 +69,15 @@ public abstract class AbstractDynamoDBQueryCriteria<T, ID extends Serializable>
7169

7270
public abstract boolean isApplicableForLoad();
7371

72+
/**
73+
* @throws UnsupportedOperationException if a {@link #sort} is initalized (non-null && not {@link Sort#unsorted()}
74+
*/
75+
protected void ensureNoSort() throws UnsupportedOperationException {
76+
if (sort != null && sort != Sort.unsorted()) {
77+
throw new UnsupportedOperationException("Sort not supported for scan expressions");
78+
}
79+
}
80+
7481
protected QueryRequest buildQueryRequest(String tableName, String theIndexName, String hashKeyAttributeName,
7582
String rangeKeyAttributeName, String rangeKeyPropertyName, List<Condition> hashKeyConditions,
7683
List<Condition> rangeKeyConditions) {
@@ -656,7 +663,7 @@ protected Condition createCollectionCondition(String propertyName, ComparisonOpe
656663

657664
Assert.notNull(o, "Creating conditions on null property values not supported: please specify a value for '"
658665
+ propertyName + "'");
659-
List<AttributeValue> attributeValueList = new ArrayList<AttributeValue>();
666+
List<AttributeValue> attributeValueList = new ArrayList<>();
660667
boolean marshalled = false;
661668
for (Object object : o) {
662669
Object attributeValue = getPropertyAttributeValue(propertyName, object);

src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBEntityWithHashAndRangeKeyCriteria.java

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,12 @@
1515
*/
1616
package org.socialsignin.spring.data.dynamodb.repository.query;
1717

18-
import java.io.Serializable;
19-
import java.util.ArrayList;
20-
import java.util.Arrays;
21-
import java.util.HashMap;
22-
import java.util.HashSet;
23-
import java.util.List;
24-
import java.util.Map;
25-
import java.util.Map.Entry;
26-
import java.util.Set;
27-
18+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel;
19+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression;
20+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBScanExpression;
21+
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator;
22+
import com.amazonaws.services.dynamodbv2.model.Condition;
23+
import com.amazonaws.services.dynamodbv2.model.QueryRequest;
2824
import org.socialsignin.spring.data.dynamodb.core.DynamoDBOperations;
2925
import org.socialsignin.spring.data.dynamodb.query.CountByHashAndRangeKeyQuery;
3026
import org.socialsignin.spring.data.dynamodb.query.MultipleEntityQueryExpressionQuery;
@@ -38,17 +34,19 @@
3834
import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBIdIsHashAndRangeKeyEntityInformation;
3935
import org.springframework.util.Assert;
4036

41-
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel;
42-
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression;
43-
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBScanExpression;
44-
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator;
45-
import com.amazonaws.services.dynamodbv2.model.Condition;
46-
import com.amazonaws.services.dynamodbv2.model.QueryRequest;
37+
import java.util.ArrayList;
38+
import java.util.Arrays;
39+
import java.util.HashMap;
40+
import java.util.HashSet;
41+
import java.util.List;
42+
import java.util.Map;
43+
import java.util.Map.Entry;
44+
import java.util.Set;
4745

4846
/**
4947
* @author Michael Lavelle
5048
*/
51-
public class DynamoDBEntityWithHashAndRangeKeyCriteria<T, ID extends Serializable> extends AbstractDynamoDBQueryCriteria<T, ID> {
49+
public class DynamoDBEntityWithHashAndRangeKeyCriteria<T, ID> extends AbstractDynamoDBQueryCriteria<T, ID> {
5250

5351
private Object rangeKeyAttributeValue;
5452
private Object rangeKeyPropertyValue;
@@ -75,14 +73,14 @@ public DynamoDBEntityWithHashAndRangeKeyCriteria(
7573
this.rangeKeyPropertyName = entityInformation.getRangeKeyPropertyName();
7674
this.indexRangeKeyPropertyNames = entityInformation.getIndexRangeKeyPropertyNames();
7775
if (indexRangeKeyPropertyNames == null) {
78-
indexRangeKeyPropertyNames = new HashSet<String>();
76+
indexRangeKeyPropertyNames = new HashSet<>();
7977
}
8078
this.entityInformation = entityInformation;
8179

8280
}
8381

8482
public Set<String> getIndexRangeKeyAttributeNames() {
85-
Set<String> indexRangeKeyAttributeNames = new HashSet<String>();
83+
Set<String> indexRangeKeyAttributeNames = new HashSet<>();
8684
for (String indexRangeKeyPropertyName : indexRangeKeyPropertyNames) {
8785
indexRangeKeyAttributeNames.add(getAttributeName(indexRangeKeyPropertyName));
8886
}
@@ -102,12 +100,12 @@ protected boolean isRangeKeySpecified() {
102100
}
103101

104102
protected Query<T> buildSingleEntityLoadQuery(DynamoDBOperations dynamoDBOperations) {
105-
return new SingleEntityLoadByHashAndRangeKeyQuery<T>(dynamoDBOperations, entityInformation.getJavaType(),
103+
return new SingleEntityLoadByHashAndRangeKeyQuery<>(dynamoDBOperations, entityInformation.getJavaType(),
106104
getHashKeyPropertyValue(), getRangeKeyPropertyValue());
107105
}
108106

109107
protected Query<Long> buildSingleEntityCountQuery(DynamoDBOperations dynamoDBOperations) {
110-
return new CountByHashAndRangeKeyQuery<T>(dynamoDBOperations, entityInformation.getJavaType(),
108+
return new CountByHashAndRangeKeyQuery<>(dynamoDBOperations, entityInformation.getJavaType(),
111109
getHashKeyPropertyValue(), getRangeKeyPropertyValue());
112110
}
113111

@@ -146,7 +144,7 @@ public DynamoDBQueryExpression<T> buildQueryExpression() {
146144
if (isHashKeySpecified()) {
147145
T hashKeyPrototype = entityInformation.getHashKeyPropotypeEntityForHashKey(getHashKeyPropertyValue());
148146
queryExpression.withHashKeyValues(hashKeyPrototype);
149-
queryExpression.withRangeKeyConditions(new HashMap<String, Condition>());
147+
queryExpression.withRangeKeyConditions(new HashMap<>());
150148
}
151149

152150
if (isRangeKeySpecified() && !isApplicableForGlobalSecondaryIndex()) {
@@ -160,7 +158,7 @@ public DynamoDBQueryExpression<T> buildQueryExpression() {
160158

161159
Entry<String, List<Condition>> singlePropertyConditions = propertyConditions.entrySet().iterator().next();
162160

163-
List<String> allowedSortProperties = new ArrayList<String>();
161+
List<String> allowedSortProperties = new ArrayList<>();
164162
for (Entry<String, List<Condition>> singlePropertyCondition : propertyConditions.entrySet()) {
165163
if (entityInformation.getGlobalSecondaryIndexNamesByPropertyName().keySet()
166164
.contains(singlePropertyCondition.getKey())) {
@@ -332,9 +330,8 @@ public boolean isApplicableForQuery() {
332330

333331
public DynamoDBScanExpression buildScanExpression() {
334332

335-
if (sort != null) {
336-
throw new UnsupportedOperationException("Sort not supported for scan expressions");
337-
}
333+
ensureNoSort();
334+
338335
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
339336
if (isHashKeySpecified()) {
340337
scanExpression.addFilterCondition(

src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBEntityWithHashKeyOnlyCriteria.java

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@
1515
*/
1616
package org.socialsignin.spring.data.dynamodb.repository.query;
1717

18-
import java.io.Serializable;
19-
import java.util.List;
20-
import java.util.Map;
21-
18+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel;
19+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBScanExpression;
20+
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator;
21+
import com.amazonaws.services.dynamodbv2.model.Condition;
22+
import com.amazonaws.services.dynamodbv2.model.QueryRequest;
2223
import org.socialsignin.spring.data.dynamodb.core.DynamoDBOperations;
2324
import org.socialsignin.spring.data.dynamodb.query.CountByHashKeyQuery;
2425
import org.socialsignin.spring.data.dynamodb.query.MultipleEntityQueryRequestQuery;
@@ -29,16 +30,13 @@
2930
import org.socialsignin.spring.data.dynamodb.query.SingleEntityLoadByHashKeyQuery;
3031
import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityInformation;
3132

32-
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel;
33-
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBScanExpression;
34-
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator;
35-
import com.amazonaws.services.dynamodbv2.model.Condition;
36-
import com.amazonaws.services.dynamodbv2.model.QueryRequest;
33+
import java.util.List;
34+
import java.util.Map;
3735

3836
/**
3937
* @author Michael Lavelle
4038
*/
41-
public class DynamoDBEntityWithHashKeyOnlyCriteria<T, ID extends Serializable> extends AbstractDynamoDBQueryCriteria<T, ID> {
39+
public class DynamoDBEntityWithHashKeyOnlyCriteria<T, ID> extends AbstractDynamoDBQueryCriteria<T, ID> {
4240

4341
private DynamoDBEntityInformation<T, ID> entityInformation;
4442

@@ -61,9 +59,9 @@ protected Query<T> buildFinderQuery(DynamoDBOperations dynamoDBOperations) {
6159
List<Condition> hashKeyConditions = getHashKeyConditions();
6260
QueryRequest queryRequest = buildQueryRequest(dynamoDBOperations.getOverriddenTableName(clazz, entityInformation.getDynamoDBTableName()),
6361
getGlobalSecondaryIndexName(), getHashKeyAttributeName(), null, null, hashKeyConditions, null);
64-
return new MultipleEntityQueryRequestQuery<T>(dynamoDBOperations,entityInformation.getJavaType(), queryRequest);
62+
return new MultipleEntityQueryRequestQuery<>(dynamoDBOperations,entityInformation.getJavaType(), queryRequest);
6563
} else {
66-
return new MultipleEntityScanExpressionQuery<T>(dynamoDBOperations, clazz, buildScanExpression());
64+
return new MultipleEntityScanExpressionQuery<>(dynamoDBOperations, clazz, buildScanExpression());
6765
}
6866
}
6967

@@ -73,10 +71,10 @@ protected Query<Long> buildFinderCountQuery(DynamoDBOperations dynamoDBOperation
7371
List<Condition> hashKeyConditions = getHashKeyConditions();
7472
QueryRequest queryRequest = buildQueryRequest(dynamoDBOperations.getOverriddenTableName(clazz, entityInformation.getDynamoDBTableName()),
7573
getGlobalSecondaryIndexName(), getHashKeyAttributeName(), null, null, hashKeyConditions, null);
76-
return new QueryRequestCountQuery<T>(dynamoDBOperations, entityInformation.getJavaType(), queryRequest);
74+
return new QueryRequestCountQuery<>(dynamoDBOperations, entityInformation.getJavaType(), queryRequest);
7775

7876
} else {
79-
return new ScanExpressionCountQuery<T>(dynamoDBOperations, clazz, buildScanExpression(),pageQuery);
77+
return new ScanExpressionCountQuery<>(dynamoDBOperations, clazz, buildScanExpression(),pageQuery);
8078
}
8179
}
8280

@@ -92,9 +90,7 @@ public boolean isApplicableForLoad() {
9290

9391
public DynamoDBScanExpression buildScanExpression() {
9492

95-
if (sort != null) {
96-
throw new UnsupportedOperationException("Sort not supported for scan expressions");
97-
}
93+
ensureNoSort();
9894

9995
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
10096
if (isHashKeySpecified()) {

0 commit comments

Comments
 (0)