Skip to content

Commit d6fd2cf

Browse files
committed
Fix ordering of sort-by properties.
We now apply sort-by properties individually on the built statement instead of collecting these into a Map first. Resolves #1008
1 parent 5fc572c commit d6fd2cf

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -641,10 +641,14 @@ private static StatementBuilder<Select> createSelectAndOrder(List<Selector> sele
641641

642642
builder.apply((statement) -> {
643643

644-
Map<String, ClusteringOrder> ordering = sort.stream().collect(Collectors.toMap(Sort.Order::getProperty,
645-
order -> order.isAscending() ? ClusteringOrder.ASC : ClusteringOrder.DESC));
644+
Select statementToUse = statement;
646645

647-
return statement.orderBy(ordering);
646+
for (Sort.Order order : sort) {
647+
statementToUse = statementToUse.orderBy(order.getProperty(),
648+
order.isAscending() ? ClusteringOrder.ASC : ClusteringOrder.DESC);
649+
}
650+
651+
return statementToUse;
648652
});
649653
}
650654

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/StatementFactoryUnitTests.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.springframework.data.cassandra.core;
1717

1818
import static org.assertj.core.api.Assertions.*;
19+
import static org.springframework.data.domain.Sort.Direction.*;
1920

2021
import java.time.Duration;
2122
import java.util.Collections;
@@ -131,16 +132,40 @@ public void shouldMapSelectQueryWithTtlColumns() {
131132
assertThat(select.build(ParameterHandling.INLINE).getQuery()).isEqualTo("SELECT ttl(email) FROM group");
132133
}
133134

134-
@Test // DATACASS-343
135+
@Test // #1008
135136
public void shouldMapSelectQueryWithSortLimitAndAllowFiltering() {
136137

137-
Query query = Query.empty().sort(Sort.by("id.hashPrefix")).limit(10).withAllowFiltering();
138+
Query query = Query.empty().sort(Sort.by(DESC, "email", "age"));
139+
140+
StatementBuilder<Select> select = statementFactory.select(query,
141+
converter.getMappingContext().getRequiredPersistentEntity(Group.class));
142+
143+
assertThat(select.build(ParameterHandling.INLINE).getQuery())
144+
.isEqualTo("SELECT * FROM group ORDER BY email DESC,age DESC");
145+
}
146+
147+
@Test // DATACASS-343
148+
public void shouldMapSelectQueryWithSortByEmbeddedLimitAndAllowFiltering() {
149+
150+
Query query = Query.empty().sort(Sort.by(DESC, "id.hashPrefix", "id.username"));
151+
152+
StatementBuilder<Select> select = statementFactory.select(query,
153+
converter.getMappingContext().getRequiredPersistentEntity(Group.class));
154+
155+
assertThat(select.build(ParameterHandling.INLINE).getQuery())
156+
.isEqualTo("SELECT * FROM group ORDER BY hash_prefix DESC,username DESC");
157+
}
158+
159+
@Test // DATACASS-343
160+
public void shouldMapSelectQueryWithLimitAndAllowFiltering() {
161+
162+
Query query = Query.empty().limit(10).withAllowFiltering();
138163

139164
StatementBuilder<Select> select = statementFactory.select(query,
140165
converter.getMappingContext().getRequiredPersistentEntity(Group.class));
141166

142167
assertThat(select.build(ParameterHandling.INLINE).getQuery())
143-
.isEqualTo("SELECT * FROM group ORDER BY hash_prefix ASC LIMIT 10 ALLOW FILTERING");
168+
.isEqualTo("SELECT * FROM group LIMIT 10 ALLOW FILTERING");
144169
}
145170

146171
@Test // DATACASS-343

0 commit comments

Comments
 (0)