Browse Source

regorganize stuff

labs/generated-repositories
Christoph Strobl 11 months ago
parent
commit
0aa54f2b9b
No known key found for this signature in database
GPG Key ID: E6054036D0C37A4B
  1. 22
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/generated/MongoBlocks.java
  2. 37
      spring-data-mongodb/src/test/java/example/aot/UserRepository.java
  3. 73
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/aot/generated/MongoRepositoryContributorTests.java

22
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/generated/MongoBlocks.java

@ -75,14 +75,9 @@ public class MongoBlocks {
builder.add("\n"); builder.add("\n");
if (isProjecting) { 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)", FindWithQuery.class, actualReturnType, builder.addStatement("$T<$T> finder = $L.query($T.class).as($T.class)", FindWithQuery.class, actualReturnType,
mongoOpsRef, context.getRepositoryInformation().getDomainType(), actualReturnType); mongoOpsRef, context.getRepositoryInformation().getDomainType(), actualReturnType);
} else { } 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)", FindWithQuery.class, actualReturnType, mongoOpsRef, builder.addStatement("$T<$T> finder = $L.query($T.class)", FindWithQuery.class, actualReturnType, mongoOpsRef,
context.getRepositoryInformation().getDomainType()); context.getRepositoryInformation().getDomainType());
} }
@ -110,13 +105,8 @@ public class MongoBlocks {
context.getPageableParameterName(), queryVariableName); context.getPageableParameterName(), queryVariableName);
} else { } else {
builder.addStatement("return finder.matching($L).$L", queryVariableName, terminatingMethod); 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(); return builder.build();
} }
@ -129,8 +119,6 @@ public class MongoBlocks {
StringQuery source; StringQuery source;
List<String> arguments; List<String> arguments;
// MongoParameters argumentSource;
public QueryBlockBuilder(AotRepositoryMethodGenerationContext context) { public QueryBlockBuilder(AotRepositoryMethodGenerationContext context) {
this.context = context; this.context = context;
this.arguments = Arrays.stream(context.getMethod().getParameters()).map(Parameter::getName) this.arguments = Arrays.stream(context.getMethod().getParameters()).map(Parameter::getName)
@ -151,8 +139,6 @@ public class MongoBlocks {
CodeBlock.Builder builder = CodeBlock.builder(); CodeBlock.Builder builder = CodeBlock.builder();
builder.add("\n"); builder.add("\n");
// String queryStringName = "%sString".formatted(queryVariableName);
// builder.addStatement("String $L = $S", queryStringName, queryString);
String queryDocumentVariableName = "%sDocument".formatted(queryVariableName); String queryDocumentVariableName = "%sDocument".formatted(queryVariableName);
builder.add(renderExpressionToDocument(source.getQueryString(), queryVariableName)); builder.add(renderExpressionToDocument(source.getQueryString(), queryVariableName));
builder.addStatement("$T $L = new $T($L)", BasicQuery.class, queryVariableName, BasicQuery.class, builder.addStatement("$T $L = new $T($L)", BasicQuery.class, queryVariableName, BasicQuery.class,
@ -181,7 +167,7 @@ public class MongoBlocks {
} }
String pageableParameter = context.getPageableParameterName(); String pageableParameter = context.getPageableParameterName();
if (StringUtils.hasText(pageableParameter) && (!context.returnsPage() || !context.returnsSlice())) { if (StringUtils.hasText(pageableParameter) && !context.returnsPage() && !context.returnsSlice()) {
builder.addStatement("$L.with($L)", queryVariableName, pageableParameter); builder.addStatement("$L.with($L)", queryVariableName, pageableParameter);
} }
@ -206,10 +192,8 @@ public class MongoBlocks {
Builder builder = CodeBlock.builder(); Builder builder = CodeBlock.builder();
if (!StringUtils.hasText(source)) { if (!StringUtils.hasText(source)) {
builder.addStatement("$T $L = new $T()", Document.class, "%sDocument".formatted(variableName), builder.addStatement("$T $L = new $T()", Document.class, "%sDocument".formatted(variableName), Document.class);
Document.class); } else if (!containsPlaceholder(source)) {
}
else if (!containsPlaceholder(source)) {
builder.addStatement("$T $L = $T.parse($S)", Document.class, "%sDocument".formatted(variableName), builder.addStatement("$T $L = $T.parse($S)", Document.class, "%sDocument".formatted(variableName),
Document.class, source); Document.class, source);
} else { } else {

37
spring-data-mongodb/src/test/java/example/aot/UserRepository.java

@ -33,6 +33,8 @@ import org.springframework.data.repository.CrudRepository;
*/ */
public interface UserRepository extends CrudRepository<User, String> { public interface UserRepository extends CrudRepository<User, String> {
/* Derived Queries */
List<User> findUserNoArgumentsBy(); List<User> findUserNoArgumentsBy();
User findOneByUsername(String username); User findOneByUsername(String username);
@ -61,6 +63,18 @@ public interface UserRepository extends CrudRepository<User, String> {
Slice<User> findSliceOfUserByLastnameStartingWith(String lastname, Pageable page); Slice<User> findSliceOfUserByLastnameStartingWith(String lastname, Pageable page);
// TODO: Streaming
// TODO: Scrolling
// TODO: GeoQueries
/* Annotated Queries */
@Query("{ 'username' : ?0 }")
User findAnnotatedQueryByUsername(String username);
@Query(value = "{ 'lastname' : { '$regex' : '^?0' } }", count = true)
Long countAnnotatedQueryByLastname(String lastname);
@Query("{ 'lastname' : { '$regex' : '^?0' } }") @Query("{ 'lastname' : { '$regex' : '^?0' } }")
List<User> findAnnotatedQueryByLastname(String lastname); List<User> findAnnotatedQueryByLastname(String lastname);
@ -90,22 +104,27 @@ public interface UserRepository extends CrudRepository<User, String> {
@Query("{ 'lastname' : { '$regex' : '^?0' } }") @Query("{ 'lastname' : { '$regex' : '^?0' } }")
Slice<User> findAnnotatedQuerySliceOfUsersByLastname(String lastname, Pageable pageable); Slice<User> findAnnotatedQuerySliceOfUsersByLastname(String lastname, Pageable pageable);
// TODO: deletes
// TODO: updates
// TODO: Aggregations
/* Derived With Annotated Options */
@Query(sort = "{ 'username' : 1 }") @Query(sort = "{ 'username' : 1 }")
List<User> findWithAnnotatedSortByLastnameStartingWith(String lastname); List<User> findWithAnnotatedSortByLastnameStartingWith(String lastname);
@ReadPreference("secondary") @Query(fields = "{ 'username' : 1 }")
User findWithReadPreferenceByUsername(String username); List<User> findWithAnnotatedFieldsProjectionByLastnameStartingWith(String lastname);
Page<UserProjection> findUserProjectionBy(Pageable pageable); @ReadPreference("no-such-read-preference")
User findWithReadPreferenceByUsername(String username);
@Query(sort = "{ 'last_name' : -1}") // TODO: hints
List<User> findByLastnameAfter(String lastname);
@Query(fields = "{ '_id' : -1}") /* Projecting Queries */
List<User> findByLastnameBefore(String lastname);
List<User> findByLastnameOrderByFirstnameDesc(String lastname); List<UserProjection> findUserProjectionByLastnameStartingWith(String lastname);
List<User> findUserByLastnameLike(String lastname); Page<UserProjection> findUserProjectionByLastnameStartingWith(String lastname, Pageable page);
} }

73
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/aot/generated/MongoRepositoryContributorTests.java

@ -32,8 +32,10 @@
package org.springframework.data.mongodb.aot.generated; package org.springframework.data.mongodb.aot.generated;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import example.aot.User; import example.aot.User;
import example.aot.UserProjection;
import example.aot.UserRepository; import example.aot.UserRepository;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -66,6 +68,7 @@ import org.springframework.data.mongodb.test.util.MongoTestTemplate;
import org.springframework.data.mongodb.test.util.MongoTestUtils; import org.springframework.data.mongodb.test.util.MongoTestUtils;
import org.springframework.data.util.Lazy; import org.springframework.data.util.Lazy;
import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.util.StringUtils;
import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClient;
@ -273,7 +276,27 @@ public class MongoRepositoryContributorTests {
} }
@Test @Test
void testAnnotatedFinderWithQuery() { void testAnnotatedFinderReturningSingleValueWithQuery() {
generated.verify(methodInvoker -> {
User user = methodInvoker.invoke("findAnnotatedQueryByUsername", "yoda").onBean("aotUserRepository");
assertThat(user).isNotNull().extracting(User::getUsername).isEqualTo("yoda");
});
}
@Test
void testAnnotatedCount() {
generated.verify(methodInvoker -> {
Long value = methodInvoker.invoke("countAnnotatedQueryByLastname", "Skywalker").onBean("aotUserRepository");
assertThat(value).isEqualTo(2L);
});
}
@Test
void testAnnotatedFinderReturningListWithQuery() {
generated.verify(methodInvoker -> { generated.verify(methodInvoker -> {
@ -376,9 +399,53 @@ public class MongoRepositoryContributorTests {
}); });
} }
// findAnnotatedQueryPageOfUsersByLastname @Test
void testDerivedFinderWithAnnotatedFieldsProjection() {
generated.verify(methodInvoker -> {
List<User> users = methodInvoker.invoke("findWithAnnotatedFieldsProjectionByLastnameStartingWith", "S")
.onBean("aotUserRepository");
assertThat(users).allMatch(
user -> StringUtils.hasText(user.getUsername()) && user.getLastname() == null && user.getFirstname() == null);
});
}
// countUsersByLastname @Test
void testReadPreferenceAppliedToQuery() {
generated.verify(methodInvoker -> {
// check if it fails when trying to parse the read preference to indicate it would get applied
assertThatExceptionOfType(IllegalArgumentException.class)
.isThrownBy(() -> methodInvoker.invoke("findWithReadPreferenceByUsername", "S").onBean("aotUserRepository"))
.withMessageContaining("No match for read preference");
});
}
@Test
void testDerivedFinderReturningListOfProjections() {
generated.verify(methodInvoker -> {
List<UserProjection> users = methodInvoker.invoke("findUserProjectionByLastnameStartingWith", "S")
.onBean("aotUserRepository");
assertThat(users).extracting(UserProjection::getUsername).containsExactlyInAnyOrder("han", "kylo", "luke",
"vader");
});
}
@Test
void testDerivedFinderReturningPageOfProjections() {
generated.verify(methodInvoker -> {
Page<UserProjection> users = methodInvoker
.invoke("findUserProjectionByLastnameStartingWith", "S", PageRequest.of(0, 2, Sort.by("username")))
.onBean("aotUserRepository");
assertThat(users).extracting(UserProjection::getUsername).containsExactly("han", "kylo");
});
}
private static void initUsers() { private static void initUsers() {

Loading…
Cancel
Save