Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: implement query profile #1365

Merged
merged 19 commits into from
Mar 25, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Prev Previous commit
Next Next commit
new api updates
  • Loading branch information
kolea2 committed Mar 9, 2024
commit d7bbb364d067f3ec2f0d656a37971bfcaa041602
48 changes: 19 additions & 29 deletions google-cloud-datastore/clirr-ignored-differences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,43 +4,47 @@
<!-- added a default method to an interface-->
<difference>
<className>com/google/cloud/datastore/Datastore</className>
<method>com.google.cloud.datastore.QueryResults run(com.google.cloud.datastore.Query, com.google.cloud.datastore.models.QueryProfile$QueryMode, com.google.cloud.datastore.ReadOption[])</method>
<method>com.google.cloud.datastore.QueryResults run(com.google.cloud.datastore.Query, com.google.cloud.datastore.models.ExplainOptions, com.google.cloud.datastore.ReadOption[])</method>
<differenceType>7012</differenceType>
</difference>
<difference>
<className>com/google/cloud/datastore/Datastore</className>
<method>com.google.cloud.datastore.AggregationResults runAggregation(com.google.cloud.datastore.AggregationQuery, com.google.cloud.datastore.models.QueryProfile$QueryMode, com.google.cloud.datastore.ReadOption[])</method>
<method>com.google.cloud.datastore.AggregationResults runAggregation(com.google.cloud.datastore.AggregationQuery, com.google.cloud.datastore.models.ExplainOptions, com.google.cloud.datastore.ReadOption[])</method>
<differenceType>7012</differenceType>
</difference>
<difference>
<className>com/google/cloud/datastore/QueryResults</className>
<method>java.util.Optional getResultSetStats()</method>
<className>com/google/cloud/datastore/DatastoreReader</className>
<method> com.google.cloud.datastore.AggregationResults runAggregation(com.google.cloud.datastore.AggregationQuery, com.google.cloud.datastore.models.ExplainOptions)</method>
<differenceType>7012</differenceType>
</difference>
<difference>
<className>com/google/cloud/datastore/DatastoreReader</className>
<method>com.google.cloud.datastore.AggregationResults runAggregation(com.google.cloud.datastore.AggregationQuery, com.google.cloud.datastore.models.QueryProfile$QueryMode)</method>
<className>com/google/cloud/datastore/QueryResults</className>
<method>java.util.Optional getExecutionStats()</method>
<differenceType>7012</differenceType>
</difference>
<difference>
<className>com/google/cloud/datastore/DatastoreReader</className>
<method>com.google.cloud.datastore.AggregationResults runAggregation(com.google.cloud.datastore.AggregationQuery, com.google.cloud.datastore.models.QueryProfile$QueryMode)</method>
<className>com/google/cloud/datastore/QueryResults</className>
<method>java.util.Optional getPlan()</method>
<differenceType>7012</differenceType>
</difference>
<difference>
<className>com/google/cloud/datastore/Transaction</className>
<method>com.google.cloud.datastore.QueryResults run(com.google.cloud.datastore.Query, com.google.cloud.datastore.models.QueryProfile$QueryMode)</method>
<method>com.google.cloud.datastore.QueryResults run(com.google.cloud.datastore.Query, com.google.cloud.datastore.models.ExplainOptions)</method>
<differenceType>7012</differenceType>
</difference>

<!-- added to internal only interface-->
<!-- changed parmeters on internal only class-->
<difference>
<className>com/google/cloud/datastore/execution/QueryExecutor</className>
<method>java.lang.Object execute(com.google.cloud.datastore.Query, com.google.cloud.datastore.models.QueryProfile$QueryMode, com.google.cloud.datastore.ReadOption[])</method>
<differenceType>7012</differenceType>
<className>com/google/cloud/datastore/ReadOption$QueryConfig</className>
<method>com.google.cloud.datastore.ReadOption$QueryConfig create(com.google.cloud.datastore.Query, java.util.List)</method>
<to>*com.google.datastore.v1.ExplainOptions*</to>
<differenceType>7005</differenceType>
</difference>
<difference>
<className>com/google/cloud/datastore/ReadOption$QueryConfig</className>
<method>com.google.cloud.datastore.ReadOption$QueryConfig create(com.google.cloud.datastore.Query)</method>
<differenceType>7004</differenceType>
</difference>

<!-- updated internal only interface-->
<difference>
<className>com/google/cloud/datastore/execution/AggregationQueryExecutor</className>
<method>com.google.cloud.datastore.AggregationResults execute(com.google.cloud.datastore.AggregationQuery, com.google.cloud.datastore.ReadOption[])</method>
Expand All @@ -56,18 +60,4 @@
<method>java.lang.Object execute(com.google.cloud.datastore.Query, com.google.cloud.datastore.ReadOption[])</method>
<differenceType>7004</differenceType>
</difference>

