Skip to content

Commit 2608d4a

Browse files
authored
Query: Adds EnableOptimisticDirectExecution flag to QueryRequestOptions (#3664)
* Added new flag to QueryRequestOptions to allow customers to use Ode pipeline * Updated comments in QueryRequestOptions.cs * Renamed enabledOde to enableOde * Removed default setting for EnableOptimisticDirectExecution
1 parent c29abfe commit 2608d4a

File tree

7 files changed

+31
-25
lines changed

7 files changed

+31
-25
lines changed

Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/CosmosQueryExecutionContextFactory.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,7 @@ private static TryCatch<IQueryPipelineStage> TryCreateSpecializedDocumentQueryEx
418418
inputParameters.ExecutionEnvironment,
419419
inputParameters.ReturnResultsInDeterministicOrder,
420420
inputParameters.ForcePassthrough,
421+
inputParameters.EnableOptimisticDirectExecution,
421422
inputParameters.TestInjections);
422423
}
423424

@@ -752,7 +753,7 @@ private static Documents.PartitionKeyDefinition GetPartitionKeyDefinition(InputP
752753
ContainerQueryProperties containerQueryProperties,
753754
ITrace trace)
754755
{
755-
if (inputParameters.TestInjections == null || !inputParameters.TestInjections.EnableOptimisticDirectExecution) return null;
756+
if (!inputParameters.EnableOptimisticDirectExecution) return null;
756757

757758
// case 1: Is query going to a single partition
758759
bool hasPartitionKey = inputParameters.PartitionKey.HasValue
@@ -824,6 +825,7 @@ public InputParameters(
824825
ExecutionEnvironment? executionEnvironment,
825826
bool? returnResultsInDeterministicOrder,
826827
bool forcePassthrough,
828+
bool enableOptimisticDirectExecution,
827829
TestInjections testInjections)
828830
{
829831
this.SqlQuerySpec = sqlQuerySpec ?? throw new ArgumentNullException(nameof(sqlQuerySpec));
@@ -857,6 +859,7 @@ public InputParameters(
857859
this.ExecutionEnvironment = executionEnvironment.GetValueOrDefault(InputParameters.DefaultExecutionEnvironment);
858860
this.ReturnResultsInDeterministicOrder = returnResultsInDeterministicOrder.GetValueOrDefault(InputParameters.DefaultReturnResultsInDeterministicOrder);
859861
this.ForcePassthrough = forcePassthrough;
862+
this.EnableOptimisticDirectExecution = enableOptimisticDirectExecution;
860863
this.TestInjections = testInjections;
861864
}
862865

@@ -873,6 +876,7 @@ public InputParameters(
873876
public bool ReturnResultsInDeterministicOrder { get; }
874877
public TestInjections TestInjections { get; }
875878
public bool ForcePassthrough { get; }
879+
public bool EnableOptimisticDirectExecution { get; }
876880

877881
public InputParameters WithContinuationToken(CosmosElement token)
878882
{
@@ -889,6 +893,7 @@ public InputParameters WithContinuationToken(CosmosElement token)
889893
this.ExecutionEnvironment,
890894
this.ReturnResultsInDeterministicOrder,
891895
this.ForcePassthrough,
896+
this.EnableOptimisticDirectExecution,
892897
this.TestInjections);
893898
}
894899
}

Microsoft.Azure.Cosmos/src/Query/Core/TestInjections.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,13 @@ public enum PipelineType
1313
OptimisticDirectExecution,
1414
}
1515

16-
public TestInjections(bool simulate429s, bool simulateEmptyPages, bool enableOptimisticDirectExecution = false, ResponseStats responseStats = null)
16+
public TestInjections(bool simulate429s, bool simulateEmptyPages, ResponseStats responseStats = null)
1717
{
1818
this.SimulateThrottles = simulate429s;
1919
this.SimulateEmptyPages = simulateEmptyPages;
2020
this.Stats = responseStats;
21-
this.EnableOptimisticDirectExecution = enableOptimisticDirectExecution;
2221
}
2322

24-
public bool EnableOptimisticDirectExecution { get; }
25-
2623
public bool SimulateThrottles { get; }
2724

2825
public bool SimulateEmptyPages { get; }

Microsoft.Azure.Cosmos/src/Query/v3Query/QueryIterator.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ public static QueryIterator Create(
144144
executionEnvironment: queryRequestOptions.ExecutionEnvironment,
145145
returnResultsInDeterministicOrder: queryRequestOptions.ReturnResultsInDeterministicOrder,
146146
forcePassthrough: forcePassthrough,
147+
enableOptimisticDirectExecution: queryRequestOptions.EnableOptimisticDirectExecution,
147148
testInjections: queryRequestOptions.TestSettings);
148149

