private LinqQueryOptions GetQueryOptions(QueryModel queryModel, ScalarResultBehavior scalarResultBehavior) { var queryOptions = new LinqQueryOptions(scalarResultBehavior); MutationState?combinedMutationState = null; foreach (var bodyClause in queryModel.BodyClauses) { switch (bodyClause) { case ScanConsistencyClause scanConsistency: queryOptions.ScanConsistency(scanConsistency.ScanConsistency); if (scanConsistency.ScanWait != null) { queryOptions.ScanWait(scanConsistency.ScanWait.Value); } break; case ConsistentWithClause consistentWith: combinedMutationState ??= new MutationState(); combinedMutationState.Add(consistentWith.MutationState); if (consistentWith.ScanWait != null) { queryOptions.ScanWait(consistentWith.ScanWait.Value); } break; } } if (combinedMutationState != null) { queryOptions.ConsistentWith(combinedMutationState); } if (QueryTimeout != null) { queryOptions.Timeout(QueryTimeout.Value); } return(queryOptions); }
/// <summary> /// Asynchronously execute a <see cref="LinqQueryOptions"/>. /// </summary> /// <typeparam name="T">Type returned by the query.</typeparam> /// <param name="statement">Query to execute.</param> /// <param name="queryOptions">Options to control execution.</param> /// <param name="cancellationToken">Cancellation token.</param> /// <returns>Task which contains a list of objects returned by the request when complete.</returns> public async IAsyncEnumerable <T> ExecuteCollectionAsync <T>(string statement, LinqQueryOptions queryOptions, [EnumeratorCancellation] CancellationToken cancellationToken = default) { // TODO: Make this more efficient with a custom enumerator queryOptions.CancellationToken(cancellationToken); IAsyncEnumerable <T> result; if (!queryOptions.ScalarResultBehavior.ResultExtractionRequired) { result = await _cluster.QueryAsync <T>(statement, queryOptions).ConfigureAwait(false); } else { var tempResult = await _cluster.QueryAsync <ScalarResult <T> >(statement, queryOptions).ConfigureAwait(false); result = queryOptions.ScalarResultBehavior.ApplyResultExtraction(tempResult); } await foreach (var row in result.WithCancellation(cancellationToken).ConfigureAwait(false)) { yield return(row); } }
/// <summary> /// Execute a <see cref="LinqQueryOptions"/>. /// </summary> /// <typeparam name="T">Type returned by the query.</typeparam> /// <param name="statement">Query to execute.</param> /// <param name="queryOptions">Options to control execution.</param> /// <returns>List of objects returned by the request.</returns> public IEnumerable <T> ExecuteCollection <T>(string statement, LinqQueryOptions queryOptions) { return(ExecuteCollectionAsync <T>(statement, queryOptions).ToEnumerable()); }