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
This commit is contained in:
Mark Paluch
2021-01-29 11:32:00 +01:00
parent c98de7557a
commit 8cc4075361
2 changed files with 35 additions and 6 deletions

View File

@@ -641,10 +641,14 @@ public class StatementFactory {
builder.apply((statement) -> {
Map<String, ClusteringOrder> ordering = sort.stream().collect(Collectors.toMap(Sort.Order::getProperty,
order -> order.isAscending() ? ClusteringOrder.ASC : ClusteringOrder.DESC));
Select statementToUse = statement;
return statement.orderBy(ordering);
for (Sort.Order order : sort) {
statementToUse = statementToUse.orderBy(order.getProperty(),
order.isAscending() ? ClusteringOrder.ASC : ClusteringOrder.DESC);
}
return statementToUse;
});
}

View File

@@ -16,6 +16,7 @@
package org.springframework.data.cassandra.core;
import static org.assertj.core.api.Assertions.*;
import static org.springframework.data.domain.Sort.Direction.*;
import java.time.Duration;
import java.util.Collections;
@@ -133,16 +134,40 @@ class StatementFactoryUnitTests {
assertThat(select.build(ParameterHandling.INLINE).getQuery()).isEqualTo("SELECT ttl(email) FROM group");
}
@Test // DATACASS-343
@Test // #1008
void shouldMapSelectQueryWithSortLimitAndAllowFiltering() {
Query query = Query.empty().sort(Sort.by("id.hashPrefix")).limit(10).withAllowFiltering();
Query query = Query.empty().sort(Sort.by(DESC, "email", "age"));
StatementBuilder<Select> select = statementFactory.select(query,
converter.getMappingContext().getRequiredPersistentEntity(Group.class));
assertThat(select.build(ParameterHandling.INLINE).getQuery())
.isEqualTo("SELECT * FROM group ORDER BY hash_prefix ASC LIMIT 10 ALLOW FILTERING");
.isEqualTo("SELECT * FROM group ORDER BY email DESC,age DESC");
}
@Test // DATACASS-343
void shouldMapSelectQueryWithSortByEmbeddedLimitAndAllowFiltering() {
Query query = Query.empty().sort(Sort.by(DESC, "id.hashPrefix", "id.username"));
StatementBuilder<Select> select = statementFactory.select(query,
converter.getMappingContext().getRequiredPersistentEntity(Group.class));
assertThat(select.build(ParameterHandling.INLINE).getQuery())
.isEqualTo("SELECT * FROM group ORDER BY hash_prefix DESC,username DESC");
}
@Test // DATACASS-343
void shouldMapSelectQueryWithLimitAndAllowFiltering() {
Query query = Query.empty().limit(10).withAllowFiltering();
StatementBuilder<Select> select = statementFactory.select(query,
converter.getMappingContext().getRequiredPersistentEntity(Group.class));
assertThat(select.build(ParameterHandling.INLINE).getQuery())
.isEqualTo("SELECT * FROM group LIMIT 10 ALLOW FILTERING");
}
@Test // DATACASS-343