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: add support for explain prepared query API endpoint #368

Merged
Merged
Show file tree
Hide file tree
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
16 changes: 12 additions & 4 deletions Consul.Test/PreparedQueryTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ public async Task PreparedQuery_Test()
Assert.True(defs.Length == 1);
Assert.Equal(def.Service.Service, defs[0].Service.Service);

defs = null;
defs = (await _client.PreparedQuery.List(mgmtquerytoken)).Response;

Assert.NotNull(defs);
Expand All @@ -87,7 +86,6 @@ public async Task PreparedQuery_Test()

await _client.PreparedQuery.Update(def);

defs = null;
defs = (await _client.PreparedQuery.Get(id)).Response;

Assert.NotNull(defs);
Expand All @@ -101,17 +99,27 @@ public async Task PreparedQuery_Test()
Assert.True(nodes.Length == 1);
Assert.Equal("foobaz", nodes[0].Node.Name);

results = null;
results = (await _client.PreparedQuery.Execute("my-query")).Response;

Assert.NotNull(results);
nodes = results.Nodes.Where(n => n.Node.Name == "foobaz").ToArray();
Assert.True(nodes.Length == 1);
Assert.Equal("foobaz", results.Nodes[0].Node.Name);

var query = (await _client.PreparedQuery.Explain(id)).Response.Query;

Assert.NotNull(query);
Assert.True(query.Name == "my-query");
Assert.True(query.Service.OnlyPassing == true);

query = (await _client.PreparedQuery.Explain("my-query")).Response.Query;

Assert.NotNull(query);
Assert.True(query.Name == "my-query");
Assert.True(query.Service.OnlyPassing == true);

await _client.PreparedQuery.Delete(id);

defs = null;
defs = (await _client.PreparedQuery.List(mgmtquerytoken)).Response;

Assert.True(defs.Length == 0);
Expand Down
3 changes: 3 additions & 0 deletions Consul/Interfaces/IPreparedQueryEndpoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,5 +40,8 @@ public interface IPreparedQueryEndpoint
Task<WriteResult> Delete(string queryID, WriteOptions q, CancellationToken ct = default);
Task<QueryResult<PreparedQueryExecuteResponse>> Execute(string queryIDOrName, CancellationToken ct = default);
Task<QueryResult<PreparedQueryExecuteResponse>> Execute(string queryIDOrName, QueryOptions q, CancellationToken ct = default);
Task<QueryResult<PreparedQueryExplainResponse>> Explain(string queryIDOrName, QueryOptions q, CancellationToken ct = default);
Task<QueryResult<PreparedQueryExplainResponse>> Explain(string queryIDOrName, CancellationToken ct = default);

}
}
33 changes: 33 additions & 0 deletions Consul/PreparedQuery.cs
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,14 @@ public class PreparedQueryExecuteResponse
public int Failovers { get; set; }
}

public class PreparedQueryExplainResponse
{
/// <summary>
/// Query has the fully-rendered query.
/// </summary>
public PreparedQueryDefinition Query { get; set; }
}

public class PreparedQuery : IPreparedQueryEndpoint
{
private class PreparedQueryCreationResult
Expand Down Expand Up @@ -286,6 +294,31 @@ public Task<WriteResult> Update(PreparedQueryDefinition query, WriteOptions q, C
{
return _client.Put(string.Format("/v1/query/{0}", query.ID), query, q).Execute(ct);
}

/// <summary>
/// Shows which query a name resolves to, the fully interpolated template (if it's a template), as well as additional info about the execution of a query.
/// </summary>
/// <param name="queryIDOrName">Specifies the UUID of the query to explain. This can also be the name of an existing prepared query,
/// or a name that matches a prefix name for a prepared query template</param>
/// <param name="q">Query Options</param>
/// <param name="ct">Cancellation Token</param>
/// <returns>Returns a single prepared query</returns>
public Task<QueryResult<PreparedQueryExplainResponse>> Explain(string queryIDOrName, QueryOptions q, CancellationToken ct = default)
{
return _client.Get<PreparedQueryExplainResponse>(string.Format("/v1/query/{0}/explain", queryIDOrName), q).Execute(ct);
}

/// <summary>
/// Shows which query a name resolves to, the fully interpolated template (if it's a template), as well as additional info about the execution of a query.
/// </summary>
/// <param name="queryIDOrName">Specifies the UUID of the query to explain. This can also be the name of an existing prepared query,
/// or a name that matches a prefix name for a prepared query template</param>
/// <param name="ct">Cancellation Token</param>
/// <returns>Returns a single prepared query</returns>
public Task<QueryResult<PreparedQueryExplainResponse>> Explain(string queryIDOrName, CancellationToken ct = default)
{
return Explain(queryIDOrName, QueryOptions.Default, ct);
}
}

public partial class ConsulClient : IConsulClient
Expand Down