Skip to content

[DE-941] Explain query untyped #585

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

Merged
merged 4 commits into from
Nov 7, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions core/src/main/java/com/arangodb/ArangoDatabase.java
Original file line number Diff line number Diff line change
@@ -363,9 +363,24 @@ public interface ArangoDatabase extends ArangoSerdeAccessor {
* @return information about the query
* @see <a href="https://docs.arangodb.com/stable/develop/http-api/queries/aql-queries/#explain-an-aql-query">API
* Documentation</a>
*
* @deprecated for removal, use {@link ArangoDatabase#explainAqlQuery(String, Map, AqlQueryExplainOptions)} instead
*/
@Deprecated
AqlExecutionExplainEntity explainQuery(String query, Map<String, Object> bindVars, AqlQueryExplainOptions options);

/**
* Explain an AQL query and return information about it
*
* @param query the query which you want explained
* @param bindVars key/value pairs representing the bind parameters
* @param options Additional options, can be null
* @return information about the query
* @see <a href="https://docs.arangodb.com/stable/develop/http-api/queries/aql-queries/#explain-an-aql-query">API
* Documentation</a>
*/
AqlQueryExplainEntity explainAqlQuery(String query, Map<String, Object> bindVars, AqlQueryExplainOptions options);

/**
* Parse an AQL query and return information about it This method is for query validation only. To actually query
* the database, see {@link ArangoDatabase#query(String, Class, Map, AqlQueryOptions)}
8 changes: 8 additions & 0 deletions core/src/main/java/com/arangodb/ArangoDatabaseAsync.java
Original file line number Diff line number Diff line change
@@ -164,9 +164,17 @@ public interface ArangoDatabaseAsync extends ArangoSerdeAccessor {

/**
* Asynchronous version of {@link ArangoDatabase#explainQuery(String, Map, AqlQueryExplainOptions)}
*
* @deprecated for removal, use {@link ArangoDatabaseAsync#explainAqlQuery(String, Map, AqlQueryExplainOptions)} instead
*/
@Deprecated
CompletableFuture<AqlExecutionExplainEntity> explainQuery(String query, Map<String, Object> bindVars, AqlQueryExplainOptions options);

/**
* Asynchronous version of {@link ArangoDatabase#explainAqlQuery(String, Map, AqlQueryExplainOptions)}
*/
CompletableFuture<AqlQueryExplainEntity> explainAqlQuery(String query, Map<String, Object> bindVars, AqlQueryExplainOptions options);

/**
* Asynchronous version of {@link ArangoDatabase#parseQuery(String)}
*/
147 changes: 147 additions & 0 deletions core/src/main/java/com/arangodb/entity/AqlQueryExplainEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
/*
* DISCLAIMER
*
* Copyright 2016 ArangoDB GmbH, Cologne, Germany
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Copyright holder is ArangoDB GmbH, Cologne, Germany
*/

package com.arangodb.entity;

import com.fasterxml.jackson.annotation.JsonAnySetter;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public final class AqlQueryExplainEntity {

private ExecutionPlan plan;
private Collection<ExecutionPlan> plans;
private Collection<CursorWarning> warnings;
private ExecutionStats stats;
private Boolean cacheable;

public ExecutionPlan getPlan() {
return plan;
}

public Collection<ExecutionPlan> getPlans() {
return plans;
}

public Collection<CursorWarning> getWarnings() {
return warnings;
}

public ExecutionStats getStats() {
return stats;
}

public Boolean getCacheable() {
return cacheable;
}

public static final class ExecutionPlan {
private final Map<String, Object> properties = new HashMap<>();
private Collection<ExecutionNode> nodes;
private Double estimatedCost;
private Collection<ExecutionCollection> collections;
private Collection<String> rules;
private Collection<ExecutionVariable> variables;

@JsonAnySetter
public void add(String key, Object value) {
properties.put(key, value);
}

public Object get(String key) {
return properties.get(key);
}

public Collection<ExecutionNode> getNodes() {
return nodes;
}

public Double getEstimatedCost() {
return estimatedCost;
}

public Collection<ExecutionCollection> getCollections() {
return collections;
}

public Collection<String> getRules() {
return rules;
}

public Collection<ExecutionVariable> getVariables() {
return variables;
}
}

public static final class ExecutionNode {
private final Map<String, Object> properties = new HashMap<>();

@JsonAnySetter
public void add(String key, Object value) {
properties.put(key, value);
}

public Object get(String key) {
return properties.get(key);
}
}

public static final class ExecutionVariable {
private final Map<String, Object> properties = new HashMap<>();

@JsonAnySetter
public void add(String key, Object value) {
properties.put(key, value);
}

public Object get(String key) {
return properties.get(key);
}
}

public static final class ExecutionCollection {
private final Map<String, Object> properties = new HashMap<>();

@JsonAnySetter
public void add(String key, Object value) {
properties.put(key, value);
}

public Object get(String key) {
return properties.get(key);
}
}

public static final class ExecutionStats {
private final Map<String, Object> properties = new HashMap<>();

@JsonAnySetter
public void add(String key, Object value) {
properties.put(key, value);
}

public Object get(String key) {
return properties.get(key);
}
}

}
Original file line number Diff line number Diff line change
@@ -223,6 +223,12 @@ public CompletableFuture<AqlExecutionExplainEntity> explainQuery(
return executorAsync().execute(() -> explainQueryRequest(query, bindVars, options), AqlExecutionExplainEntity.class);
}

@Override
public CompletableFuture<AqlQueryExplainEntity> explainAqlQuery(
String query, Map<String, Object> bindVars, AqlQueryExplainOptions options) {
return executorAsync().execute(() -> explainQueryRequest(query, bindVars, options), AqlQueryExplainEntity.class);
}

@Override
public CompletableFuture<AqlParseEntity> parseQuery(final String query) {
return executorAsync().execute(() -> parseQueryRequest(query), AqlParseEntity.class);
Original file line number Diff line number Diff line change
@@ -244,6 +244,11 @@ public AqlExecutionExplainEntity explainQuery(
return executorSync().execute(explainQueryRequest(query, bindVars, options), AqlExecutionExplainEntity.class);
}

@Override
public AqlQueryExplainEntity explainAqlQuery(String query, Map<String, Object> bindVars, AqlQueryExplainOptions options) {
return executorSync().execute(explainQueryRequest(query, bindVars, options), AqlQueryExplainEntity.class);
}

@Override
public AqlParseEntity parseQuery(final String query) {
return executorSync().execute(parseQueryRequest(query), AqlParseEntity.class);
Original file line number Diff line number Diff line change
@@ -110,7 +110,7 @@ public AqlQueryExplainOptions rules(final Collection<String> rules) {
return this;
}

private Options getOptions() {
public Options getOptions() {
if (options == null) {
options = new Options();
}
@@ -128,9 +128,21 @@ public Optimizer getOptimizer() {
}
return optimizer;
}

public Integer getMaxNumberOfPlans() {
return maxNumberOfPlans;
}

public Boolean getAllPlans() {
return allPlans;
}
}

public static final class Optimizer {
private Collection<String> rules;

public Collection<String> getRules() {
return rules;
}
}
}
Loading