Skip to content

Commit 90b246b

Browse files
author
Ajay Kannan
committed
---
yaml --- r: 2161 b: refs/heads/pubsub-alpha c: a2e60ab h: refs/heads/master i: 2159: 2c7be82
1 parent 39e78cb commit 90b246b

6 files changed

Lines changed: 119 additions & 6 deletions

File tree

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ refs/heads/master: 689bbb466df4b2d5d2483d6edb8ac5c7c7f7c6fa
33
refs/heads/travis: e21ee7b88a5edc3f3d8c71f90c3fc32abf7e8dd6
44
refs/heads/gh-pages: 4e0561bb4504bf647db669a14417b2b2c87ba45d
55
refs/heads/bigquery: 762fa5830e6c398c0396177e3e7fd243bd62cfc3
6-
refs/heads/pubsub-alpha: cdad97a1a3f40739fadb0cacd802c19fbb2cdfd9
6+
refs/heads/pubsub-alpha: a2e60abf83d6603ecf9f0e80b0c95082e8ce0fbb
77
refs/heads/resource-manager: ebf4adc5ee835cd2086c4ac5b4e78d01a5a005a7
88
refs/heads/update-datastore: 482954f2c5055231e5b3122ea91d2ba00ce8187c
99
refs/tags/0.0.9: 22f1839238f66c39e67ed4dfdcd273b1ae2e8444

branches/pubsub-alpha/README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@ Example Applications
4444

