|
27 | 27 |
|
28 | 28 | import com.google.api.services.datastore.DatastoreV1;
|
29 | 29 | import com.google.api.services.datastore.DatastoreV1.EntityResult;
|
| 30 | +import com.google.api.services.datastore.DatastoreV1.QueryResultBatch; |
| 31 | +import com.google.api.services.datastore.DatastoreV1.RunQueryRequest; |
| 32 | +import com.google.api.services.datastore.DatastoreV1.RunQueryResponse; |
30 | 33 | import com.google.common.collect.Iterators;
|
31 | 34 | import com.google.gcloud.RetryParams;
|
32 | 35 | import com.google.gcloud.datastore.Query.ResultType;
|
@@ -462,6 +465,89 @@ public void testRunStructuredQuery() {
|
462 | 465 | assertFalse(results4.hasNext());
|
463 | 466 | }
|
464 | 467 |
|
| 468 | + @Test |
| 469 | + public void testQueryPaginationWithLimit() throws DatastoreRpcException { |
| 470 | + DatastoreRpcFactory rpcFactoryMock = EasyMock.createStrictMock(DatastoreRpcFactory.class); |
| 471 | + DatastoreRpc rpcMock = EasyMock.createStrictMock(DatastoreRpc.class); |
| 472 | + EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(DatastoreOptions.class))) |
| 473 | + .andReturn(rpcMock); |
| 474 | + List<RunQueryResponse> responses = buildResponsesForQueryPaginationWithLimit(); |
| 475 | + for (int i = 0; i < responses.size(); i++) { |
| 476 | + EasyMock.expect(rpcMock.runQuery(EasyMock.anyObject(RunQueryRequest.class))) |
| 477 | + .andReturn(responses.get(i)); |
| 478 | + } |
| 479 | + EasyMock.replay(rpcFactoryMock, rpcMock); |
| 480 | + Datastore mockDatastore = options.toBuilder() |
| 481 | + .retryParams(RetryParams.defaultInstance()) |
| 482 | + .serviceRpcFactory(rpcFactoryMock) |
| 483 | + .build() |
| 484 | + .service(); |
| 485 | + int limit = 2; |
| 486 | + int totalCount = 0; |
| 487 | + StructuredQuery<Entity> query = Query.entityQueryBuilder().limit(limit).build(); |
| 488 | + while (true) { |
| 489 | + QueryResults<Entity> results = mockDatastore.run(query); |
| 490 | + int resultCount = 0; |
| 491 | + while (results.hasNext()) { |
| 492 | + results.next(); |
| 493 | + resultCount++; |
| 494 | + totalCount++; |
| 495 | + } |
| 496 | + if (resultCount < limit) { |
| 497 | + break; |
| 498 | + } |
| 499 | + query = query.toBuilder().startCursor(results.cursorAfter()).build(); |
| 500 | + } |
| 501 | + assertEquals(totalCount, 5); |
| 502 | + EasyMock.verify(rpcFactoryMock, rpcMock); |
| 503 | + } |
| 504 | + |
| 505 | + private List<RunQueryResponse> buildResponsesForQueryPaginationWithLimit() { |
| 506 | + Entity entity4 = Entity.builder(KEY4).set("value", StringValue.of("value")).build(); |
| 507 | + Entity entity5 = Entity.builder(KEY5).set("value", "value").build(); |
| 508 | + datastore.add(ENTITY3, entity4, entity5); |
| 509 | + List<RunQueryResponse> responses = new ArrayList<>(); |
| 510 | + Query<Entity> query = Query.entityQueryBuilder().build(); |
| 511 | + RunQueryRequest.Builder requestPb = RunQueryRequest.newBuilder(); |
| 512 | + query.populatePb(requestPb); |
| 513 | + QueryResultBatch queryResultBatchPb = RunQueryResponse.newBuilder() |
| 514 | + .mergeFrom(((DatastoreImpl) datastore).runQuery(requestPb.build())) |
| 515 | + .getBatch(); |
| 516 | + QueryResultBatch queryResultBatchPb1 = QueryResultBatch.newBuilder() |
| 517 | + .mergeFrom(queryResultBatchPb) |
| 518 | + .setMoreResults(QueryResultBatch.MoreResultsType.NOT_FINISHED) |
| 519 | + .clearEntityResult() |
| 520 | + .addAllEntityResult(queryResultBatchPb.getEntityResultList().subList(0, 1)) |
| 521 | + .setEndCursor(queryResultBatchPb.getEntityResultList().get(0).getCursor()) |
| 522 | + .build(); |
| 523 | + responses.add(RunQueryResponse.newBuilder().setBatch(queryResultBatchPb1).build()); |
| 524 | + QueryResultBatch queryResultBatchPb2 = QueryResultBatch.newBuilder() |
| 525 | + .mergeFrom(queryResultBatchPb) |
| 526 | + .setMoreResults(QueryResultBatch.MoreResultsType.MORE_RESULTS_AFTER_LIMIT) |
| 527 | + .clearEntityResult() |
| 528 | + .addAllEntityResult(queryResultBatchPb.getEntityResultList().subList(1, 2)) |
| 529 | + .setEndCursor(queryResultBatchPb.getEntityResultList().get(1).getCursor()) |
| 530 | + .build(); |
| 531 | + responses.add(RunQueryResponse.newBuilder().setBatch(queryResultBatchPb2).build()); |
| 532 | + QueryResultBatch queryResultBatchPb3 = QueryResultBatch.newBuilder() |
| 533 | + .mergeFrom(queryResultBatchPb) |
| 534 | + .setMoreResults(QueryResultBatch.MoreResultsType.MORE_RESULTS_AFTER_LIMIT) |
| 535 | + .clearEntityResult() |
| 536 | + .addAllEntityResult(queryResultBatchPb.getEntityResultList().subList(2, 4)) |
| 537 | + .setEndCursor(queryResultBatchPb.getEntityResultList().get(3).getCursor()) |
| 538 | + .build(); |
| 539 | + responses.add(RunQueryResponse.newBuilder().setBatch(queryResultBatchPb3).build()); |
| 540 | + QueryResultBatch queryResultBatchPb4 = QueryResultBatch.newBuilder() |
| 541 | + .mergeFrom(queryResultBatchPb) |
| 542 | + .setMoreResults(QueryResultBatch.MoreResultsType.NO_MORE_RESULTS) |
| 543 | + .clearEntityResult() |
| 544 | + .addAllEntityResult(queryResultBatchPb.getEntityResultList().subList(4, 5)) |
| 545 | + .setEndCursor(queryResultBatchPb.getEntityResultList().get(4).getCursor()) |
| 546 | + .build(); |
| 547 | + responses.add(RunQueryResponse.newBuilder().setBatch(queryResultBatchPb4).build()); |
| 548 | + return responses; |
| 549 | + } |
| 550 | + |
465 | 551 | @Test
|
466 | 552 | public void testAllocateId() {
|
467 | 553 | KeyFactory keyFactory = datastore.newKeyFactory().kind(KIND1);
|
|
0 commit comments