8000 feat: add support for read-only transactions in TransactionOptions (#… · googleapis/java-firestore@c25dca3 · GitHub 8000
[go: up one dir, main page]

Skip to content

Commit c25dca3

Browse files
authored
feat: add support for read-only transactions in TransactionOptions (#320)
* Add new typesafe builders for read-only `TransactionOptions.readOnlyOptionsBuilder` and read-write `TransactionOptions.readWriteOptionsBuilder` transactions in TransactionOptions * These new builders ensure only those parameters relevant to the respec 8000 tive type of transaction are available * Deprecate existing `TransactionOptions.create(...)` methods in favor of the new builders * Update Transaction and TransactionRunner to use TransactionOptions directly
1 parent 01f4c69 commit c25dca3

File tree

7 files changed

+463
-39
lines changed

7 files changed

+463
-39
lines changed

google-cloud-firestore/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,12 @@
152152
<version>2.11.2</version>
153153
<scope>test</scope>
154154
</dependency>
155+
<dependency>
156+
<groupId>org.apache.commons</groupId>
157+
<artifactId>commons-lang3</artifactId>
158+
<version>3.11</version>
159+
<scope>test</scope>
160+
</dependency>
155161
</dependencies>
156162

157163
<reporting>

google-cloud-firestore/src/main/java/com/google/cloud/firestore/FirestoreImpl.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import com.google.firestore.v1.BatchGetDocumentsResponse;
3131
import com.google.firestore.v1.DatabaseRootName;
3232
import com.google.protobuf.ByteString;
33-
import io.grpc.Context;
3433
import io.opencensus.trace.AttributeValue;
3534
import io.opencensus.trace.Tracer;
3635
import io.opencensus.trace.Tracing;
@@ -40,7 +39,6 @@
4039
import java.util.List;
4140
import java.util.Map;
4241
import java.util.Random;
43-
import java.util.concurrent.Executor;
4442
import javax.annotation.Nonnull;
4543
import javax.annotation< 10000 /span>.Nullable;
4644

@@ -310,15 +308,9 @@ public <T> ApiFuture<T> runAsyncTransaction(
310308
public <T> ApiFuture<T> runAsyncTransaction(
311309
@Nonnull final Transaction.AsyncFunction<T> updateFunction,
312310
@Nonnull TransactionOptions transactionOptions) {
313-
final Executor userCallbackExecutor =
314-
Context.currentContextExecutor(
315-
transactionOptions.getExecutor() != null
316-
? transactionOptions.getExecutor()
317-
: firestoreClient.getExecutor());
318311

319312
TransactionRunner<T> transactionRunner =
320-
new TransactionRunner<>(
321-
this, updateFunction, userCallbackExecutor, transactionOptions.getNumberOfAttempts());
313+
new TransactionRunner<>(this, updateFunction, transactionOptions);
322314
return transactionRunner.run();
323315
}
324316

google-cloud-firestore/src/main/java/com/google/cloud/firestore/Transaction.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
import com.google.api.core.ApiFunction;
2020
import com.google.api.core.ApiFuture;
2121
import com.google.api.core.ApiFutures;
22+
import com.google.cloud.firestore.TransactionOptions.TransactionOptionsType;
2223
import com.google.common.base.Preconditions;
2324
import com.google.common.util.concurrent.MoreExecutors;
2425
import com.google.firestore.v1.BeginTransactionRequest;
2526
import com.google.firestore.v1.BeginTransactionResponse;
2627
import com.google.firestore.v1.RollbackRequest;
28+
import com.google.firestore.v1.TransactionOptions.ReadOnly;
2729
import com.google.protobuf.ByteString;
2830
import com.google.protobuf.Empty;
2931
import java.util.List;
@@ -61,12 +63,18 @@ public interface AsyncFunction<T> {
6163
ApiFuture<T> updateCallback(Transaction transaction);
6264
}
6365

66+
private final TransactionOptions transactionOptions;
67+
@Nullable private final ByteString previousTransactionId;
6468
private ByteString transactionId;
65-
private @Nullable ByteString previousTransactionId;
6669

67-
Transaction(FirestoreImpl firestore, @Nullable Transaction previousTransaction) {
70+
Transaction(
71+
FirestoreImpl firestore,
72+
TransactionOptions transactionOptions,
73+
@Nullable Transaction previousTransaction) {
6874
super(firestore);
69-
previousTransactionId = previousTransaction != null ? previousTransaction.transactionId : null;
75+
this.transactionOptions = transactionOptions;
76+
this.previousTransactionId =
77+
previousTransaction != null ? previousTransaction.transactionId : null;
7078
}
7179

7280
Transaction wrapResult(ApiFuture<WriteResult> result) {
@@ -78,11 +86,18 @@ ApiFuture<Void> begin() {
7886
BeginTransactionRequest.Builder beginTransaction = BeginTransactionRequest.newBuilder();
7987
beginTransaction.setDatabase(firestore.getDatabaseName());
8088

81-
if (previousTransactionId != null) {
89+
if (TransactionOptionsType.READ_WRITE.equals(transactionOptions.getType())
90+
&& previousTransactionId != null) {
8291
beginTransaction
8392
.getOptionsBuilder()
8493
.getReadWriteBuilder()
8594
.setRetryTransaction(previousTransactionId);
95+
} else if (TransactionOptionsType.READ_ONLY.equals(transactionOptions.getType())) {
96+
final ReadOnly.Builder readOnlyBuilder = ReadOnly.newBuilder();
97+
if (transactionOptions.getReadTime() != null) {
98+
readOnlyBuilder.setReadTime(transactionOptions.getReadTime());
99+
}
100+
beginTransaction.getOptionsBuilder().setReadOnly(readOnlyBuilder);
86101
}
87102

88103
ApiFuture<BeginTransactionResponse> transactionBeginFuture =

0 commit comments

Comments
 (0)
0