Exemplo n.º 1
0
        public async Task <List <ProgressResultItem> > Get([FromQuery] FilterRequest filterRequest)
        {
            var result = (await GetActivitiesGroupByDate(filterRequest))
                         .Select(
                group =>
            {
                if (group.Value?.Any() != true)
                {
                    return(new ProgressResultItem
                    {
                        Name = group.Key
                    });
                }

                return(new ProgressResultItem
                {
                    Name = group.Key,
                    ActivityCount = ItemValue.TryCreate(group.Value.Count, ItemValueType.Number),
                    Distance = ItemValue.TryCreate(
                        group.Value.Where(item => item.Distance != null).SumOrNull(activity => activity.Distance?.Value),
                        ItemValueType.DistanceInMeters),
                    ElapsedTime = ItemValue.TryCreate(
                        group.Value.Where(item => item.ElapsedTime != null).SumOrNull(activity => activity.ElapsedTime?.Value),
                        ItemValueType.TimeInSeconds),
                    Pace = ItemValue.TryCreate(
                        group.Value.Where(item => item.Pace != null)
                        .AverageBy(activity => activity.ElapsedTime.Value, activity => activity.Pace.Value),
                        ItemValueType.MetersPerSecond),
                    Heartrate = ItemValue.TryCreate(
                        group.Value.Where(item => item.Heartrate != null).AverageOrNull(activity => activity.Heartrate?.Value),
                        ItemValueType.Heartrate),
                    Lactate = ItemValue.TryCreate(
                        group.Value.Where(item => item.Lactate != null).AverageOrNull(activity => activity.Lactate?.Value),
                        ItemValueType.Lactate)
                });
            })
                         .ToList();

            result.CalculateFactorsFor(item => item.ActivityCount);
            result.CalculateFactorsFor(item => item.Distance);
            result.CalculateFactorsFor(item => item.ElapsedTime);
            result.CalculateFactorsFor(item => item.Pace, true);
            result.CalculateFactorsFor(item => item.Heartrate, true);
            result.CalculateFactorsFor(item => item.Lactate, true);

            return(result);
        }
