Skip to content
Merged
Show file tree
Hide file tree
Changes from 16 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
Original file line number Diff line number Diff line change
Expand Up @@ -161,29 +161,7 @@ private static async Task<TryCatch<IQueryPipelineStage>> TryCreateCoreContextAsy
}

PartitionedQueryExecutionInfo partitionedQueryExecutionInfo;
if (inputParameters.ForcePassthrough)
{
partitionedQueryExecutionInfo = new PartitionedQueryExecutionInfo()
{
QueryInfo = new QueryInfo()
{
Aggregates = null,
DistinctType = DistinctQueryType.None,
GroupByAliases = null,
GroupByAliasToAggregateType = null,
GroupByExpressions = null,
HasSelectValue = false,
Limit = null,
Offset = null,
OrderBy = null,
OrderByExpressions = null,
RewrittenQuery = null,
Top = null,
},
QueryRanges = new List<Documents.Routing.Range<string>>(),
};
}
else if (queryPlanFromContinuationToken != null)
if (queryPlanFromContinuationToken != null)
{
partitionedQueryExecutionInfo = queryPlanFromContinuationToken;
}
Expand Down Expand Up @@ -270,26 +248,7 @@ private static async Task<TryCatch<IQueryPipelineStage>> TryCreateFromPartitione
inputParameters.InitialFeedRange,
trace);

bool singleLogicalPartitionKeyQuery = inputParameters.PartitionKey.HasValue
|| ((partitionedQueryExecutionInfo.QueryRanges.Count == 1)
&& partitionedQueryExecutionInfo.QueryRanges[0].IsSingleValue);
bool serverStreamingQuery = !partitionedQueryExecutionInfo.QueryInfo.HasAggregates
&& !partitionedQueryExecutionInfo.QueryInfo.HasDistinct
&& !partitionedQueryExecutionInfo.QueryInfo.HasGroupBy;
bool streamingSinglePartitionQuery = singleLogicalPartitionKeyQuery && serverStreamingQuery;

bool clientStreamingQuery =
serverStreamingQuery
&& !partitionedQueryExecutionInfo.QueryInfo.HasOrderBy
&& !partitionedQueryExecutionInfo.QueryInfo.HasTop
&& !partitionedQueryExecutionInfo.QueryInfo.HasLimit
&& !partitionedQueryExecutionInfo.QueryInfo.HasOffset;
bool streamingCrossContinuationQuery = !singleLogicalPartitionKeyQuery && clientStreamingQuery;

bool createPassthroughQuery = streamingSinglePartitionQuery || streamingCrossContinuationQuery;

TryCatch<IQueryPipelineStage> tryCreatePipelineStage;

