Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get total results for revisions (RavenDB Client API)

Tags:

ravendb

I am trying to display document revisions in a paginated list. This will only work when I know the total results count so I can calculate the page count.

For common document queries this is possible with session.Query(...).Statistics(out var stats).

My current solution is the following:

// get paged revisions
List<T> items = await session.Advanced.Revisions.GetForAsync<T>(id, (pageNumber - 1) * pageSize, pageSize);
double totalResults = items.Count;

// get total results in case items count equals page size
if (pageSize <= items.Count || pageNumber > 1)
{
  GetRevisionsCommand command = new GetRevisionsCommand(id, 0, 1, true);
  session.Advanced.RequestExecutor.Execute(command, session.Advanced.Context);
  command.Result.Results.Parent.TryGet("TotalResults", out totalResults);
}

Problem with this approach is that I need an additional request just to get the TotalResults property which indeed has already been returned by the first request. I just don't know how to access it.

like image 239
tobi.at Avatar asked Aug 30 '20 10:08

tobi.at


Video Answer


1 Answers

You are right the TotalResults is returned from server but not parsed on the client side. I opened an issue to fix that: https://issues.hibernatingrhinos.com/issue/RavenDB-15552

You can also get the total revisions count for document by using the /databases/{dbName}/revisions/count?id={docId} endpoint, client code for example:

                var docId = "company/1";
                var dbName = store.Database;
                var json = await store.GetRequestExecutor().HttpClient
                    .GetAsync(store.Urls.First() + $"/databases/{dbName}/revisions/count?id={docId}").Result.Content.ReadAsStringAsync();
                using var ctx = JsonOperationContext.ShortTermSingleUse();
                using var obj = ctx.ReadForMemory(json, "revision-count");
                obj.TryGet("RevisionsCount", out long revisionsCount);

Another way could be getting all the revisions:

var revisions = await session.Advanced.Revisions.GetForAsync<Company>(docId, 0, int.MaxValue);

Then using the revisions.Count as the total count.

like image 89
garay Avatar answered Oct 12 '22 06:10

garay