45
45
import com .google .spanner .v1 .DirectedReadOptions ;
46
46
import com .google .spanner .v1 .ExecuteBatchDmlRequest ;
47
47
import com .google .spanner .v1 .ExecuteSqlRequest ;
48
+ import com .google .spanner .v1 .ExecuteSqlRequest .Builder ;
48
49
import com .google .spanner .v1 .ExecuteSqlRequest .QueryMode ;
49
50
import com .google .spanner .v1 .ExecuteSqlRequest .QueryOptions ;
50
51
import com .google .spanner .v1 .PartialResultSet ;
@@ -457,7 +458,7 @@ void initTransaction() {
457
458
458
459
// A per-transaction sequence number used to identify this ExecuteSqlRequests. Required for DML,
459
460
// ignored for query by the server.
460
- private AtomicLong seqNo = new AtomicLong ();
461
+ private final AtomicLong seqNo = new AtomicLong ();
461
462
462
463
// Allow up to 512MB to be buffered (assuming 1MB chunks). In practice, restart tokens are sent
463
464
// much more frequently.
@@ -488,6 +489,10 @@ long getSeqNo() {
488
489
return seqNo .incrementAndGet ();
489
490
}
490
491
492
+ protected boolean isReadOnly () {
493
+ return true ;
494
+ }
495
+
491
496
protected boolean isRouteToLeader () {
492
497
return false ;
493
498
}
@@ -622,19 +627,18 @@ private ResultSet executeQueryInternal(
622
627
@ VisibleForTesting
623
628
QueryOptions buildQueryOptions (QueryOptions requestOptions ) {
624
629
// Shortcut for the most common return value.
625
- if (defaultQueryOptions . equals ( QueryOptions . getDefaultInstance ()) && requestOptions == null ) {
626
- return QueryOptions . getDefaultInstance () ;
630
+ if (requestOptions == null ) {
631
+ return defaultQueryOptions ;
627
632
}
628
- // Create a builder based on the default query options.
629
- QueryOptions .Builder builder = defaultQueryOptions .toBuilder ();
630
- // Then overwrite with specific options for this query.
631
- if (requestOptions != null ) {
632
- builder .mergeFrom (requestOptions );
633
- }
634
- return builder .build ();
633
+ return defaultQueryOptions .toBuilder ().mergeFrom (requestOptions ).build ();
635
634
}
636
635
637
636
RequestOptions buildRequestOptions (Options options ) {
637
+ // Shortcut for the most common return value.
638
+ if (!(options .hasPriority () || options .hasTag () || getTransactionTag () != null )) {
639
+ return RequestOptions .getDefaultInstance ();
640
+ }
641
+
638
642
RequestOptions .Builder builder = RequestOptions .newBuilder ();
639
643
if (options .hasPriority ()) {
640
644
builder .setPriority (options .priority ());
@@ -655,16 +659,7 @@ ExecuteSqlRequest.Builder getExecuteSqlRequestBuilder(
655
659
.setSql (statement .getSql ())
656
660
.setQueryMode (queryMode )
657
661
.setSession (session .getName ());
658
- Map <String , Value > stmtParameters = statement .getParameters ();
659
- if (!stmtParameters .isEmpty ()) {
660
- com .google .protobuf .Struct .Builder paramsBuilder = builder .getParamsBuilder ();
661
- for (Map .Entry <String , Value > param : stmtParameters .entrySet ()) {
662
- paramsBuilder .putFields (param .getKey (), Value .toProto (param .getValue ()));
663
- if (param .getValue () != null && param .getValue ().getType () != null ) {
664
- builder .putParamTypes (param .getKey (), param .getValue ().getType ().toProto ());
665
- }
666
- }
667
- }
662
+ addParameters (builder , statement .getParameters ());
668
663
if (withTransactionSelector ) {
669
664
TransactionSelector selector = getTransactionSelector ();
670
665
if (selector != null ) {
@@ -679,12 +674,26 @@ ExecuteSqlRequest.Builder getExecuteSqlRequestBuilder(
679
674
} else if (defaultDirectedReadOptions != null ) {
680
675
builder .setDirectedReadOptions (defaultDirectedReadOptions );
681
676
}
682
- builder .setSeqno (getSeqNo ());
677
+ if (!isReadOnly ()) {
678
+ builder .setSeqno (getSeqNo ());
679
+ }
683
680
builder .setQueryOptions (buildQueryOptions (statement .getQueryOptions ()));
684
681
builder .setRequestOptions (buildRequestOptions (options ));
685
682
return builder ;
686
683
}
687
684
685
+ static void addParameters (ExecuteSqlRequest .Builder builder , Map <String , Value > stmtParameters ) {
686
+ if (!stmtParameters .isEmpty ()) {
687
+ com .google .protobuf .Struct .Builder paramsBuilder = builder .getParamsBuilder ();
688
+ for (Map .Entry <String , Value > param : stmtParameters .entrySet ()) {
689
+ paramsBuilder .putFields (param .getKey (), Value .toProto (param .getValue ()));
690
+ if (param .getValue () != null && param .getValue ().getType () != null ) {
691
+ builder .putParamTypes (param .getKey (), param .getValue ().getType ().toProto ());
692
+ }
693
+ }
694
+ }
695
+ }
696
+
688
697
ExecuteBatchDmlRequest .Builder getExecuteBatchDmlRequestBuilder (
689
698
Iterable <Statement > statements , Options options ) {
690
699
ExecuteBatchDmlRequest .Builder builder =
0 commit comments