Skip to content

Commit 8cc4075

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 c98de75 commit 8cc4075

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;
@@ -133,16 +134,40 @@ void shouldMapSelectQueryWithTtlColumns() {
133134
assertThat(select.build(ParameterHandling.INLINE).getQuery()).isEqualTo("SELECT ttl(email) FROM group");
134135
}
135136

136-
@Test // DATACASS-343
137+
@Test // #1008
137138
void shouldMapSelectQueryWithSortLimitAndAllowFiltering() {
138139

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

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

144169
assertThat(select.build(ParameterHandling.INLINE).getQuery())
145-
.isEqualTo("SELECT * FROM group ORDER BY hash_prefix ASC LIMIT 10 ALLOW FILTERING");
170+
.isEqualTo("SELECT * FROM group LIMIT 10 ALLOW FILTERING");
146171
}
147172

148173
@Test // DATACASS-343

0 commit comments

Comments
 (0)