1 package com
.google
.appengine
.api
.datastore
;
3 import com
.google
.datastore
.v1beta3
.QueryResultBatch
;
4 import com
.google
.datastore
.v1beta3
.RunQueryRequest
;
5 import com
.google
.datastore
.v1beta3
.RunQueryResponse
;
7 import java
.util
.concurrent
.Future
;
9 class QueryResultsSourceCloudDatastoreV1
extends
10 BaseQueryResultsSource
<RunQueryResponse
, RunQueryRequest
, RunQueryResponse
> {
12 private final CloudDatastoreV1Proxy dsApiProxy
;
13 private final RunQueryRequest initialRequest
;
14 private int remainingLimit
;
16 QueryResultsSourceCloudDatastoreV1(DatastoreCallbacks callbacks
, FetchOptions fetchOptions
,
17 Transaction txn
, Query query
, RunQueryRequest request
,
18 Future
<RunQueryResponse
> runQueryResponse
, CloudDatastoreV1Proxy dsApiProxy
) {
19 super(callbacks
, fetchOptions
, txn
, query
, runQueryResponse
);
20 this.initialRequest
= request
;
21 this.dsApiProxy
= dsApiProxy
;
22 remainingLimit
= fetchOptions
.getLimit() != null ? fetchOptions
.getLimit() : -1;
26 RunQueryRequest
buildNextCallPrototype(RunQueryResponse initialResponse
) {
27 return initialRequest
;
31 Future
<RunQueryResponse
> makeNextCall(RunQueryRequest prototype
, WrappedQueryResult latestResult
,Integer fetchCount
,Integer offset
) {
32 RunQueryRequest
.Builder runQueryRequest
= prototype
.toBuilder();
33 com
.google
.datastore
.v1beta3
.Query
.Builder query
= runQueryRequest
.getQueryBuilder();
34 QueryResultBatch latestBatch
= ((WrappedQueryResultCloudDatastoreV1
) latestResult
).getBatch();
35 if (latestBatch
.getEndCursor().isEmpty()) {
36 throw new IllegalArgumentException();
38 query
.setStartCursor(latestBatch
.getEndCursor());
39 if (query
.hasLimit()) {
40 remainingLimit
-= latestBatch
.getEntityResultsCount();
41 query
.getLimitBuilder().setValue(Math
.max(remainingLimit
, 0));
44 query
.setOffset(offset
);
48 return dsApiProxy
.runQuery(runQueryRequest
.build());
52 WrappedQueryResult
wrapInitialResult(RunQueryResponse initialResponse
) {
53 return new WrappedQueryResultCloudDatastoreV1(initialResponse
.getBatch());
57 WrappedQueryResult
wrapResult(RunQueryResponse res
) {
58 return new WrappedQueryResultCloudDatastoreV1(res
.getBatch());