4545
- [`BigQueryExample`](https://github.com/GoogleCloudPlatform/gcloud-java/blob/master/gcloud-java-examples/src/main/java/com/google/gcloud/examples/BigQueryExample.java) - A simple command line interface providing some of Cloud BigQuery's functionality
4646
- Read more about using this application on the [`gcloud-java-examples` docs page](http://googlecloudplatform.github.io/gcloud-java/apidocs/?com/google/gcloud/examples/BigQueryExample.html).
47-
- [`Bookshelf`](https://github.com/GoogleCloudPlatform/getting-started-java/tree/master/bookshelf) - An App Engine app that manages a virtual bookshelf.
48-
- This app uses `gcloud-java` to interface with Cloud Datastore and Cloud Storage. It also uses Cloud SQL, another Google Cloud Platform service.
4947
- [`DatastoreExample`](https://github.com/GoogleCloudPlatform/gcloud-java/blob/master/gcloud-java-examples/src/main/java/com/google/gcloud/examples/DatastoreExample.java) - A simple command line interface for the Cloud Datastore
5048
- Read more about using this application on the [`gcloud-java-examples` docs page](http://googlecloudplatform.github.io/gcloud-java/apidocs/?com/google/gcloud/examples/DatastoreExample.html).
5149
- [`ResourceManagerExample`](https://github.com/GoogleCloudPlatform/gcloud-java/blob/master/gcloud-java-examples/src/main/java/com/google/gcloud/examples/ResourceManagerExample.java) - A simple command line interface providing some of Cloud Resource Manager's functionality

branches/pubsub-alpha/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/QueryResults.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ public interface QueryResults<V> extends Iterator<V> {
3535
Class<?> resultClass();
3636

3737
/**
38-
* Returns the Cursor for point after the value returned in the last {@link #next} call.
39-
* Not currently implemented (depends on v1beta3).
38+
* Returns the Cursor for the point after the value returned in the last {@link #next} call. Until
39+
* v1beta3 is supported, this field should only be used if you have set a limit and the number of
40+
* results is equal to that limit.
4041
*/
4142
Cursor cursorAfter();
4243
}

branches/pubsub-alpha/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/QueryResultsImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,6 @@ public Class<?> resultClass() {
100100
@Override
101101
public Cursor cursorAfter() {
102102
//return new Cursor(cursor); // only available in v1beta3
103-
return null;
103+
return new Cursor(queryResultBatchPb.getEndCursor());
104104
}
105105
}

branches/pubsub-alpha/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/StructuredQuery.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,20 @@ protected static class BaseBuilder<V, B extends BaseBuilder<V, B>> {
633633
this.resultType = resultType;
634634
}
635635

636+
BaseBuilder(StructuredQuery<V> query) {
637+
resultType = query.type();
638+
namespace = query.namespace();
639+
kind = query.kind;
640+
projection.addAll(query.projection);
641+
filter = query.filter;
642+
groupBy.addAll(query.groupBy);
643+
orderBy.addAll(query.orderBy);
644+
startCursor = query.startCursor;
645+
endCursor = query.endCursor;
646+
offset = query.offset;
647+
limit = query.limit;
648+
}
649+
636650
@SuppressWarnings("unchecked")
637651
B self() {
638652
return (B) this;
@@ -773,6 +787,10 @@ static final class Builder<V> extends BaseBuilder<V, Builder<V>> {
773787
Builder(ResultType<V> resultType) {
774788
super(resultType);
775789
}
790+
791+
Builder(StructuredQuery<V> query) {
792+
super(query);
793+
}
776794
}
777795

778796
/**
@@ -953,6 +971,10 @@ public Integer limit() {
953971
return limit;
954972
}
955973

974+
public Builder<V> toBuilder() {
975+
return new Builder<V>(this);
976+
}
977+
956978
@Override
957979
void populatePb(DatastoreV1.RunQueryRequest.Builder requestPb) {
958980
requestPb.setQuery(toPb());

branches/pubsub-alpha/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DatastoreTest.java

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727

2828
import com.google.api.services.datastore.DatastoreV1;
2929
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;
3033
import com.google.common.collect.Iterators;
3134
import com.google.gcloud.RetryParams;
3235
import com.google.gcloud.datastore.Query.ResultType;
@@ -462,6 +465,95 @@ public void testRunStructuredQuery() {
462465
assertFalse(results4.hasNext());
463466
}
464467

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 =
481+
this.options.toBuilder()
482+
.retryParams(RetryParams.defaultInstance())
483+
.serviceRpcFactory(rpcFactoryMock)
484+
.build()
485+
.service();
486+
int limit = 2;
487+
int totalCount = 0;
488+
StructuredQuery<Entity> query = Query.entityQueryBuilder().limit(limit).build();
489+
while (true) {
490+
QueryResults<Entity> results = mockDatastore.run(query);
491+
int resultCount = 0;
492+
while (results.hasNext()) {
493+
results.next();
494+
resultCount++;
495+
totalCount++;
496+
}
497+
if (resultCount < limit) {
498+
break;
499+
}
500+
query = query.toBuilder().startCursor(results.cursorAfter()).build();
501+
}
502+
assertEquals(totalCount, 5);
503+
EasyMock.verify(rpcFactoryMock, rpcMock);
504+
}
505+
506+
private List<RunQueryResponse> buildResponsesForQueryPaginationWithLimit() {
507+
Entity entity4 = Entity.builder(KEY4).set("value", StringValue.of("value")).build();
508+
Entity entity5 = Entity.builder(KEY5).set("value", "value").build();
509+
datastore.add(ENTITY3, entity4, entity5);
510+
List<RunQueryResponse> responses = new ArrayList<>();
511+
Query<Entity> query = Query.entityQueryBuilder().build();
512+
RunQueryRequest.Builder requestPb = RunQueryRequest.newBuilder();
513+
query.populatePb(requestPb);
514+
QueryResultBatch queryResultBatchPb =
515+
RunQueryResponse.newBuilder()
516+
.mergeFrom(((DatastoreImpl) datastore).runQuery(requestPb.build()))
517+
.getBatch();
518+
QueryResultBatch queryResultBatchPb1 =
519+
QueryResultBatch.newBuilder()
520+
.mergeFrom(queryResultBatchPb)
521+
.setMoreResults(QueryResultBatch.MoreResultsType.NOT_FINISHED)
522+
.clearEntityResult()
523+
.addAllEntityResult(queryResultBatchPb.getEntityResultList().subList(0, 1))
524+
.setEndCursor(queryResultBatchPb.getEntityResultList().get(0).getCursor())
525+
.build();
526+
responses.add(RunQueryResponse.newBuilder().setBatch(queryResultBatchPb1).build());
527+
QueryResultBatch queryResultBatchPb2 =
528+
QueryResultBatch.newBuilder()
529+
.mergeFrom(queryResultBatchPb)
530+
.setMoreResults(QueryResultBatch.MoreResultsType.MORE_RESULTS_AFTER_LIMIT)
531+
.clearEntityResult()
532+
.addAllEntityResult(queryResultBatchPb.getEntityResultList().subList(1, 2))
533+
.setEndCursor(queryResultBatchPb.getEntityResultList().get(1).getCursor())
534+
.build();
535+
responses.add(RunQueryResponse.newBuilder().setBatch(queryResultBatchPb2).build());
536+
QueryResultBatch queryResultBatchPb3 =
537+
QueryResultBatch.newBuilder()
538+
.mergeFrom(queryResultBatchPb)
539+
.setMoreResults(QueryResultBatch.MoreResultsType.MORE_RESULTS_AFTER_LIMIT)
540+
.clearEntityResult()
541+
.addAllEntityResult(queryResultBatchPb.getEntityResultList().subList(2, 4))
542+
.setEndCursor(queryResultBatchPb.getEntityResultList().get(3).getCursor())
543+
.build();
544+
responses.add(RunQueryResponse.newBuilder().setBatch(queryResultBatchPb3).build());
545+
QueryResultBatch queryResultBatchPb4 =
546+
QueryResultBatch.newBuilder()
547+
.mergeFrom(queryResultBatchPb)
548+
.setMoreResults(QueryResultBatch.MoreResultsType.NO_MORE_RESULTS)
549+
.clearEntityResult()
550+
.addAllEntityResult(queryResultBatchPb.getEntityResultList().subList(4, 5))
551+
.setEndCursor(queryResultBatchPb.getEntityResultList().get(4).getCursor())
552+
.build();
553+
responses.add(RunQueryResponse.newBuilder().setBatch(queryResultBatchPb4).build());
554+
return responses;
555+
}
556+
465557
@Test
466558
public void testAllocateId() {
467559
KeyFactory keyFactory = datastore.newKeyFactory().kind(KIND1);

0 commit comments

Comments
 (0)