@@ -327,4 +327,182 @@ public void testClone() {
327327 assertThat (clonedReq ).isEqualTo (query );
328328 assertThat (clonedReq .toProto (requestContext )).isEqualTo (request );
329329 }
330+
331+ @ Test
332+ public void testQueryPaginatorRangeLimitReached () {
333+ int chunkSize = 10 , limit = 15 ;
334+ Query query = Query .create (TABLE_ID ).range ("a" , "z" ).limit (limit );
335+ Query .QueryPaginator paginator = query .createPaginator (chunkSize );
336+
337+ Query nextQuery = paginator .getNextQuery ();
338+
339+ Builder expectedProto =
340+ expectedProtoBuilder ()
341+ .setRows (
342+ RowSet .newBuilder ()
343+ .addRowRanges (
344+ RowRange .newBuilder ()
345+ .setStartKeyClosed (ByteString .copyFromUtf8 ("a" ))
346+ .setEndKeyOpen (ByteString .copyFromUtf8 ("z" ))
347+ .build ()))
348+ .setRowsLimit (chunkSize );
349+ assertThat (nextQuery .toProto (requestContext )).isEqualTo (expectedProto .build ());
350+
351+ assertThat (paginator .advance (ByteString .copyFromUtf8 ("c" ))).isTrue ();
352+ int expectedLimit = limit - chunkSize ;
353+ nextQuery = paginator .getNextQuery ();
354+ expectedProto =
355+ expectedProtoBuilder ()
356+ .setRows (
357+ RowSet .newBuilder ()
358+ .addRowRanges (
359+ RowRange .newBuilder ()
360+ .setStartKeyOpen (ByteString .copyFromUtf8 ("c" ))
361+ .setEndKeyOpen (ByteString .copyFromUtf8 ("z" ))
362+ .build ()))
363+ .setRowsLimit (expectedLimit );
364+ assertThat (nextQuery .toProto (requestContext )).isEqualTo (expectedProto .build ());
365+
366+ assertThat (paginator .advance (ByteString .copyFromUtf8 ("d" ))).isFalse ();
367+ }
368+
369+ @ Test
370+ public void testQueryPaginatorRangeLimitMultiplyOfChunkSize () {
371+ int chunkSize = 10 , limit = 20 ;
372+ Query query = Query .create (TABLE_ID ).range ("a" , "z" ).limit (limit );
373+ Query .QueryPaginator paginator = query .createPaginator (chunkSize );
374+
375+ Query nextQuery = paginator .getNextQuery ();
376+
377+ Builder expectedProto =
378+ expectedProtoBuilder ()
379+ .setRows (
380+ RowSet .newBuilder ()
381+ .addRowRanges (
382+ RowRange .newBuilder ()
383+ .setStartKeyClosed (ByteString .copyFromUtf8 ("a" ))
384+ .setEndKeyOpen (ByteString .copyFromUtf8 ("z" ))
385+ .build ()))
386+ .setRowsLimit (chunkSize );
387+ assertThat (nextQuery .toProto (requestContext )).isEqualTo (expectedProto .build ());
388+
389+ assertThat (paginator .advance (ByteString .copyFromUtf8 ("c" ))).isTrue ();
390+ int expectedLimit = limit - chunkSize ;
391+ nextQuery = paginator .getNextQuery ();
392+ expectedProto =
393+ expectedProtoBuilder ()
394+ .setRows (
395+ RowSet .newBuilder ()
396+ .addRowRanges (
397+ RowRange .newBuilder ()
398+ .setStartKeyOpen (ByteString .copyFromUtf8 ("c" ))
399+ .setEndKeyOpen (ByteString .copyFromUtf8 ("z" ))
400+ .build ()))
401+ .setRowsLimit (expectedLimit );
402+ assertThat (nextQuery .toProto (requestContext )).isEqualTo (expectedProto .build ());
403+
404+ assertThat (paginator .advance (ByteString .copyFromUtf8 ("d" ))).isFalse ();
405+ }
406+
407+ @ Test
408+ public void testQueryPaginatorRagneNoLimit () {
409+ int chunkSize = 10 ;
410+ Query query = Query .create (TABLE_ID ).range ("a" , "z" );
411+ Query .QueryPaginator paginator = query .createPaginator (chunkSize );
412+
413+ Query nextQuery = paginator .getNextQuery ();
414+
415+ Builder expectedProto =
416+ expectedProtoBuilder ()
417+ .setRows (
418+ RowSet .newBuilder ()
419+ .addRowRanges (
420+ RowRange .newBuilder ()
421+ .setStartKeyClosed (ByteString .copyFromUtf8 ("a" ))
422+ .setEndKeyOpen (ByteString .copyFromUtf8 ("z" ))
423+ .build ()))
424+ .setRowsLimit (chunkSize );
425+ assertThat (nextQuery .toProto (requestContext )).isEqualTo (expectedProto .build ());
426+
427+ assertThat (paginator .advance (ByteString .copyFromUtf8 ("c" ))).isTrue ();
428+ nextQuery = paginator .getNextQuery ();
429+ expectedProto
430+ .setRows (
431+ RowSet .newBuilder ()
432+ .addRowRanges (
433+ RowRange .newBuilder ()
434+ .setStartKeyOpen (ByteString .copyFromUtf8 ("c" ))
435+ .setEndKeyOpen (ByteString .copyFromUtf8 ("z" ))
436+ .build ()))
437+ .setRowsLimit (chunkSize );
438+ assertThat (nextQuery .toProto (requestContext )).isEqualTo (expectedProto .build ());
439+
440+ assertThat (paginator .advance (ByteString .copyFromUtf8 ("z" ))).isFalse ();
441+ }
442+
443+ @ Test
444+ public void testQueryPaginatorRowsNoLimit () {
445+ int chunkSize = 10 ;
446+ Query query = Query .create (TABLE_ID ).rowKey ("a" ).rowKey ("b" ).rowKey ("c" );
447+
448+ Query .QueryPaginator paginator = query .createPaginator (chunkSize );
449+
450+ Query nextQuery = paginator .getNextQuery ();
451+
452+ ReadRowsRequest .Builder expectedProto = expectedProtoBuilder ();
453+ expectedProto
454+ .getRowsBuilder ()
455+ .addRowKeys (ByteString .copyFromUtf8 ("a" ))
456+ .addRowKeys (ByteString .copyFromUtf8 ("b" ))
457+ .addRowKeys (ByteString .copyFromUtf8 ("c" ));
458+ expectedProto .setRowsLimit (chunkSize );
459+
460+ assertThat (nextQuery .toProto (requestContext )).isEqualTo (expectedProto .build ());
461+
462+ paginator .advance (ByteString .copyFromUtf8 ("b" ));
463+ nextQuery = paginator .getNextQuery ();
464+ expectedProto = expectedProtoBuilder ();
465+ expectedProto .getRowsBuilder ().addRowKeys (ByteString .copyFromUtf8 ("c" ));
466+ expectedProto .setRowsLimit (chunkSize );
467+
468+ assertThat (nextQuery .toProto (requestContext )).isEqualTo (expectedProto .build ());
469+
470+ assertThat (paginator .advance (ByteString .copyFromUtf8 ("c" ))).isFalse ();
471+ }
472+
473+ @ Test
474+ public void testQueryPaginatorFullTableScan () {
475+ int chunkSize = 10 ;
476+ Query query = Query .create (TABLE_ID );
477+ Query .QueryPaginator queryPaginator = query .createPaginator (chunkSize );
478+
479+ ReadRowsRequest .Builder expectedProto = expectedProtoBuilder ().setRowsLimit (chunkSize );
480+ assertThat (queryPaginator .getNextQuery ().toProto (requestContext ))
481+ .isEqualTo (expectedProto .build ());
482+
483+ assertThat (queryPaginator .advance (ByteString .copyFromUtf8 ("a" ))).isTrue ();
484+ expectedProto
485+ .setRows (
486+ RowSet .newBuilder ()
487+ .addRowRanges (
488+ RowRange .newBuilder ().setStartKeyOpen (ByteString .copyFromUtf8 ("a" )).build ()))
489+ .setRowsLimit (chunkSize );
490+ assertThat (queryPaginator .getNextQuery ().toProto (requestContext ))
491+ .isEqualTo (expectedProto .build ());
492+
493+ assertThat (queryPaginator .advance (ByteString .copyFromUtf8 ("a" ))).isFalse ();
494+ }
495+
496+ @ Test
497+ public void testQueryPaginatorEmptyTable () {
498+ int chunkSize = 10 ;
499+ Query query = Query .create (TABLE_ID );
500+ Query .QueryPaginator queryPaginator = query .createPaginator (chunkSize );
501+
502+ ReadRowsRequest .Builder expectedProto = expectedProtoBuilder ().setRowsLimit (chunkSize );
503+ assertThat (queryPaginator .getNextQuery ().toProto (requestContext ))
504+ .isEqualTo (expectedProto .build ());
505+
506+ assertThat (queryPaginator .advance (ByteString .EMPTY )).isFalse ();
507+ }
330508}
0 commit comments