|
31 | 31 | import com.google.gcloud.datastore.StructuredQuery.OrderBy; |
32 | 32 | import com.google.gcloud.datastore.StructuredQuery.PropertyFilter; |
33 | 33 | import com.google.gcloud.spi.DatastoreRpc; |
| 34 | +import com.google.gcloud.spi.DatastoreRpc.DatastoreRpcException; |
34 | 35 | import com.google.gcloud.spi.DatastoreRpc.DatastoreRpcException.Reason; |
35 | 36 | import com.google.gcloud.spi.DatastoreRpcFactory; |
36 | 37 |
|
|
43 | 44 | import org.junit.runners.JUnit4; |
44 | 45 |
|
45 | 46 | import java.io.IOException; |
| 47 | +import java.util.ArrayList; |
46 | 48 | import java.util.Collections; |
47 | 49 | import java.util.Iterator; |
48 | 50 | import java.util.List; |
@@ -403,6 +405,42 @@ public void testRunGqlQueryWithCasting() { |
403 | 405 | assertFalse(results3.hasNext()); |
404 | 406 | } |
405 | 407 |
|
| 408 | + @Test |
| 409 | + public void testGqlQueryPagination() { |
| 410 | + DatastoreRpcFactory rpcFactoryMock = EasyMock.createStrictMock(DatastoreRpcFactory.class); |
| 411 | + DatastoreRpc rpcMock = EasyMock.createStrictMock(DatastoreRpc.class); |
| 412 | + EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(DatastoreOptions.class))) |
| 413 | + .andReturn(rpcMock); |
| 414 | + List<com.google.datastore.v1beta3.RunQueryResponse> responses = |
| 415 | + buildResponsesForQueryPagination(); |
| 416 | + for (int i = 0; i < responses.size(); i++) { |
| 417 | + try { |
| 418 | + EasyMock |
| 419 | + .expect(rpcMock.runQuery( |
| 420 | + EasyMock.anyObject(com.google.datastore.v1beta3.RunQueryRequest.class))) |
| 421 | + .andReturn(responses.get(i)); |
| 422 | + } catch (DatastoreRpcException e) { |
| 423 | + fail("Unexpected DatastoreRpcException"); |
| 424 | + } |
| 425 | + } |
| 426 | + EasyMock.replay(rpcFactoryMock, rpcMock); |
| 427 | + DatastoreOptions options = |
| 428 | + this.options.toBuilder() |
| 429 | + .retryParams(RetryParams.getDefaultInstance()) |
| 430 | + .serviceRpcFactory(rpcFactoryMock) |
| 431 | + .build(); |
| 432 | + Datastore mockDatastore = DatastoreFactory.instance().get(options); |
| 433 | + QueryResults<Key> results = |
| 434 | + mockDatastore.run(Query.gqlQueryBuilder(ResultType.KEY, "select __key__ from *").build()); |
| 435 | + int count = 0; |
| 436 | + while (results.hasNext()) { |
| 437 | + count += 1; |
| 438 | + results.next(); |
| 439 | + } |
| 440 | + assertEquals(count, responses.size()); |
| 441 | + EasyMock.verify(rpcFactoryMock, rpcMock); |
| 442 | + } |
| 443 | + |
406 | 444 | @Test |
407 | 445 | public void testRunStructuredQuery() { |
408 | 446 | Query<Entity> query = |
@@ -445,7 +483,80 @@ public void testRunStructuredQuery() { |
445 | 483 | assertEquals(20, entity.getLong("age")); |
446 | 484 | assertEquals(1, entity.properties().size()); |
447 | 485 | assertFalse(results4.hasNext()); |
448 | | - // TODO(ozarov): construct a test to verify nextQuery/pagination |
| 486 | + } |
| 487 | + |
| 488 | + @Test |
| 489 | + public void testStructuredQueryPagination() { |
| 490 | + DatastoreRpcFactory rpcFactoryMock = EasyMock.createStrictMock(DatastoreRpcFactory.class); |
| 491 | + DatastoreRpc rpcMock = EasyMock.createStrictMock(DatastoreRpc.class); |
| 492 | + EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(DatastoreOptions.class))) |
| 493 | + .andReturn(rpcMock); |
| 494 | + List<com.google.datastore.v1beta3.RunQueryResponse> responses = |
| 495 | + buildResponsesForQueryPagination(); |
| 496 | + for (int i = 0; i < responses.size(); i++) { |
| 497 | + try { |
| 498 | + EasyMock |
| 499 | + .expect(rpcMock.runQuery( |
| 500 | + EasyMock.anyObject(com.google.datastore.v1beta3.RunQueryRequest.class))) |
| 501 | + .andReturn(responses.get(i)); |
| 502 | + } catch (DatastoreRpcException e) { |
| 503 | + fail("Unexpected DatastoreRpcException"); |
| 504 | + } |
| 505 | + } |
| 506 | + EasyMock.replay(rpcFactoryMock, rpcMock); |
| 507 | + DatastoreOptions options = |
| 508 | + this.options.toBuilder() |
| 509 | + .retryParams(RetryParams.getDefaultInstance()) |
| 510 | + .serviceRpcFactory(rpcFactoryMock) |
| 511 | + .build(); |
| 512 | + Datastore mockDatastore = DatastoreFactory.instance().get(options); |
| 513 | + QueryResults<Key> results = mockDatastore.run(Query.keyQueryBuilder().build()); |
| 514 | + int count = 0; |
| 515 | + while (results.hasNext()) { |
| 516 | + count += 1; |
| 517 | + results.next(); |
| 518 | + } |
| 519 | + assertEquals(count, responses.size()); |
| 520 | + EasyMock.verify(rpcFactoryMock, rpcMock); |
| 521 | + } |
| 522 | + |
| 523 | + private List<com.google.datastore.v1beta3.RunQueryResponse> buildResponsesForQueryPagination() { |
| 524 | + List<com.google.datastore.v1beta3.RunQueryResponse> responses = new ArrayList<>(); |
| 525 | + Query<Key> query = Query.keyQueryBuilder().build(); |
| 526 | + com.google.datastore.v1beta3.RunQueryRequest.Builder requestPb = |
| 527 | + com.google.datastore.v1beta3.RunQueryRequest.newBuilder(); |
| 528 | + query.populatePb(requestPb); |
| 529 | + com.google.datastore.v1beta3.QueryResultBatch queryResultBatchPb = |
| 530 | + com.google.datastore.v1beta3.RunQueryResponse.newBuilder() |
| 531 | + .mergeFrom(((DatastoreImpl) datastore).runQuery(requestPb.build())) |
| 532 | + .getBatch(); |
| 533 | + com.google.datastore.v1beta3.QueryResultBatch queryResultBatchPb1 = |
| 534 | + com.google.datastore.v1beta3.QueryResultBatch.newBuilder() |
| 535 | + .mergeFrom(queryResultBatchPb) |
| 536 | + .setMoreResults( |
| 537 | + com.google.datastore.v1beta3.QueryResultBatch.MoreResultsType.NOT_FINISHED) |
| 538 | + .clearEntityResults() |
| 539 | + .addAllEntityResults(queryResultBatchPb.getEntityResultsList().subList(0, 1)) |
| 540 | + .setEndCursor(queryResultBatchPb.getEntityResultsList().get(0).getCursor()) |
| 541 | + .build(); |
| 542 | + responses.add( |
| 543 | + com.google.datastore.v1beta3.RunQueryResponse.newBuilder() |
| 544 | + .setBatch(queryResultBatchPb1) |
| 545 | + .build()); |
| 546 | + com.google.datastore.v1beta3.QueryResultBatch queryResultBatchPb2 = |
| 547 | + com.google.datastore.v1beta3.QueryResultBatch.newBuilder() |
| 548 | + .mergeFrom(queryResultBatchPb) |
| 549 | + .setMoreResults( |
| 550 | + com.google.datastore.v1beta3.QueryResultBatch.MoreResultsType.NO_MORE_RESULTS) |
| 551 | + .clearEntityResults() |
| 552 | + .addAllEntityResults(queryResultBatchPb.getEntityResultsList().subList(1, 2)) |
| 553 | + .setEndCursor(queryResultBatchPb.getEntityResultsList().get(1).getCursor()) |
| 554 | + .build(); |
| 555 | + responses.add( |
| 556 | + com.google.datastore.v1beta3.RunQueryResponse.newBuilder() |
| 557 | + .setBatch(queryResultBatchPb2) |
| 558 | + .build()); |
| 559 | + return responses; |
449 | 560 | } |
450 | 561 |
|
451 | 562 | @Test |
|
0 commit comments