View Javadoc
1   package org.davidmoten.rx.jdbc;
2   
3   import java.sql.Connection;
4   import java.util.concurrent.atomic.AtomicReference;
5   
6   import javax.annotation.Nonnull;
7   
8   import com.github.davidmoten.guavamini.Preconditions;
9   
10  import io.reactivex.Flowable;
11  
12  public final class TransactedReturnGeneratedKeysBuilder implements GetterTx {
13  
14      private final TransactedUpdateBuilder update;
15      private final Database db;
16  
17      TransactedReturnGeneratedKeysBuilder(TransactedUpdateBuilder update, Database db) {
18          this.update = update;
19          this.db = db;
20      }
21  
22      /**
23       * Transforms the results using the given function.
24       *
25       * @param mapper
26       *            maps the query results to an object
27       * @return the results of the query as an Observable
28       */
29      @Override
30      public <T> Flowable<Tx<T>> get(@Nonnull ResultSetMapper<? extends T> mapper) {
31          Preconditions.checkNotNull(mapper, "mapper cannot be null");
32          return Flowable.defer(() -> {
33              AtomicReference<Connection> connection = new AtomicReference<Connection>();
34              Flowable<T> o = Update.<T>createReturnGeneratedKeys( //
35                      update.updateBuilder.connections //
36                              .map(c -> Util.toTransactedConnection(connection, c)),
37                      update.parameterGroupsToFlowable(), update.updateBuilder.sql, mapper, false);
38              return o.materialize() //
39                      .flatMap(n -> Tx.toTx(n, connection.get(), db)) //
40                      .doOnNext(tx -> {
41                          if (tx.isComplete()) {
42                              ((TxImpl<T>) tx).connection().commit();
43                          }
44                      });
45          });
46      }
47  
48      public ValuesOnly valuesOnly() {
49          return new ValuesOnly(this);
50      }
51  
52      public static final class ValuesOnly implements Getter {
53  
54          private final TransactedReturnGeneratedKeysBuilder builder;
55  
56          public ValuesOnly(TransactedReturnGeneratedKeysBuilder builder) {
57              this.builder = builder;
58          }
59  
60          @Override
61          public <T> Flowable<T> get(ResultSetMapper<? extends T> function) {
62              return builder.get(function).flatMap(Tx.flattenToValuesOnly());
63          }
64  
65      }
66  
67  }