/// <summary>
/// Prepare an ad-hoc N1QL statement for later execution against a Couchbase Server.
/// </summary>
/// <param name="toPrepare">The <see cref="IQueryRequest" /> containing a N1QL statement to be prepared.</param>
/// <returns>
/// A <see cref="IQueryResult{T}" /> containing the <see cref="IQueryPlan" /> representing the reusable
/// and cachable execution plan for the statement.
/// </returns>
/// <remarks>
/// Most parameters in the IQueryRequest will be ignored, appart from the Statement and the BaseUri.
/// </remarks>
public IQueryResult <IQueryPlan> Prepare(IQueryRequest toPrepare)
{
string statement = toPrepare.GetStatement();
if (!statement.ToUpper().StartsWith("PREPARE "))
{
statement = string.Concat("PREPARE ", statement);
}
QueryRequest query = new QueryRequest(statement);
query.BaseUri(toPrepare.GetBaseUri());
IQueryResult <dynamic> planResult = Query <dynamic>(query);
IQueryResult <IQueryPlan> result = new QueryResult <IQueryPlan>()
{
Message = planResult.Message,
ClientContextId = planResult.ClientContextId,
Errors = planResult.Errors,
Exception = planResult.Exception,
Metrics = planResult.Metrics,
RequestId = planResult.RequestId,
Signature = planResult.Signature,
Status = planResult.Status,
Rows = new List <IQueryPlan>(1),
Success = planResult.Success
};
if (planResult.Success)
{
var rawPlan = planResult.Rows.First();
string encodedPlan = EncodeParameter(rawPlan);
result.Rows.Add(new QueryPlan(encodedPlan));
}
return(result);
}