5454import com .google .spanner .v1 .GetSessionRequest ;
5555import com .google .spanner .v1 .ListSessionsRequest ;
5656import com .google .spanner .v1 .ListSessionsResponse ;
57+ import com .google .spanner .v1 .MultiplexedSessionPrecommitToken ;
5758import com .google .spanner .v1 .PartialResultSet ;
5859import com .google .spanner .v1 .Partition ;
5960import com .google .spanner .v1 .PartitionOptions ;
@@ -197,10 +198,12 @@ private static class PartialResultSetsIterator implements Iterator<PartialResult
197198 private boolean hasNext ;
198199 private boolean first = true ;
199200 private int currentRow = 0 ;
201+ private boolean isMultiplexedSession = false ;
200202
201- private PartialResultSetsIterator (ResultSet resultSet ) {
203+ private PartialResultSetsIterator (ResultSet resultSet , boolean isMultiplexedSession ) {
202204 this .resultSet = resultSet ;
203205 this .hasNext = true ;
206+ this .isMultiplexedSession = isMultiplexedSession ;
204207 }
205208
206209 @ Override
@@ -227,6 +230,9 @@ public PartialResultSet next() {
227230 }
228231 builder .setResumeToken (ByteString .copyFromUtf8 (String .format ("%09d" , currentRow )));
229232 hasNext = currentRow < resultSet .getRowsCount ();
233+ if (this .isMultiplexedSession ) {
234+ builder .setPrecommitToken (getPartialResultSetPrecommitToken ());
235+ }
230236 return builder .build ();
231237 }
232238
@@ -1020,7 +1026,11 @@ public void executeSql(ExecuteSqlRequest request, StreamObserver<ResultSet> resp
10201026 throw result .getException ();
10211027 case RESULT_SET :
10221028 returnResultSet (
1023- result .getResultSet (), transactionId , request .getTransaction (), responseObserver );
1029+ result .getResultSet (),
1030+ transactionId ,
1031+ request .getTransaction (),
1032+ responseObserver ,
1033+ session );
10241034 break ;
10251035 case UPDATE_COUNT :
10261036 if (isPartitionedDmlTransaction (transactionId )) {
@@ -1033,7 +1043,7 @@ public void executeSql(ExecuteSqlRequest request, StreamObserver<ResultSet> resp
10331043 .build ())
10341044 .build ());
10351045 } else {
1036- responseObserver . onNext (
1046+ ResultSet . Builder resultSetBuilder =
10371047 ResultSet .newBuilder ()
10381048 .setStats (
10391049 ResultSetStats .newBuilder ()
@@ -1045,8 +1055,11 @@ public void executeSql(ExecuteSqlRequest request, StreamObserver<ResultSet> resp
10451055 ignoreNextInlineBeginRequest .getAndSet (false )
10461056 ? Transaction .getDefaultInstance ()
10471057 : Transaction .newBuilder ().setId (transactionId ).build ())
1048- .build ())
1049- .build ());
1058+ .build ());
1059+ if (session .getMultiplexed ()) {
1060+ resultSetBuilder .setPrecommitToken (getResultSetPrecommitToken ());
1061+ }
1062+ responseObserver .onNext (resultSetBuilder .build ());
10501063 }
10511064 break ;
10521065 default :
@@ -1064,7 +1077,8 @@ private void returnResultSet(
10641077 ResultSet resultSet ,
10651078 ByteString transactionId ,
10661079 TransactionSelector transactionSelector ,
1067- StreamObserver <ResultSet > responseObserver ) {
1080+ StreamObserver <ResultSet > responseObserver ,
1081+ Session session ) {
10681082 ResultSetMetadata metadata = resultSet .getMetadata ();
10691083 if (transactionId != null ) {
10701084 metadata =
@@ -1080,6 +1094,9 @@ private void returnResultSet(
10801094 metadata = metadata .toBuilder ().setTransaction (transaction ).build ();
10811095 }
10821096 resultSet = resultSet .toBuilder ().setMetadata (metadata ).build ();
1097+ if (session .getMultiplexed ()) {
1098+ resultSet = resultSet .toBuilder ().setPrecommitToken (getResultSetPrecommitToken ()).build ();
1099+ }
10831100 responseObserver .onNext (resultSet );
10841101 }
10851102
@@ -1174,6 +1191,9 @@ public void executeBatchDml(
11741191 .build ());
11751192 }
11761193 builder .setStatus (status );
1194+ if (session .getMultiplexed ()) {
1195+ builder .setPrecommitToken (getExecuteBatchDmlResponsePrecommitToken ());
1196+ }
11771197 responseObserver .onNext (builder .build ());
11781198 responseObserver .onCompleted ();
11791199 } catch (StatusRuntimeException e ) {
@@ -1242,7 +1262,8 @@ public void executeStreamingSql(
12421262 transactionId ,
12431263 request .getTransaction (),
12441264 responseObserver ,
1245- getExecuteStreamingSqlExecutionTime ());
1265+ getExecuteStreamingSqlExecutionTime (),
1266+ session .getMultiplexed ());
12461267 break ;
12471268 case UPDATE_COUNT :
12481269 if (isPartitioned ) {
@@ -1612,7 +1633,7 @@ public void read(final ReadRequest request, StreamObserver<ResultSet> responseOb
16121633 cols );
16131634 StatementResult res = getResult (statement );
16141635 returnResultSet (
1615- res .getResultSet (), transactionId , request .getTransaction (), responseObserver );
1636+ res .getResultSet (), transactionId , request .getTransaction (), responseObserver , session );
16161637 responseObserver .onCompleted ();
16171638 } catch (StatusRuntimeException e ) {
16181639 responseObserver .onError (e );
@@ -1670,7 +1691,8 @@ public void streamingRead(
16701691 transactionId ,
16711692 request .getTransaction (),
16721693 responseObserver ,
1673- getStreamingReadExecutionTime ());
1694+ getStreamingReadExecutionTime (),
1695+ session .getMultiplexed ());
16741696 } catch (StatusRuntimeException e ) {
16751697 responseObserver .onError (e );
16761698 } catch (Throwable t ) {
@@ -1683,7 +1705,8 @@ private void returnPartialResultSet(
16831705 ByteString transactionId ,
16841706 TransactionSelector transactionSelector ,
16851707 StreamObserver <PartialResultSet > responseObserver ,
1686- SimulatedExecutionTime executionTime )
1708+ SimulatedExecutionTime executionTime ,
1709+ boolean isMultiplexedSession )
16871710 throws Exception {
16881711 ResultSetMetadata metadata = resultSet .getMetadata ();
16891712 if (transactionId == null ) {
@@ -1700,7 +1723,8 @@ private void returnPartialResultSet(
17001723 .build ();
17011724 }
17021725 resultSet = resultSet .toBuilder ().setMetadata (metadata ).build ();
1703- PartialResultSetsIterator iterator = new PartialResultSetsIterator (resultSet );
1726+ PartialResultSetsIterator iterator =
1727+ new PartialResultSetsIterator (resultSet , isMultiplexedSession );
17041728 long index = 0L ;
17051729 while (iterator .hasNext ()) {
17061730 SimulatedExecutionTime .checkStreamException (
@@ -2447,4 +2471,23 @@ Session getSession(String name) {
24472471 }
24482472 return null ;
24492473 }
2474+
2475+ static MultiplexedSessionPrecommitToken getResultSetPrecommitToken () {
2476+ return getPrecommitToken ("ResultSetPrecommitToken" , 1 );
2477+ }
2478+
2479+ static MultiplexedSessionPrecommitToken getPartialResultSetPrecommitToken () {
2480+ return getPrecommitToken ("PartialResultSetPrecommitToken" , 3 );
2481+ }
2482+
2483+ static MultiplexedSessionPrecommitToken getExecuteBatchDmlResponsePrecommitToken () {
2484+ return getPrecommitToken ("ExecuteBatchDmlResponsePrecommitToken" , 2 );
2485+ }
2486+
2487+ static MultiplexedSessionPrecommitToken getPrecommitToken (String value , int seqNo ) {
2488+ return MultiplexedSessionPrecommitToken .newBuilder ()
2489+ .setPrecommitToken (ByteString .copyFromUtf8 (value ))
2490+ .setSeqNum (seqNo )
2491+ .build ();
2492+ }
24502493}
0 commit comments