Slide 13
Slide 13 text
def standings(season, league_id)
Repo.all(m in Match, where: m.season == ^season and m.league_id == ^league_id)
|> Map.merge(%{row.home_team_api_id => home_team_values(row) }, &add_up/3)
|> Map.merge(%{row.away_team_api_id => away_team_values(row) }, &add_up/3)
|> Enum.sort_by(fn s ->
{s.points, s.goal_difference, s.goals_for}
end, &>=/2)
end
defp home_team_values(row) do
%{
games: 1,
wins: Rules.wins(row.home_team_goal, row.away_team_goal),
draws: Rules.draws(row.home_team_goal, row.away_team_goal),
losses: Rules.losses(row.home_team_goal, row.away_team_goal),
goals_for: row.home_team_goal,
goals_against: row.away_team_goal,
points: Rules.points(row.home_team_goal, row.away_team_goal)
}
end
defp add_up(_k, nil, v2), do: v2
defp add_up(_k, v1, v2) when is_integer(v1), do: v1 + v2
defp add_up(_k, v1, v2) when is_map(v1), do: Map.merge(v1, v2, &add_up/3)