17
17
18
18
import java .util .Collections ;
19
19
import java .util .List ;
20
+ import java .util .concurrent .CompletionStage ;
20
21
import java .util .function .Consumer ;
21
22
import java .util .function .Function ;
22
23
import java .util .stream .Collectors ;
33
34
import org .springframework .dao .DataAccessException ;
34
35
import org .springframework .dao .OptimisticLockingFailureException ;
35
36
import org .springframework .dao .support .DataAccessUtils ;
37
+ import org .springframework .dao .support .PersistenceExceptionTranslator ;
36
38
import org .springframework .data .cassandra .SessionFactory ;
37
39
import org .springframework .data .cassandra .core .EntityOperations .AdaptibleEntity ;
38
40
import org .springframework .data .cassandra .core .convert .CassandraConverter ;
@@ -729,6 +731,19 @@ public ListenableFuture<Void> truncate(Class<?> entityClass) {
729
731
// Implementation hooks and utility methods
730
732
// -------------------------------------------------------------------------
731
733
734
+ /**
735
+ * Create a new statement-based {@link AsyncPreparedStatementHandler} using the statement passed in.
736
+ * <p>
737
+ * This method allows for the creation to be overridden by subclasses.
738
+ *
739
+ * @param statement the statement to be prepared.
740
+ * @return the new {@link PreparedStatementHandler} to use.
741
+ * @since 3.3.3
742
+ */
743
+ protected AsyncPreparedStatementHandler createPreparedStatementHandler (Statement <?> statement ) {
744
+ return new PreparedStatementHandler (statement , exceptionTranslator );
745
+ }
746
+
732
747
private <T > ListenableFuture <EntityWriteResult <T >> executeSave (T entity , CqlIdentifier tableName ,
733
748
SimpleStatement statement ) {
734
749
@@ -781,7 +796,7 @@ private <T> ListenableFuture<List<T>> doQuery(Statement<?> statement, RowMapper<
781
796
782
797
if (PreparedStatementDelegate .canPrepare (isUsePreparedStatements (), statement , log )) {
783
798
784
- PreparedStatementHandler statementHandler = new PreparedStatementHandler (statement );
799
+ AsyncPreparedStatementHandler statementHandler = createPreparedStatementHandler (statement );
785
800
return getAsyncCqlOperations ().query (statementHandler , statementHandler , rowMapper );
786
801
}
787
802
@@ -792,7 +807,7 @@ private ListenableFuture<Void> doQuery(Statement<?> statement, RowCallbackHandle
792
807
793
808
if (PreparedStatementDelegate .canPrepare (isUsePreparedStatements (), statement , log )) {
794
809
795
- PreparedStatementHandler statementHandler = new PreparedStatementHandler (statement );
810
+ AsyncPreparedStatementHandler statementHandler = createPreparedStatementHandler (statement );
796
811
return getAsyncCqlOperations ().query (statementHandler , statementHandler , callbackHandler );
797
812
}
798
813
@@ -807,7 +822,7 @@ private <T> ListenableFuture<T> doExecute(Statement<?> statement, Function<Async
807
822
808
823
if (PreparedStatementDelegate .canPrepare (isUsePreparedStatements (), statement , log )) {
809
824
810
- PreparedStatementHandler statementHandler = new PreparedStatementHandler (statement );
825
+ AsyncPreparedStatementHandler statementHandler = createPreparedStatementHandler (statement );
811
826
return getAsyncCqlOperations ().query (statementHandler , statementHandler ,
812
827
(AsyncResultSetExtractor <T >) resultSet -> new AsyncResult <>(mappingFunction .apply (resultSet )));
813
828
}
@@ -925,24 +940,48 @@ protected T adapt(@Nullable S adapteeResult) {
925
940
}
926
941
}
927
942
943
+ /**
944
+ * General callback interface used to create and bind prepared CQL statements.
945
+ * <p>
946
+ * This interface prepares the CQL statement and sets values on a {@link PreparedStatement} as union-type comprised
947
+ * from {@link AsyncPreparedStatementCreator}, {@link PreparedStatementBinder}, and {@link CqlProvider}.
948
+ *
949
+ * @since 3.3.3
950
+ */
951
+ public interface AsyncPreparedStatementHandler
952
+ extends AsyncPreparedStatementCreator , PreparedStatementBinder , CqlProvider {
953
+
954
+ }
955
+
928
956
/**
929
957
* Utility class to prepare a {@link SimpleStatement} and bind values associated with the statement to a
930
958
* {@link BoundStatement}.
931
959
*
932
960
* @since 3.2
933
961
*/
934
- private class PreparedStatementHandler
935
- implements AsyncPreparedStatementCreator , PreparedStatementBinder , CqlProvider {
962
+ public static class PreparedStatementHandler implements AsyncPreparedStatementHandler {
936
963
937
964
private final SimpleStatement statement ;
965
+ private final PersistenceExceptionTranslator exceptionTranslator ;
938
966
939
- public PreparedStatementHandler (Statement <?> statement ) {
967
+ public PreparedStatementHandler (Statement <?> statement , PersistenceExceptionTranslator exceptionTranslator ) {
940
968
this .statement = PreparedStatementDelegate .getStatementForPrepare (statement );
969
+ this .exceptionTranslator = exceptionTranslator ;
941
970
}
942
971
943
972
@ Override
944
973
public ListenableFuture <PreparedStatement > createPreparedStatement (CqlSession session ) throws DriverException {
945
- return new CassandraFutureAdapter <>(session .prepareAsync (statement ), exceptionTranslator );
974
+ return new CassandraFutureAdapter <>(doPrepare (session ), exceptionTranslator );
975
+ }
976
+
977
+ /**
978
+ * Invokes the statement preparation.
979
+ *
980
+ * @param session
981
+ * @return
982
+ */
983
+ protected CompletionStage <PreparedStatement > doPrepare (CqlSession session ) {
984
+ return session .prepareAsync (statement );
946
985
}
947
986
948
987
@ Override
0 commit comments