DATACASS-696 - Fix return of null values through selectOne(…) and event emission.

Null values are now correctly handled when selecting a single element. We also suppress event emission in CassandraTemplate if the loaded entity is null.
This commit is contained in:
Mark Paluch
2019-10-28 14:50:32 +01:00
parent 6991b6a4fa
commit 062bb106d0
7 changed files with 40 additions and 5 deletions

View File

@@ -350,9 +350,8 @@ public class AsyncCassandraTemplate
*/
@Override
public <T> ListenableFuture<T> selectOne(Statement statement, Class<T> entityClass) {
return new MappingListenableFutureAdapter<>(select(statement, entityClass),
list -> list.stream().findFirst().orElse(null));
list -> list.isEmpty() ? null : list.get(0));
}
/* (non-Javadoc)

View File

@@ -343,7 +343,9 @@ public class CassandraTemplate implements CassandraOperations, ApplicationEventP
*/
@Override
public <T> T selectOne(Statement statement, Class<T> entityClass) {
return select(statement, entityClass).stream().findFirst().orElse(null);
List<T> result = select(statement, entityClass);
return result.isEmpty() ? null : result.get(0);
}
/* (non-Javadoc)
@@ -913,7 +915,9 @@ public class CassandraTemplate implements CassandraOperations, ApplicationEventP
T result = (T) (targetType.isInterface() ? getProjectionFactory().createProjection(targetType, source) : source);
maybeEmitEvent(new AfterConvertEvent<>(row, result, tableName));
if (result != null) {
maybeEmitEvent(new AfterConvertEvent<>(row, result, tableName));
}
return result;
};

View File

@@ -860,7 +860,9 @@ public class ReactiveCassandraTemplate
T result = (T) (targetType.isInterface() ? getProjectionFactory().createProjection(targetType, source) : source);
maybeEmitEvent(new AfterConvertEvent<>(row, result, tableName));
if (result != null) {
maybeEmitEvent(new AfterConvertEvent<>(row, result, tableName));
}
return result;
};

View File

@@ -213,6 +213,16 @@ public class AsyncCassandraTemplateUnitTests {
assertThat(statementCaptor.getValue().toString()).isEqualTo("SELECT * FROM users WHERE id='myid';");
}
@Test // DATACASS-696
public void selectOneShouldNull() {
when(resultSet.iterator()).thenReturn(Collections.singleton(row).iterator());
ListenableFuture<String> future = template.selectOne("SELECT id FROM users WHERE id='myid';", String.class);
assertThat(getUninterruptibly(future)).isNull();
}
@Test // DATACASS-292
public void existsShouldReturnExistingElement() {

View File

@@ -32,6 +32,7 @@ import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;

View File

@@ -158,6 +158,16 @@ public class CassandraTemplateUnitTests {
assertThat(statementCaptor.getValue().toString()).isEqualTo("SELECT * FROM users WHERE id='myid';");
}
@Test // DATACASS-696
public void selectOneShouldNull() {
when(resultSet.iterator()).thenReturn(Collections.singleton(row).iterator());
String nullValue = template.selectOne("SELECT id FROM users WHERE id='myid';", String.class);
assertThat(nullValue).isNull();
}
@Test // DATACASS-292
public void selectOneByIdShouldReturnMappedResults() {

View File

@@ -178,6 +178,15 @@ public class ReactiveCassandraTemplateUnitTests {
assertThat(statementCaptor.getValue().toString()).isEqualTo("SELECT firstname FROM users LIMIT 1;");
}
@Test // DATACASS-696
public void selectOneShouldNull() {
when(reactiveResultSet.rows()).thenReturn(Flux.just(row));
template.selectOne("SELECT id FROM users WHERE id='myid';", String.class).as(StepVerifier::create) //
.verifyComplete();
}
@Test // DATACASS-335
public void existsShouldReturnExistingElement() {