Skip to content

Commit 3c93b73

Browse files
Support Streamable return type in AOT repositories.
1 parent eb913f5 commit 3c93b73

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/aot/CassandraCodeBlocks.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.springframework.data.javapoet.TypeNames;
4343
import org.springframework.data.repository.aot.generate.AotQueryMethodGenerationContext;
4444
import org.springframework.data.repository.aot.generate.MethodReturn;
45+
import org.springframework.data.util.Streamable;
4546
import org.springframework.javapoet.CodeBlock;
4647
import org.springframework.javapoet.CodeBlock.Builder;
4748
import org.springframework.javapoet.TypeName;
@@ -706,16 +707,22 @@ CodeBlock build() {
706707
conversionMethod = "convertOne";
707708
}
708709

710+
CodeBlock result = CodeBlock.of("$L($L, $T.class)", conversionMethod, execution.build(), actualReturnType);
711+
if (queryMethod.getReturnType().getType().equals(Streamable.class)) {
712+
result = CodeBlock.of("$T.of($L)", Streamable.class, result);
713+
}
714+
709715
builder.addStatement(returnBuilder //
710-
.optional("($T) $L($L, $T.class)", methodReturn.getTypeName(), conversionMethod, execution.build(),
711-
actualReturnType) //
716+
.optional("($T) $L", methodReturn.getTypeName(), result) //
712717
.build());
713718
} else {
714719

715720
CodeBlock executionBlock = execution.build();
716721

717722
if (query.isCount()) {
718723
returnBuilder.whenPrimitiveOrBoxed(Integer.class, "(int) $L", executionBlock);
724+
} else if (queryMethod.getReturnType().getType().equals(Streamable.class)) {
725+
executionBlock = CodeBlock.of("$T.of($L)", Streamable.class, executionBlock);
719726
}
720727

721728
builder.addStatement(returnBuilder.optional(executionBlock) //

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/aot/CassandraRepositoryContributorIntegrationTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import org.springframework.data.domain.Sort;
5252
import org.springframework.data.domain.Vector;
5353
import org.springframework.data.domain.Window;
54+
import org.springframework.data.util.Streamable;
5455
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
5556

5657
import com.datastax.oss.driver.api.core.CqlIdentifier;
@@ -196,6 +197,15 @@ void shouldApplySorting() {
196197
.containsSequence("Flynn (Walter Jr.)", "Skyler", "Walter");
197198
}
198199

200+
@Test // GH-1620
201+
void shouldConvertResultToStreamable() {
202+
203+
assertThat(fragment.streamByLastname("White", Sort.by("firstname")))
204+
.isInstanceOf(Streamable.class) //
205+
.extracting(Person::getFirstname) //
206+
.containsSequence("Flynn (Walter Jr.)", "Skyler", "Walter");
207+
}
208+
199209
@Test // GH-1566
200210
void shouldFindByFirstnameContains() {
201211

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/aot/PersonRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141

4242
import com.datastax.oss.driver.api.core.DefaultConsistencyLevel;
4343
import com.datastax.oss.driver.api.core.cql.ResultSet;
44+
import org.springframework.data.util.Streamable;
4445

4546
/**
4647
* AOT repository interface for {@link Person} entities.
@@ -63,6 +64,8 @@ public interface PersonRepository extends CrudRepository<Person, String> {
6364

6465
List<Person> findByLastname(String lastname, Sort sort);
6566

67+
Streamable<Person> streamByLastname(String lastname, Sort sort);
68+
6669
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
6770

6871
Person findByFirstnameStartsWith(String prefix);

0 commit comments

Comments
 (0)