public List<Activity> GetActivity(Int64 lastActivityLogID, int count, bool declump)
{
List<Activity> activities = new List<Activity>();
SortedList<Int64, Activity> cache = GetFreshCache();
// grab as many as you can from the cache
if (lastActivityLogID == -1)
{
activities.AddRange(cache.Values);
}
else if (cache.IndexOfKey(lastActivityLogID) != -1)
{
activities.AddRange(cache.Values);
activities.RemoveRange(0, cache.IndexOfKey(lastActivityLogID) + 1);
}
List<Activity> retval = activities;
if (declump)
{
retval = GetUnclumpedSubset(activities, count);
}
else if (count < retval.Count)
{
retval.RemoveRange(count, activities.Count - count);
}
if (count > retval.Count && retval.Count > 0)
{
// we need to go to the DB to get more. If we are declumping, we don't know exacly how many more we need but we make a good guess
// and loop as needed
if (declump)
{
while (count > retval.Count)
{
SortedList<Int64, Activity> newActivities = GetRecentActivity(activities[activities.Count-1].Id, 10 * (count - retval.Count), true);
if (newActivities.Count == 0)
{
// nothing more to load, time to bail
break;
}
else
{
activities.AddRange(newActivities.Values);
retval = GetUnclumpedSubset(activities, count);
}
}
}
else
{
retval.AddRange(GetRecentActivity(retval[retval.Count - 1].Id, count - retval.Count, true).Values);
}
}
return retval;
}