From 6d89ed657cec5c469eba55991703d431ececfc00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro?= Date: Fri, 14 Jun 2024 04:58:40 +0200 Subject: [PATCH] spawn tasks for processing matches --- apps/lol_analytics/lib/lol_analytics/application.ex | 3 ++- .../lol_analytics/facts/champion_picked_item/repo.ex | 3 ++- .../lib/lol_analytics/facts/facts_runner.ex | 10 ++++++++++ .../lib/lol_analytics/matches_processor.ex | 12 ++++++++++++ apps/storage/lib/match_storage/s3_match_storage.ex | 6 ++++-- 5 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 apps/lol_analytics/lib/lol_analytics/matches_processor.ex diff --git a/apps/lol_analytics/lib/lol_analytics/application.ex b/apps/lol_analytics/lib/lol_analytics/application.ex index 5ecfabe..0aee9c5 100644 --- a/apps/lol_analytics/lib/lol_analytics/application.ex +++ b/apps/lol_analytics/lib/lol_analytics/application.ex @@ -10,7 +10,8 @@ defmodule LoLAnalytics.Application do children = [ LoLAnalytics.Repo, {DNSCluster, query: Application.get_env(:lol_analytics, :dns_cluster_query) || :ignore}, - {Phoenix.PubSub, name: LoLAnalytics.PubSub} + {Phoenix.PubSub, name: LoLAnalytics.PubSub}, + {Task.Supervisor, name: LoLAnalytics.TaskSupervisor} # Start a worker by calling: LoLAnalytics.Worker.start_link(arg) # {LoLAnalytics.Worker, arg} ] 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 8da271e..c6925b6 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 @@ -1,6 +1,7 @@ defmodule LolAnalytics.Facts.ChampionPickedItem.Repo do import Ecto.Query + alias LolAnalytics.Dimensions.Patch.PatchRepo alias LolAnalytics.Dimensions.Item.ItemSchema alias LolAnalytics.Dimensions.Champion.ChampionSchema alias LolAnalytics.Facts.ChampionPickedItem.Schema @@ -33,7 +34,7 @@ defmodule LolAnalytics.Facts.ChampionPickedItem.Repo do _match = MatchRepo.get_or_create(attrs.match_id) _champion = ChampionRepo.get_or_create(attrs.champion_id) _player = PlayerRepo.get_or_create(attrs.puuid) - _patch = PlayerRepo.get_or_create(attrs.patch_number) + _patch = PatchRepo.get_or_create(attrs.patch_number) _item_id = ItemRepo.get_or_create(attrs.item_id) prev = diff --git a/apps/lol_analytics/lib/lol_analytics/facts/facts_runner.ex b/apps/lol_analytics/lib/lol_analytics/facts/facts_runner.ex index 034aedb..f098502 100644 --- a/apps/lol_analytics/lib/lol_analytics/facts/facts_runner.ex +++ b/apps/lol_analytics/lib/lol_analytics/facts/facts_runner.ex @@ -1,6 +1,16 @@ defmodule LolAnalytics.Facts.FactsRunner do alias LolAnalytics.Facts + def analyze_by_patch(patch) do + Storage.MatchStorage.S3MatchStorage.stream_files("ranked", patch: patch) + |> peach(fn %{key: path} -> + get_facts() + |> Enum.each(fn fact_runner -> + apply(fact_runner, ["http://192.168.1.55:9000/ranked/#{path}"]) + end) + end) + end + def analyze_all_matches do Storage.MatchStorage.S3MatchStorage.stream_files("ranked") |> peach(fn %{key: path} -> diff --git a/apps/lol_analytics/lib/lol_analytics/matches_processor.ex b/apps/lol_analytics/lib/lol_analytics/matches_processor.ex new file mode 100644 index 0000000..de4618d --- /dev/null +++ b/apps/lol_analytics/lib/lol_analytics/matches_processor.ex @@ -0,0 +1,12 @@ +defmodule LolAnalytics.MatchesProcessor do + use GenServer + + @doc """ + iex> LolAnalytics.MatchesProcessor.process_for_patch "14.12.593.5894" + """ + def process_for_patch(patch) do + Task.Supervisor.async(LoLAnalytics.TaskSupervisor, fn -> + LolAnalytics.Facts.FactsRunner.analyze_by_patch(patch) + end) + end +end diff --git a/apps/storage/lib/match_storage/s3_match_storage.ex b/apps/storage/lib/match_storage/s3_match_storage.ex index 91ae8a2..636fc31 100644 --- a/apps/storage/lib/match_storage/s3_match_storage.ex +++ b/apps/storage/lib/match_storage/s3_match_storage.ex @@ -7,8 +7,10 @@ defmodule Storage.MatchStorage.S3MatchStorage do end @impl true - def stream_files(path) do - ExAws.S3.list_objects_v2(path) + def stream_files(path, opts \\ []) do + patch = Keyword.get(opts, :patch, "") + + ExAws.S3.list_objects_v2(path, prefix: patch) |> ExAws.stream!() end