Exemplo n.º 2
0
        public static List <ActivityDataSummary> ToActivitySummary(this IEnumerable <DetailedActivity> activities, FilterRequest filterRequest)
        {
            var result = activities
                         .Where(activity => filterRequest.DataType != FilterDataType.Interval || !activity.IgnoreIntervals)
                         .Select(
                activity =>
            {
                ItemValue distance    = null;
                ItemValue elapsedTime = null;
                ItemValue pace        = null;
                ItemValue heartrate   = null;
                ItemValue lactate     = null;
                ItemValue feeling     = activity.Feeling.HasValue ? new ItemValue(activity.Feeling.Value, ItemValueType.Feeling) : null;

                if (filterRequest.DataType == FilterDataType.Activity)
                {
                    distance    = new ItemValue(activity.Distance, ItemValueType.DistanceInMeters);
                    elapsedTime = new ItemValue(activity.MovingTime, ItemValueType.TimeInSeconds);
                    pace        = new ItemValue(activity.AverageSpeed, ItemValueType.MetersPerSecond);
                    heartrate   = activity.AverageHeartrate > 0 ? new ItemValue(activity.AverageHeartrate, ItemValueType.Heartrate) : null;
                    lactate     = activity.AverageLactate.HasValue ? new ItemValue(activity.AverageLactate.Value, ItemValueType.Lactate) : null;
                }
                else if (filterRequest.DataType == FilterDataType.Interval)
                {
                    var intervalLaps = activity.Laps?.Where(lap => lap.IsInterval).ToList();

                    if (intervalLaps?.Any() == true)
                    {
                        distance    = new ItemValue(intervalLaps.Sum(lap => lap.Distance), ItemValueType.DistanceInMeters);
                        elapsedTime = new ItemValue(intervalLaps.Sum(lap => lap.ElapsedTime), ItemValueType.TimeInSeconds);
                        pace        = new ItemValue(
                            intervalLaps.AverageBy(lap => lap.ElapsedTime, lap => lap.AverageSpeed).Value,
                            ItemValueType.MetersPerSecond);
                        heartrate = ItemValue.TryCreate(
                            intervalLaps.Where(lap => lap.AverageHeartrate > 0).AverageOrNull(lap => lap.AverageHeartrate),
                            ItemValueType.Heartrate);
                        lactate = ItemValue.TryCreate(
                            intervalLaps.Where(lap => lap.Lactate > 0).AverageOrNull(lap => lap.Lactate),
                            ItemValueType.Lactate);
                    }
                }
                else if (filterRequest.DataType == FilterDataType.Threshold && filterRequest.MinPace.HasValue && filterRequest.MaxPace.HasValue)
                {
                    if (activity.Laps != null)
                    {
                        var thresholdLaps = activity.Laps
                                            .Where(
                            lap => lap.ElapsedTime > 120 &&
                            lap.AverageSpeed >= filterRequest.MinPace.Value.ToMetersPerSecond() &&
                            lap.AverageSpeed <= filterRequest.MaxPace.Value.ToMetersPerSecond())
                                            .ToList();

                        if (thresholdLaps.Any())
                        {
                            distance    = new ItemValue(thresholdLaps.Sum(lap => lap.Distance), ItemValueType.DistanceInMeters);
                            elapsedTime = new ItemValue(thresholdLaps.Sum(lap => lap.ElapsedTime), ItemValueType.TimeInSeconds);
                            pace        = new ItemValue(
                                thresholdLaps.AverageBy(lap => lap.ElapsedTime, lap => lap.AverageSpeed).Value,
                                ItemValueType.MetersPerSecond);
                            heartrate = ItemValue.TryCreate(
                                thresholdLaps.Where(lap => lap.AverageHeartrate > 0).AverageOrNull(lap => lap.AverageHeartrate),
                                ItemValueType.Heartrate);
                            lactate = ItemValue.TryCreate(
                                thresholdLaps.Where(lap => lap.Lactate > 0).AverageOrNull(lap => lap.Lactate),
                                ItemValueType.Number);
                        }
                    }
                    else if (activity.ElapsedTime > 120 &&
                             activity.AverageSpeed >= filterRequest.MinPace.Value.ToMetersPerSecond() &&
                             activity.AverageSpeed <= filterRequest.MaxPace.Value.ToMetersPerSecond())
                    {
                        distance    = new ItemValue(activity.Distance, ItemValueType.DistanceInMeters);
                        elapsedTime = new ItemValue(activity.MovingTime, ItemValueType.TimeInSeconds);
                        pace        = new ItemValue(activity.AverageSpeed, ItemValueType.MetersPerSecond);
                        heartrate   = activity.AverageHeartrate > 0 ? new ItemValue(activity.AverageHeartrate, ItemValueType.Heartrate) : null;
                        lactate     = activity.AverageLactate.HasValue ? new ItemValue(activity.AverageLactate.Value, ItemValueType.Lactate) : null;
                        feeling     = activity.Feeling.HasValue ? new ItemValue(activity.Feeling.Value, ItemValueType.Feeling) : null;
                    }
                }

                return(new ActivityDataSummary
                {
                    Activity = activity,
                    Distance = distance,
                    ElapsedTime = elapsedTime,
                    Pace = pace,
                    Heartrate = heartrate,
                    Lactate = lactate,
                    Feeling = feeling
                });
            })
                         .Where(activity => activity.Distance != null)
                         .ToList();

            result.CalculateFactorsFor(item => item.Distance);
            result.CalculateFactorsFor(item => item.ElapsedTime);
            result.CalculateFactorsFor(item => item.Pace, true);
            result.CalculateFactorsFor(item => item.Heartrate, true);
            result.CalculateFactorsFor(item => item.Lactate, true);

            return(result);
        }