/*
         * Probes to test ExecuteSql and ExecuteStreamingSql call from Spanner stub.
         *
         * Args:
         *  stub: An object of SpannerStub.
         *  metrics: A list of metrics.
         *
         */

        public static void executeSql(Spanner.SpannerClient client, ref Dictionary <string, long> metrics)
        {
            long latency;

            //Create Session
            Session session = StartSession(client);

            //Probing ExecuteSql Call
            stopwatch.Start();
            ExecuteSqlRequest executeSqlRequest = new ExecuteSqlRequest();

            executeSqlRequest.Session = session.Name;
            executeSqlRequest.Sql     = "select * FROM users";
            client.ExecuteSql(executeSqlRequest);
            stopwatch.Stop();
            latency = stopwatch.ElapsedMilliseconds;
            metrics.Add("execute_sql_latency_ms", latency);

            //Probing ExecuteStreamingSql Call
            AsyncServerStreamingCall <PartialResultSet> partial_result_set = client.ExecuteStreamingSql(executeSqlRequest);

            stopwatch.Start();
            var header = partial_result_set.ResponseHeadersAsync;

            stopwatch.Stop();
            latency = stopwatch.ElapsedMilliseconds;
            metrics.Add("execute_streaming_sql_latency_ms", latency);

            //Delete Session
            EndSession(client, session);
        }
        public void ExecuteStreamingSql()
        {
            Session session;

            session = client.CreateSession(
                new CreateSessionRequest {
                Database = DatabaseUrl
            });
            Assert.IsNotNull(session);
            AssertAffinityCount(1);

            var streamingCall = client.ExecuteStreamingSql(
                new ExecuteSqlRequest
            {
                Session = session.Name,
                Sql     = string.Format("select id, data from {0}", TableName)
            });

            AssertAffinityCount(1, expectedActiveStreamCount: 1);

            CancellationTokenSource tokenSource = new CancellationTokenSource();
            CancellationToken       token       = tokenSource.Token;
            var responseStream = streamingCall.ResponseStream;
            PartialResultSet firstResultSet = null;

            while (responseStream.MoveNext(token).Result)
            {
                if (firstResultSet == null)
                {
                    firstResultSet = responseStream.Current;
                }
            }
            Assert.AreEqual(ColumnId, firstResultSet?.Values[0].StringValue);
            AssertAffinityCount(1);

            client.DeleteSession(new DeleteSessionRequest {
                Name = session.Name
            });
            AssertAffinityCount(0);
        }