Skip to content

Commit ae79a99

Browse files
refactor(datastore): extract DatastoreExecutionOptions for query execution options
1 parent e5396c0 commit ae79a99

8 files changed

Lines changed: 336 additions & 130 deletions

File tree

java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/Datastore.java

Lines changed: 5 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -495,28 +495,10 @@ interface TransactionCallable<T> {
495495
<T> QueryResults<T> run(Query<T> query, ExplainOptions explainOptions, ReadOption... options);
496496

497497
/**
498-
* Submits a {@link Query} with specified {@link com.google.datastore.v1.RequestOptions} and
499-
* returns its result.
500-
*/
501-
<T> QueryResults<T> run(Query<T> query, RequestOptions requestOptions);
502-
503-
/**
504-
* Submits a {@link Query} with specified {@link com.google.datastore.v1.RequestOptions} and
505-
* returns its result. {@link ReadOption}s can be specified if desired.
506-
*/
507-
<T> QueryResults<T> run(Query<T> query, RequestOptions requestOptions, ReadOption... options);
508-
509-
/**
510-
* Submits a {@link Query} with specified {@link com.google.cloud.datastore.models.ExplainOptions}
511-
* and {@link com.google.datastore.v1.RequestOptions} and returns its result. {@link ReadOption}s
512-
* can be specified if desired.
498+
* Submits a {@link Query} with specified {@link DatastoreExecutionOptions} and returns its result.
513499
*/
514500
@BetaApi
515-
<T> QueryResults<T> run(
516-
Query<T> query,
517-
ExplainOptions explainOptions,
518-
RequestOptions requestOptions,
519-
ReadOption... options);
501+
<T> QueryResults<T> run(Query<T> query, DatastoreExecutionOptions executionOptions);
520502

521503
/**
522504
* Submits a {@link AggregationQuery} and returns {@link AggregationResults}. {@link ReadOption}s
@@ -563,20 +545,6 @@ <T> QueryResults<T> run(
563545
*/
564546
AggregationResults runAggregation(AggregationQuery query, ReadOption... options);
565547

566-
/**
567-
* Submits an {@link AggregationQuery} with specified {@link
568-
* com.google.datastore.v1.RequestOptions} and returns {@link AggregationResults}.
569-
*/
570-
AggregationResults runAggregation(AggregationQuery query, RequestOptions requestOptions);
571-
572-
/**
573-
* Submits an {@link AggregationQuery} with specified {@link
574-
* com.google.datastore.v1.RequestOptions} and returns {@link AggregationResults}. {@link
575-
* ReadOption}s can be specified if desired.
576-
*/
577-
AggregationResults runAggregation(
578-
AggregationQuery query, RequestOptions requestOptions, ReadOption... options);
579-
580548
/**
581549
* Submits a {@link AggregationQuery} with specified {@link
582550
* com.google.cloud.datastore.models.ExplainOptions} and returns {@link AggregationResults}.
@@ -605,26 +573,12 @@ AggregationResults runAggregation(
605573
AggregationQuery query, ExplainOptions explainOptions, ReadOption... options);
606574

607575
/**
608-
* Submits an {@link AggregationQuery} with specified {@link
609-
* com.google.cloud.datastore.models.ExplainOptions} and {@link
610-
* com.google.datastore.v1.RequestOptions} and returns {@link AggregationResults}.
611-
*/
612-
@BetaApi
613-
AggregationResults runAggregation(
614-
AggregationQuery query, ExplainOptions explainOptions, RequestOptions requestOptions);
615-
616-
/**
617-
* Submits an {@link AggregationQuery} with specified {@link
618-
* com.google.cloud.datastore.models.ExplainOptions} and {@link
619-
* com.google.datastore.v1.RequestOptions} and returns {@link AggregationResults}. {@link
620-
* ReadOption}s can be specified if desired.
576+
* Submits an {@link AggregationQuery} with specified {@link DatastoreExecutionOptions} and returns
577+
* {@link AggregationResults}.
621578
*/
622579
@BetaApi
623580
AggregationResults runAggregation(
624-
AggregationQuery query,
625-
ExplainOptions explainOptions,
626-
RequestOptions requestOptions,
627-
ReadOption... options);
581+
AggregationQuery query, DatastoreExecutionOptions executionOptions);
628582

