21
21
22
22
import com .google .api .core .ApiFuture ;
23
23
import com .google .api .core .SettableApiFuture ;
24
+ import com .google .api .gax .rpc .ServerStream ;
24
25
import com .google .cloud .Timestamp ;
25
26
import com .google .cloud .spanner .AbstractReadContext .MultiUseReadOnlyTransaction ;
26
27
import com .google .cloud .spanner .AbstractReadContext .SingleReadContext ;
35
36
import com .google .common .util .concurrent .MoreExecutors ;
36
37
import com .google .protobuf .ByteString ;
37
38
import com .google .protobuf .Empty ;
39
+ import com .google .spanner .v1 .BatchWriteRequest ;
40
+ import com .google .spanner .v1 .BatchWriteResponse ;
38
41
import com .google .spanner .v1 .BeginTransactionRequest ;
39
42
import com .google .spanner .v1 .CommitRequest ;
40
43
import com .google .spanner .v1 .RequestOptions ;
@@ -160,7 +163,6 @@ public CommitResponse writeAtLeastOnceWithOptions(
160
163
Iterable <Mutation > mutations , TransactionOption ... transactionOptions )
161
164
throws SpannerException {
162
165
setActive (null );
163
- Options commitRequestOptions = Options .fromTransactionOptions (transactionOptions );
164
166
List <com .google .spanner .v1 .Mutation > mutationsProto = new ArrayList <>();
165
167
Mutation .toProto (mutations , mutationsProto );
166
168
final CommitRequest .Builder requestBuilder =
@@ -172,15 +174,9 @@ public CommitResponse writeAtLeastOnceWithOptions(
172
174
.setSingleUseTransaction (
173
175
TransactionOptions .newBuilder ()
174
176
.setReadWrite (TransactionOptions .ReadWrite .getDefaultInstance ()));
175
- if (commitRequestOptions .hasPriority () || commitRequestOptions .hasTag ()) {
176
- RequestOptions .Builder requestOptionsBuilder = RequestOptions .newBuilder ();
177
- if (commitRequestOptions .hasPriority ()) {
178
- requestOptionsBuilder .setPriority (commitRequestOptions .priority ());
179
- }
180
- if (commitRequestOptions .hasTag ()) {
181
- requestOptionsBuilder .setTransactionTag (commitRequestOptions .tag ());
182
- }
183
- requestBuilder .setRequestOptions (requestOptionsBuilder .build ());
177
+ RequestOptions commitRequestOptions = getRequestOptions (transactionOptions );
178
+ if (commitRequestOptions != null ) {
179
+ requestBuilder .setRequestOptions (commitRequestOptions );
184
180
}
185
181
CommitRequest request = requestBuilder .build ();
186
182
Span span = tracer .spanBuilder (SpannerImpl .COMMIT ).startSpan ();
@@ -195,6 +191,45 @@ public CommitResponse writeAtLeastOnceWithOptions(
195
191
}
196
192
}
197
193
194
+ private RequestOptions getRequestOptions (TransactionOption ... transactionOptions ) {
195
+ Options requestOptions = Options .fromTransactionOptions (transactionOptions );
196
+ if (requestOptions .hasPriority () || requestOptions .hasTag ()) {
197
+ RequestOptions .Builder requestOptionsBuilder = RequestOptions .newBuilder ();
198
+ if (requestOptions .hasPriority ()) {
199
+ requestOptionsBuilder .setPriority (requestOptions .priority ());
200
+ }
201
+ if (requestOptions .hasTag ()) {
202
+ requestOptionsBuilder .setTransactionTag (requestOptions .tag ());
203
+ }
204
+ return requestOptionsBuilder .build ();
205
+ }
206
+ return null ;
207
+ }
208
+
209
+ @ Override
210
+ public ServerStream <BatchWriteResponse > batchWriteAtLeastOnce (
211
+ Iterable <MutationGroup > mutationGroups , TransactionOption ... transactionOptions )
212
+ throws SpannerException {
213
+ setActive (null );
214
+ List <BatchWriteRequest .MutationGroup > mutationGroupsProto =
215
+ MutationGroup .toListProto (mutationGroups );
216
+ final BatchWriteRequest .Builder requestBuilder =
217
+ BatchWriteRequest .newBuilder ().setSession (name ).addAllMutationGroups (mutationGroupsProto );
218
+ RequestOptions batchWriteRequestOptions = getRequestOptions (transactionOptions );
219
+ if (batchWriteRequestOptions != null ) {
220
+ requestBuilder .setRequestOptions (batchWriteRequestOptions );
221
+ }
222
+ Span span = tracer .spanBuilder (SpannerImpl .BATCH_WRITE ).startSpan ();
223
+ try (Scope s = tracer .withSpan (span )) {
224
+ return spanner .getRpc ().batchWriteAtLeastOnce (requestBuilder .build (), this .options );
225
+ } catch (Throwable e ) {
226
+ TraceUtil .setWithFailure (span , e );
227
+ throw SpannerExceptionFactory .newSpannerException (e );
228
+ } finally {
229
+ span .end (TraceUtil .END_SPAN_OPTIONS );
230
+ }
231
+ }
232
+
198
233
@ Override
199
234
public ReadContext singleUse () {
200
235
return singleUse (TimestampBound .strong ());
0 commit comments