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 5fc572cb25
commit d6fd2cf14a
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;
@@ -131,16 +132,40 @@ public class StatementFactoryUnitTests {
assertThat(select.build(ParameterHandling.INLINE).getQuery()).isEqualTo("SELECT ttl(email) FROM group");
}
@Test // DATACASS-343
@Test // #1008
public 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
public 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
public 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