/// <summary> /// Helper method to create a stream feed iterator. /// It decides if it is a query or read feed and create /// the correct instance. /// </summary> internal FeedIterator GetItemQueryStreamIteratorInternal( SqlQuerySpec sqlQuerySpec, bool isContinuationExcpected, string continuationToken, QueryRequestOptions requestOptions) { requestOptions = requestOptions ?? new QueryRequestOptions(); if (requestOptions.IsEffectivePartitionKeyRouting) { requestOptions.PartitionKey = null; } if (sqlQuerySpec == null) { return(new FeedIteratorCore( this.ClientContext, this.LinkUri, resourceType: ResourceType.Document, queryDefinition: null, continuationToken: continuationToken, options: requestOptions)); } return(QueryIterator.Create( client: this.queryClient, sqlQuerySpec: sqlQuerySpec, continuationToken: continuationToken, queryRequestOptions: requestOptions, resourceLink: this.LinkUri, isContinuationExpected: isContinuationExcpected, allowNonValueAggregateQuery: true, partitionedQueryExecutionInfo: null)); }
/// <summary> /// Helper method to create a stream feed iterator. /// It decides if it is a query or read feed and create /// the correct instance. /// </summary> public override FeedIteratorInternal GetItemQueryStreamIteratorInternal( SqlQuerySpec sqlQuerySpec, bool isContinuationExcpected, string continuationToken, FeedRangeInternal feedRange, QueryRequestOptions requestOptions) { requestOptions ??= new QueryRequestOptions(); if (requestOptions.IsEffectivePartitionKeyRouting) { if (feedRange != null) { throw new ArgumentException(nameof(feedRange), ClientResources.FeedToken_EffectivePartitionKeyRouting); } requestOptions.PartitionKey = null; } if (sqlQuerySpec == null) { NetworkAttachedDocumentContainer networkAttachedDocumentContainer = new NetworkAttachedDocumentContainer( this, this.queryClient, requestOptions); DocumentContainer documentContainer = new DocumentContainer(networkAttachedDocumentContainer); ReadFeedPaginationOptions.PaginationDirection?direction = null; if ((requestOptions.Properties != null) && requestOptions.Properties.TryGetValue(HttpConstants.HttpHeaders.EnumerationDirection, out object enumerationDirection)) { direction = (byte)enumerationDirection == (byte)RntbdConstants.RntdbEnumerationDirection.Reverse ? ReadFeedPaginationOptions.PaginationDirection.Reverse : ReadFeedPaginationOptions.PaginationDirection.Forward; } ReadFeedPaginationOptions readFeedPaginationOptions = new ReadFeedPaginationOptions( direction, pageSizeHint: requestOptions.MaxItemCount ?? int.MaxValue); return(new ReadFeedIteratorCore( documentContainer, continuationToken, readFeedPaginationOptions, requestOptions, cancellationToken: default)); } return(QueryIterator.Create( containerCore: this, client: this.queryClient, clientContext: this.ClientContext, sqlQuerySpec: sqlQuerySpec, continuationToken: continuationToken, feedRangeInternal: feedRange, queryRequestOptions: requestOptions, resourceLink: this.LinkUri, isContinuationExpected: isContinuationExcpected, allowNonValueAggregateQuery: true, forcePassthrough: false, partitionedQueryExecutionInfo: null)); }
public override FeedIteratorInternal GetReadFeedIterator( QueryDefinition queryDefinition, QueryRequestOptions queryRequestOptions, string resourceLink, ResourceType resourceType, string continuationToken, int pageSize) { queryRequestOptions ??= new QueryRequestOptions(); NetworkAttachedDocumentContainer networkAttachedDocumentContainer = new NetworkAttachedDocumentContainer( this, this.queryClient, queryRequestOptions, resourceLink: resourceLink, resourceType: resourceType); DocumentContainer documentContainer = new DocumentContainer(networkAttachedDocumentContainer); FeedIteratorInternal feedIterator; if (queryDefinition != null) { feedIterator = QueryIterator.Create( containerCore: this, client: this.queryClient, clientContext: this.ClientContext, sqlQuerySpec: queryDefinition.ToSqlQuerySpec(), continuationToken: continuationToken, feedRangeInternal: FeedRangeEpk.FullRange, queryRequestOptions: queryRequestOptions, resourceLink: resourceLink, isContinuationExpected: false, allowNonValueAggregateQuery: true, forcePassthrough: false, partitionedQueryExecutionInfo: null); } else { ReadFeedPaginationOptions.PaginationDirection?direction = null; if ((queryRequestOptions.Properties != null) && queryRequestOptions.Properties.TryGetValue(HttpConstants.HttpHeaders.EnumerationDirection, out object enumerationDirection)) { direction = (byte)enumerationDirection == (byte)RntbdConstants.RntdbEnumerationDirection.Reverse ? ReadFeedPaginationOptions.PaginationDirection.Reverse : ReadFeedPaginationOptions.PaginationDirection.Forward; } ReadFeedPaginationOptions readFeedPaginationOptions = new ReadFeedPaginationOptions( direction, pageSizeHint: queryRequestOptions.MaxItemCount ?? int.MaxValue); feedIterator = new ReadFeedIteratorCore( documentContainer: documentContainer, queryRequestOptions: queryRequestOptions, continuationToken: continuationToken, readFeedPaginationOptions: readFeedPaginationOptions, cancellationToken: default);
/// <summary> /// Helper method to create a stream feed iterator. /// It decides if it is a query or read feed and create /// the correct instance. /// </summary> public override FeedIteratorInternal GetItemQueryStreamIteratorInternal( SqlQuerySpec sqlQuerySpec, bool isContinuationExcpected, string continuationToken, FeedRangeInternal feedRange, QueryRequestOptions requestOptions) { requestOptions = requestOptions ?? new QueryRequestOptions(); if (requestOptions.IsEffectivePartitionKeyRouting) { if (feedRange != null) { throw new ArgumentException(nameof(feedRange), ClientResources.FeedToken_EffectivePartitionKeyRouting); } requestOptions.PartitionKey = null; } if (sqlQuerySpec == null) { return(FeedRangeIteratorCore.Create( containerCore: this, continuation: continuationToken, feedRangeInternal: feedRange, options: requestOptions)); } return(QueryIterator.Create( containerCore: this, client: this.queryClient, clientContext: this.ClientContext, sqlQuerySpec: sqlQuerySpec, continuationToken: continuationToken, feedRangeInternal: feedRange, queryRequestOptions: requestOptions, resourceLink: this.LinkUri, isContinuationExpected: isContinuationExcpected, allowNonValueAggregateQuery: true, forcePassthrough: false, partitionedQueryExecutionInfo: null)); }
/// <summary> /// Helper method to create a stream feed iterator. /// It decides if it is a query or read feed and create /// the correct instance. /// </summary> internal FeedIteratorInternal GetItemQueryStreamIteratorInternal( SqlQuerySpec sqlQuerySpec, bool isContinuationExcpected, string continuationToken, FeedTokenInternal feedToken, QueryRequestOptions requestOptions) { requestOptions = requestOptions ?? new QueryRequestOptions(); if (requestOptions.IsEffectivePartitionKeyRouting) { if (feedToken != null) { throw new ArgumentException(nameof(feedToken), ClientResources.FeedToken_EffectivePartitionKeyRouting); } requestOptions.PartitionKey = null; } if (sqlQuerySpec == null) { return(FeedIteratorCore.CreateForPartitionedResource( this, this.LinkUri, resourceType: ResourceType.Document, queryDefinition: null, continuationToken: continuationToken, feedTokenInternal: feedToken, options: requestOptions)); } return(QueryIterator.Create( client: this.queryClient, sqlQuerySpec: sqlQuerySpec, continuationToken: continuationToken, queryRequestOptions: requestOptions, resourceLink: this.LinkUri, isContinuationExpected: isContinuationExcpected, allowNonValueAggregateQuery: true, partitionedQueryExecutionInfo: null)); }
/// <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, CancellationToken cancellationToken = default(CancellationToken)) { 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( 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); 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) { partitionKeyDefinition = definition; } else { throw new ArgumentException( "partitionkeydefinition has invalid type", nameof(partitionKeyDefinitionObject)); } } else { ContainerQueryProperties containerQueryProperties = await this.queryClient.GetCachedContainerQueryPropertiesAsync( this.LinkUri, requestOptions.PartitionKey, cancellationToken); partitionKeyDefinition = containerQueryProperties.PartitionKeyDefinition; } QueryPlanHandler queryPlanHandler = new QueryPlanHandler(this.queryClient); TryCatch <(PartitionedQueryExecutionInfo queryPlan, bool supported)> tryGetQueryInfoAndIfSupported = await queryPlanHandler.TryGetQueryInfoAndIfSupportedAsync( supportedQueryFeatures, queryDefinition.ToSqlQuerySpec(), partitionKeyDefinition, requestOptions.PartitionKey.HasValue, cancellationToken); if (tryGetQueryInfoAndIfSupported.Failed) { return(new FailedToGetQueryPlanResult(tryGetQueryInfoAndIfSupported.Exception)); } (PartitionedQueryExecutionInfo queryPlan, bool supported) = tryGetQueryInfoAndIfSupported.Result; TryExecuteQueryResult tryExecuteQueryResult; if (supported) { QueryIterator queryIterator = QueryIterator.Create( 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); tryExecuteQueryResult = new QueryPlanIsSupportedResult(queryIterator); } else { tryExecuteQueryResult = new QueryPlanNotSupportedResult(queryPlan); } return(tryExecuteQueryResult); }
/// <summary> /// Used in the compute gateway to support legacy gateway interface. /// </summary> internal async Task <((Exception, PartitionedQueryExecutionInfo), (bool, QueryIterator))> TryExecuteQueryAsync( QueryFeatures supportedQueryFeatures, QueryDefinition queryDefinition, string continuationToken, QueryRequestOptions requestOptions, CancellationToken cancellationToken = default(CancellationToken)) { if (queryDefinition == null) { throw new ArgumentNullException(nameof(queryDefinition)); } if (requestOptions == null) { throw new ArgumentNullException(nameof(requestOptions)); } 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) { partitionKeyDefinition = definition; } else { throw new ArgumentException( "partitionkeydefinition has invalid type", nameof(partitionKeyDefinitionObject)); } } else { ContainerQueryProperties containerQueryProperties = await this.queryClient.GetCachedContainerQueryPropertiesAsync( this.LinkUri, requestOptions.PartitionKey, cancellationToken); partitionKeyDefinition = containerQueryProperties.PartitionKeyDefinition; } QueryPlanHandler queryPlanHandler = new QueryPlanHandler(this.queryClient); ((Exception exception, PartitionedQueryExecutionInfo partitionedQueryExecutionInfo), bool supported) = await queryPlanHandler.TryGetQueryInfoAndIfSupportedAsync( supportedQueryFeatures, queryDefinition.ToSqlQuerySpec(), partitionKeyDefinition, requestOptions.PartitionKey.HasValue, cancellationToken); if (exception != null) { return((exception, null), (false, null)); } QueryIterator queryIterator; if (supported) { queryIterator = QueryIterator.Create( client: this.queryClient, clientContext: this.ClientContext, sqlQuerySpec: queryDefinition.ToSqlQuerySpec(), continuationToken: continuationToken, queryRequestOptions: requestOptions, resourceLink: this.LinkUri, isContinuationExpected: false, allowNonValueAggregateQuery: true, partitionedQueryExecutionInfo: partitionedQueryExecutionInfo); } else { queryIterator = null; } return((null, partitionedQueryExecutionInfo), (supported, queryIterator)); }