Documents.PartitionKeyRange targetRange = await TryGetTargetRangeOptimisticDirectExecutionAsync(
inputParameters,
partitionedQueryExecutionInfo,
Expand All @@ -311,6 +270,23 @@ private static async Task<TryCatch<IQueryPipelineStage>> TryCreateFromPartitione
}
else
{
bool singleLogicalPartitionKeyQuery = inputParameters.PartitionKey.HasValue
|| ((partitionedQueryExecutionInfo.QueryRanges.Count == 1)
&& partitionedQueryExecutionInfo.QueryRanges[0].IsSingleValue);
bool serverStreamingQuery = !partitionedQueryExecutionInfo.QueryInfo.HasAggregates
&& !partitionedQueryExecutionInfo.QueryInfo.HasDistinct
&& !partitionedQueryExecutionInfo.QueryInfo.HasGroupBy;
bool streamingSinglePartitionQuery = singleLogicalPartitionKeyQuery && serverStreamingQuery;

bool clientStreamingQuery =
serverStreamingQuery
&& !partitionedQueryExecutionInfo.QueryInfo.HasOrderBy
&& !partitionedQueryExecutionInfo.QueryInfo.HasTop
&& !partitionedQueryExecutionInfo.QueryInfo.HasLimit
&& !partitionedQueryExecutionInfo.QueryInfo.HasOffset;
bool streamingCrossContinuationQuery = !singleLogicalPartitionKeyQuery && clientStreamingQuery;
bool createPassthroughQuery = streamingSinglePartitionQuery || streamingCrossContinuationQuery;

if (createPassthroughQuery)
{
SetTestInjectionPipelineType(inputParameters, Passthrough);
Expand Down Expand Up @@ -432,7 +408,6 @@ private static TryCatch<IQueryPipelineStage> TryCreateSpecializedDocumentQueryEx
inputParameters.PartitionedQueryExecutionInfo,
inputParameters.ExecutionEnvironment,
inputParameters.ReturnResultsInDeterministicOrder,
inputParameters.ForcePassthrough,
inputParameters.EnableOptimisticDirectExecution,
inputParameters.TestInjections);
}
Expand Down Expand Up @@ -746,7 +721,7 @@ private static void SetTestInjectionPipelineType(InputParameters inputParameters
{
responseStats.PipelineType = TestInjections.PipelineType.Specialized;
}
else
else
{
responseStats.PipelineType = TestInjections.PipelineType.Passthrough;
}
Expand Down Expand Up @@ -865,7 +840,6 @@ public InputParameters(
PartitionedQueryExecutionInfo partitionedQueryExecutionInfo,
ExecutionEnvironment? executionEnvironment,
bool? returnResultsInDeterministicOrder,
bool forcePassthrough,
bool enableOptimisticDirectExecution,
TestInjections testInjections)
{
Expand Down Expand Up @@ -899,7 +873,6 @@ public InputParameters(
this.PartitionedQueryExecutionInfo = partitionedQueryExecutionInfo;
this.ExecutionEnvironment = executionEnvironment.GetValueOrDefault(InputParameters.DefaultExecutionEnvironment);
this.ReturnResultsInDeterministicOrder = returnResultsInDeterministicOrder.GetValueOrDefault(InputParameters.DefaultReturnResultsInDeterministicOrder);
this.ForcePassthrough = forcePassthrough;
this.EnableOptimisticDirectExecution = enableOptimisticDirectExecution;
this.TestInjections = testInjections;
}
Expand All @@ -916,7 +889,6 @@ public InputParameters(
public ExecutionEnvironment ExecutionEnvironment { get; }
public bool ReturnResultsInDeterministicOrder { get; }
public TestInjections TestInjections { get; }
public bool ForcePassthrough { get; }
public bool EnableOptimisticDirectExecution { get; }

public InputParameters WithContinuationToken(CosmosElement token)
Expand All @@ -933,7 +905,6 @@ public InputParameters WithContinuationToken(CosmosElement token)
this.PartitionedQueryExecutionInfo,
this.ExecutionEnvironment,
this.ReturnResultsInDeterministicOrder,
this.ForcePassthrough,
this.EnableOptimisticDirectExecution,
this.TestInjections);
}
Expand Down
2 changes: 0 additions & 2 deletions Microsoft.Azure.Cosmos/src/Query/v3Query/QueryIterator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ public static QueryIterator Create(
string resourceLink,
bool isContinuationExpected,
bool allowNonValueAggregateQuery,
bool forcePassthrough,
PartitionedQueryExecutionInfo partitionedQueryExecutionInfo,
Documents.ResourceType resourceType)
{
Expand Down Expand Up @@ -145,7 +144,6 @@ public static QueryIterator Create(
partitionedQueryExecutionInfo: partitionedQueryExecutionInfo,
executionEnvironment: queryRequestOptions.ExecutionEnvironment,
returnResultsInDeterministicOrder: queryRequestOptions.ReturnResultsInDeterministicOrder,
forcePassthrough: forcePassthrough,
enableOptimisticDirectExecution: queryRequestOptions.EnableOptimisticDirectExecution,
testInjections: queryRequestOptions.TestSettings);

Expand Down
117 changes: 0 additions & 117 deletions Microsoft.Azure.Cosmos/src/Resource/Container/ContainerCore.Items.cs
Original file line number Diff line number Diff line change
Expand Up @@ -337,121 +337,6 @@ public async Task<FeedResponse<T>> ReadManyItemsAsync<T>(
cancellationToken);
}

/// <summary>
/// Used in the compute gateway to support legacy gateway interface.
/// </summary>
public override async Task<TryExecuteQueryResult> TryExecuteQueryAsync(
QueryFeatures supportedQueryFeatures,
QueryDefinition queryDefinition,
string continuationToken,
FeedRangeInternal feedRangeInternal,
QueryRequestOptions requestOptions,
GeospatialType geospatialType,
CancellationToken cancellationToken = default)
{
if (queryDefinition == null)
{
throw new ArgumentNullException(nameof(queryDefinition));
}

if (requestOptions == null)
{
throw new ArgumentNullException(nameof(requestOptions));
}

if (feedRangeInternal != null)
{
// The user has scoped down to a physical partition or logical partition.
// In either case let the query execute as a passthrough.
QueryIterator passthroughQueryIterator = QueryIterator.Create(
containerCore: this,
client: this.queryClient,
clientContext: this.ClientContext,
sqlQuerySpec: queryDefinition.ToSqlQuerySpec(),
continuationToken: continuationToken,
feedRangeInternal: feedRangeInternal,
queryRequestOptions: requestOptions,
resourceLink: this.LinkUri,
isContinuationExpected: false,
allowNonValueAggregateQuery: true,
forcePassthrough: true, // Forcing a passthrough, since we don't want to get the query plan nor try to rewrite it.
partitionedQueryExecutionInfo: null,
resourceType: ResourceType.Document);

return new QueryPlanIsSupportedResult(passthroughQueryIterator);
}

cancellationToken.ThrowIfCancellationRequested();

Documents.PartitionKeyDefinition partitionKeyDefinition;
if (requestOptions.Properties != null
&& requestOptions.Properties.TryGetValue("x-ms-query-partitionkey-definition", out object partitionKeyDefinitionObject))
{
if (!(partitionKeyDefinitionObject is Documents.PartitionKeyDefinition definition))
{
throw new ArgumentException(
"partitionkeydefinition has invalid type",
nameof(partitionKeyDefinitionObject));
}

partitionKeyDefinition = definition;
}
else
{
ContainerQueryProperties containerQueryProperties = await this.queryClient.GetCachedContainerQueryPropertiesAsync(
this.LinkUri,
requestOptions.PartitionKey,
NoOpTrace.Singleton,
cancellationToken);
partitionKeyDefinition = containerQueryProperties.PartitionKeyDefinition;
}

QueryPlanHandler queryPlanHandler = new QueryPlanHandler(this.queryClient);

TryCatch<(PartitionedQueryExecutionInfo queryPlan, bool supported)> tryGetQueryInfoAndIfSupported = await queryPlanHandler.TryGetQueryInfoAndIfSupportedAsync(
supportedQueryFeatures,
queryDefinition.ToSqlQuerySpec(),
ResourceType.Document,
partitionKeyDefinition,
requestOptions.PartitionKey.HasValue,
useSystemPrefix: QueryIterator.IsSystemPrefixExpected(requestOptions),
geospatialType: geospatialType,
cancellationToken);

if (tryGetQueryInfoAndIfSupported.Failed)
{
return new FailedToGetQueryPlanResult(tryGetQueryInfoAndIfSupported.Exception);
}

(PartitionedQueryExecutionInfo queryPlan, bool supported) = tryGetQueryInfoAndIfSupported.Result;
TryExecuteQueryResult tryExecuteQueryResult;
if (supported)
{
QueryIterator queryIterator = QueryIterator.Create(
containerCore: this,
client: this.queryClient,
clientContext: this.ClientContext,
sqlQuerySpec: queryDefinition.ToSqlQuerySpec(),
continuationToken: continuationToken,
feedRangeInternal: feedRangeInternal,
queryRequestOptions: requestOptions,
resourceLink: this.LinkUri,
isContinuationExpected: false,
allowNonValueAggregateQuery: true,
forcePassthrough: false,
partitionedQueryExecutionInfo: queryPlan,
resourceType: ResourceType.Document);

tryExecuteQueryResult = new QueryPlanIsSupportedResult(queryIterator);
}
else
{
tryExecuteQueryResult = new QueryPlanNotSupportedResult(queryPlan);
}

return tryExecuteQueryResult;
}

public override FeedIterator<T> GetItemQueryIterator<T>(
string queryText = null,
string continuationToken = null,
Expand Down Expand Up @@ -835,7 +720,6 @@ public override FeedIteratorInternal GetItemQueryStreamIteratorInternal(
resourceLink: this.LinkUri,
isContinuationExpected: isContinuationExcpected,
allowNonValueAggregateQuery: true,
forcePassthrough: false,
partitionedQueryExecutionInfo: null,
resourceType: ResourceType.Document);
}
Expand Down Expand Up @@ -874,7 +758,6 @@ public override FeedIteratorInternal GetReadFeedIterator(
resourceLink: resourceLink,
isContinuationExpected: false,
allowNonValueAggregateQuery: true,
forcePassthrough: false,
partitionedQueryExecutionInfo: null,
resourceType: resourceType);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,6 @@ public abstract Task<IReadOnlyList<IReadOnlyList<string>>> GetPartitionKeyPathTo

public abstract Task<CollectionRoutingMap> GetRoutingMapAsync(CancellationToken cancellationToken);

public abstract Task<TryExecuteQueryResult> TryExecuteQueryAsync(
QueryFeatures supportedQueryFeatures,
QueryDefinition queryDefinition,
string continuationToken,
FeedRangeInternal feedRangeInternal,
QueryRequestOptions requestOptions,
GeospatialType geospatialType,
CancellationToken cancellationToken = default);

public abstract FeedIterator GetStandByFeedIterator(
string continuationToken = default,
int? maxItemCount = default,
Expand Down
Loading