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;
27 RunQueryRequest
buildNextCallPrototype(RunQueryResponse initialResponse
) {
28 return initialRequest
;
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));
45 query
.setOffset(offset
);
49 return dsApiProxy
.runQuery(runQueryRequest
.build());
53 WrappedQueryResult
wrapInitialResult(RunQueryResponse initialResponse
) {
54 return new WrappedQueryResultV4(initialResponse
.getBatch());
58 WrappedQueryResult
wrapResult(RunQueryResponse res
) {
59 return new WrappedQueryResultV4(res
.getBatch());