@@ -38,12 +38,14 @@ import {
3838 SessionPoolExhaustedError ,
3939 SessionPoolOptions ,
4040} from '../src/session-pool' ;
41- import CreateInstanceMetadata = google . spanner . admin . instance . v1 . CreateInstanceMetadata ;
4241import { Json } from '../src/codec' ;
42+ import CreateInstanceMetadata = google . spanner . admin . instance . v1 . CreateInstanceMetadata ;
4343import Done = Mocha . Done ;
4444import QueryOptions = google . spanner . v1 . ExecuteSqlRequest . QueryOptions ;
4545import v1 = google . spanner . v1 ;
4646import IQueryOptions = google . spanner . v1 . ExecuteSqlRequest . IQueryOptions ;
47+ import ResultSetStats = google . spanner . v1 . ResultSetStats ;
48+ import { SpannerClient as s } from '../src/v1' ;
4749
4850function numberToEnglishWord ( num : number ) : string {
4951 switch ( num ) {
@@ -172,6 +174,97 @@ describe('Spanner with mock server', () => {
172174 }
173175 } ) ;
174176
177+ it ( 'should return statistics' , async ( ) => {
178+ const database = newTestDatabase ( ) ;
179+ try {
180+ const [ rows , stats ] = await database . run ( {
181+ sql : selectSql ,
182+ queryMode : s . QueryMode . PROFILE ,
183+ } ) ;
184+ assert . strictEqual ( rows . length , 3 ) ;
185+ assert . ok ( stats ) ;
186+ assert . ok ( stats . queryPlan ) ;
187+ } finally {
188+ await database . close ( ) ;
189+ }
190+ } ) ;
191+
192+ it ( 'should return statistics from snapshot' , async ( ) => {
193+ const database = newTestDatabase ( ) ;
194+ try {
195+ const [ snapshot ] = await database . getSnapshot ( ) ;
196+ const [ rows , stats ] = await snapshot . run ( {
197+ sql : selectSql ,
198+ queryMode : s . QueryMode . PROFILE ,
199+ } ) ;
200+ assert . strictEqual ( rows . length , 3 ) ;
201+ assert . ok ( stats ) ;
202+ assert . ok ( stats . queryPlan ) ;
203+ snapshot . end ( ) ;
204+ } finally {
205+ await database . close ( ) ;
206+ }
207+ } ) ;
208+
209+ it ( 'should emit query statistics' , done => {
210+ const database = newTestDatabase ( ) ;
211+ let rowCount = 0 ;
212+ let stats : ResultSetStats ;
213+ database
214+ . runStream ( {
215+ sql : selectSql ,
216+ queryMode : s . QueryMode . PROFILE ,
217+ } )
218+ . on ( 'data' , ( ) => rowCount ++ )
219+ . on ( 'stats' , _stats => ( stats = _stats ) )
220+ . on ( 'end' , ( ) => {
221+ assert . strictEqual ( rowCount , 3 ) ;
222+ assert . ok ( stats ) ;
223+ assert . ok ( stats . queryPlan ) ;
224+ database . close ( ) . then ( ( ) => done ( ) ) ;
225+ } ) ;
226+ } ) ;
227+
228+ it ( 'should emit query statistics from snapshot' , done => {
229+ const database = newTestDatabase ( ) ;
230+ let rowCount = 0 ;
231+ let stats : ResultSetStats ;
232+ database . getSnapshot ( ) . then ( response => {
233+ const [ snapshot ] = response ;
234+ snapshot
235+ . runStream ( {
236+ sql : selectSql ,
237+ queryMode : s . QueryMode . PROFILE ,
238+ } )
239+ . on ( 'data' , ( ) => rowCount ++ )
240+ . on ( 'stats' , _stats => ( stats = _stats ) )
241+ . on ( 'end' , ( ) => {
242+ assert . strictEqual ( rowCount , 3 ) ;
243+ assert . ok ( stats ) ;
244+ assert . ok ( stats . queryPlan ) ;
245+ snapshot . end ( ) ;
246+ database . close ( ) . then ( ( ) => done ( ) ) ;
247+ } ) ;
248+ } ) ;
249+ } ) ;
250+
251+ it ( 'should call callback with statistics' , done => {
252+ const database = newTestDatabase ( ) ;
253+ database . run (
254+ {
255+ sql : selectSql ,
256+ queryMode : s . QueryMode . PROFILE ,
257+ } ,
258+ ( err , rows , stats ) => {
259+ assert . ifError ( err ) ;
260+ assert . strictEqual ( rows . length , 3 ) ;
261+ assert . ok ( stats ) ;
262+ assert . ok ( stats . queryPlan ) ;
263+ database . close ( ) . then ( ( ) => done ( ) ) ;
264+ }
265+ ) ;
266+ } ) ;
267+
175268 it ( 'should execute update' , async ( ) => {
176269 const update = {
177270 sql : insertSql ,
0 commit comments