public static async Task<RedisKey> GetWeekAsync(
IDatabase database,
string category,
string action,
DateTime dateTime,
DayOfWeek firstDayOfWeek = DayOfWeek.Sunday)
{
// get the key
string week = BitwiseAnalytics.DateTimeUtil.WeekNumber(dateTime, firstDayOfWeek);
RedisKey key = EventKey(category, action, week);
// return it if there's already data for this day
bool weekExists = await BitwiseAnalytics.ExistsAsync(database, key);
if (weekExists)
{
return key;
}
// no data for the week, so we need to create it from the days
string[] daysInWeek = BitwiseAnalytics.DateTimeUtil.DaysInWeek(dateTime, firstDayOfWeek);
var keyTasks = new List<Task<RedisKey>>();
// make sure each day exists
// ReSharper disable once LoopCanBeConvertedToQuery
foreach (string day in daysInWeek)
{
keyTasks.Add(GetDayAsync(
database, category, action, DateTime.ParseExact(day, "yyyyMMdd", CultureInfo.InvariantCulture)));
}
await Task.WhenAll(keyTasks);
// combine the days to form one week
await BitwiseAnalytics.BitwiseOrAsync(
database,
key,
daysInWeek.Select(x => EventKey(category, action, x)).ToArray());
return key;
}