From 15e207e9c489ed2d0f77b4eebff3eec8a42a71dd Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 14 Jan 2025 09:50:06 +0100 Subject: [PATCH] switch to query execution maybe? --- .../mongodb/aot/generated/MongoBlocks.java | 36 +++++++++++++------ .../repository/query/MongoQueryExecution.java | 22 ++++++------ .../test/java/example/aot/UserRepository.java | 4 ++- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/generated/MongoBlocks.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/generated/MongoBlocks.java index c34ba4c04..f1e2d38fa 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/generated/MongoBlocks.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/generated/MongoBlocks.java @@ -21,14 +21,15 @@ import java.util.List; import java.util.stream.Collectors; import org.springframework.data.mongodb.BindableMongoExpression; -import org.springframework.data.mongodb.core.ExecutableFindOperation.TerminatingFind; +import org.springframework.data.mongodb.core.ExecutableFindOperation.FindWithQuery; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.data.mongodb.repository.Hint; import org.springframework.data.mongodb.repository.ReadPreference; +import org.springframework.data.mongodb.repository.query.MongoQueryExecution.PagedExecution; +import org.springframework.data.mongodb.repository.query.MongoQueryExecution.SlicedExecution; import org.springframework.data.repository.aot.generate.AotRepositoryMethodBuilder.MethodGenerationMetadata; import org.springframework.data.repository.core.RepositoryInformation; -import org.springframework.data.support.PageableExecutionUtils; import org.springframework.javapoet.CodeBlock; import org.springframework.javapoet.CodeBlock.Builder; import org.springframework.javapoet.TypeName; @@ -71,11 +72,16 @@ public class MongoBlocks { Object actualReturnType = isProjecting ? metadata.getActualReturnType() : repositoryInformation.getDomainType(); if (isProjecting) { - builder.addStatement("$T<$T> finder = $L.query($T.class).as($T.class).matching($L)", TerminatingFind.class, - actualReturnType, mongoOpsRef, repositoryInformation.getDomainType(), actualReturnType, queryVariableName); + // builder.addStatement("$T<$T> finder = $L.query($T.class).as($T.class).matching($L)", TerminatingFind.class, + // actualReturnType, mongoOpsRef, repositoryInformation.getDomainType(), actualReturnType, queryVariableName); + builder.addStatement("$T<$T> finder = $L.query($T.class).as($T.class)", FindWithQuery.class, actualReturnType, + mongoOpsRef, repositoryInformation.getDomainType(), actualReturnType); } else { - builder.addStatement("$T<$T> finder = $L.query($T.class).matching($L)", TerminatingFind.class, actualReturnType, - mongoOpsRef, repositoryInformation.getDomainType(), queryVariableName); + // builder.addStatement("$T<$T> finder = $L.query($T.class).matching($L)", TerminatingFind.class, + // actualReturnType, + // mongoOpsRef, repositoryInformation.getDomainType(), queryVariableName); + builder.addStatement("$T<$T> finder = $L.query($T.class)", FindWithQuery.class, actualReturnType, mongoOpsRef, + repositoryInformation.getDomainType()); } String terminatingMethod = "all()"; @@ -87,14 +93,24 @@ public class MongoBlocks { } } - if (!metadata.returnsPage()) { - builder.addStatement("return finder.$L", terminatingMethod); + if (metadata.returnsPage()) { + // builder.addStatement("return finder.$L", terminatingMethod); + builder.addStatement("return new $T(finder, $L).execute($L)", PagedExecution.class, + metadata.getPageableParameterName(), queryVariableName); + } else if (metadata.returnsSlice()) { + builder.addStatement("return new $T(finder, $L).execute($L)", SlicedExecution.class, + metadata.getPageableParameterName(), queryVariableName); } else { - builder.addStatement("return $T.getPage(finder.$L, $L, () -> finder.count())", PageableExecutionUtils.class, terminatingMethod, - metadata.getPageableParameterName()); + builder.addStatement("return finder.matching($L).$L", queryVariableName, terminatingMethod); + // builder.addStatement("return $T.getPage(finder.$L, $L, () -> finder.count())", PageableExecutionUtils.class, + // terminatingMethod, + // metadata.getPageableParameterName()); } + // new MongoQueryExecution.PagedExecution(finder, page).execute(query); + return builder.build(); + } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryExecution.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryExecution.java index cebdf4e40..f1cbff588 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryExecution.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryExecution.java @@ -54,7 +54,7 @@ import com.mongodb.client.result.DeleteResult; * @author Christoph Strobl */ @FunctionalInterface -interface MongoQueryExecution { +public interface MongoQueryExecution { @Nullable Object execute(Query query); @@ -66,12 +66,12 @@ interface MongoQueryExecution { * @author Christoph Strobl * @since 1.5 */ - final class SlicedExecution implements MongoQueryExecution { + final class SlicedExecution implements MongoQueryExecution { - private final FindWithQuery find; + private final FindWithQuery find; private final Pageable pageable; - public SlicedExecution(ExecutableFindOperation.FindWithQuery find, Pageable pageable) { + public SlicedExecution(ExecutableFindOperation.FindWithQuery find, Pageable pageable) { Assert.notNull(find, "Find must not be null"); Assert.notNull(pageable, "Pageable must not be null"); @@ -82,7 +82,7 @@ interface MongoQueryExecution { @Override @SuppressWarnings({ "unchecked", "rawtypes" }) - public Object execute(Query query) { + public Slice execute(Query query) { int pageSize = pageable.getPageSize(); @@ -92,7 +92,7 @@ interface MongoQueryExecution { boolean hasNext = result.size() > pageSize; - return new SliceImpl(hasNext ? result.subList(0, pageSize) : result, pageable, hasNext); + return new SliceImpl(hasNext ? result.subList(0, pageSize) : result, pageable, hasNext); } } @@ -103,12 +103,12 @@ interface MongoQueryExecution { * @author Mark Paluch * @author Christoph Strobl */ - final class PagedExecution implements MongoQueryExecution { + final class PagedExecution implements MongoQueryExecution { - private final FindWithQuery operation; + private final FindWithQuery operation; private final Pageable pageable; - public PagedExecution(ExecutableFindOperation.FindWithQuery operation, Pageable pageable) { + public PagedExecution(ExecutableFindOperation.FindWithQuery operation, Pageable pageable) { Assert.notNull(operation, "Operation must not be null"); Assert.notNull(pageable, "Pageable must not be null"); @@ -118,11 +118,11 @@ interface MongoQueryExecution { } @Override - public Object execute(Query query) { + public Page execute(Query query) { int overallLimit = query.getLimit(); - TerminatingFind matching = operation.matching(query); + TerminatingFind matching = operation.matching(query); // Apply raw pagination query.with(pageable); diff --git a/spring-data-mongodb/src/test/java/example/aot/UserRepository.java b/spring-data-mongodb/src/test/java/example/aot/UserRepository.java index 7d13e6637..d1dc7298d 100644 --- a/spring-data-mongodb/src/test/java/example/aot/UserRepository.java +++ b/spring-data-mongodb/src/test/java/example/aot/UserRepository.java @@ -20,6 +20,7 @@ import java.util.List; import org.springframework.data.domain.Limit; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.repository.Query; import org.springframework.data.mongodb.repository.ReadPreference; @@ -45,5 +46,6 @@ public interface UserRepository extends CrudRepository { List findUserByLastnameStartingWith(String lastname, Limit limit); List findUserByLastnameStartingWith(String lastname, Sort sort, Limit limit); - Page findUserByFirstnameStartingWith(String lastname, Pageable page); + Page findUserByFirstnameStartingWith(String firstname, Pageable page); + Slice findUserByFirstnameLike(String firstname, Pageable page); }