|
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;
|
@@ -407,6 +409,38 @@ public void testRunGqlQueryWithCasting() {
|
407 | 409 | assertFalse(results3.hasNext());
|
408 | 410 | }
|
409 | 411 |
|
| 412 | + @Test |
| 413 | + public void testGqlQueryPagination() throws DatastoreRpcException { |
| 414 | + DatastoreRpcFactory rpcFactoryMock = EasyMock.createStrictMock(DatastoreRpcFactory.class); |
| 415 | + DatastoreRpc rpcMock = EasyMock.createStrictMock(DatastoreRpc.class); |
| 416 | + EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(DatastoreOptions.class))) |
| 417 | + .andReturn(rpcMock); |
| 418 | + List<com.google.datastore.v1beta3.RunQueryResponse> responses = |
| 419 | + buildResponsesForQueryPagination(); |
| 420 | + for (int i = 0; i < responses.size(); i++) { |
| 421 | + EasyMock |
| 422 | + .expect(rpcMock.runQuery( |
| 423 | + EasyMock.anyObject(com.google.datastore.v1beta3.RunQueryRequest.class))) |
| 424 | + .andReturn(responses.get(i)); |
| 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, 5); |
| 441 | + EasyMock.verify(rpcFactoryMock, rpcMock); |
| 442 | + } |
| 443 | + |
410 | 444 | @Test
|
411 | 445 | public void testRunStructuredQuery() {
|
412 | 446 | Query<Entity> query =
|
@@ -449,7 +483,92 @@ public void testRunStructuredQuery() {
|
449 | 483 | assertEquals(20, entity.getLong("age"));
|
450 | 484 | assertEquals(1, entity.properties().size());
|
451 | 485 | assertFalse(results4.hasNext());
|
452 |
| - // TODO(ozarov): construct a test to verify nextQuery/pagination |
| 486 | + } |
| 487 | + |
| 488 | + @Test |
| 489 | + public void testStructuredQueryPagination() throws DatastoreRpcException { |
| 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 | + EasyMock |
| 498 | + .expect(rpcMock.runQuery( |
| 499 | + EasyMock.anyObject(com.google.datastore.v1beta3.RunQueryRequest.class))) |
| 500 | + .andReturn(responses.get(i)); |
| 501 | + } |
| 502 | + EasyMock.replay(rpcFactoryMock, rpcMock); |
| 503 | + DatastoreOptions options = |
| 504 | + this.options.toBuilder() |
| 505 | + .retryParams(RetryParams.getDefaultInstance()) |
| 506 | + .serviceRpcFactory(rpcFactoryMock) |
| 507 | + .build(); |
| 508 | + Datastore mockDatastore = DatastoreFactory.instance().get(options); |
| 509 | + QueryResults<Key> results = mockDatastore.run(Query.keyQueryBuilder().build()); |
| 510 | + int count = 0; |
| 511 | + while (results.hasNext()) { |
| 512 | + count += 1; |
| 513 | + results.next(); |
| 514 | + } |
| 515 | + assertEquals(count, 5); |
| 516 | + EasyMock.verify(rpcFactoryMock, rpcMock); |
| 517 | + } |
| 518 | + |
| 519 | + private List<com.google.datastore.v1beta3.RunQueryResponse> buildResponsesForQueryPagination() { |
| 520 | + Entity entity4 = Entity.builder(KEY4).set("value", StringValue.of("value")).build(); |
| 521 | + Entity entity5 = Entity.builder(KEY5).set("value", "value").build(); |
| 522 | + datastore.add(ENTITY3, entity4, entity5); |
| 523 | + List<com.google.datastore.v1beta3.RunQueryResponse> responses = new ArrayList<>(); |
| 524 | + Query<Key> query = Query.keyQueryBuilder().build(); |
| 525 | + com.google.datastore.v1beta3.RunQueryRequest.Builder requestPb = |
| 526 | + com.google.datastore.v1beta3.RunQueryRequest.newBuilder(); |
| 527 | + query.populatePb(requestPb); |
| 528 | + com.google.datastore.v1beta3.QueryResultBatch queryResultBatchPb = |
| 529 | + com.google.datastore.v1beta3.RunQueryResponse.newBuilder() |
| 530 | + .mergeFrom(((DatastoreImpl) datastore).runQuery(requestPb.build())) |
| 531 | + .getBatch(); |
| 532 | + com.google.datastore.v1beta3.QueryResultBatch queryResultBatchPb1 = |
| 533 | + com.google.datastore.v1beta3.QueryResultBatch.newBuilder() |
| 534 | + .mergeFrom(queryResultBatchPb) |
| 535 | + .setMoreResults( |
| 536 | + com.google.datastore.v1beta3.QueryResultBatch.MoreResultsType.NOT_FINISHED) |
| 537 | + .clearEntityResults() |
| 538 | + .addAllEntityResults(queryResultBatchPb.getEntityResultsList().subList(0, 1)) |
| 539 | + .setEndCursor(queryResultBatchPb.getEntityResultsList().get(0).getCursor()) |
| 540 | + .build(); |
| 541 | + responses.add( |
| 542 | + com.google.datastore.v1beta3.RunQueryResponse.newBuilder() |
| 543 | + .setBatch(queryResultBatchPb1) |
| 544 | + .build()); |
| 545 | + com.google.datastore.v1beta3.QueryResultBatch queryResultBatchPb2 = |
| 546 | + com.google.datastore.v1beta3.QueryResultBatch.newBuilder() |
| 547 | + .mergeFrom(queryResultBatchPb) |
| 548 | + .setMoreResults( |
| 549 | + com.google.datastore.v1beta3.QueryResultBatch.MoreResultsType.NOT_FINISHED) |
| 550 | + .clearEntityResults() |
| 551 | + .addAllEntityResults(queryResultBatchPb.getEntityResultsList().subList(1, 3)) |
| 552 | + .setEndCursor(queryResultBatchPb.getEntityResultsList().get(2).getCursor()) |
| 553 | + .build(); |
| 554 | + responses.add( |
| 555 | + com.google.datastore.v1beta3.RunQueryResponse.newBuilder() |
| 556 | + .setBatch(queryResultBatchPb2) |
| 557 | + .build()); |
| 558 | + com.google.datastore.v1beta3.QueryResultBatch queryResultBatchPb3 = |
| 559 | + com.google.datastore.v1beta3.QueryResultBatch.newBuilder() |
| 560 | + .mergeFrom(queryResultBatchPb) |
| 561 | + .setMoreResults( |
| 562 | + com.google.datastore.v1beta3.QueryResultBatch.MoreResultsType.NO_MORE_RESULTS) |
| 563 | + .clearEntityResults() |
| 564 | + .addAllEntityResults(queryResultBatchPb.getEntityResultsList().subList(3, 5)) |
| 565 | + .setEndCursor(queryResultBatchPb.getEntityResultsList().get(4).getCursor()) |
| 566 | + .build(); |
| 567 | + responses.add( |
| 568 | + com.google.datastore.v1beta3.RunQueryResponse.newBuilder() |
| 569 | + .setBatch(queryResultBatchPb3) |
| 570 | + .build()); |
| 571 | + return responses; |
453 | 572 | }
|
454 | 573 |
|
455 | 574 | @Test
|
|
0 commit comments