Revision created by MOE tool push_codebase.
[gae.git] / java / src / main / com / google / appengine / api / datastore / QueryResultsSourceCloudDatastore.java
blobba925dcb114be145eb6bb55ffe8675a5cc261614
1 package com.google.appengine.api.datastore;
3 import com.google.apphosting.datastore.DatastoreV4;
4 import com.google.apphosting.datastore.DatastoreV4.QueryResultBatch;
5 import com.google.apphosting.datastore.DatastoreV4.RunQueryRequest;
6 import com.google.apphosting.datastore.DatastoreV4.RunQueryResponse;
8 import java.util.concurrent.Future;
10 class QueryResultsSourceCloudDatastore extends
11 BaseQueryResultsSource<RunQueryResponse, RunQueryRequest, RunQueryResponse> {
13 private final DatastoreV4Proxy dsApiProxy;
14 private final RunQueryRequest initialRequest;
15 private int remainingLimit;
17 QueryResultsSourceCloudDatastore(DatastoreCallbacks callbacks, FetchOptions fetchOptions,
18 Transaction txn, Query query, RunQueryRequest request,
19 Future<RunQueryResponse> runQueryResponse, DatastoreV4Proxy dsApiProxy) {
20 super(callbacks, fetchOptions, txn, query, runQueryResponse);
21 this.initialRequest = request;
22 this.dsApiProxy = dsApiProxy;
23 remainingLimit = fetchOptions.getLimit() != null ? fetchOptions.getLimit() : -1;
26 @Override
27 RunQueryRequest buildNextCallPrototype(RunQueryResponse initialResponse) {
28 return initialRequest;
31 @Override
32 Future<RunQueryResponse> makeNextCall(RunQueryRequest prototype, WrappedQueryResult latestResult,Integer fetchCount,Integer offset) {
33 RunQueryRequest.Builder runQueryRequest = prototype.toBuilder();
34 DatastoreV4.Query.Builder query = runQueryRequest.getQueryBuilder();
35 QueryResultBatch latestBatch = ((WrappedQueryResultV4) latestResult).getBatch();
36 if (!latestBatch.hasEndCursor()) {
37 throw new IllegalArgumentException();
39 query.setStartCursor(latestBatch.getEndCursor());
40 if (query.hasLimit()) {
41 remainingLimit -= latestBatch.getEntityResultCount();
42 query.setLimit(Math.max(remainingLimit, 0));
44 if (offset != null) {
45 query.setOffset(offset);
46 } else {
47 query.clearOffset();
49 return dsApiProxy.runQuery(runQueryRequest.build());
52 @Override
53 WrappedQueryResult wrapInitialResult(RunQueryResponse initialResponse) {
54 return new WrappedQueryResultV4(initialResponse.getBatch());
57 @Override
58 WrappedQueryResult wrapResult(RunQueryResponse res) {
59 return new WrappedQueryResultV4(res.getBatch());