Skip to content
This repository has been archived by the owner on Jul 12, 2020. It is now read-only.

Commit

Permalink
Split the GetResultsFromQueryToList method to one for single and one …
Browse files Browse the repository at this point in the history
…for multiple operations
  • Loading branch information
Elfocrash committed Dec 2, 2018
1 parent 6b7a225 commit f77af24
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 deletions.
23 changes: 18 additions & 5 deletions src/Cosmonaut/Extensions/CosmosResultExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ public static class CosmosResultExtensions
var feedOptions = queryable.GetFeedOptionsForQueryable();
if (feedOptions?.RequestContinuation == null)
{
return await GetResultsFromQueryToList(queryable, false, cancellationToken);
return await GetResultsFromQueryToList(queryable, cancellationToken);
}

return await GetPaginatedResultsFromQueryable(queryable, cancellationToken, feedOptions);
Expand All @@ -141,7 +141,7 @@ public static class CosmosResultExtensions

if (feedOptions?.RequestContinuation == null)
{
return await GetResultsFromQueryToList(queryable, true, cancellationToken);
return await GetResultsFromQueryForSingleOrFirst(queryable, cancellationToken);
}

return await GetPaginatedResultsFromQueryable(queryable, cancellationToken, feedOptions);
Expand Down Expand Up @@ -172,7 +172,7 @@ private static void SetFeedOptionsForSingleOperation<T>(ref IQueryable<T> querya
return await GetPaginatedResultsFromQueryable(queryable, cancellationToken, feedOptions);
}

private static async Task<List<T>> GetResultsFromQueryToList<T>(IQueryable<T> queryable, bool stopOnAny, CancellationToken cancellationToken)
private static async Task<List<T>> GetResultsFromQueryToList<T>(IQueryable<T> queryable, CancellationToken cancellationToken)
{
var query = queryable.AsDocumentQuery();
var results = new List<T>();
Expand All @@ -181,12 +181,25 @@ private static async Task<List<T>> GetResultsFromQueryToList<T>(IQueryable<T> qu
var items = await query.InvokeExecuteNextAsync(() => query.ExecuteNextAsync<T>(cancellationToken),
query.ToString(), target: GetAltLocationFromQueryable(queryable));
results.AddRange(items);
if (stopOnAny && results.Any())
}
return results;
}

private static async Task<List<T>> GetResultsFromQueryForSingleOrFirst<T>(IQueryable<T> queryable, CancellationToken cancellationToken)
{
var query = queryable.AsDocumentQuery();
var results = new List<T>();
while (query.HasMoreResults)
{
var items = await query.InvokeExecuteNextAsync(() => query.ExecuteNextAsync<T>(cancellationToken),
query.ToString(), target: GetAltLocationFromQueryable(queryable));
results.AddRange(items);
if (results.Any())
return results;
}
return results;
}

private static async Task<CosmosPagedResults<T>> GetSkipTakePagedResultsFromQueryToList<T>(IQueryable<T> queryable, int pageNumber, int pageSize, CancellationToken cancellationToken)
{
var query = queryable.AsDocumentQuery();
Expand Down
8 changes: 5 additions & 3 deletions src/Cosmonaut/Extensions/PaginationExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ namespace Cosmonaut.Extensions
{
public static class PaginationExtensions
{
private const string DocumentQueryTypeName = "DocumentQuery`1";

/// <summary>
/// Adds pagination for your CosmosDB query. This is an inefficient and expensive form of pagination because it goes
/// though all the documents to get to the page you want. The usage of WithPagination with the ContinuationToken is recommended.
Expand Down Expand Up @@ -53,7 +55,7 @@ public static IQueryable<T> WithPagination<T>(this IQueryable<T> queryable, stri

private static IQueryable<T> GetQueryableWithPaginationSettings<T>(IQueryable<T> queryable, string continuationInfo, int pageSize)
{
if (!queryable.GetType().Name.Equals("DocumentQuery`1"))
if (!queryable.GetType().Name.Equals(DocumentQueryTypeName))
return queryable;

var feedOptions = queryable.GetFeedOptionsForQueryable() ?? new FeedOptions();
Expand All @@ -65,15 +67,15 @@ private static IQueryable<T> GetQueryableWithPaginationSettings<T>(IQueryable<T>

internal static FeedOptions GetFeedOptionsForQueryable<T>(this IQueryable<T> queryable)
{
if (!queryable.GetType().Name.Equals("DocumentQuery`1"))
if (!queryable.GetType().Name.Equals(DocumentQueryTypeName))
return null;

return (FeedOptions) InternalTypeCache.Instance.FeedOptionsFieldInfo.GetValue(queryable.Provider);
}

internal static void SetFeedOptionsForQueryable<T>(this IQueryable<T> queryable, FeedOptions feedOptions)
{
if (!queryable.GetType().Name.Equals("DocumentQuery`1"))
if (!queryable.GetType().Name.Equals(DocumentQueryTypeName))
return;

InternalTypeCache.Instance.GetFieldInfoFromCache(queryable.GetType(), "feedOptions", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(queryable, feedOptions);
Expand Down

0 comments on commit f77af24

Please sign in to comment.