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
switch return type to optional for ResultSetStats
  • Loading branch information
kolea2 committed Jan 18, 2024
commit 4a6dc23d055bdd30647778c391a9e202dc220d0c
2 changes: 1 addition & 1 deletion google-cloud-datastore/clirr-ignored-differences.xml
Expand Up @@ -14,7 +14,7 @@
</difference>
<difference>
<className>com/google/cloud/datastore/QueryResults</className>
<method>com.google.cloud.datastore.models.ResultSetStats getResultSetStats()</method>
<method>java.util.Optional getResultSetStats()</method>
<differenceType>7012</differenceType>
</difference>
<difference>
Expand Down
Expand Up @@ -23,6 +23,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
* The result of an {@link AggregationQuery} query submission. Contains a List&lt;{@link
Expand Down Expand Up @@ -64,8 +65,8 @@ public int size() {
/*
* Returns the ResultSetStats if QueryMode is set to EXPLAIN or EXPLAIN_ANALYZE. Otherwise, returns null.
*/
public ResultSetStats getResultSetStats() {
return this.resultSetStats;
public Optional<ResultSetStats> getResultSetStats() {
return Optional.ofNullable(this.resultSetStats);
}

@InternalApi
Expand Down
Expand Up @@ -20,6 +20,7 @@
import com.google.cloud.datastore.models.ResultSetStats;
import com.google.datastore.v1.QueryResultBatch;
import java.util.Iterator;
import java.util.Optional;

/**
* The result of a Google Cloud Datastore query submission. When the result is not typed it is
Expand Down Expand Up @@ -77,7 +78,7 @@ public interface QueryResults<V> extends Iterator<V> {
* Returns the {@link ResultSetStats} if {@link QueryMode} was set to EXPLAIN or EXPLAIN_ANALYZE. Otherwise, it will return null.
*/
@BetaApi
default ResultSetStats getResultSetStats() {
throw new UnsupportedOperationException("not implemented");
default Optional<ResultSetStats> getResultSetStats() {
throw new UnsupportedOperationException("Not implemented.");
}
}
Expand Up @@ -149,7 +149,7 @@ public MoreResultsType getMoreResults() {

@Override
@BetaApi
public ResultSetStats getResultSetStats() {
return this.resultSetStats;
public Optional<ResultSetStats> getResultSetStats() {
return Optional.ofNullable(this.resultSetStats);
}
}
Expand Up @@ -19,6 +19,7 @@
import com.google.cloud.Structs;
import com.google.common.base.Objects;
import java.util.Map;
import java.util.Optional;

/*
* Model class containing the planning and execution stats for the query. If QueryMode.EXPLAIN_ANALYZE was set,
Expand All @@ -40,7 +41,7 @@ public ResultSetStats(com.google.datastore.v1.ResultSetStats proto) {
}

/*
* Returns the plan for the query, if EXPLAIN or EXPLAIN_ANALYZE was set. Otherwise, returns null.
* Returns the plan for the query.
*/
public QueryPlan getQueryPlan() {
return this.queryPlan;
Expand All @@ -49,8 +50,8 @@ public QueryPlan getQueryPlan() {
/*
* Returns the stats for the query if EXPLAIN_ANALYZE was set. Otherwise, returns null.
*/
public Map<String, Object> getQueryStats() {
return this.queryStats;
public Optional<Map<String, Object>> getQueryStats() {
return Optional.ofNullable(this.queryStats);
}

public boolean hasQueryStats() {
Expand Down
Expand Up @@ -78,7 +78,7 @@ public void shouldTransformAggregationQueryResponseWithIntValues() {
assertThat(aggregationResults.get(0)).isEqualTo(new AggregationResult(toDomainValues(result1)));
assertThat(aggregationResults.get(1)).isEqualTo(new AggregationResult(toDomainValues(result2)));
assertThat(aggregationResults.getReadTime()).isEqualTo(readTime);
assertThat(aggregationResults.getResultSetStats()).isEqualTo(null);
assertThat(aggregationResults.getResultSetStats().isPresent()).isFalse();
}

@Test
Expand Down Expand Up @@ -120,7 +120,7 @@ public void shouldTransformAggregationQueryResponseWithIntValuesWithStats() {
assertThat(aggregationResults.get(0)).isEqualTo(new AggregationResult(toDomainValues(result1)));
assertThat(aggregationResults.get(1)).isEqualTo(new AggregationResult(toDomainValues(result2)));
assertThat(aggregationResults.getReadTime()).isEqualTo(readTime);
assertThat(aggregationResults.getResultSetStats())
assertThat(aggregationResults.getResultSetStats().get())
.isEqualTo(new com.google.cloud.datastore.models.ResultSetStats(stats));
}

Expand Down
Expand Up @@ -389,19 +389,19 @@ public void testQueryProfile() {
QueryResults<Entity> results =
datastore.run(simpleOrQuery, QueryProfile.QueryMode.EXPLAIN_ANALYZE);
Truth.assertThat(results.hasNext()).isTrue();
ResultSetStats resultSetStats = results.getResultSetStats();
ResultSetStats resultSetStats = results.getResultSetStats().get();
assertQueryPlan(resultSetStats);
assertQueryStats(resultSetStats);

QueryResults<Entity> results2 = datastore.run(simpleOrQuery, QueryProfile.QueryMode.EXPLAIN);
Truth.assertThat(results2.hasNext()).isFalse();
ResultSetStats resultSetStats2 = results2.getResultSetStats();
ResultSetStats resultSetStats2 = results2.getResultSetStats().get();
assertQueryPlan(resultSetStats2);
Truth.assertThat(resultSetStats2.getQueryStats()).isNull();
Truth.assertThat(resultSetStats2.getQueryStats().isPresent()).isFalse();

QueryResults<Entity> results3 = datastore.run(simpleOrQuery, QueryProfile.QueryMode.NORMAL);
Truth.assertThat(results3.hasNext()).isTrue();
Truth.assertThat(results3.getResultSetStats()).isNull();
Truth.assertThat(results3.getResultSetStats().isPresent()).isFalse();

AggregationQuery aggregationQuery =
Query.newAggregationQueryBuilder().over(simpleOrQuery).addAggregation(count()).build();
Expand All @@ -410,7 +410,7 @@ public void testQueryProfile() {

Truth.assertThat(resultsAggregation.size() > 0).isTrue();

ResultSetStats aggregationStats = resultsAggregation.getResultSetStats();
ResultSetStats aggregationStats = resultsAggregation.getResultSetStats().get();
assertQueryPlan(aggregationStats);
assertQueryStats(aggregationStats);
}
Expand Down Expand Up @@ -540,7 +540,7 @@ public void testTransactionQueryModeExplainAnalyze() {
assertEquals(ENTITY2, baseResults.next());
assertFalse(baseResults.hasNext());

ResultSetStats resultSetStats = baseResults.getResultSetStats();
ResultSetStats resultSetStats = baseResults.getResultSetStats().get();
assertQueryPlan(resultSetStats);
assertQueryStats(resultSetStats);

Expand All @@ -557,7 +557,7 @@ public void testTransactionQueryModeExplainAnalyze() {
aggregationQuery, QueryProfile.QueryMode.EXPLAIN_ANALYZE);
assertTrue(results.size() > 0);

ResultSetStats aggregationStats = results.getResultSetStats();
ResultSetStats aggregationStats = results.getResultSetStats().get();
assertQueryPlan(aggregationStats);
assertQueryStats(aggregationStats);
aggregationTransaction.commit();
Expand All @@ -575,10 +575,10 @@ public void testTransactionQueryModeExplain() {
QueryResults<Entity> baseResults = baseTransaction.run(query, QueryProfile.QueryMode.EXPLAIN);
assertFalse(baseResults.hasNext());

ResultSetStats resultSetStats = baseResults.getResultSetStats();
ResultSetStats resultSetStats = baseResults.getResultSetStats().get();
assertQueryPlan(resultSetStats);
Truth.assertThat(resultSetStats.hasQueryStats()).isFalse();
Truth.assertThat(resultSetStats.getQueryStats()).isNull();
Truth.assertThat(resultSetStats.getQueryStats().isPresent()).isFalse();

AggregationQuery aggregationQuery =
Query.newAggregationQueryBuilder().addAggregation(count()).over(query).build();
Expand All @@ -588,18 +588,18 @@ public void testTransactionQueryModeExplain() {
aggregationTransaction.runAggregation(aggregationQuery, QueryProfile.QueryMode.EXPLAIN);
assertFalse(results.size() > 0);

ResultSetStats aggregationStats = results.getResultSetStats();
ResultSetStats aggregationStats = results.getResultSetStats().get();
assertQueryPlan(aggregationStats);
Truth.assertThat(aggregationStats.hasQueryStats()).isFalse();
Truth.assertThat(aggregationStats.getQueryStats()).isNull();
Truth.assertThat(aggregationStats.getQueryStats().isPresent()).isFalse();
}

private void assertQueryPlan(ResultSetStats resultSetStats) {
Truth.assertThat(resultSetStats.getQueryPlan().getPlanInfo().keySet()).contains("indexes_used");
}

private void assertQueryStats(ResultSetStats resultSetStats) {
Map<String, Object> queryStatsAggregation = resultSetStats.getQueryStats();
Map<String, Object> queryStatsAggregation = resultSetStats.getQueryStats().get();
Truth.assertThat(queryStatsAggregation.keySet())
.containsAtLeast(
"bytes_returned",
Expand All @@ -621,7 +621,7 @@ public void testTransactionQueryModeNormal() {
QueryResults<Entity> baseResults = baseTransaction.run(query, QueryProfile.QueryMode.NORMAL);
assertTrue(baseResults.hasNext());

Truth.assertThat(baseResults.getResultSetStats()).isNull();
Truth.assertThat(baseResults.getResultSetStats().isPresent()).isFalse();
baseTransaction.commit();

AggregationQuery aggregationQuery =
Expand All @@ -632,7 +632,7 @@ public void testTransactionQueryModeNormal() {
aggregationTransaction.runAggregation(aggregationQuery, QueryProfile.QueryMode.NORMAL);
assertTrue(results.size() > 0);

Truth.assertThat(results.getResultSetStats()).isNull();
Truth.assertThat(results.getResultSetStats().isPresent()).isFalse();
aggregationTransaction.commit();
}

Expand Down Expand Up @@ -1819,8 +1819,8 @@ private void testCountAggregationReadTimeWith(Consumer<AggregationQuery.Builder>
countAggregationQuery, QueryMode.EXPLAIN_ANALYZE, ReadOption.readTime(now));
Long oldCount = getOnlyElement(results).getLong("total_count");
assertThat(oldCount).isEqualTo(2L);
assertQueryPlan(results.getResultSetStats());
assertQueryStats(results.getResultSetStats());
assertQueryPlan(results.getResultSetStats().get());
assertQueryStats(results.getResultSetStats().get());
} finally {
datastore.delete(entity1.getKey(), entity2.getKey(), entity3.getKey());
}
Expand Down
Expand Up @@ -44,7 +44,7 @@ public void testResultSetStatsModel() {
ResultSetStats resultSetStats = new ResultSetStats(proto);

Truth.assertThat(resultSetStats.getQueryPlan()).isEqualTo(new QueryPlan(queryPlanProto));
Truth.assertThat(resultSetStats.getQueryStats()).isEqualTo(Structs.asMap(statsProto));
Truth.assertThat(resultSetStats.getQueryStats().get()).isEqualTo(Structs.asMap(statsProto));
}

@Test
Expand Down