149150
return new QueryIterator(

Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ public class QueryRequestOptions : RequestOptions
4343
/// </value>
4444
public bool? EnableLowPrecisionOrderBy { get; set; }
4545

46+
/// <summary>
47+
/// Gets or sets the option for customers to opt in for direct (optimistic) execution of the query..
48+
/// </summary>
49+
/// <value>
50+
/// Direct (optimistic) execution offers improved performance for several kinds of queries such as a single partition streaming query.
51+
/// </value>
52+
internal bool EnableOptimisticDirectExecution { get; set; }
53+
4654
/// <summary>
4755
/// Gets or sets the maximum number of items that can be buffered client side during
4856
/// parallel query execution in the Azure Cosmos DB service.

Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/OptimisticDirectExecutionQueryTests.cs

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ private static async Task TestPositiveOptimisticDirectExecutionOutput(
6767
QueryRequestOptions feedOptions = new QueryRequestOptions
6868
{
6969
MaxItemCount = -1,
70-
TestSettings = GetTestInjections(simulate429s:false, simulateEmptyPages:false, enableOptimisticDirectExecution:true)
70+
EnableOptimisticDirectExecution = true,
71+
TestSettings = new TestInjections(simulate429s: false, simulateEmptyPages: false, new TestInjections.ResponseStats())
7172
};
7273

7374
// check if pipeline returns empty continuation token
@@ -172,13 +173,11 @@ private static async Task TestPositiveOptimisticDirectExecutionOutput(
172173
feedOptions = new QueryRequestOptions
173174
{
174175
MaxItemCount = pageSizeOptions[i],
175-
PartitionKey = queryAndResults[j].PartitionKey == null
176+
PartitionKey = queryAndResults[j].PartitionKey == null
176177
? null
177178
: new Cosmos.PartitionKey(queryAndResults[j].PartitionKey),
178-
TestSettings = GetTestInjections(
179-
simulate429s: false,
180-
simulateEmptyPages: false,
181-
enableOptimisticDirectExecution: queryAndResults[j].EnableOptimisticDirectExecution)
179+
EnableOptimisticDirectExecution = queryAndResults[j].EnableOptimisticDirectExecution,
180+
TestSettings = new TestInjections(simulate429s: false, simulateEmptyPages: false, new TestInjections.ResponseStats())
182181
};
183182

184183
List<CosmosElement> items = await RunQueryAsync(
@@ -208,7 +207,8 @@ private static async Task TestNegativeOptimisticDirectExecutionOutput(
208207
QueryRequestOptions feedOptions = new QueryRequestOptions
209208
{
210209
PartitionKey = new Cosmos.PartitionKey("/value"),
211-
TestSettings = GetTestInjections(simulate429s: false, simulateEmptyPages: false, enableOptimisticDirectExecution: true)
210+
EnableOptimisticDirectExecution = true,
211+
TestSettings = new TestInjections(simulate429s: false, simulateEmptyPages: false, new TestInjections.ResponseStats())
212212
};
213213

214214
// check if bad continuation queries and syntax error queries are handled by pipeline
@@ -241,15 +241,6 @@ await container.GetItemQueryIterator<Document>(
241241
}
242242
}
243243

244-
private static TestInjections GetTestInjections(bool simulate429s, bool simulateEmptyPages, bool enableOptimisticDirectExecution)
245-
{
246-
return new TestInjections(
247-
simulate429s,
248-
simulateEmptyPages,
249-
enableOptimisticDirectExecution,
250-
new TestInjections.ResponseStats());
251-
}
252-
253244
private struct SinglePartitionWithContinuationsArgs
254245
{
255246
public int NumberOfDocuments;

Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/QueryTestsBase.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,7 @@ internal static async Task<List<T>> QueryWithCosmosElementContinuationTokenAsync
597597
Properties = queryRequestOptions.Properties,
598598
IsEffectivePartitionKeyRouting = queryRequestOptions.IsEffectivePartitionKeyRouting,
599599
CosmosElementContinuationToken = queryRequestOptions.CosmosElementContinuationToken,
600+
EnableOptimisticDirectExecution = queryRequestOptions.EnableOptimisticDirectExecution,
600601
TestSettings = queryRequestOptions.TestSettings,
601602
};
602603

Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OptimisticDirectExecutionQueryBaselineTests.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,12 @@ public void NegativeOptimisticDirectExecutionOutput()
148148
// This test confirms that TestInjection.EnableOptimisticDirectExection is set to false from default.
149149
// Check test "TestPipelineForDistributedQueryAsync" to understand why this is done
150150
[TestMethod]
151-
public async Task TestDefaultTestInjectionSettingsAsync()
151+
public async Task TestDefaultQueryRequestOptionsSettings()
152152
{
153-
TestInjections testInjection = new TestInjections(simulate429s: false, simulateEmptyPages: false);
154153

155-
Assert.AreEqual(testInjection.EnableOptimisticDirectExecution, false);
154+
QueryRequestOptions requestOptions = new QueryRequestOptions();
155+
156+
Assert.AreEqual(requestOptions.EnableOptimisticDirectExecution, false);
156157
}
157158

158159
// test checks that the pipeline can take a query to the backend and returns its associated document(s).
@@ -563,6 +564,7 @@ public override OptimisticDirectExecutionTestOutput ExecuteTest(OptimisticDirect
563564
executionEnvironment: null,
564565
returnResultsInDeterministicOrder: null,
565566
forcePassthrough: false,
567+
enableOptimisticDirectExecution: queryRequestOptions.EnableOptimisticDirectExecution,
566568
testInjections: queryRequestOptions.TestSettings);
567569

568570
string databaseId = "db1234";
@@ -587,7 +589,8 @@ private static QueryRequestOptions GetQueryRequestOptions(bool enableOptimisticD
587589
{
588590
MaxConcurrency = 0,
589591
MaxItemCount = 10,
590-
TestSettings = new TestInjections(simulate429s: true, simulateEmptyPages: false, enableOptimisticDirectExecution: enableOptimisticDirectExecution, new TestInjections.ResponseStats()),
592+
EnableOptimisticDirectExecution = enableOptimisticDirectExecution,
593+
TestSettings = new TestInjections(simulate429s: true, simulateEmptyPages: false, new TestInjections.ResponseStats()),
591594
Properties = new Dictionary<string, object>()
592595
{
593596
{ HttpConstants.HttpHeaders.EnumerationDirection, ""},

0 commit comments

Comments
 (0)