add metadata to summoner spell
This commit is contained in:
+22
@@ -0,0 +1,22 @@
|
||||
defmodule LolAnalytics.Dimensions.SummonerSpell.SummonerSpellMetadata do
|
||||
alias LolAnalytics.Dimensions.SummonerSpell.SummonerSpellRepo
|
||||
@spells_url "https://ddragon.leagueoflegends.com/cdn/14.11.1/data/en_US/summoner.json"
|
||||
|
||||
def update_metadata() do
|
||||
get_spells()
|
||||
|> Enum.each(&save_metadata/1)
|
||||
end
|
||||
|
||||
defp get_spells() do
|
||||
case HTTPoison.get(@spells_url) do
|
||||
{:ok, resp} ->
|
||||
Poison.decode!(resp.body)["data"]
|
||||
end
|
||||
end
|
||||
|
||||
defp save_metadata({name, metadata}) do
|
||||
%{"key" => spell_id} = metadata
|
||||
|
||||
SummonerSpellRepo.update(spell_id, %{metadata: metadata})
|
||||
end
|
||||
end
|
||||
@@ -4,6 +4,7 @@ defmodule LolAnalytics.Dimensions.SummonerSpell.SummonerSpellRepo do
|
||||
alias LolAnalytics.Dimensions.SummonerSpell.SummonerSpellSchema
|
||||
alias LoLAnalytics.Repo
|
||||
|
||||
@spec get_or_create(String.t()) :: any()
|
||||
def get_or_create(spell_id) do
|
||||
query = from s in SummonerSpellSchema, where: s.spell_id == ^spell_id
|
||||
spell = Repo.one(query)
|
||||
@@ -23,6 +24,13 @@ defmodule LolAnalytics.Dimensions.SummonerSpell.SummonerSpellRepo do
|
||||
end
|
||||
end
|
||||
|
||||
@spec update(spell_id :: String.t(), attrs :: map()) :: any()
|
||||
def update(spell_id, attrs) do
|
||||
get_or_create(spell_id)
|
||||
|> SummonerSpellSchema.changeset(attrs)
|
||||
|> Repo.update()
|
||||
end
|
||||
|
||||
def list_spells() do
|
||||
Repo.all(SummonerSpellSchema)
|
||||
end
|
||||
|
||||
+2
-1
@@ -4,12 +4,13 @@ defmodule LolAnalytics.Dimensions.SummonerSpell.SummonerSpellSchema do
|
||||
|
||||
schema "dim_summoner_spell" do
|
||||
field :spell_id, :integer
|
||||
field :metadata, :map
|
||||
timestamps()
|
||||
end
|
||||
|
||||
def changeset(summoner_spell = %__MODULE__{}, attrs) do
|
||||
summoner_spell
|
||||
|> cast(attrs, [:spell_id])
|
||||
|> cast(attrs, [:spell_id, :metadata])
|
||||
|> validate_required([:spell_id])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
defmodule LolAnalytics.Facts.ChampionPickedSummonerSpell.Repo do
|
||||
import Ecto.Query
|
||||
|
||||
alias LolAnalytics.Dimensions.SummonerSpell.SummonerSpellSchema
|
||||
alias LolAnalytics.Dimensions.SummonerSpell.SummonerSpellRepo
|
||||
alias LolAnalytics.Dimensions.Champion.ChampionSchema
|
||||
|
||||
@@ -13,11 +14,11 @@ defmodule LolAnalytics.Facts.ChampionPickedSummonerSpell.Repo do
|
||||
alias LoLAnalytics.Repo
|
||||
|
||||
@type insert_attrs :: %{
|
||||
match_id: String.t(),
|
||||
champion_id: String.t(),
|
||||
puuid: String.t(),
|
||||
summoner_spell_id: :integer
|
||||
}
|
||||
match_id: String.t(),
|
||||
champion_id: String.t(),
|
||||
puuid: String.t(),
|
||||
summoner_spell_id: :integer
|
||||
}
|
||||
|
||||
@spec insert(insert_attrs()) :: any()
|
||||
def insert(attrs) do
|
||||
@@ -33,11 +34,17 @@ defmodule LolAnalytics.Facts.ChampionPickedSummonerSpell.Repo do
|
||||
|> IO.inspect()
|
||||
end
|
||||
|
||||
@spec get_champion_spells_by_win_rate(String.t()) :: list()
|
||||
def get_champion_spells_by_win_rate(championId) do
|
||||
end
|
||||
|
||||
def get_champion_picked_summoners() do
|
||||
query =
|
||||
from f in Schema,
|
||||
join: c in ChampionSchema,
|
||||
on: c.champion_id == f.champion_id,
|
||||
join: s in SummonerSpellSchema,
|
||||
on: s.spell_id == f.summoner_spell_id,
|
||||
select: %{
|
||||
wins: fragment("count(CASE WHEN ? THEN 1 END)", f.is_win),
|
||||
win_rate:
|
||||
@@ -48,13 +55,23 @@ defmodule LolAnalytics.Facts.ChampionPickedSummonerSpell.Repo do
|
||||
f.is_win
|
||||
),
|
||||
id: f.champion_id,
|
||||
spell_id: f.spell_id,
|
||||
name: c.name,
|
||||
spell_id: f.summoner_spell_id,
|
||||
metadata: s.metadata,
|
||||
champion_name: c.name,
|
||||
champion_id: c.champion_id,
|
||||
image: c.image,
|
||||
team_position: f.team_position,
|
||||
total_games: count("*")
|
||||
},
|
||||
group_by: [f.champion_id, f.spell_id, c.image, c.name, f.team_position]
|
||||
group_by: [
|
||||
f.champion_id,
|
||||
f.summoner_spell_id,
|
||||
s.metadata,
|
||||
c.image,
|
||||
c.name,
|
||||
c.champion_id,
|
||||
f.team_position
|
||||
]
|
||||
|
||||
Repo.all(query)
|
||||
end
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
defmodule LoLAnalytics.Repo.Migrations.SummonerSpellMetadata do
|
||||
use Ecto.Migration
|
||||
|
||||
def change do
|
||||
alter table("dim_summoner_spell") do
|
||||
add :metadata, :map
|
||||
end
|
||||
end
|
||||
end
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
defmodule LoLAnalytics.Repo.Migrations.SummonerSpellMetadataIndex do
|
||||
use Ecto.Migration
|
||||
|
||||
def up do
|
||||
execute("CREATE INDEX dim_summoner_spell_metadata ON dim_summoner_spell USING GIN(metadata)")
|
||||
end
|
||||
|
||||
def down do
|
||||
execute("DROP INDEX dim_summoner_spell_metadata")
|
||||
end
|
||||
end
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
defmodule LolAnalyticsWeb.ChampionComponents.SummonerSpells.SummonerSpell do
|
||||
defstruct [:id, :win_rate, :total_games]
|
||||
|
||||
@type t :: %{
|
||||
id: integer(),
|
||||
win_rate: float(),
|
||||
total_games: integer()
|
||||
}
|
||||
end
|
||||
|
||||
defmodule LolAnalyticsWeb.ChampionComponents.SummonerSpells.Props do
|
||||
alias LolAnalyticsWeb.ChampionComponents.SummonerSpells.SummonerSpell
|
||||
|
||||
defstruct spell1: %SummonerSpell{},
|
||||
spell2: %SummonerSpell{}
|
||||
|
||||
@type t :: %{
|
||||
spell1: SummonerSpell.t(),
|
||||
spell2: SummonerSpell.t()
|
||||
}
|
||||
end
|
||||
|
||||
defmodule LolAnalyticsWeb.ChampionComponents.SummonerSpells do
|
||||
alias LolAnalyticsWeb.ChampionComponents.SummonerSpells.Props
|
||||
use Phoenix.Component
|
||||
|
||||
attr :spells, Props, default: %Props{}
|
||||
|
||||
def summoner_spells(assigns) do
|
||||
~H"""
|
||||
<div>
|
||||
Spells
|
||||
</div>
|
||||
"""
|
||||
end
|
||||
end
|
||||
@@ -1,3 +1,3 @@
|
||||
defmodule LolAnalyticsWeb.ChampionLive.Champion do
|
||||
defmodule LolAnalyticsWeb.ChampionLive.ChampionSummary do
|
||||
defstruct [:id, :win_rate, :image, :name, :team_position, :wins, :total_games]
|
||||
end
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
defmodule LolAnalyticsWeb.ChampionLive.Mapper do
|
||||
alias LolAnalyticsWeb.ChampionLive.Champion
|
||||
alias LolAnalyticsWeb.ChampionLive.ChampionSummary
|
||||
|
||||
def map_champs(champs) do
|
||||
champs
|
||||
|> Enum.map(fn champ ->
|
||||
%{
|
||||
Kernel.struct!(%Champion{}, champ)
|
||||
Kernel.struct!(%ChampionSummary{}, champ)
|
||||
| win_rate: :erlang.float_to_binary(champ.win_rate, decimals: 2)
|
||||
}
|
||||
end)
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
defmodule LoLAnalyticsWeb.ChampionLive.Show do
|
||||
use LoLAnalyticsWeb, :live_view
|
||||
|
||||
import LolAnalyticsWeb.ChampionComponents.SummonerSpells
|
||||
|
||||
@impl true
|
||||
def mount(_params, _session, socket) do
|
||||
{:ok, socket}
|
||||
@@ -11,7 +13,23 @@ defmodule LoLAnalyticsWeb.ChampionLive.Show do
|
||||
{:noreply,
|
||||
socket
|
||||
|> assign(:page_title, page_title(socket.assigns.live_action))
|
||||
|> assign(:champion, %{id: id})}
|
||||
|> assign(:champion, %{id: id})
|
||||
|> assign(:summoner_spells, %{summoner_spells: load_summoner_spells()})}
|
||||
end
|
||||
|
||||
defp load_summoner_spells() do
|
||||
%LolAnalyticsWeb.ChampionComponents.SummonerSpells.Props{
|
||||
spell1: %LolAnalyticsWeb.ChampionComponents.SummonerSpells.SummonerSpell{
|
||||
id: 1,
|
||||
win_rate: 51.7,
|
||||
total_games: 400
|
||||
},
|
||||
spell2: %LolAnalyticsWeb.ChampionComponents.SummonerSpells.SummonerSpell{
|
||||
id: 2,
|
||||
win_rate: 51.7,
|
||||
total_games: 500
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
defp page_title(:show), do: "Show Champion"
|
||||
|
||||
@@ -4,4 +4,8 @@
|
||||
<:actions></:actions>
|
||||
</.header>
|
||||
|
||||
<.back navigate={~p"/champions"}>Back to champions</.back>
|
||||
<.summoner_spells spells={@summoner_spells} />
|
||||
|
||||
<.back navigate={~p"/champions"}>
|
||||
Back to champions
|
||||
</.back>
|
||||
|
||||
@@ -3,5 +3,3 @@
|
||||
<:subtitle>This is a role record from your database.</:subtitle>
|
||||
<:actions></:actions>
|
||||
</.header>
|
||||
|
||||
<.back navigate={~p"/roles"}>Back to roles</.back>
|
||||
|
||||
Reference in New Issue
Block a user