/// <summary> /// Gets a FileInfo for a given filename and revision. Considers only 'completed' uploads. /// </summary> /// <param name="revision">-1: The most recent revision. -2: The second most recent revision. -3: The third most recent revision. 0: The original stored file. 1: The first revision. 2: The second revision. etc...</param> /// <param name="bucket"><see cref="Bucket"/></param> /// <param name="cancelToken"><see cref="CancellationToken"/></param> /// <param name="filename">The filename</param> public static async Task <FileInfo> GetFileInfoByNameAsync(this Bucket bucket, string filename, int revision = -1, CancellationToken cancelToken = default) { filename = filename.SafePath(); var index = new { index = bucket.fileIndex }; var between = bucket.fileTable .Between(R.Array(Status.Completed, filename, R.Minval()), R.Array(Status.Completed, filename, R.Maxval()))[index]; var sort = revision >= 0 ? R.Asc(bucket.fileIndex) : R.Desc(bucket.fileIndex) as ReqlExpr; revision = revision >= 0 ? revision : (revision * -1) - 1; var selection = await between.OrderBy()[new { index = sort }] .Skip(revision).Limit(1) // so the driver doesn't throw an error when a file isn't found. .RunResultAsync <List <FileInfo> >(bucket.conn, cancelToken) .ConfigureAwait(false); var fileinfo = selection.FirstOrDefault(); if (fileinfo == null) { throw new FileNotFoundException(filename, revision); } return(fileinfo); }
public override NexusExtDBBaseService OrderBy(string body) { OrderBy(); string[] order = body.Split(' '); bool useIndex = order[0].StartsWith("index:"); string column = useIndex ? order[0].Substring(6) : order[0]; string dir = order.Count() > 1 ? order[1].ToLower() : "asc"; switch (dir) { case "asc": { query = useIndex ? query.OrderBy().OptArg("index", r.Asc(column)) : query.OrderBy(r.Asc(column)); break; } case "desc": { query = useIndex ? query.OrderBy().OptArg("index", r.Desc(column)) : query.OrderBy(r.Desc(column)); break; } } return(this); }