629583
/**
630584
* Closes the gRPC channels associated with this instance and frees up their resources. This
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
/*
2+
* Copyright 2026 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.google.cloud.datastore;
18+
19+
import com.google.api.core.BetaApi;
20+
import com.google.cloud.datastore.models.ExplainOptions;
21+
import com.google.common.base.Objects;
22+
import com.google.common.collect.ImmutableList;
23+
import com.google.datastore.v1.RequestOptions;
24+
import java.util.Arrays;
25+
import java.util.Collections;
26+
import java.util.List;
27+
28+
/**
29+
* Class representing options for query execution in Google Cloud Datastore. Combines {@link
30+
* ExplainOptions}, {@link RequestOptions}, and {@link ReadOption}s.
31+
*/
32+
@BetaApi
33+
public class DatastoreExecutionOptions {
34+
35+
private final ExplainOptions explainOptions;
36+
private final RequestOptions requestOptions;
37+
private final List<ReadOption> readOptions;
38+
39+
private DatastoreExecutionOptions(Builder builder) {
40+
this.explainOptions = builder.explainOptions;
41+
this.requestOptions = builder.requestOptions;
42+
this.readOptions = ImmutableList.copyOf(builder.readOptions);
43+
}
44+
45+
public ExplainOptions getExplainOptions() {
46+
return explainOptions;
47+
}
48+
49+
public RequestOptions getRequestOptions() {
50+
return requestOptions;
51+
}
52+
53+
public List<ReadOption> getReadOptions() {
54+
return readOptions;
55+
}
56+
57+
@Override
58+
public boolean equals(Object o) {
59+
if (this == o) return true;
60+
if (!(o instanceof DatastoreExecutionOptions)) return false;
61+
DatastoreExecutionOptions that = (DatastoreExecutionOptions) o;
62+
return Objects.equal(explainOptions, that.explainOptions)
63+
&& Objects.equal(requestOptions, that.requestOptions)
64+
&& Objects.equal(readOptions, that.readOptions);
65+
}
66+
67+
@Override
68+
public int hashCode() {
69+
return Objects.hashCode(explainOptions, requestOptions, readOptions);
70+
}
71+
72+
public static Builder newBuilder() {
73+
return new Builder();
74+
}
75+
76+
public static DatastoreExecutionOptions of(RequestOptions requestOptions) {
77+
return newBuilder().setRequestOptions(requestOptions).build();
78+
}
79+
80+
public static DatastoreExecutionOptions of(ExplainOptions explainOptions) {
81+
return newBuilder().setExplainOptions(explainOptions).build();
82+
}
83+
84+
public static DatastoreExecutionOptions of(ReadOption... readOptions) {
85+
return newBuilder().setReadOptions(readOptions).build();
86+
}
87+
88+
public static DatastoreExecutionOptions of(
89+
RequestOptions requestOptions, ReadOption... readOptions) {
90+
return newBuilder().setRequestOptions(requestOptions).setReadOptions(readOptions).build();
91+
}
92+
93+
public static DatastoreExecutionOptions of(
94+
ExplainOptions explainOptions, RequestOptions requestOptions, ReadOption... readOptions) {
95+
return newBuilder()
96+
.setExplainOptions(explainOptions)
97+
.setRequestOptions(requestOptions)
98+
.setReadOptions(readOptions)
99+
.build();
100+
}
101+
102+
/** Builder for {@link DatastoreExecutionOptions}. */
103+
public static class Builder {
104+
private ExplainOptions explainOptions;
105+
private RequestOptions requestOptions;
106+
private List<ReadOption> readOptions = Collections.emptyList();
107+
108+
private Builder() {}
109+
110+
public Builder setExplainOptions(ExplainOptions explainOptions) {
111+
this.explainOptions = explainOptions;
112+
return this;
113+
}
114+
115+
public Builder setRequestOptions(RequestOptions requestOptions) {
116+
this.requestOptions = requestOptions;
117+
return this;
118+
}
119+
120+
public Builder setReadOptions(ReadOption... readOptions) {
121+
this.readOptions = readOptions != null ? Arrays.asList(readOptions) : Collections.emptyList();
122+
return this;
123+
}
124+
125+
public Builder setReadOptions(List<ReadOption> readOptions) {
126+
this.readOptions = readOptions != null ? readOptions : Collections.emptyList();
127+
return this;
128+
}
129+
130+
public DatastoreExecutionOptions build() {
131+
return new DatastoreExecutionOptions(this);
132+
}
133+
}
134+
}

java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java

Lines changed: 12 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -345,28 +345,17 @@ public <T> QueryResults<T> run(
345345
return run(toReadOptionsPb(options), query, explainOptions.toPb());
346346
}
347347