<!-- updated internal only class and method-->
<difference>
<className>com/google/cloud/datastore/ReadOption$QueryConfig</className>
<method>*QueryConfig*</method>
<to>*com.google.datastore.v1.QueryMode*</to>
<differenceType>7005</differenceType>
</difference>
<difference>
<className>com/google/cloud/datastore/ReadOption$QueryConfig</className>
<method>com.google.cloud.datastore.ReadOption$QueryConfig create(com.google.cloud.datastore.Query)</method>
<differenceType>7004</differenceType>
</difference>

</differences>
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@

import static com.google.api.client.util.Preconditions.checkNotNull;

import com.google.api.core.BetaApi;
import com.google.api.core.InternalApi;
import com.google.cloud.Timestamp;
import com.google.cloud.datastore.models.ResultSetStats;
import com.google.cloud.datastore.models.ExplainMetrics;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
Expand All @@ -35,21 +36,22 @@ public class AggregationResults implements Iterable<AggregationResult> {

private final List<AggregationResult> aggregationResults;
private final Timestamp readTime;
private final ResultSetStats resultSetStats;

public AggregationResults(List<AggregationResult> aggregationResults, Timestamp readTime) {
this(aggregationResults, readTime, null);
}
private final ExplainMetrics explainMetrics;

public AggregationResults(
List<AggregationResult> aggregationResults,
Timestamp readTime,
ResultSetStats resultSetStats) {
ExplainMetrics explainMetrics) {
checkNotNull(aggregationResults, "Aggregation results cannot be null");
checkNotNull(readTime, "readTime cannot be null");
this.aggregationResults = aggregationResults;
this.readTime = readTime;
this.resultSetStats = resultSetStats;
this.explainMetrics = explainMetrics;
}

public AggregationResults(List<AggregationResult> aggregationResults, Timestamp readTime) {
this(aggregationResults, readTime, null);
}

/** Returns {@link Iterator} for underlying List&lt;{@link AggregationResult}&gt;. */
Expand All @@ -65,8 +67,9 @@ public int size() {
/*
* Returns the ResultSetStats if QueryMode is set to EXPLAIN or EXPLAIN_ANALYZE. Otherwise, returns null.
*/
public Optional<ResultSetStats> getResultSetStats() {
return Optional.ofNullable(this.resultSetStats);
@BetaApi
public Optional<ExplainMetrics> getExplainMetrics() {
return Optional.ofNullable(this.explainMetrics);
}

@InternalApi
Expand All @@ -90,11 +93,11 @@ public boolean equals(Object o) {
AggregationResults that = (AggregationResults) o;
return Objects.equals(aggregationResults, that.aggregationResults)
&& Objects.equals(readTime, that.readTime)
&& Objects.equals(resultSetStats, that.resultSetStats);
&& Objects.equals(explainMetrics, that.explainMetrics);
}

@Override
public int hashCode() {
return Objects.hash(aggregationResults, readTime, resultSetStats);
return Objects.hash(aggregationResults, readTime, explainMetrics);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

import com.google.api.core.BetaApi;
import com.google.cloud.Service;
import com.google.cloud.datastore.models.QueryProfile;
import com.google.cloud.datastore.models.ExplainOptions;
import com.google.datastore.v1.TransactionOptions;
import java.util.Iterator;
import java.util.List;
Expand Down Expand Up @@ -465,9 +465,8 @@ interface TransactionCallable<T> {
<T> QueryResults<T> run(Query<T> query, ReadOption... options);

/**
* Submits a {@link Query} with specified {@link
* com.google.cloud.datastore.models.QueryProfile.QueryMode} and returns its result. {@link
* ReadOption}s can be specified if desired.
* Submits a {@link Query} with specified {@link com.google.cloud.datastore.models.ExplainOptions}
* and returns its result. {@link ReadOption}s can be specified if desired.
*
* <p>Example of running a query to find all entities of one kind.
*
Expand All @@ -484,7 +483,7 @@ interface TransactionCallable<T> {
*/
@BetaApi
default <T> QueryResults<T> run(
Query<T> query, QueryProfile.QueryMode queryMode, ReadOption... options) {
Query<T> query, ExplainOptions explainOptions, ReadOption... options) {
throw new UnsupportedOperationException("Not implemented.");
}

Expand Down Expand Up @@ -537,8 +536,8 @@ default AggregationResults runAggregation(AggregationQuery query, ReadOption...

/**
* Submits a {@link AggregationQuery} with specified {@link
* com.google.cloud.datastore.models.QueryProfile.QueryMode} and returns {@link
* AggregationResults}. {@link ReadOption}s can be specified if desired.
* com.google.cloud.datastore.models.ExplainOptions} and returns {@link AggregationResults}.
* {@link ReadOption}s can be specified if desired.
*
* <p>Example of running an {@link AggregationQuery} to find the count of entities of one kind.
*
Expand All @@ -561,7 +560,7 @@ default AggregationResults runAggregation(AggregationQuery query, ReadOption...
*/
@BetaApi
default AggregationResults runAggregation(
AggregationQuery query, QueryProfile.QueryMode queryMode, ReadOption... options) {
AggregationQuery query, ExplainOptions explainOptions, ReadOption... options) {
throw new UnsupportedOperationException("Not implemented.");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,14 @@
import com.google.cloud.RetryHelper.RetryHelperException;
import com.google.cloud.ServiceOptions;
import com.google.cloud.datastore.execution.AggregationQueryExecutor;
import com.google.cloud.datastore.models.QueryProfile;
import com.google.cloud.datastore.spi.v1.DatastoreRpc;
import com.google.common.base.MoreObjects;
import com.google.common.base.Preconditions;
import com.google.common.collect.AbstractIterator;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import com.google.datastore.v1.QueryMode;
import com.google.datastore.v1.ExplainOptions;
import com.google.datastore.v1.ReadOptions;
import com.google.datastore.v1.ReserveIdsRequest;
import com.google.datastore.v1.TransactionOptions;
Expand Down Expand Up @@ -185,50 +184,54 @@ public <T> T runInTransaction(

@Override
public <T> QueryResults<T> run(Query<T> query) {
return run(Optional.empty(), query, QueryMode.NORMAL);
return run(Optional.empty(), query, null);
}

@Override
public <T> QueryResults<T> run(Query<T> query, ReadOption... options) {
return run(toReadOptionsPb(options), query, QueryMode.NORMAL);
return run(toReadOptionsPb(options), query, null);
}

@Override
@BetaApi
public <T> QueryResults<T> run(
Query<T> query, QueryProfile.QueryMode queryMode, ReadOption... options) {
return run(toReadOptionsPb(options), query, queryMode.toPb());
Query<T> query,
com.google.cloud.datastore.models.ExplainOptions explainOptions,
ReadOption... options) {
return run(toReadOptionsPb(options), query, explainOptions.toPb());
}

@SuppressWarnings("unchecked")
<T> QueryResults<T> run(
Optional<ReadOptions> readOptionsPb, Query<T> query, QueryMode queryMode) {
Optional<ReadOptions> readOptionsPb, Query<T> query, ExplainOptions explainOptions) {
return new QueryResultsImpl<T>(
this, readOptionsPb, (RecordQuery<T>) query, query.getNamespace(), queryMode);
this, readOptionsPb, (RecordQuery<T>) query, query.getNamespace(), explainOptions);
}

@Override
public AggregationResults runAggregation(AggregationQuery query) {
return aggregationQueryExecutor.execute(query, QueryProfile.QueryMode.NORMAL);
return aggregationQueryExecutor.execute(query, null);
}

@Override
public AggregationResults runAggregation(AggregationQuery query, ReadOption... options) {
return aggregationQueryExecutor.execute(query, QueryProfile.QueryMode.NORMAL, options);
return aggregationQueryExecutor.execute(query, null, options);
}

@Override
@BetaApi
public AggregationResults runAggregation(
AggregationQuery query, QueryProfile.QueryMode queryMode) {
return aggregationQueryExecutor.execute(query, queryMode);
AggregationQuery query, com.google.cloud.datastore.models.ExplainOptions explainOptions) {
return aggregationQueryExecutor.execute(query, explainOptions);
}

@Override
@BetaApi
public AggregationResults runAggregation(
AggregationQuery query, QueryProfile.QueryMode queryMode, ReadOption... options) {
return aggregationQueryExecutor.execute(query, queryMode, options);
AggregationQuery query,
com.google.cloud.datastore.models.ExplainOptions explainOptions,
ReadOption... options) {
return aggregationQueryExecutor.execute(query, explainOptions, options);
}

com.google.datastore.v1.RunQueryResponse runQuery(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

package com.google.cloud.datastore;

import com.google.cloud.datastore.models.QueryProfile;
import com.google.cloud.datastore.models.ExplainOptions;
import java.util.Iterator;
import java.util.List;

Expand Down Expand Up @@ -71,8 +71,7 @@ default AggregationResults runAggregation(AggregationQuery query) {
*
* @throws DatastoreException upon failure
*/
default AggregationResults runAggregation(
AggregationQuery query, QueryProfile.QueryMode queryMode) {
default AggregationResults runAggregation(AggregationQuery query, ExplainOptions explainOptions) {
throw new UnsupportedOperationException("Not implemented.");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
package com.google.cloud.datastore;

import com.google.api.core.BetaApi;
import com.google.cloud.datastore.models.ResultSetStats;
import com.google.cloud.datastore.models.ExplainMetrics;
import com.google.datastore.v1.QueryResultBatch;
import java.util.Iterator;
import java.util.Optional;
Expand Down Expand Up @@ -74,11 +74,8 @@ public interface QueryResults<V> extends Iterator<V> {
/** Returns MoreResults state of the query after the current batch. */
QueryResultBatch.MoreResultsType getMoreResults();

/*
* Returns the {@link ResultSetStats} if {@link QueryMode} was set to EXPLAIN or EXPLAIN_ANALYZE. Otherwise, it will return null.
*/
@BetaApi
default Optional<ResultSetStats> getResultSetStats() {
throw new UnsupportedOperationException("Not implemented.");
default Optional<ExplainMetrics> getExplainMetrics() {
throw new UnsupportedOperationException("not implemented");
}
}