diff --git a/apps/lol_analytics/lib/lol_analytics/dimensions/match/match_repo.ex b/apps/lol_analytics/lib/lol_analytics/dimensions/match/match_repo.ex index 9a46374..56af516 100644 --- a/apps/lol_analytics/lib/lol_analytics/dimensions/match/match_repo.ex +++ b/apps/lol_analytics/lib/lol_analytics/dimensions/match/match_repo.ex @@ -11,20 +11,44 @@ defmodule LolAnalytics.Dimensions.Match.MatchRepo do case match do nil -> - match_changeset = - MatchSchema.changeset( - %MatchSchema{}, - %{match_id: match_id} - ) - - Repo.insert(match_changeset) + %MatchSchema{} + |> MatchSchema.changeset(%{ + fact_champion_played_game_status: 0, + fact_champion_picked_item_status: 0, + fact_champion_picked_summoner_spell_status: 0 + }) + |> Repo.insert() match -> match end end + @type update_attrs :: %{ + optional(:fact_champion_played_game_status) => process_status(), + optional(:fact_champion_picked_item_status) => process_status(), + optional(:fact_champion_picked_summoner_spell_status) => process_status() + } + @spec update(%MatchSchema{}, update_attrs()) :: %MatchSchema{} + def update(match, attrs) do + mapped_attrs = + attrs + |> Enum.map(fn {k, v} -> {k, process_status_atom_to_db(v)} end) + |> Map.new() + + match + |> MatchSchema.changeset(mapped_attrs) + |> Repo.update() + end + def list_matches() do Repo.all(MatchSchema) end + + @type process_status :: :not_processed | :processed | :error + defp process_status_atom_to_db(:not_processed), do: 0 + defp process_status_atom_to_db(:enqueued), do: 1 + defp process_status_atom_to_db(:processed), do: 2 + defp process_status_atom_to_db(:error), do: 3 + defp process_status_atom_to_db(_), do: raise("Invalid processing status") end diff --git a/apps/lol_analytics/lib/lol_analytics/dimensions/match/match_schema.ex b/apps/lol_analytics/lib/lol_analytics/dimensions/match/match_schema.ex index b5f50ce..4cc685a 100644 --- a/apps/lol_analytics/lib/lol_analytics/dimensions/match/match_schema.ex +++ b/apps/lol_analytics/lib/lol_analytics/dimensions/match/match_schema.ex @@ -2,14 +2,24 @@ defmodule LolAnalytics.Dimensions.Match.MatchSchema do use Ecto.Schema import Ecto.Changeset + @casting_attrs [ + :match_id, + :fact_champion_picked_item_status, + :fact_champion_picked_summoner_spell_status, + :fact_champion_played_game_status + ] + schema "dim_match" do field :match_id, :string + field :fact_champion_picked_item_status, :integer + field :fact_champion_picked_summoner_spell_status, :integer + field :fact_champion_played_game_status, :integer timestamps() end def changeset(match = %__MODULE__{}, attrs \\ %{}) do match - |> cast(attrs, [:match_id]) + |> cast(attrs, @casting_attrs) |> validate_required([:match_id]) end end diff --git a/apps/lol_analytics/lib/lol_analytics/facts/champion_picked_item/repo.ex b/apps/lol_analytics/lib/lol_analytics/facts/champion_picked_item/repo.ex index 2e2850c..a9e8321 100644 --- a/apps/lol_analytics/lib/lol_analytics/facts/champion_picked_item/repo.ex +++ b/apps/lol_analytics/lib/lol_analytics/facts/champion_picked_item/repo.ex @@ -31,7 +31,7 @@ defmodule LolAnalytics.Facts.ChampionPickedItem.Repo do :slot_number => integer() }) :: {:ok, Ecto.Schema.t()} | {:error, Ecto.Changeset.t()} def insert(attrs) do - _match = MatchRepo.get_or_create(attrs.match_id) + match = MatchRepo.get_or_create(attrs.match_id) _champion = ChampionRepo.get_or_create(attrs.champion_id) _player = PlayerRepo.get_or_create(attrs.puuid) _patch = PatchRepo.get_or_create(attrs.patch_number) @@ -49,6 +49,8 @@ defmodule LolAnalytics.Facts.ChampionPickedItem.Repo do Schema.changeset(prev || %Schema{}, attrs) |> Repo.insert_or_update() + + MatchRepo.update(match, %{fact_champion_picked_item: :processed}) end @spec get_champion_picked_items(String.t(), String.t(), String.t()) :: list() diff --git a/apps/lol_analytics/lib/lol_analytics/facts/champion_picked_summoner_spell/repo.ex b/apps/lol_analytics/lib/lol_analytics/facts/champion_picked_summoner_spell/repo.ex index cbd3953..1c964b1 100644 --- a/apps/lol_analytics/lib/lol_analytics/facts/champion_picked_summoner_spell/repo.ex +++ b/apps/lol_analytics/lib/lol_analytics/facts/champion_picked_summoner_spell/repo.ex @@ -22,7 +22,7 @@ defmodule LolAnalytics.Facts.ChampionPickedSummonerSpell.Repo do :summoner_spell_id => String.t() }) :: any() def insert(attrs) do - _match = MatchRepo.get_or_create(attrs.match_id) + match = MatchRepo.get_or_create(attrs.match_id) _champion = ChampionRepo.get_or_create(attrs.champion_id) _player = PlayerRepo.get_or_create(attrs.puuid) _spell = SummonerSpellRepo.get_or_create(attrs.summoner_spell_id) @@ -40,6 +40,8 @@ defmodule LolAnalytics.Facts.ChampionPickedSummonerSpell.Repo do Schema.changeset(prev || %Schema{}, attrs) |> Repo.insert_or_update() + + MatchRepo.update(match, %{fact_champion_picked_summoner_spell: :processed}) end @spec get_champion_picked_summoners(String.t(), String.t(), String.t()) :: list() diff --git a/apps/lol_analytics/lib/lol_analytics/facts/champion_played_game/champion_played_game_repo.ex b/apps/lol_analytics/lib/lol_analytics/facts/champion_played_game/champion_played_game_repo.ex index 5fd67d6..a8d7882 100644 --- a/apps/lol_analytics/lib/lol_analytics/facts/champion_played_game/champion_played_game_repo.ex +++ b/apps/lol_analytics/lib/lol_analytics/facts/champion_played_game/champion_played_game_repo.ex @@ -10,7 +10,7 @@ defmodule LolAnalytics.Facts.ChampionPlayedGame.Repo do alias LoLAnalytics.Repo def insert(attrs) do - _match = MatchRepo.get_or_create(attrs.match_id) + match = MatchRepo.get_or_create(attrs.match_id) _champion = ChampionRepo.get_or_create(attrs.champion_id) _player = PlayerRepo.get_or_create(attrs.puuid) _patch = PatchRepo.get_or_create(attrs.patch_number) @@ -26,6 +26,7 @@ defmodule LolAnalytics.Facts.ChampionPlayedGame.Repo do changeset = Schema.changeset(prev || %Schema{}, attrs) Repo.insert_or_update(changeset) + MatchRepo.update(match, %{fact_champion_played_game: :processed}) end def list_played_matches() do diff --git a/apps/lol_analytics/priv/repo/migrations/20240622103506_dim_match_fact_processing_status.exs b/apps/lol_analytics/priv/repo/migrations/20240622103506_dim_match_fact_processing_status.exs index 560f495..38e2c39 100644 --- a/apps/lol_analytics/priv/repo/migrations/20240622103506_dim_match_fact_processing_status.exs +++ b/apps/lol_analytics/priv/repo/migrations/20240622103506_dim_match_fact_processing_status.exs @@ -3,9 +3,9 @@ defmodule LoLAnalytics.Repo.Migrations.DimMatchFactProcessingStatus do def change do alter table("dim_match") do - add :fact_champion_played_game_status, :integer - add :fact_champion_picked_item_status, :integer - add :fact_champion_picked_summoner_spell_status, :integer + add :fact_champion_played_game_status, :integer, default: 0 + add :fact_champion_picked_item_status, :integer, default: 0 + add :fact_champion_picked_summoner_spell_status, :integer, default: 0 end create index("dim_match", [:fact_champion_played_game_status])