348-
/** Implements run query with request options. */
349-
@Override
350-
public <T> QueryResults<T> run(Query<T> query, RequestOptions requestOptions) {
351-
return run(Optional.empty(), query, null, requestOptions);
352-
}
353-
354-
/** Implements run query with request options and read options. */
355-
@Override
356-
public <T> QueryResults<T> run(
357-
Query<T> query, RequestOptions requestOptions, ReadOption... options) {
358-
return run(toReadOptionsPb(options), query, null, requestOptions);
359-
}
360-
361-
/** Implements run query with explain options, request options and read options. */
348+
/** Implements run query with execution options. */
362349
@Override
363350
@BetaApi
364-
public <T> QueryResults<T> run(
365-
Query<T> query,
366-
com.google.cloud.datastore.models.ExplainOptions explainOptions,
367-
RequestOptions requestOptions,
368-
ReadOption... options) {
369-
return run(toReadOptionsPb(options), query, explainOptions.toPb(), requestOptions);
351+
public <T> QueryResults<T> run(Query<T> query, DatastoreExecutionOptions executionOptions) {
352+
com.google.cloud.datastore.models.ExplainOptions explainOptions =
353+
executionOptions.getExplainOptions();
354+
return run(
355+
toReadOptionsPb(executionOptions.getReadOptions().toArray(new ReadOption[0])),
356+
query,
357+
explainOptions != null ? explainOptions.toPb() : null,
358+
executionOptions.getRequestOptions());
370359
}
371360

372361
@SuppressWarnings("unchecked")
@@ -396,41 +385,18 @@ public AggregationResults runAggregation(AggregationQuery query) {
396385
return aggregationQueryExecutor.execute(query, null);
397386
}
398387

399-
/** Implements run aggregation query with request options. */
400-
@Override
401-
public AggregationResults runAggregation(AggregationQuery query, RequestOptions requestOptions) {
402-
return aggregationQueryExecutor.execute(query, null, requestOptions);
403-
}
404-
405388
@Override
406389
public AggregationResults runAggregation(AggregationQuery query, ReadOption... options) {
407390
return aggregationQueryExecutor.execute(query, null, options);
408391
}
409392

410-
/** Implements run aggregation query with request options and read options. */
411-
@Override
412-
public AggregationResults runAggregation(
413-
AggregationQuery query, RequestOptions requestOptions, ReadOption... options) {
414-
return aggregationQueryExecutor.execute(query, null, requestOptions, options);
415-
}
416-
417393
@Override
418394
@BetaApi
419395
public AggregationResults runAggregation(
420396
AggregationQuery query, com.google.cloud.datastore.models.ExplainOptions explainOptions) {
421397
return aggregationQueryExecutor.execute(query, explainOptions);
422398
}
423399

424-
/** Implements run aggregation query with explain options and request options. */
425-
@Override
426-
@BetaApi
427-
public AggregationResults runAggregation(
428-
AggregationQuery query,
429-
com.google.cloud.datastore.models.ExplainOptions explainOptions,
430-
RequestOptions requestOptions) {
431-
return aggregationQueryExecutor.execute(query, explainOptions, requestOptions);
432-
}
433-
434400
@Override
435401
@BetaApi
436402
public AggregationResults runAggregation(
@@ -440,15 +406,12 @@ public AggregationResults runAggregation(
440406
return aggregationQueryExecutor.execute(query, explainOptions, options);
441407
}
442408

443-
/** Implements run aggregation query with explain options, request options and read options. */
409+
/** Implements run aggregation query with execution options. */
444410
@Override
445411
@BetaApi
446412
public AggregationResults runAggregation(
447-
AggregationQuery query,
448-
com.google.cloud.datastore.models.ExplainOptions explainOptions,
449-
RequestOptions requestOptions,
450-
ReadOption... options) {
451-
return aggregationQueryExecutor.execute(query, explainOptions, requestOptions, options);
413+
AggregationQuery query, DatastoreExecutionOptions executionOptions) {
414+
return aggregationQueryExecutor.execute(query, executionOptions);
452415
}
453416

454417
RunQueryResponse runQuery(final RunQueryRequest requestPb) {

java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/QueryResultsImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ private void sendRequest() {
130130
if (explainOptions != null) {
131131
requestPb.setExplainOptions(explainOptions);
132132
}
133-
if (requestOptions != null || !datastore.getOptions().getRequestTags().isEmpty()) {
133+
if (requestOptions != null) {
134134
requestPb.setRequestOptions(
135135
RequestOptionsHelper.createRequestOptions(datastore.getOptions(), requestOptions));
136136
}

java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/ReadOption.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,20 @@ public static <Q extends Query<?>> QueryConfig<Q> create(
207207
.build();
208208
}
209209

210+
public static <Q extends Query<?>> QueryConfig<Q> createWithExecutionOptions(
211+
Q query, DatastoreExecutionOptions executionOptions) {
212+
if (executionOptions == null) {
213+
return create(query, (com.google.datastore.v1.ExplainOptions) null);
214+
}
215+
return create(
216+
query,
217+
executionOptions.getExplainOptions() != null
218+
? executionOptions.getExplainOptions().toPb()
219+
: null,
220+
executionOptions.getReadOptions(),
221+
executionOptions.getRequestOptions());
222+
}
223+
210224
/** Creates a new builder for {@link QueryConfig}. */
211225
public static <Q extends Query<?>> Builder<Q> newBuilder() {
212226
return new Builder<>();

0 commit comments

Comments
 (0)