From d6fd2cf14ae71d8772fc300904e07dc98482b381 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Fri, 29 Jan 2021 11:32:00 +0100 Subject: [PATCH] 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 --- .../data/cassandra/core/StatementFactory.java | 10 ++++-- .../core/StatementFactoryUnitTests.java | 31 +++++++++++++++++-- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java index ef2557d59..e55ec2b2e 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java @@ -641,10 +641,14 @@ public class StatementFactory { builder.apply((statement) -> { - Map 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; }); } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/StatementFactoryUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/StatementFactoryUnitTests.java index 401be0608..ddc7623bf 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/StatementFactoryUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/StatementFactoryUnitTests.java @@ -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 = 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