/** * Create a reusable {@link Flux} given a {@link ReactiveStatementCallback} without exception translation. * * @param callback must not be {@literal null}. * @return a reusable {@link Flux} wrapping the {@link ReactiveStatementCallback}. */ protected <T> Flux<T> createFlux(Statement statement, ReactiveStatementCallback<T> callback) { Assert.notNull(callback, "ReactiveStatementCallback must not be null"); applyStatementSettings(statement); ReactiveSession session = getSession(); return Flux.defer(() -> callback.doInStatement(session, statement)); }
@Override public Flux<Boolean> execute(String cql, Publisher<Object[]> args) throws DataAccessException { Assert.notNull(args, "Args Publisher must not be null"); return execute(newReactivePreparedStatementCreator(cql), (session, ps) -> Flux.from(args).flatMap(objects -> { if (logger.isDebugEnabled()) { logger.debug("Executing Prepared CQL Statement [{}]", cql); } BoundStatement boundStatement = newArgPreparedStatementBinder(objects).bindValues(ps); applyStatementSettings(boundStatement); return session.execute(boundStatement); }).map(ReactiveResultSet::wasApplied)); }
/** * Create a reusable {@link Mono} given a {@link ReactiveStatementCallback} without exception translation. * * @param callback must not be {@literal null}. * @return a reusable {@link Mono} wrapping the {@link ReactiveStatementCallback}. */ protected <T> Mono<T> createMono(Statement statement, ReactiveStatementCallback<T> callback) { Assert.notNull(callback, "ReactiveStatementCallback must not be null"); applyStatementSettings(statement); ReactiveSession session = getSession(); return Mono.defer(() -> Mono.from(callback.doInStatement(session, statement))); }
/** * Query using a prepared statement, reading the {@link ReactiveResultSet} with a {@link ReactiveResultSetExtractor}. * * @param psc object that can create a {@link PreparedStatement} given a {@link ReactiveSession} * @param preparedStatementBinder object that knows how to set values on the prepared statement. If this is * {@literal null}, the CQL will be assumed to contain no bind parameters. * @param rse object that will extract results * @return an arbitrary result object, as returned by the {@link ReactiveResultSetExtractor} * @throws DataAccessException if there is any problem */ public <T> Flux<T> query(ReactivePreparedStatementCreator psc, @Nullable PreparedStatementBinder preparedStatementBinder, ReactiveResultSetExtractor<T> rse) throws DataAccessException { Assert.notNull(psc, "ReactivePreparedStatementCreator must not be null"); Assert.notNull(rse, "ReactiveResultSetExtractor object must not be null"); return execute(psc, (session, ps) -> Mono.just(ps).flatMapMany(pps -> { if (logger.isDebugEnabled()) { logger.debug("Executing Prepared CQL Statement [{}]", ps.getQueryString()); } BoundStatement boundStatement = (preparedStatementBinder != null ? preparedStatementBinder.bindValues(ps) : ps.bind()); applyStatementSettings(boundStatement); return session.execute(boundStatement); }).flatMap(rse::extractData)).onErrorMap(translateException("Query", getCql(psc))); }