From 415f41718236c70e41543edd311ae912fb6e4728 Mon Sep 17 00:00:00 2001 From: StewKI Date: Sun, 17 May 2026 20:25:33 +0200 Subject: [PATCH] a u kurac --- data/01_EWC2025_Event_Tournament_Summary.csv | 28 - data/02_EWC2025_Medalists.csv | 258 --------- ...03_EWC2025_Club_Championship_Standings.csv | 25 - data/04_EWC2025_Club_Partner_Program.csv | 41 -- data/05_EWC2025_Player_Roster.csv | 273 ---------- data/06_EWC2025_Prize_Pool_Distribution.csv | 6 - data/07_EWC2025_Calendar_Schedule.csv | 28 - data/08_EWC2025_Country_Results.csv | 37 -- data/09_EWC2025_Point_System.csv | 17 - data/10_EWC2025_Game_by_Game_Results.csv | 51 -- data/README.md | 202 -------- docs/01_overview.md | 83 --- docs/02_dataset.md | 50 -- docs/03_oltp_schema.md | 140 ----- docs/04_datamart.md | 198 ------- docs/05_etl_pipeline.md | 135 ----- docs/06_infrastructure.md | 109 ---- docs/07_conclusion.md | 97 ---- nifi/NIFI_SETUP.md | 359 ------------- nifi/sql/extract/01_dim_date.sql | 18 - nifi/sql/extract/02_dim_game.sql | 2 - nifi/sql/extract/03_dim_country.sql | 2 - nifi/sql/extract/04_dim_organization.sql | 10 - nifi/sql/extract/05_fact_tournament.sql | 18 - nifi/sql/extract/06_fact_medal_award.sql | 16 - nifi/sql/extract/07_fact_club_standing.sql | 9 - nifi/sql/load/01_dim_date.sql | 12 - nifi/sql/load/02_dim_medal.sql | 4 - nifi/sql/load/03_dim_game.sql | 7 - nifi/sql/load/04_dim_country.sql | 6 - nifi/sql/load/05_dim_organization.sql | 10 - nifi/sql/load/06_fact_tournament.sql | 18 - nifi/sql/load/07_fact_medal_award.sql | 16 - nifi/sql/load/08_fact_club_standing.sql | 13 - scripts/seed.cs | 489 ------------------ sql/datamart_schema.sql | 149 ------ sql/schema.sql | 186 ------- 37 files changed, 3122 deletions(-) delete mode 100644 data/01_EWC2025_Event_Tournament_Summary.csv delete mode 100644 data/02_EWC2025_Medalists.csv delete mode 100644 data/03_EWC2025_Club_Championship_Standings.csv delete mode 100644 data/04_EWC2025_Club_Partner_Program.csv delete mode 100644 data/05_EWC2025_Player_Roster.csv delete mode 100644 data/06_EWC2025_Prize_Pool_Distribution.csv delete mode 100644 data/07_EWC2025_Calendar_Schedule.csv delete mode 100644 data/08_EWC2025_Country_Results.csv delete mode 100644 data/09_EWC2025_Point_System.csv delete mode 100644 data/10_EWC2025_Game_by_Game_Results.csv delete mode 100644 data/README.md delete mode 100644 docs/01_overview.md delete mode 100644 docs/02_dataset.md delete mode 100644 docs/03_oltp_schema.md delete mode 100644 docs/04_datamart.md delete mode 100644 docs/05_etl_pipeline.md delete mode 100644 docs/06_infrastructure.md delete mode 100644 docs/07_conclusion.md delete mode 100644 nifi/NIFI_SETUP.md delete mode 100644 nifi/sql/extract/01_dim_date.sql delete mode 100644 nifi/sql/extract/02_dim_game.sql delete mode 100644 nifi/sql/extract/03_dim_country.sql delete mode 100644 nifi/sql/extract/04_dim_organization.sql delete mode 100644 nifi/sql/extract/05_fact_tournament.sql delete mode 100644 nifi/sql/extract/06_fact_medal_award.sql delete mode 100644 nifi/sql/extract/07_fact_club_standing.sql delete mode 100644 nifi/sql/load/01_dim_date.sql delete mode 100644 nifi/sql/load/02_dim_medal.sql delete mode 100644 nifi/sql/load/03_dim_game.sql delete mode 100644 nifi/sql/load/04_dim_country.sql delete mode 100644 nifi/sql/load/05_dim_organization.sql delete mode 100644 nifi/sql/load/06_fact_tournament.sql delete mode 100644 nifi/sql/load/07_fact_medal_award.sql delete mode 100644 nifi/sql/load/08_fact_club_standing.sql delete mode 100644 scripts/seed.cs delete mode 100644 sql/datamart_schema.sql delete mode 100644 sql/schema.sql diff --git a/data/01_EWC2025_Event_Tournament_Summary.csv b/data/01_EWC2025_Event_Tournament_Summary.csv deleted file mode 100644 index bf90b5b..0000000 --- a/data/01_EWC2025_Event_Tournament_Summary.csv +++ /dev/null @@ -1,28 +0,0 @@ -Game,Event_Name,Start_Date,End_Date,Prize_Pool_USD,Num_Participants,Winner,Runner_Up,Game_Type,Platform,Club_Championship_Points,Gender -Rennsport,Rennsport R1 at EWC 2025,2025-07-08,2025-07-11,500000,9,BMW M Team Redline Red Bull Sim Racing,Virtus.pro,Racing,PC,Yes, -Valorant,Esports World Cup 2025,2025-07-08,2025-07-13,1250000,16,Team Heretics,Fnatic,Tactical Shooter,PC,Yes, -Dota 2,Esports World Cup 2025,2025-07-08,2025-07-19,3000000,16,Team Spirit,Team Falcons,MOBA,PC,Yes, -Fatal Fury: City of the Wolves,Esports World Cup 2025,2025-07-10,2025-07-12,1000000,16,GO1 (DetonatioN FocusMe),Xiaohai (KuaiShou Gaming),Fighting,Console/PC,Yes, -Apex Legends,ALGS 2025 Midseason Playoffs,2025-07-10,2025-07-13,2000000,40,VK Gaming,ROC Esports,Battle Royale,PC/Console,Yes, -Mobile Legends: Bang Bang,MLBB Mid Season Cup 2025,2025-07-10,2025-08-02,3000000,23,Team Liquid PH,SRG.OG,MOBA,Mobile,Yes,Men -Mobile Legends: Bang Bang,MLBB Women's Invitational 2025,2025-07-15,2025-07-19,500000,16,Team Vitality,Gaimin Gladiators,MOBA,Mobile,Yes,Women -Honor of Kings,HoK World Cup 2025,2025-07-15,2025-07-26,3000000,18,AG.AL,ThunderTalk Global,MOBA,Mobile,Yes, -Free Fire,Esports World Cup 2025,2025-07-16,2025-07-20,1000000,18,EVOS Esports,Rex Regum Qeon,Battle Royale,Mobile,Yes, -League of Legends,Esports World Cup 2025,2025-07-16,2025-07-20,2000000,12,Gen.G,AG.AL,MOBA,PC,Yes, -StarCraft II,Esports World Cup 2025,2025-07-22,2025-07-25,700000,18,Serral (Basilisk),Classic (Virtus.pro),RTS,PC,Yes, -Call of Duty: Black Ops 6,Esports World Cup 2025,2025-07-24,2025-07-27,1800000,16,OpTic Gaming,Vancouver Surge,FPS,Console/PC,Yes, -PUBG Mobile,PUBG Mobile World Cup 2025,2025-07-25,2025-08-03,3000000,24,Yangon Galacticos,Weibo Gaming,Battle Royale,Mobile,Yes, -Chess,Esports World Cup 2025,2025-07-29,2025-08-01,1500000,16,Magnus Carlsen (Team Liquid),Alireza Firouzja (Team Falcons),Strategy,Online,Yes, -Overwatch 2,OWCS Midseason Championship 2025,2025-07-31,2025-08-03,1000000,16,Team Falcons,Al Qadsiah,FPS,PC,Yes, -Rainbow Six Siege X,Esports World Cup 2025,2025-08-05,2025-08-09,2000000,16,Team Secret,G2 Esports,Tactical Shooter,PC,Yes, -Call of Duty: Warzone,Esports World Cup 2025,2025-08-06,2025-08-09,1000000,21,Twisted Minds,Gentle Mates,Battle Royale,Console/PC,Yes, -EA Sports FC 25,FC Pro 25 World Championship,2025-08-07,2025-08-10,1000000,32,ManuBachoore (Team Liquid),Brice (Team Vitality),Sports,Console/PC,Yes, -Teamfight Tactics,Esports World Cup 2025,2025-08-11,2025-08-15,500000,16,Weibo Gaming,Virtus.pro,Auto Battler,PC,Yes, -PUBG: Battlegrounds,Esports World Cup 2025,2025-08-12,2025-08-16,2000000,24,Twisted Minds,Gen.G,Battle Royale,PC,Yes, -Tekken 8,Esports World Cup 2025,2025-08-13,2025-08-16,1000000,32,ULSAN (DN Freecs),LOWHIGH (DRX),Fighting,Console/PC,Yes, -Rocket League,Esports World Cup 2025,2025-08-14,2025-08-17,1000000,16,Karmine Corp,Geekay Esports,Sports,PC/Console,Yes, -CrossFire,Esports World Cup 2025,2025-08-19,2025-08-23,2000000,16,AG.AL,BaiSha Gaming,FPS,PC,Yes, -Street Fighter 6,Esports World Cup 2025,2025-08-20,2025-08-23,1000000,48,Xiaohai (KuaiShou Gaming),Blaz (2Game Esports),Fighting,Console/PC,Yes, -Counter-Strike 2,Esports World Cup 2025,2025-08-20,2025-08-24,1250000,16,The MongolZ,Aurora Gaming,FPS,PC,Yes, -Naraka: Bladepoint,Mid-Season Championship 2025 Solo,2025-08-19,2025-08-19,150000,12,TBD,TBD,Battle Royale,PC,No, -Naraka: Bladepoint,Mid-Season Championship 2025 Trios,2025-08-20,2025-08-20,350000,12,TBD,TBD,Battle Royale,PC,No, diff --git a/data/02_EWC2025_Medalists.csv b/data/02_EWC2025_Medalists.csv deleted file mode 100644 index 1c484c7..0000000 --- a/data/02_EWC2025_Medalists.csv +++ /dev/null @@ -1,258 +0,0 @@ -Event,Medal,Team_Organization,Player,Country,Role -Apex Legends,Gold,VK Gaming,Kasssa,Brazil,Player -Apex Legends,Gold,VK Gaming,QQ,China,Player -Apex Legends,Gold,VK Gaming,LqDuD,China,Player -Apex Legends,Silver,ROC Esports,Vaxlon,Philippines,Player -Apex Legends,Silver,ROC Esports,Deeds,Australia,Player -Apex Legends,Silver,ROC Esports,Sauceror,USA,Player -Apex Legends,Bronze,Ninjas in Pyjamas,Vein,USA,Player -Apex Legends,Bronze,Ninjas in Pyjamas,Kurev,Russia,Player -Apex Legends,Bronze,Ninjas in Pyjamas,McLovin,USA,Player -Call of Duty: Black Ops 6,Gold,OpTic Gaming,Dashy,USA,Player -Call of Duty: Black Ops 6,Gold,OpTic Gaming,Huke,USA,Player -Call of Duty: Black Ops 6,Gold,OpTic Gaming,Mercules,USA,Player -Call of Duty: Black Ops 6,Gold,OpTic Gaming,Shotzzy,USA,Player -Call of Duty: Black Ops 6,Silver,Vancouver Surge,04,Canada,Player -Call of Duty: Black Ops 6,Silver,Vancouver Surge,Abuzah,Morocco,Player -Call of Duty: Black Ops 6,Silver,Vancouver Surge,Neptune,USA,Player -Call of Duty: Black Ops 6,Silver,Vancouver Surge,Nastie,UK,Player -Call of Duty: Black Ops 6,Bronze,Movistar KOI,Abe,Spain,Player -Call of Duty: Black Ops 6,Bronze,Movistar KOI,CleanX,Denmark,Player -Call of Duty: Black Ops 6,Bronze,Movistar KOI,Insight,UK,Player -Call of Duty: Black Ops 6,Bronze,Movistar KOI,JoeDeceives,USA,Player -Call of Duty: Warzone,Gold,Twisted Minds,zSmit,USA,Player -Call of Duty: Warzone,Gold,Twisted Minds,Almond,USA,Player -Call of Duty: Warzone,Gold,Twisted Minds,Aydan,USA,Player -Call of Duty: Warzone,Silver,Gentle Mates,Enkeo,France,Player -Call of Duty: Warzone,Silver,Gentle Mates,Gromalok,France,Player -Call of Duty: Warzone,Silver,Gentle Mates,HalloW,France,Player -Call of Duty: Warzone,Bronze,Virtus.pro,Dongy,South Korea,Player -Call of Duty: Warzone,Bronze,Virtus.pro,Newbz,USA,Player -Call of Duty: Warzone,Bronze,Virtus.pro,Sage,USA,Player -Chess,Gold,Team Liquid,Magnus Carlsen,Norway,Player -Chess,Silver,Team Falcons,Alireza Firouzja,France,Player -Chess,Bronze,Team Falcons,Hikaru Nakamura,USA,Player -CrossFire,Gold,AG.AL,ZY,China,Player -CrossFire,Gold,AG.AL,Jwei,China,Player -CrossFire,Gold,AG.AL,Doo,China,Player -CrossFire,Gold,AG.AL,1222,China,Player -CrossFire,Gold,AG.AL,ZQ,China,Player -CrossFire,Silver,BaiSha Gaming,Xxiao,China,Player -CrossFire,Silver,BaiSha Gaming,N9,China,Player -CrossFire,Silver,BaiSha Gaming,577,China,Player -CrossFire,Silver,BaiSha Gaming,Lye,China,Player -CrossFire,Silver,BaiSha Gaming,YDSS,China,Player -CrossFire,Bronze,Evolution Power,ZAY,China,Player -CrossFire,Bronze,Evolution Power,mino,China,Player -CrossFire,Bronze,Evolution Power,YZK,China,Player -CrossFire,Bronze,Evolution Power,yh,China,Player -CrossFire,Bronze,Evolution Power,xqq,China,Player -Counter-Strike 2,Gold,The MongolZ,Techno4K,Mongolia,Player -Counter-Strike 2,Gold,The MongolZ,910,Mongolia,Player -Counter-Strike 2,Gold,The MongolZ,mzinho,Mongolia,Player -Counter-Strike 2,Gold,The MongolZ,bLitz,Mongolia,Player -Counter-Strike 2,Gold,The MongolZ,Senzu,Mongolia,Player -Counter-Strike 2,Silver,Aurora Gaming,MAJ3R,Turkey,Player -Counter-Strike 2,Silver,Aurora Gaming,XANTARES,Turkey,Player -Counter-Strike 2,Silver,Aurora Gaming,woxic,Turkey,Player -Counter-Strike 2,Silver,Aurora Gaming,Wicadia,Turkey,Player -Counter-Strike 2,Silver,Aurora Gaming,jottAAA,Turkey,Player -Counter-Strike 2,Bronze,Team Falcons,NiKo,Bosnia,Player -Counter-Strike 2,Bronze,Team Falcons,TeSeS,Denmark,Player -Counter-Strike 2,Bronze,Team Falcons,m0NESY,Russia,Player -Counter-Strike 2,Bronze,Team Falcons,kyxsan,Bosnia,Player -Counter-Strike 2,Bronze,Team Falcons,kyousuke,Russia,Player -Dota 2,Gold,Team Spirit,Yatoro,Ukraine,Carry -Dota 2,Gold,Team Spirit,Larl,Russia,Mid -Dota 2,Gold,Team Spirit,Collapse,Russia,Offlane -Dota 2,Gold,Team Spirit,Rue,Russia,Support -Dota 2,Gold,Team Spirit,Miposhka,Russia,Support -Dota 2,Silver,Team Falcons,skiter,Slovakia,Carry -Dota 2,Silver,Team Falcons,Malr1ne,Ukraine,Mid -Dota 2,Silver,Team Falcons,ATF,Jordan,Offlane -Dota 2,Silver,Team Falcons,Cr1t-,Denmark,Support -Dota 2,Silver,Team Falcons,Sneyking,USA,Support -Dota 2,Bronze,Parivision,Satanic,Russia,Carry -Dota 2,Bronze,Parivision,No[o]ne-,Ukraine,Mid -Dota 2,Bronze,Parivision,DM,Ukraine,Offlane -Dota 2,Bronze,Parivision,9Class,Russia,Support -Dota 2,Bronze,Parivision,Dukalis,Russia,Support -EA Sports FC 25,Gold,Team Liquid,ManuBachoore,Netherlands,Player -EA Sports FC 25,Silver,Team Vitality,Brice,France,Player -EA Sports FC 25,Bronze,Team Liquid,Levi de Weerd,Netherlands,Player -Fatal Fury: City of the Wolves,Gold,DetonatioN FocusMe,GO1,Japan,Player -Fatal Fury: City of the Wolves,Silver,KuaiShou Gaming,Xiaohai,China,Player -Fatal Fury: City of the Wolves,Bronze,Natus Vincere,DarkAngel,South Korea,Player -Free Fire,Gold,EVOS Esports,Rasyah,Indonesia,Player -Free Fire,Gold,EVOS Esports,AimGOD,Indonesia,Player -Free Fire,Gold,EVOS Esports,Reyyy,Indonesia,Player -Free Fire,Gold,EVOS Esports,Koceel,Indonesia,Player -Free Fire,Silver,Rex Regum Qeon,Dutzz,Indonesia,Player -Free Fire,Silver,Rex Regum Qeon,Abay,Indonesia,Player -Free Fire,Silver,Rex Regum Qeon,18Deer,Indonesia,Player -Free Fire,Silver,Rex Regum Qeon,Maal,Indonesia,Player -Free Fire,Bronze,Team Vitality,JUMP,Thailand,Player -Free Fire,Bronze,Team Vitality,COUGAR,Thailand,Player -Free Fire,Bronze,Team Vitality,ZEN1S,Thailand,Player -Free Fire,Bronze,Team Vitality,DON,Thailand,Player -Honor of Kings,Gold,AG.AL,Ran,China,Player -Honor of Kings,Gold,AG.AL,Zoe,China,Player -Honor of Kings,Gold,AG.AL,Sheng,China,Player -Honor of Kings,Gold,AG.AL,YiNuo,China,Player -Honor of Kings,Gold,AG.AL,Shuai,China,Player -Honor of Kings,Silver,ThunderTalk Global,Qing,China,Player -Honor of Kings,Silver,ThunderTalk Global,Sunrise,China,Player -Honor of Kings,Silver,ThunderTalk Global,Crane,China,Player -Honor of Kings,Silver,ThunderTalk Global,Snowy,China,Player -Honor of Kings,Silver,ThunderTalk Global,Joy,China,Player -Honor of Kings,Bronze,Nova Esports,Xuan,China,Player -Honor of Kings,Bronze,Nova Esports,Cy,China,Player -Honor of Kings,Bronze,Nova Esports,Wendy,China,Player -Honor of Kings,Bronze,Nova Esports,Muci,China,Player -Honor of Kings,Bronze,Nova Esports,Weipit,China,Player -League of Legends,Gold,Gen.G,Kiin,South Korea,Top -League of Legends,Gold,Gen.G,Canyon,South Korea,Jungle -League of Legends,Gold,Gen.G,Chovy,South Korea,Mid -League of Legends,Gold,Gen.G,Ruler,South Korea,ADC -League of Legends,Gold,Gen.G,Duro,South Korea,Support -League of Legends,Silver,AG.AL,Flandre,China,Top -League of Legends,Silver,AG.AL,Tarzan,South Korea,Jungle -League of Legends,Silver,AG.AL,Shanks,China,Mid -League of Legends,Silver,AG.AL,Hope,China,ADC -League of Legends,Silver,AG.AL,Kael,South Korea,Support -League of Legends,Bronze,T1,Doran,South Korea,Top -League of Legends,Bronze,T1,Oner,South Korea,Jungle -League of Legends,Bronze,T1,Faker,South Korea,Mid -League of Legends,Bronze,T1,Gumayusi,South Korea,ADC -League of Legends,Bronze,T1,Keria,South Korea,Support -Mobile Legends: Bang Bang - Men,Gold,Team Liquid PH,Sanford,Philippines,Player -Mobile Legends: Bang Bang - Men,Gold,Team Liquid PH,KarlTzy,Philippines,Player -Mobile Legends: Bang Bang - Men,Gold,Team Liquid PH,Sanji,Philippines,Player -Mobile Legends: Bang Bang - Men,Gold,Team Liquid PH,Oheb,Philippines,Player -Mobile Legends: Bang Bang - Men,Gold,Team Liquid PH,Jaypee,Philippines,Player -Mobile Legends: Bang Bang - Men,Silver,SRG.OG,Kramm,Philippines,Player -Mobile Legends: Bang Bang - Men,Silver,SRG.OG,Sekys,Philippines,Player -Mobile Legends: Bang Bang - Men,Silver,SRG.OG,Stormie,Philippines,Player -Mobile Legends: Bang Bang - Men,Silver,SRG.OG,Innocent,Philippines,Player -Mobile Legends: Bang Bang - Men,Silver,SRG.OG,Yums,Philippines,Player -Mobile Legends: Bang Bang - Men,Bronze,Onic Philippines,Kirk,Philippines,Player -Mobile Legends: Bang Bang - Men,Bronze,Onic Philippines,K1NG KONG,Philippines,Player -Mobile Legends: Bang Bang - Men,Bronze,Onic Philippines,Super Frince,Philippines,Player -Mobile Legends: Bang Bang - Men,Bronze,Onic Philippines,Kelra,Philippines,Player -Mobile Legends: Bang Bang - Men,Bronze,Onic Philippines,Brusko,Philippines,Player -Mobile Legends: Bang Bang - Women,Gold,Team Vitality,Fumi,Philippines,Player -Mobile Legends: Bang Bang - Women,Gold,Team Vitality,Vival,Philippines,Player -Mobile Legends: Bang Bang - Women,Gold,Team Vitality,Cinny,Philippines,Player -Mobile Legends: Bang Bang - Women,Gold,Team Vitality,Chell,Philippines,Player -Mobile Legends: Bang Bang - Women,Gold,Team Vitality,Vivian,Philippines,Player -Mobile Legends: Bang Bang - Women,Silver,Gaimin Gladiators,Aria,Philippines,Player -Mobile Legends: Bang Bang - Women,Silver,Gaimin Gladiators,Nicholette,Philippines,Player -Mobile Legends: Bang Bang - Women,Silver,Gaimin Gladiators,Sayori,Philippines,Player -Mobile Legends: Bang Bang - Women,Silver,Gaimin Gladiators,Panda,Philippines,Player -Mobile Legends: Bang Bang - Women,Silver,Gaimin Gladiators,Ashlay,Philippines,Player -Mobile Legends: Bang Bang - Women,Bronze,Terror Queens,Hlaing,Myanmar,Player -Mobile Legends: Bang Bang - Women,Bronze,Terror Queens,Ruli,Myanmar,Player -Mobile Legends: Bang Bang - Women,Bronze,Terror Queens,LunaLynn,Myanmar,Player -Mobile Legends: Bang Bang - Women,Bronze,Terror Queens,CKOSHIII,Myanmar,Player -Mobile Legends: Bang Bang - Women,Bronze,Terror Queens,Kuu,Myanmar,Player -Overwatch 2,Gold,Team Falcons,Proper,South Korea,DPS -Overwatch 2,Gold,Team Falcons,MER1T,South Korea,DPS -Overwatch 2,Gold,Team Falcons,SOMEONE,South Korea,Tank -Overwatch 2,Gold,Team Falcons,Hanbin,South Korea,Tank -Overwatch 2,Gold,Team Falcons,ChiYo,South Korea,Support -Overwatch 2,Gold,Team Falcons,Fielder,South Korea,Support -Overwatch 2,Silver,Al Qadsiah,LBBD7,Saudi Arabia,Player -Overwatch 2,Silver,Al Qadsiah,CheckMate,Saudi Arabia,Player -Overwatch 2,Silver,Al Qadsiah,ZIYAD,Saudi Arabia,Player -Overwatch 2,Silver,Al Qadsiah,Landon,Saudi Arabia,Player -Overwatch 2,Silver,Al Qadsiah,Kellex,Saudi Arabia,Player -Overwatch 2,Bronze,Twisted Minds,Quartz,Saudi Arabia,Player -Overwatch 2,Bronze,Twisted Minds,Youbi,Saudi Arabia,Player -Overwatch 2,Bronze,Twisted Minds,KSAA,Saudi Arabia,Player -Overwatch 2,Bronze,Twisted Minds,FunnyAstro,UK,Player -Overwatch 2,Bronze,Twisted Minds,Simple,Saudi Arabia,Player -PUBG: Battlegrounds,Gold,Twisted Minds,xmpl,Russia,Player -PUBG: Battlegrounds,Gold,Twisted Minds,BatulinS,Russia,Player -PUBG: Battlegrounds,Gold,Twisted Minds,Perfect1ks,Russia,Player -PUBG: Battlegrounds,Gold,Twisted Minds,Lu,Russia,Player -PUBG: Battlegrounds,Silver,Gen.G,Tosi,South Korea,Player -PUBG: Battlegrounds,Silver,Gen.G,F1ame,South Korea,Player -PUBG: Battlegrounds,Silver,Gen.G,Orca,South Korea,Player -PUBG: Battlegrounds,Silver,Gen.G,BeaN,South Korea,Player -PUBG: Battlegrounds,Bronze,Team Falcons,hwinn,USA,Player -PUBG: Battlegrounds,Bronze,Team Falcons,TGLTN,Australia,Player -PUBG: Battlegrounds,Bronze,Team Falcons,Shrimzy,USA,Player -PUBG: Battlegrounds,Bronze,Team Falcons,Kickstart,USA,Player -PUBG Mobile,Gold,Yangon Galacticos,Smile,Myanmar,Player -PUBG Mobile,Gold,Yangon Galacticos,Marnett,Myanmar,Player -PUBG Mobile,Gold,Yangon Galacticos,Romeo,Myanmar,Player -PUBG Mobile,Gold,Yangon Galacticos,SAYCLOUD,Myanmar,Player -PUBG Mobile,Silver,Weibo Gaming,Suk,China,Player -PUBG Mobile,Silver,Weibo Gaming,Order,China,Player -PUBG Mobile,Silver,Weibo Gaming,33z,China,Player -PUBG Mobile,Silver,Weibo Gaming,HECC,China,Player -PUBG Mobile,Bronze,Alpha Gaming,Zyol,Mongolia,Player -PUBG Mobile,Bronze,Alpha Gaming,DOK,Mongolia,Player -PUBG Mobile,Bronze,Alpha Gaming,REFUS,Mongolia,Player -PUBG Mobile,Bronze,Alpha Gaming,TOP,Mongolia,Player -Rainbow Six Siege X,Gold,Team Secret,Savage,Brazil,Player -Rainbow Six Siege X,Gold,Team Secret,jume,Brazil,Player -Rainbow Six Siege X,Gold,Team Secret,Adrian,Brazil,Player -Rainbow Six Siege X,Gold,Team Secret,Mowwwgli,Brazil,Player -Rainbow Six Siege X,Gold,Team Secret,NoaUrz,Brazil,Player -Rainbow Six Siege X,Silver,G2 Esports,Alem4o,Brazil,Player -Rainbow Six Siege X,Silver,G2 Esports,Doki,UK,Player -Rainbow Six Siege X,Silver,G2 Esports,BlaZ,France,Player -Rainbow Six Siege X,Silver,G2 Esports,Loira,Brazil,Player -Rainbow Six Siege X,Silver,G2 Esports,Stompn,Brazil,Player -Rainbow Six Siege X,Bronze,Furia Esports,FelipeX,Brazil,Player -Rainbow Six Siege X,Bronze,Furia Esports,HerdsZ,Brazil,Player -Rainbow Six Siege X,Bronze,Furia Esports,Jv92,Brazil,Player -Rainbow Six Siege X,Bronze,Furia Esports,Kheyze,Brazil,Player -Rainbow Six Siege X,Bronze,Furia Esports,nade,Brazil,Player -Rennsport,Gold,BMW M Team Redline Red Bull Sim Racing,Luke Bennett,UK,Driver -Rennsport,Gold,BMW M Team Redline Red Bull Sim Racing,Jeffery Rietveld,Netherlands,Driver -Rennsport,Gold,BMW M Team Redline Red Bull Sim Racing,Sebastian Job,Germany,Driver -Rennsport,Gold,BMW M Team Redline Red Bull Sim Racing,Kevin Siggy,Austria,Driver -Rennsport,Silver,Virtus.pro,Kevin Ellis Jr,USA,Driver -Rennsport,Silver,Virtus.pro,Dáire McCormack,Ireland,Driver -Rennsport,Silver,Virtus.pro,Vojtěch Fiala,Czech Republic,Driver -Rennsport,Silver,Virtus.pro,Mikhail Statsenko,Russia,Driver -Rennsport,Bronze,Team Vitality,Thibault Cazaubon,France,Driver -Rennsport,Bronze,Team Vitality,Marcell Csincsik,Hungary,Driver -Rennsport,Bronze,Team Vitality,Erhan Jajovski,North Macedonia,Driver -Rennsport,Bronze,Team Vitality,Jiri Toman,Czech Republic,Driver -Rocket League,Gold,Karmine Corp,Vatira,France,Player -Rocket League,Gold,Karmine Corp,Atow,France,Player -Rocket League,Gold,Karmine Corp,dralii,France,Player -Rocket League,Silver,Geekay Esports,Archie,UK,Player -Rocket League,Silver,Geekay Esports,Joyo,USA,Player -Rocket League,Silver,Geekay Esports,oaly,Netherlands,Player -Rocket League,Bronze,Team Falcons,Trk511,Saudi Arabia,Player -Rocket League,Bronze,Team Falcons,Rw9,Saudi Arabia,Player -Rocket League,Bronze,Team Falcons,Kiileerrz,Saudi Arabia,Player -StarCraft II,Gold,Basilisk,Serral,Finland,Player -StarCraft II,Silver,Virtus.pro,Classic,South Korea,Player -StarCraft II,Bronze,Team Liquid,Cure,South Korea,Player -Street Fighter 6,Gold,KuaiShou Gaming,Xiaohai,China,Player -Street Fighter 6,Silver,2Game Esports,Blaz,South Korea,Player -Street Fighter 6,Bronze,DRX,Leshar,South Korea,Player -Teamfight Tactics,Gold,Weibo Gaming,Saopimi,China,Player -Teamfight Tactics,Gold,Weibo Gaming,LBTZ,China,Player -Teamfight Tactics,Gold,Weibo Gaming,Guan,China,Player -Teamfight Tactics,Gold,Weibo Gaming,TianLong,China,Player -Teamfight Tactics,Silver,Virtus.pro,Maris,Russia,Player -Teamfight Tactics,Silver,Virtus.pro,Milo,Russia,Player -Teamfight Tactics,Silver,Virtus.pro,k1an,Russia,Player -Teamfight Tactics,Silver,Virtus.pro,NCC1,Russia,Player -Teamfight Tactics,Bronze,T1,Binteum,South Korea,Player -Teamfight Tactics,Bronze,T1,sCsC,South Korea,Player -Teamfight Tactics,Bronze,T1,dunizuni,South Korea,Player -Teamfight Tactics,Bronze,T1,CrazyMoving,South Korea,Player -Teamfight Tactics,Bronze,AEGIS,Opale,France,Player -Teamfight Tactics,Bronze,AEGIS,Pas de Bol,France,Player -Teamfight Tactics,Bronze,AEGIS,Lyyyress,France,Player -Teamfight Tactics,Bronze,AEGIS,Gobosteur,France,Player -Tekken 8,Gold,DN Freecs,ULSAN,South Korea,Player -Tekken 8,Silver,DRX,LOWHIGH,South Korea,Player -Tekken 8,Bronze,DN Freecs,CBM,South Korea,Player diff --git a/data/03_EWC2025_Club_Championship_Standings.csv b/data/03_EWC2025_Club_Championship_Standings.csv deleted file mode 100644 index 7ff3876..0000000 --- a/data/03_EWC2025_Club_Championship_Standings.csv +++ /dev/null @@ -1,25 +0,0 @@ -Rank,Organization,Total_Points,Prize_Money_USD,Tournament_Wins,Top_8_Finishes,Region,Club_Partner_Status,Eligible_to_Win,Games_Won -1,Team Falcons,3850,7000000,2,5,Middle East,Yes,Yes,"Overwatch 2, PUBG: Battlegrounds" -2,Team Liquid,2400,4000000,2,4,Europe,Yes,Yes,"Chess, EA Sports FC 25" -3,Team Vitality,1950,3000000,1,4,Europe,Yes,Yes,Mobile Legends: Bang Bang - Women -4,Twisted Minds,1800,2250000,2,3,Middle East,Yes,Yes,"Call of Duty: Warzone, PUBG: Battlegrounds" -5,Virtus.pro,1600,2250000,0,5,Europe,Yes,No,None -6,Team Spirit,1550,2250000,1,3,Europe,Yes,Yes,Dota 2 -7,AG.AL,1500,1500000,2,3,Asia,Yes,Yes,"CrossFire, Honor of Kings" -8,Gen.G,1400,1000000,1,3,Asia,Yes,Yes,League of Legends -9,Weibo Gaming,1250,850000,1,2,Asia,Yes,Yes,Teamfight Tactics -10,KuaiShou Gaming,1100,700000,1,2,Asia,No,Yes,Street Fighter 6 -11,DRX,950,600000,0,3,Asia,No,No,None -12,Aurora Gaming,900,525000,0,3,Europe,No,No,None -13,T1,850,425000,0,3,Asia,Yes,No,None -14,Team Heretics,800,425000,1,1,Europe,No,Yes,Valorant -15,DetonatioN FocusMe,750,300000,1,1,Asia,No,Yes,Fatal Fury: City of the Wolves -16,DN Freecs,700,300000,1,1,Asia,No,Yes,Tekken 8 -17,Karmine Corp,650,300000,1,1,Europe,Yes,Yes,Rocket League -18,Team Secret,600,300000,1,1,Asia,Yes,Yes,Rainbow Six Siege X -19,G2 Esports,550,225000,0,2,Europe,Yes,No,None -20,Al Qadsiah,500,150000,0,2,Middle East,No,No,None -21,Gaimin Gladiators,450,150000,0,2,North America,Yes,No,None -22,Geekay Esports,400,150000,0,2,Middle East,No,No,None -23,ROC Esports,350,150000,0,2,Asia,No,No,None -24,Rex Regum Qeon,300,150000,0,2,Asia,Yes,No,None diff --git a/data/04_EWC2025_Club_Partner_Program.csv b/data/04_EWC2025_Club_Partner_Program.csv deleted file mode 100644 index a2526ab..0000000 --- a/data/04_EWC2025_Club_Partner_Program.csv +++ /dev/null @@ -1,41 +0,0 @@ -Organization,Region,Country,Club_Partner_Status,Top_8_2024,Games_Competing,Founded,HQ_Location,CEO,Social_Media_Followers_M -Fnatic,Europe,UK,Current,No,"Valorant, League of Legends",2004,"London, UK",Sam Mathews,2.5 -G2 Esports,Europe,Germany,Current,No,"Rainbow Six Siege X, Counter-Strike 2",2013,"Berlin, Germany",Alban Dechelotte,3.2 -Gentle Mates,Europe,France,Current,No,Call of Duty: Warzone,2023,"Paris, France",Squeezie,1.8 -HEROIC,Europe,Norway,Current,No,Counter-Strike 2,2016,"Oslo, Norway",Joachim Haraldsen,0.9 -Karmine Corp,Europe,France,Current,No,"Rocket League, League of Legends",2020,"Paris, France",Kameto,2.1 -MOUZ,Europe,Germany,Current,No,Counter-Strike 2,2002,"Hamburg, Germany",Stefan Wendt,1.5 -Movistar KOI,Europe,Spain,Current,No,Call of Duty: Black Ops 6,2023,"Madrid, Spain",Ibai Llanos,1.2 -Natus Vincere,Europe,Ukraine,Current,Yes,"Counter-Strike 2, Dota 2",2009,"Kyiv, Ukraine",Yevhen Zolotarov,2.8 -Ninjas in Pyjamas,Europe,Sweden,Current,Yes,"Counter-Strike 2, Apex Legends",2000,"Stockholm, Sweden",Hicham Chahine,3.0 -Team BDS,Europe,Switzerland,Current,Yes,"Rocket League, League of Legends",2019,"Geneva, Switzerland",Patrice Spathis,0.7 -Team Liquid,Europe,Netherlands,Current,Yes,"Dota 2, Chess, EA Sports FC 25, Counter-Strike 2",2000,"Utrecht, Netherlands",Steve Arhancet,4.5 -Team Secret,Europe,Philippines,Current,No,"Rainbow Six Siege X, Dota 2",2014,"Manila, Philippines",John Yao,1.9 -Team Spirit,Europe,Russia,Current,Yes,"Dota 2, Counter-Strike 2",2015,"Moscow, Russia",Nikita Cheshir Chukalin,2.2 -Team Vitality,Europe,France,Current,Yes,"EA Sports FC 25, Counter-Strike 2, Mobile Legends",2013,"Paris, France",Nicolas Maurer,3.8 -Virtus.pro,Europe,Russia,Current,No,"Counter-Strike 2, Dota 2, Rennsport",2003,"Moscow, Russia",Sergey Glamazda,2.0 -100 Thieves,North America,USA,Current,No,"Call of Duty: Black Ops 6, Valorant",2017,"Los Angeles, USA",Matthew Nadeshot Haag,3.5 -Cloud9,North America,USA,Current,No,"Counter-Strike 2, Valorant",2013,"Los Angeles, USA",Jack Etienne,2.7 -FaZe Clan,North America,USA,Current,Yes,"Call of Duty: Black Ops 6, Counter-Strike 2",2010,"Los Angeles, USA",Lee Trink,5.2 -Gaimin Gladiators,North America,USA,Current,Yes,"Dota 2, Mobile Legends",2021,"Toronto, Canada",Joseph Turner,0.6 -Sentinels,North America,USA,Current,No,Valorant,2018,"Los Angeles, USA",Rob Moore,2.3 -All Gamers,Asia,China,Current,No,"CrossFire, Honor of Kings, League of Legends",1999,"Chengdu, China",Jiang Lei,1.4 -Bilibili Gaming,Asia,China,Current,No,"League of Legends, Valorant",2017,"Hangzhou, China",Chen Rui,1.1 -Edward Gaming,Asia,China,Current,No,"League of Legends, Valorant",2013,"Guangzhou, China",Zhu Yilong,2.0 -EVOS Esports,Asia,Indonesia,Current,No,"Free Fire, Mobile Legends",2016,"Jakarta, Indonesia",Ivan Yeo,1.6 -Gen.G Esports,Asia,South Korea,Current,No,"League of Legends, Valorant, PUBG",2017,"Seoul, South Korea",Arnold Hur,2.4 -JD Gaming,Asia,China,Current,No,League of Legends,2017,"Beijing, China",Ye Mingming,1.3 -ONIC Esports,Asia,Indonesia,Current,No,Mobile Legends,2018,"Jakarta, Indonesia",Justin Anselmus,1.0 -REJECT,Asia,Japan,Current,No,"Street Fighter 6, Tekken 8",2020,"Tokyo, Japan",Takuya Aoki,0.5 -Rex Regum Qeon,Asia,Indonesia,Current,No,"Free Fire, Mobile Legends",2013,"Jakarta, Indonesia",Adrian Pauline,1.2 -S8UL Esports,Asia,India,Current,No,Battlegrounds Mobile India,2018,"Mumbai, India",Lokesh Jain,0.8 -T1,Asia,South Korea,Current,Yes,"League of Legends, Valorant, Teamfight Tactics",2004,"Seoul, South Korea",Joe Marsh,5.0 -Weibo Gaming,Asia,China,Current,No,"League of Legends, Teamfight Tactics, PUBG Mobile",2011,"Shanghai, China",Wang Sicong,1.7 -Wolves Esports,Asia,China,Current,No,"Honor of Kings, PUBG Mobile",2019,"Chongqing, China",Guo Bin,0.9 -ZETA DIVISION,Asia,Japan,Current,No,Valorant,2017,"Tokyo, Japan",Shinji Okubo,1.5 -FURIA,South America,Brazil,Current,No,"Counter-Strike 2, Rainbow Six Siege X",2017,"São Paulo, Brazil",André Akkari,2.1 -Leviatán,South America,Chile,Current,No,Valorant,2020,"Santiago, Chile",Pablo Maldonado,0.8 -LOUD,South America,Brazil,Current,No,"Valorant, League of Legends",2019,"São Paulo, Brazil",Bruno Playhard,1.8 -POWR Esports,Middle East,Saudi Arabia,Current,No,Counter-Strike 2,2021,"Riyadh, Saudi Arabia",Faisal Bin Homran,0.3 -Team Falcons,Middle East,Saudi Arabia,Current,Yes,"Dota 2, Counter-Strike 2, Overwatch 2, PUBG",2017,"Riyadh, Saudi Arabia",Mosaad Aldossary,4.0 -Twisted Minds,Middle East,Saudi Arabia,Current,Yes,"Call of Duty: Warzone, PUBG, Apex Legends",2020,"Riyadh, Saudi Arabia",Ahmad Al-Megren,1.1 diff --git a/data/05_EWC2025_Player_Roster.csv b/data/05_EWC2025_Player_Roster.csv deleted file mode 100644 index 7eb90b3..0000000 --- a/data/05_EWC2025_Player_Roster.csv +++ /dev/null @@ -1,273 +0,0 @@ -Player_ID,Player_Name,Country,Region,Team,Game,Role,Age,Experience_Years,Previous_Team,Tournament_Place,Prize_Earned_USD,Social_Media_Followers_K -EWC2025_001,Kasssa,Brazil,South America,VK Gaming,Apex Legends,IGL,24,5,Furia,1,0,45 -EWC2025_002,QQ,China,Asia,VK Gaming,Apex Legends,Fragger,22,4,None,1,0,120 -EWC2025_003,LqDuD,China,Asia,VK Gaming,Apex Legends,Support,21,3,None,1,0,80 -EWC2025_004,Vaxlon,Philippines,Asia,ROC Esports,Apex Legends,IGL,25,6,Team Liquid,2,0,35 -EWC2025_005,Deeds,Australia,Oceania,ROC Esports,Apex Legends,Fragger,23,4,None,2,0,28 -EWC2025_006,Sauceror,USA,North America,ROC Esports,Apex Legends,Support,26,7,TSM,2,0,55 -EWC2025_007,Vein,USA,North America,Ninjas in Pyjamas,Apex Legends,IGL,24,5,Sentinels,3,0,42 -EWC2025_008,Kurev,Russia,Europe,Ninjas in Pyjamas,Apex Legends,Fragger,22,3,None,3,0,18 -EWC2025_009,McLovin,USA,North America,Ninjas in Pyjamas,Apex Legends,Support,23,4,Cloud9,3,0,38 -EWC2025_010,Dashy,USA,North America,OpTic Gaming,Call of Duty Black Ops 6,AR,26,8,OpTic Texas,1,0,850 -EWC2025_011,Huke,USA,North America,OpTic Gaming,Call of Duty Black Ops 6,SMG,25,7,Dallas Empire,1,0,420 -EWC2025_012,Mercules,USA,North America,OpTic Gaming,Call of Duty Black Ops 6,SMG,21,3,None,1,0,95 -EWC2025_013,Shotzzy,USA,North America,OpTic Gaming,Call of Duty Black Ops 6,SMG,23,5,Dallas Empire,1,0,680 -EWC2025_014,04,Canada,North America,Vancouver Surge,Call of Duty Black Ops 6,AR,22,4,None,2,0,32 -EWC2025_015,Abuzah,Morocco,Europe,Vancouver Surge,Call of Duty Black Ops 6,SMG,24,5,Toronto Ultra,2,0,45 -EWC2025_016,Neptune,USA,North America,Vancouver Surge,Call of Duty Black Ops 6,SMG,23,4,None,2,0,38 -EWC2025_017,Nastie,UK,Europe,Vancouver Surge,Call of Duty Black Ops 6,AR,24,5,London Royal Ravens,2,0,52 -EWC2025_018,Abe,Spain,Europe,Movistar KOI,Call of Duty Black Ops 6,AR,22,3,None,3,0,25 -EWC2025_019,CleanX,Denmark,Europe,Movistar KOI,Call of Duty Black Ops 6,SMG,24,5,Toronto Ultra,3,0,48 -EWC2025_020,Insight,UK,Europe,Movistar KOI,Call of Duty Black Ops 6,AR,25,6,Toronto Ultra,3,0,55 -EWC2025_021,JoeDeceives,USA,North America,Movistar KOI,Call of Duty Black Ops 6,SMG,21,2,None,3,0,18 -EWC2025_022,Magnus Carlsen,Norway,Europe,Team Liquid,Chess,Grandmaster,34,20,None,1,0,2500 -EWC2025_023,Alireza Firouzja,France,Europe,Team Falcons,Chess,Grandmaster,21,8,None,2,0,450 -EWC2025_024,Hikaru Nakamura,USA,North America,Team Falcons,Chess,Grandmaster,37,22,None,3,0,3200 -EWC2025_025,Techno4K,Mongolia,Asia,The MongolZ,Counter-Strike 2,AWPer,22,5,None,1,0,180 -EWC2025_026,910,Mongolia,Asia,The MongolZ,Counter-Strike 2,Entry,21,4,None,1,0,120 -EWC2025_027,mzinho,Mongolia,Asia,The MongolZ,Counter-Strike 2,IGL,23,6,None,1,0,150 -EWC2025_028,bLitz,Mongolia,Asia,The MongolZ,Counter-Strike 2,Support,24,6,None,1,0,140 -EWC2025_029,Senzu,Mongolia,Asia,The MongolZ,Counter-Strike 2,Rifler,20,3,None,1,0,95 -EWC2025_030,MAJ3R,Turkey,Europe,Aurora Gaming,Counter-Strike 2,IGL,29,10,Eternal Fire,2,0,220 -EWC2025_031,XANTARES,Turkey,Europe,Aurora Gaming,Counter-Strike 2,Entry,29,11,Eternal Fire,2,0,380 -EWC2025_032,woxic,Turkey,Europe,Aurora Gaming,Counter-Strike 2,AWPer,26,8,Eternal Fire,2,0,290 -EWC2025_033,Wicadia,Turkey,Europe,Aurora Gaming,Counter-Strike 2,Rifler,19,2,None,2,0,85 -EWC2025_034,jottAAA,Turkey,Europe,Aurora Gaming,Counter-Strike 2,Support,22,4,None,2,0,65 -EWC2025_035,NiKo,Bosnia,Europe,Team Falcons,Counter-Strike 2,Entry,28,11,G2 Esports,3,0,950 -EWC2025_036,TeSeS,Denmark,Europe,Team Falcons,Counter-Strike 2,Rifler,26,7,Heroic,3,0,180 -EWC2025_037,m0NESY,Russia,Europe,Team Falcons,Counter-Strike 2,AWPer,20,4,G2 Esports,3,0,720 -EWC2025_038,kyxsan,North Macedonia,Europe,Team Falcons,Counter-Strike 2,IGL,24,5,Astralis,3,0,110 -EWC2025_039,kyousuke,Russia,Europe,Team Falcons,Counter-Strike 2,Support,19,2,None,3,0,75 -EWC2025_040,Yatoro,Ukraine,Europe,Team Spirit,Dota 2,Carry,22,6,None,1,0,320 -EWC2025_041,Larl,Russia,Europe,Team Spirit,Dota 2,Mid,23,5,None,1,0,180 -EWC2025_042,Collapse,Russia,Europe,Team Spirit,Dota 2,Offlane,23,6,None,1,0,210 -EWC2025_043,Rue,Russia,Europe,Team Spirit,Dota 2,Support,21,4,None,1,0,95 -EWC2025_044,Miposhka,Russia,Europe,Team Spirit,Dota 2,Support,26,8,None,1,0,150 -EWC2025_045,skiter,Slovakia,Europe,Team Falcons,Dota 2,Carry,26,8,Tundra Esports,2,0,140 -EWC2025_046,Malr1ne,Ukraine,Europe,Team Falcons,Dota 2,Mid,22,4,None,2,0,85 -EWC2025_047,ATF,Jordan,Middle East,Team Falcons,Dota 2,Offlane,21,5,Nigma Galaxy,2,0,180 -EWC2025_048,Cr1t-,Denmark,Europe,Team Falcons,Dota 2,Support,28,10,Evil Geniuses,2,0,220 -EWC2025_049,Sneyking,USA,North America,Team Falcons,Dota 2,Support,29,11,Tundra Esports,2,0,130 -EWC2025_050,Satanic,Russia,Europe,Parivision,Dota 2,Carry,20,3,None,3,0,65 -EWC2025_051,No[o]ne-,Ukraine,Europe,Parivision,Dota 2,Mid,30,12,Virtus.pro,3,0,190 -EWC2025_052,DM,Ukraine,Europe,Parivision,Dota 2,Offlane,26,7,Natus Vincere,3,0,110 -EWC2025_053,9Class,Russia,Europe,Parivision,Dota 2,Support,22,4,None,3,0,45 -EWC2025_054,Dukalis,Russia,Europe,Parivision,Dota 2,Support,24,6,None,3,0,55 -EWC2025_055,Kiin,South Korea,Asia,Gen.G,League of Legends,Top,26,8,Afreeca Freecs,1,0,280 -EWC2025_056,Canyon,South Korea,Asia,Gen.G,League of Legends,Jungle,24,6,DAMWON KIA,1,0,350 -EWC2025_057,Chovy,South Korea,Asia,Gen.G,League of Legends,Mid,23,7,Griffin,1,0,420 -EWC2025_058,Ruler,South Korea,Asia,Gen.G,League of Legends,ADC,26,9,JD Gaming,1,0,380 -EWC2025_059,Duro,South Korea,Asia,Gen.G,League of Legends,Support,22,3,None,1,0,95 -EWC2025_060,Flandre,China,Asia,AG.AL,League of Legends,Top,27,9,EDG,2,0,220 -EWC2025_061,Tarzan,South Korea,Asia,AG.AL,League of Legends,Jungle,25,7,LNG,2,0,310 -EWC2025_062,Shanks,China,Asia,AG.AL,League of Legends,Mid,23,5,None,2,0,140 -EWC2025_063,Hope,China,Asia,AG.AL,League of Legends,ADC,24,6,JD Gaming,2,0,180 -EWC2025_064,Kael,South Korea,Asia,AG.AL,League of Legends,Support,24,5,None,2,0,85 -EWC2025_065,Doran,South Korea,Asia,T1,League of Legends,Top,24,6,Gen.G,3,0,250 -EWC2025_066,Oner,South Korea,Asia,T1,League of Legends,Jungle,22,4,None,3,0,320 -EWC2025_067,Faker,South Korea,Asia,T1,League of Legends,Mid,29,12,None,3,0,5000 -EWC2025_068,Gumayusi,South Korea,Asia,T1,League of Legends,ADC,24,5,None,3,0,450 -EWC2025_069,Keria,South Korea,Asia,T1,League of Legends,Support,23,5,None,3,0,380 -EWC2025_070,Boo,Lithuania,Europe,Team Heretics,Valorant,IGL,27,5,G2 Esports,1,0,180 -EWC2025_071,benjyfishy,UK,Europe,Team Heretics,Valorant,Duelist,20,3,None,1,0,850 -EWC2025_072,MiniBoo,Lithuania,Europe,Team Heretics,Valorant,Duelist,19,2,None,1,0,120 -EWC2025_073,RieNs,Turkey,Europe,Team Heretics,Valorant,Controller,21,3,None,1,0,95 -EWC2025_074,Wo0t,Finland,Europe,Team Heretics,Valorant,Initiator,20,2,None,1,0,110 -EWC2025_075,Boaster,UK,Europe,Fnatic,Valorant,IGL,30,5,None,2,0,520 -EWC2025_076,Alfajer,Saudi Arabia,Middle East,Fnatic,Valorant,Sentinel,19,3,None,2,0,280 -EWC2025_077,Chronicle,Russia,Europe,Fnatic,Valorant,Flex,22,5,Gambit Esports,2,0,310 -EWC2025_078,kaajak,Poland,Europe,Fnatic,Valorant,Duelist,20,2,None,2,0,85 -EWC2025_079,crashies,USA,North America,Fnatic,Valorant,Initiator,26,5,OpTic Gaming,2,0,190 -EWC2025_080,t3xture,South Korea,Asia,Gen.G,Valorant,Duelist,23,4,None,3,0,120 -EWC2025_081,Karon,South Korea,Asia,Gen.G,Valorant,Sentinel,21,3,None,3,0,85 -EWC2025_082,Munchkin,South Korea,Asia,Gen.G,Valorant,IGL,26,5,T1,3,0,150 -EWC2025_083,Ash,South Korea,Asia,Gen.G,Valorant,Controller,22,4,None,3,0,75 -EWC2025_084,Foxy9,South Korea,Asia,Gen.G,Valorant,Initiator,21,3,None,3,0,68 -EWC2025_085,Proper,South Korea,Asia,Team Falcons,Overwatch 2,DPS,22,6,San Francisco Shock,1,0,180 -EWC2025_086,MER1T,South Korea,Asia,Team Falcons,Overwatch 2,DPS,23,5,Houston Outlaws,1,0,95 -EWC2025_087,SOMEONE,South Korea,Asia,Team Falcons,Overwatch 2,Tank,21,4,Florida Mayhem,1,0,78 -EWC2025_088,Hanbin,South Korea,Asia,Team Falcons,Overwatch 2,Tank,22,5,Dallas Fuel,1,0,110 -EWC2025_089,ChiYo,South Korea,Asia,Team Falcons,Overwatch 2,Support,23,5,Dallas Fuel,1,0,85 -EWC2025_090,Fielder,South Korea,Asia,Team Falcons,Overwatch 2,Support,24,6,Dallas Fuel,1,0,92 -EWC2025_091,LBBD7,Saudi Arabia,Middle East,Al Qadsiah,Overwatch 2,DPS,22,4,None,2,0,35 -EWC2025_092,CheckMate,Saudi Arabia,Middle East,Al Qadsiah,Overwatch 2,Tank,23,5,None,2,0,28 -EWC2025_093,ZIYAD,Saudi Arabia,Middle East,Al Qadsiah,Overwatch 2,DPS,21,3,None,2,0,22 -EWC2025_094,Landon,Saudi Arabia,Middle East,Al Qadsiah,Overwatch 2,Support,24,5,None,2,0,18 -EWC2025_095,Kellex,Saudi Arabia,Middle East,Al Qadsiah,Overwatch 2,Support,22,4,None,2,0,15 -EWC2025_096,Quartz,Saudi Arabia,Middle East,Twisted Minds,Overwatch 2,DPS,21,3,None,3,0,25 -EWC2025_097,Youbi,Saudi Arabia,Middle East,Twisted Minds,Overwatch 2,Tank,22,4,None,3,0,20 -EWC2025_098,KSAA,Saudi Arabia,Middle East,Twisted Minds,Overwatch 2,Support,24,5,None,3,0,30 -EWC2025_099,FunnyAstro,UK,Europe,Twisted Minds,Overwatch 2,Support,26,7,Philadelphia Fusion,3,0,120 -EWC2025_100,Simple,Saudi Arabia,Middle East,Twisted Minds,Overwatch 2,DPS,20,2,None,3,0,12 -EWC2025_101,Serral,Finland,Europe,Basilisk,StarCraft II,Zerg,27,12,ENCE,1,0,280 -EWC2025_102,Classic,South Korea,Asia,Virtus.pro,StarCraft II,Protoss,32,14,None,2,0,150 -EWC2025_103,Cure,South Korea,Asia,Team Liquid,StarCraft II,Terran,29,11,None,3,0,95 -EWC2025_104,Xiaohai,China,Asia,KuaiShou Gaming,Street Fighter 6,Player,35,18,Qanba,1,0,320 -EWC2025_105,Blaz,South Korea,Asia,2Game Esports,Street Fighter 6,Player,25,8,None,2,0,85 -EWC2025_106,Leshar,South Korea,Asia,DRX,Street Fighter 6,Player,23,6,None,3,0,55 -EWC2025_107,ULSAN,South Korea,Asia,DN Freecs,Tekken 8,Player,26,10,None,1,0,180 -EWC2025_108,LOWHIGH,South Korea,Asia,DRX,Tekken 8,Player,28,12,None,2,0,150 -EWC2025_109,CBM,South Korea,Asia,DN Freecs,Tekken 8,Player,24,8,None,3,0,95 -EWC2025_110,ManuBachoore,Netherlands,Europe,Team Liquid,EA Sports FC 25,Player,21,5,None,1,0,180 -EWC2025_111,Brice,France,Europe,Team Vitality,EA Sports FC 25,Player,22,4,None,2,0,95 -EWC2025_112,Levi de Weerd,Netherlands,Europe,Team Liquid,EA Sports FC 25,Player,20,3,None,3,0,65 -EWC2025_113,GO1,Japan,Asia,DetonatioN FocusMe,Fatal Fury City of the Wolves,Player,30,12,Cyclops Osaka,1,0,220 -EWC2025_114,Xiaohai,China,Asia,KuaiShou Gaming,Fatal Fury City of the Wolves,Player,35,18,Qanba,2,0,320 -EWC2025_115,DarkAngel,South Korea,Asia,Natus Vincere,Fatal Fury City of the Wolves,Player,24,6,None,3,0,45 -EWC2025_116,Vatira,France,Europe,Karmine Corp,Rocket League,Player,19,5,Moist Esports,1,0,280 -EWC2025_117,Atow,France,Europe,Karmine Corp,Rocket League,Player,18,4,None,1,0,150 -EWC2025_118,dralii,France,Europe,Karmine Corp,Rocket League,Player,20,4,None,1,0,120 -EWC2025_119,Archie,UK,Europe,Geekay Esports,Rocket League,Player,19,4,None,2,0,95 -EWC2025_120,Joyo,USA,North America,Geekay Esports,Rocket League,Player,20,5,Moist Esports,2,0,180 -EWC2025_121,oaly,Netherlands,Europe,Geekay Esports,Rocket League,Player,21,5,None,2,0,85 -EWC2025_122,Trk511,Saudi Arabia,Middle East,Team Falcons,Rocket League,Player,20,4,None,3,0,55 -EWC2025_123,Rw9,Saudi Arabia,Middle East,Team Falcons,Rocket League,Player,19,3,None,3,0,42 -EWC2025_124,Kiileerrz,Saudi Arabia,Middle East,Team Falcons,Rocket League,Player,21,4,None,3,0,38 -EWC2025_125,zSmit,USA,North America,Twisted Minds,Call of Duty Warzone,Player,24,5,None,1,0,120 -EWC2025_126,Almond,USA,North America,Twisted Minds,Call of Duty Warzone,Player,23,4,None,1,0,95 -EWC2025_127,Aydan,USA,North America,Twisted Minds,Call of Duty Warzone,Player,25,6,New York Subliners,1,0,850 -EWC2025_128,Enkeo,France,Europe,Gentle Mates,Call of Duty Warzone,Player,22,3,None,2,0,35 -EWC2025_129,Gromalok,France,Europe,Gentle Mates,Call of Duty Warzone,Player,24,4,None,2,0,28 -EWC2025_130,HalloW,France,Europe,Gentle Mates,Call of Duty Warzone,Player,23,4,None,2,0,22 -EWC2025_131,Dongy,South Korea,Asia,Virtus.pro,Call of Duty Warzone,Player,22,3,None,3,0,18 -EWC2025_132,Newbz,USA,North America,Virtus.pro,Call of Duty Warzone,Player,24,5,None,3,0,65 -EWC2025_133,Sage,USA,North America,Virtus.pro,Call of Duty Warzone,Player,23,4,None,3,0,45 -EWC2025_134,ZY,China,Asia,AG.AL,CrossFire,Player,24,6,None,1,0,85 -EWC2025_135,Jwei,China,Asia,AG.AL,CrossFire,Player,22,4,None,1,0,65 -EWC2025_136,Doo,China,Asia,AG.AL,CrossFire,Player,21,3,None,1,0,55 -EWC2025_137,1222,China,Asia,AG.AL,CrossFire,Player,23,5,None,1,0,48 -EWC2025_138,ZQ,China,Asia,AG.AL,CrossFire,Player,20,3,None,1,0,35 -EWC2025_139,Xxiao,China,Asia,BaiSha Gaming,CrossFire,Player,25,7,None,2,0,72 -EWC2025_140,N9,China,Asia,BaiSha Gaming,CrossFire,Player,24,6,None,2,0,68 -EWC2025_141,577,China,Asia,BaiSha Gaming,CrossFire,Player,22,4,None,2,0,42 -EWC2025_142,Lye,China,Asia,BaiSha Gaming,CrossFire,Player,23,5,None,2,0,38 -EWC2025_143,YDSS,China,Asia,BaiSha Gaming,CrossFire,Player,21,3,None,2,0,32 -EWC2025_144,ZAY,China,Asia,Evolution Power,CrossFire,Player,24,5,None,3,0,28 -EWC2025_145,mino,China,Asia,Evolution Power,CrossFire,Player,22,4,None,3,0,25 -EWC2025_146,YZK,China,Asia,Evolution Power,CrossFire,Player,23,5,None,3,0,22 -EWC2025_147,yh,China,Asia,Evolution Power,CrossFire,Player,21,3,None,3,0,18 -EWC2025_148,xqq,China,Asia,Evolution Power,CrossFire,Player,20,3,None,3,0,15 -EWC2025_149,Rasyah,Indonesia,Asia,EVOS Esports,Free Fire,Player,22,4,None,1,0,120 -EWC2025_150,AimGOD,Indonesia,Asia,EVOS Esports,Free Fire,Player,21,3,None,1,0,95 -EWC2025_151,Reyyy,Indonesia,Asia,EVOS Esports,Free Fire,Player,20,3,None,1,0,85 -EWC2025_152,Koceel,Indonesia,Asia,EVOS Esports,Free Fire,Player,23,5,None,1,0,78 -EWC2025_153,Dutzz,Indonesia,Asia,Rex Regum Qeon,Free Fire,Player,22,4,None,2,0,65 -EWC2025_154,Abay,Indonesia,Asia,Rex Regum Qeon,Free Fire,Player,21,3,None,2,0,58 -EWC2025_155,18Deer,Indonesia,Asia,Rex Regum Qeon,Free Fire,Player,20,3,None,2,0,52 -EWC2025_156,Maal,Indonesia,Asia,Rex Regum Qeon,Free Fire,Player,24,5,None,2,0,48 -EWC2025_157,JUMP,Thailand,Asia,Team Vitality,Free Fire,Player,22,4,None,3,0,42 -EWC2025_158,COUGAR,Thailand,Asia,Team Vitality,Free Fire,Player,21,3,None,3,0,38 -EWC2025_159,ZEN1S,Thailand,Asia,Team Vitality,Free Fire,Player,23,5,None,3,0,35 -EWC2025_160,DON,Thailand,Asia,Team Vitality,Free Fire,Player,20,3,None,3,0,28 -EWC2025_161,Ran,China,Asia,AG.AL,Honor of Kings,Player,22,4,None,1,0,95 -EWC2025_162,Zoe,China,Asia,AG.AL,Honor of Kings,Player,21,3,None,1,0,85 -EWC2025_163,Sheng,China,Asia,AG.AL,Honor of Kings,Player,20,3,None,1,0,78 -EWC2025_164,YiNuo,China,Asia,AG.AL,Honor of Kings,Player,23,5,None,1,0,72 -EWC2025_165,Shuai,China,Asia,AG.AL,Honor of Kings,Player,22,4,None,1,0,65 -EWC2025_166,Qing,China,Asia,ThunderTalk Global,Honor of Kings,Player,24,5,None,2,0,58 -EWC2025_167,Sunrise,China,Asia,ThunderTalk Global,Honor of Kings,Player,21,3,None,2,0,52 -EWC2025_168,Crane,China,Asia,ThunderTalk Global,Honor of Kings,Player,22,4,None,2,0,48 -EWC2025_169,Snowy,China,Asia,ThunderTalk Global,Honor of Kings,Player,20,3,None,2,0,42 -EWC2025_170,Joy,China,Asia,ThunderTalk Global,Honor of Kings,Player,23,5,None,2,0,38 -EWC2025_171,Xuan,China,Asia,Nova Esports,Honor of Kings,Player,22,4,None,3,0,35 -EWC2025_172,Cy,China,Asia,Nova Esports,Honor of Kings,Player,21,3,None,3,0,32 -EWC2025_173,Wendy,China,Asia,Nova Esports,Honor of Kings,Player,20,3,None,3,0,28 -EWC2025_174,Muci,China,Asia,Nova Esports,Honor of Kings,Player,23,5,None,3,0,25 -EWC2025_175,Weipit,China,Asia,Nova Esports,Honor of Kings,Player,22,4,None,3,0,22 -EWC2025_176,Sanford,Philippines,Asia,Team Liquid PH,Mobile Legends Bang Bang Men,Player,22,4,None,1,0,120 -EWC2025_177,KarlTzy,Philippines,Asia,Team Liquid PH,Mobile Legends Bang Bang Men,Player,23,5,None,1,0,150 -EWC2025_178,Sanji,Philippines,Asia,Team Liquid PH,Mobile Legends Bang Bang Men,Player,21,3,None,1,0,95 -EWC2025_179,Oheb,Philippines,Asia,Team Liquid PH,Mobile Legends Bang Bang Men,Player,22,4,None,1,0,85 -EWC2025_180,Jaypee,Philippines,Asia,Team Liquid PH,Mobile Legends Bang Bang Men,Player,20,3,None,1,0,72 -EWC2025_181,Kramm,Philippines,Asia,SRG.OG,Mobile Legends Bang Bang Men,Player,22,4,None,2,0,58 -EWC2025_182,Sekys,Philippines,Asia,SRG.OG,Mobile Legends Bang Bang Men,Player,21,3,None,2,0,52 -EWC2025_183,Stormie,Philippines,Asia,SRG.OG,Mobile Legends Bang Bang Men,Player,23,5,None,2,0,48 -EWC2025_184,Innocent,Philippines,Asia,SRG.OG,Mobile Legends Bang Bang Men,Player,22,4,None,2,0,42 -EWC2025_185,Yums,Philippines,Asia,SRG.OG,Mobile Legends Bang Bang Men,Player,20,3,None,2,0,38 -EWC2025_186,Kirk,Philippines,Asia,Onic Philippines,Mobile Legends Bang Bang Men,Player,22,4,None,3,0,35 -EWC2025_187,K1NG KONG,Philippines,Asia,Onic Philippines,Mobile Legends Bang Bang Men,Player,21,3,None,3,0,32 -EWC2025_188,Super Frince,Philippines,Asia,Onic Philippines,Mobile Legends Bang Bang Men,Player,23,5,None,3,0,28 -EWC2025_189,Kelra,Philippines,Asia,Onic Philippines,Mobile Legends Bang Bang Men,Player,22,4,None,3,0,25 -EWC2025_190,Brusko,Philippines,Asia,Onic Philippines,Mobile Legends Bang Bang Men,Player,20,3,None,3,0,22 -EWC2025_191,Fumi,Philippines,Asia,Team Vitality,Mobile Legends Bang Bang Women,Player,21,3,None,1,0,65 -EWC2025_192,Vival,Philippines,Asia,Team Vitality,Mobile Legends Bang Bang Women,Player,20,3,None,1,0,58 -EWC2025_193,Cinny,Philippines,Asia,Team Vitality,Mobile Legends Bang Bang Women,Player,22,4,None,1,0,52 -EWC2025_194,Chell,Philippines,Asia,Team Vitality,Mobile Legends Bang Bang Women,Player,21,3,None,1,0,48 -EWC2025_195,Vivian,Philippines,Asia,Team Vitality,Mobile Legends Bang Bang Women,Player,23,5,None,1,0,42 -EWC2025_196,Aria,Philippines,Asia,Gaimin Gladiators,Mobile Legends Bang Bang Women,Player,22,4,None,2,0,38 -EWC2025_197,Nicholette,Philippines,Asia,Gaimin Gladiators,Mobile Legends Bang Bang Women,Player,21,3,None,2,0,35 -EWC2025_198,Sayori,Philippines,Asia,Gaimin Gladiators,Mobile Legends Bang Bang Women,Player,20,3,None,2,0,32 -EWC2025_199,Panda,Philippines,Asia,Gaimin Gladiators,Mobile Legends Bang Bang Women,Player,23,5,None,2,0,28 -EWC2025_200,Ashlay,Philippines,Asia,Gaimin Gladiators,Mobile Legends Bang Bang Women,Player,22,4,None,2,0,25 -EWC2025_201,Hlaing,Myanmar,Asia,Terror Queens,Mobile Legends Bang Bang Women,Player,21,3,None,3,0,22 -EWC2025_202,Ruli,Myanmar,Asia,Terror Queens,Mobile Legends Bang Bang Women,Player,20,3,None,3,0,18 -EWC2025_203,LunaLynn,Myanmar,Asia,Terror Queens,Mobile Legends Bang Bang Women,Player,22,4,None,3,0,15 -EWC2025_204,CKOSHIII,Myanmar,Asia,Terror Queens,Mobile Legends Bang Bang Women,Player,23,5,None,3,0,12 -EWC2025_205,Kuu,Myanmar,Asia,Terror Queens,Mobile Legends Bang Bang Women,Player,21,3,None,3,0,10 -EWC2025_206,xmpl,Russia,Europe,Twisted Minds,PUBG Battlegrounds,Player,24,5,None,1,0,85 -EWC2025_207,BatulinS,Russia,Europe,Twisted Minds,PUBG Battlegrounds,Player,23,4,None,1,0,72 -EWC2025_208,Perfect1ks,Russia,Europe,Twisted Minds,PUBG Battlegrounds,Player,22,4,None,1,0,65 -EWC2025_209,Lu,Russia,Europe,Twisted Minds,PUBG Battlegrounds,Player,21,3,None,1,0,58 -EWC2025_210,Tosi,South Korea,Asia,Gen.G,PUBG Battlegrounds,Player,24,5,None,2,0,52 -EWC2025_211,F1ame,South Korea,Asia,Gen.G,PUBG Battlegrounds,Player,23,4,None,2,0,48 -EWC2025_212,Orca,South Korea,Asia,Gen.G,PUBG Battlegrounds,Player,22,4,None,2,0,42 -EWC2025_213,BeaN,South Korea,Asia,Gen.G,PUBG Battlegrounds,Player,21,3,None,2,0,38 -EWC2025_214,hwinn,USA,North America,Team Falcons,PUBG Battlegrounds,Player,24,5,None,3,0,35 -EWC2025_215,TGLTN,Australia,Oceania,Team Falcons,PUBG Battlegrounds,Player,23,4,None,3,0,32 -EWC2025_216,Shrimzy,USA,North America,Team Falcons,PUBG Battlegrounds,Player,22,4,None,3,0,28 -EWC2025_217,Kickstart,USA,North America,Team Falcons,PUBG Battlegrounds,Player,21,3,None,3,0,25 -EWC2025_218,Smile,Myanmar,Asia,Yangon Galacticos,PUBG Mobile,Player,22,4,None,1,0,65 -EWC2025_219,Marnett,Myanmar,Asia,Yangon Galacticos,PUBG Mobile,Player,21,3,None,1,0,58 -EWC2025_220,Romeo,Myanmar,Asia,Yangon Galacticos,PUBG Mobile,Player,20,3,None,1,0,52 -EWC2025_221,SAYCLOUD,Myanmar,Asia,Yangon Galacticos,PUBG Mobile,Player,23,5,None,1,0,48 -EWC2025_222,Suk,China,Asia,Weibo Gaming,PUBG Mobile,Player,24,5,None,2,0,42 -EWC2025_223,Order,China,Asia,Weibo Gaming,PUBG Mobile,Player,23,4,None,2,0,38 -EWC2025_224,33z,China,Asia,Weibo Gaming,PUBG Mobile,Player,22,4,None,2,0,35 -EWC2025_225,HECC,China,Asia,Weibo Gaming,PUBG Mobile,Player,21,3,None,2,0,32 -EWC2025_226,Zyol,Mongolia,Asia,Alpha Gaming,PUBG Mobile,Player,22,4,None,3,0,28 -EWC2025_227,DOK,Mongolia,Asia,Alpha Gaming,PUBG Mobile,Player,21,3,None,3,0,25 -EWC2025_228,REFUS,Mongolia,Asia,Alpha Gaming,PUBG Mobile,Player,23,5,None,3,0,22 -EWC2025_229,TOP,Mongolia,Asia,Alpha Gaming,PUBG Mobile,Player,20,3,None,3,0,18 -EWC2025_230,Savage,Brazil,South America,Team Secret,Rainbow Six Siege X,Player,24,5,None,1,0,95 -EWC2025_231,jume,Brazil,South America,Team Secret,Rainbow Six Siege X,Player,23,4,None,1,0,85 -EWC2025_232,Adrian,Brazil,South America,Team Secret,Rainbow Six Siege X,Player,22,4,None,1,0,78 -EWC2025_233,Mowwwgli,Brazil,South America,Team Secret,Rainbow Six Siege X,Player,21,3,None,1,0,72 -EWC2025_234,NoaUrz,Brazil,South America,Team Secret,Rainbow Six Siege X,Player,25,6,None,1,0,65 -EWC2025_235,Alem4o,Brazil,South America,G2 Esports,Rainbow Six Siege X,Player,24,5,None,2,0,58 -EWC2025_236,Doki,UK,Europe,G2 Esports,Rainbow Six Siege X,Player,23,4,None,2,0,52 -EWC2025_237,BlaZ,France,Europe,G2 Esports,Rainbow Six Siege X,Player,22,4,None,2,0,48 -EWC2025_238,Loira,Brazil,South America,G2 Esports,Rainbow Six Siege X,Player,21,3,None,2,0,42 -EWC2025_239,Stompn,Brazil,South America,G2 Esports,Rainbow Six Siege X,Player,24,5,None,2,0,38 -EWC2025_240,FelipeX,Brazil,South America,Furia Esports,Rainbow Six Siege X,Player,22,4,None,3,0,35 -EWC2025_241,HerdsZ,Brazil,South America,Furia Esports,Rainbow Six Siege X,Player,23,5,None,3,0,32 -EWC2025_242,Jv92,Brazil,South America,Furia Esports,Rainbow Six Siege X,Player,21,3,None,3,0,28 -EWC2025_243,Kheyze,Brazil,South America,Furia Esports,Rainbow Six Siege X,Player,24,5,None,3,0,25 -EWC2025_244,nade,Brazil,South America,Furia Esports,Rainbow Six Siege X,Player,22,4,None,3,0,22 -EWC2025_245,Luke Bennett,UK,Europe,BMW M Team Redline Red Bull Sim Racing,Rennsport,Driver,25,7,None,1,0,85 -EWC2025_246,Jeffery Rietveld,Netherlands,Europe,BMW M Team Redline Red Bull Sim Racing,Rennsport,Driver,24,6,None,1,0,72 -EWC2025_247,Sebastian Job,Germany,Europe,BMW M Team Redline Red Bull Sim Racing,Rennsport,Driver,23,5,None,1,0,65 -EWC2025_248,Kevin Siggy,Austria,Europe,BMW M Team Redline Red Bull Sim Racing,Rennsport,Driver,22,4,None,1,0,58 -EWC2025_249,Kevin Ellis Jr,USA,North America,Virtus.pro,Rennsport,Driver,24,5,None,2,0,52 -EWC2025_250,Daire McCormack,Ireland,Europe,Virtus.pro,Rennsport,Driver,23,4,None,2,0,48 -EWC2025_251,Vojtech Fiala,Czech Republic,Europe,Virtus.pro,Rennsport,Driver,22,4,None,2,0,42 -EWC2025_252,Mikhail Statsenko,Russia,Europe,Virtus.pro,Rennsport,Driver,21,3,None,2,0,38 -EWC2025_253,Thibault Cazaubon,France,Europe,Team Vitality,Rennsport,Driver,24,5,None,3,0,35 -EWC2025_254,Marcell Csincsik,Hungary,Europe,Team Vitality,Rennsport,Driver,23,4,None,3,0,32 -EWC2025_255,Erhan Jajovski,North Macedonia,Europe,Team Vitality,Rennsport,Driver,22,4,None,3,0,28 -EWC2025_256,Jiri Toman,Czech Republic,Europe,Team Vitality,Rennsport,Driver,21,3,None,3,0,25 -EWC2025_257,Saopimi,China,Asia,Weibo Gaming,Teamfight Tactics,Player,22,4,None,1,0,65 -EWC2025_258,LBTZ,China,Asia,Weibo Gaming,Teamfight Tactics,Player,21,3,None,1,0,58 -EWC2025_259,Guan,China,Asia,Weibo Gaming,Teamfight Tactics,Player,23,5,None,1,0,52 -EWC2025_260,TianLong,China,Asia,Weibo Gaming,Teamfight Tactics,Player,20,3,None,1,0,48 -EWC2025_261,Maris,Russia,Europe,Virtus.pro,Teamfight Tactics,Player,24,5,None,2,0,42 -EWC2025_262,Milo,Russia,Europe,Virtus.pro,Teamfight Tactics,Player,22,4,None,2,0,38 -EWC2025_263,k1an,Russia,Europe,Virtus.pro,Teamfight Tactics,Player,21,3,None,2,0,35 -EWC2025_264,NCC1,Russia,Europe,Virtus.pro,Teamfight Tactics,Player,23,5,None,2,0,32 -EWC2025_265,Binteum,South Korea,Asia,T1,Teamfight Tactics,Player,22,4,None,3,0,28 -EWC2025_266,sCsC,South Korea,Asia,T1,Teamfight Tactics,Player,21,3,None,3,0,25 -EWC2025_267,dunizuni,South Korea,Asia,T1,Teamfight Tactics,Player,23,5,None,3,0,22 -EWC2025_268,CrazyMoving,South Korea,Asia,T1,Teamfight Tactics,Player,20,3,None,3,0,18 -EWC2025_269,Opale,France,Europe,AEGIS,Teamfight Tactics,Player,22,4,None,3,0,15 -EWC2025_270,Pas de Bol,France,Europe,AEGIS,Teamfight Tactics,Player,21,3,None,3,0,12 -EWC2025_271,Lyyyress,France,Europe,AEGIS,Teamfight Tactics,Player,23,5,None,3,0,10 -EWC2025_272,Gobosteur,France,Europe,AEGIS,Teamfight Tactics,Player,20,3,None,3,0,8 diff --git a/data/06_EWC2025_Prize_Pool_Distribution.csv b/data/06_EWC2025_Prize_Pool_Distribution.csv deleted file mode 100644 index a42c95a..0000000 --- a/data/06_EWC2025_Prize_Pool_Distribution.csv +++ /dev/null @@ -1,6 +0,0 @@ -Category,Amount_USD,Percentage,Description,Num_Recipients -Club Championship,27000000,27.0,Top 24 clubs based on points,24 -Game Championships,45000000,45.0,Individual game tournament prizes,25 -Qualifiers,15000000,15.0,Regional qualifier prizes,200 -MVP Awards,3000000,3.0,Most Valuable Player per game,25 -Club Partner Support,10000000,10.0,Support for 40 partner clubs,40 diff --git a/data/07_EWC2025_Calendar_Schedule.csv b/data/07_EWC2025_Calendar_Schedule.csv deleted file mode 100644 index ce5891e..0000000 --- a/data/07_EWC2025_Calendar_Schedule.csv +++ /dev/null @@ -1,28 +0,0 @@ -Week,Game,Start_Date,End_Date,Duration_Days,Venue,Time_Zone -1,Rennsport,2025-07-08,2025-07-11,4,"Boulevard City, Riyadh",AST -1,Valorant,2025-07-08,2025-07-13,6,"Boulevard City, Riyadh",AST -1,Dota 2,2025-07-08,2025-07-19,12,"Boulevard City, Riyadh",AST -1,Fatal Fury: City of the Wolves,2025-07-10,2025-07-12,3,"Boulevard City, Riyadh",AST -1,Apex Legends,2025-07-10,2025-07-13,4,"Boulevard City, Riyadh",AST -1,Mobile Legends: Bang Bang - Men,2025-07-10,2025-08-02,24,"Boulevard City, Riyadh",AST -2,Mobile Legends: Bang Bang - Women,2025-07-15,2025-07-19,5,"Boulevard City, Riyadh",AST -2,Honor of Kings,2025-07-15,2025-07-26,12,"Boulevard City, Riyadh",AST -2,Free Fire,2025-07-16,2025-07-20,5,"Boulevard City, Riyadh",AST -2,League of Legends,2025-07-16,2025-07-20,5,"Boulevard City, Riyadh",AST -2,StarCraft II,2025-07-22,2025-07-25,4,"Boulevard City, Riyadh",AST -3,Call of Duty: Black Ops 6,2025-07-24,2025-07-27,4,"Boulevard City, Riyadh",AST -3,PUBG Mobile,2025-07-25,2025-08-03,10,"Boulevard City, Riyadh",AST -3,Chess,2025-07-29,2025-08-01,4,"Boulevard City, Riyadh",AST -3,Overwatch 2,2025-07-31,2025-08-03,4,"Boulevard City, Riyadh",AST -4,Rainbow Six Siege X,2025-08-05,2025-08-09,5,"Boulevard City, Riyadh",AST -4,Call of Duty: Warzone,2025-08-06,2025-08-09,4,"Boulevard City, Riyadh",AST -4,EA Sports FC 25,2025-08-07,2025-08-10,4,"Boulevard City, Riyadh",AST -5,Teamfight Tactics,2025-08-11,2025-08-15,5,"Boulevard City, Riyadh",AST -5,PUBG: Battlegrounds,2025-08-12,2025-08-16,5,"Boulevard City, Riyadh",AST -5,Tekken 8,2025-08-13,2025-08-16,4,"Boulevard City, Riyadh",AST -5,Rocket League,2025-08-14,2025-08-17,4,"Boulevard City, Riyadh",AST -6,CrossFire,2025-08-19,2025-08-23,5,"Boulevard City, Riyadh",AST -6,Street Fighter 6,2025-08-20,2025-08-23,4,"Boulevard City, Riyadh",AST -6,Counter-Strike 2,2025-08-20,2025-08-24,5,"Boulevard City, Riyadh",AST -6,Naraka: Bladepoint - Solo,2025-08-19,2025-08-19,1,"Boulevard City, Riyadh",AST -6,Naraka: Bladepoint - Trios,2025-08-20,2025-08-20,1,"Boulevard City, Riyadh",AST diff --git a/data/08_EWC2025_Country_Results.csv b/data/08_EWC2025_Country_Results.csv deleted file mode 100644 index d661f1c..0000000 --- a/data/08_EWC2025_Country_Results.csv +++ /dev/null @@ -1,37 +0,0 @@ -Country,Gold_Medals,Silver_Medals,Bronze_Medals,Total_Medals,Total_Players,Top_Game,Region -South Korea,4,3,5,12,58,League of Legends,Asia -China,3,2,2,7,52,Honor of Kings,Asia -USA,3,1,4,8,38,Call of Duty: Black Ops 6,North America -Russia,2,2,3,7,28,Dota 2,Europe -Saudi Arabia,1,1,3,5,32,Overwatch 2,Middle East -Philippines,1,2,2,5,30,Mobile Legends: Bang Bang,Asia -France,1,1,1,3,18,Rocket League,Europe -Mongolia,1,1,0,2,10,Counter-Strike 2,Asia -Brazil,1,0,1,2,22,Rainbow Six Siege X,South America -UK,1,0,1,2,14,Rocket League,Europe -Netherlands,1,0,1,2,8,EA Sports FC 25,Europe -Japan,1,0,0,1,4,Fatal Fury: City of the Wolves,Asia -Finland,1,0,0,1,3,StarCraft II,Europe -Indonesia,1,0,0,1,12,Free Fire,Asia -Myanmar,1,0,1,2,16,PUBG Mobile,Asia -Turkey,0,1,0,1,10,Counter-Strike 2,Europe -Ukraine,0,1,1,2,12,Dota 2,Europe -Denmark,0,1,0,1,6,Dota 2,Europe -Jordan,0,1,0,1,4,Dota 2,Middle East -Slovakia,0,1,0,1,4,Dota 2,Europe -Lithuania,0,1,0,1,4,Valorant,Europe -Thailand,0,0,1,1,8,Free Fire,Asia -Australia,0,0,1,1,6,Apex Legends,Oceania -Morocco,0,0,0,0,4,Call of Duty: Black Ops 6,Europe -Canada,0,0,0,0,4,Call of Duty: Black Ops 6,North America -Spain,0,0,0,0,4,Call of Duty: Black Ops 6,Europe -North Macedonia,0,0,0,0,4,Counter-Strike 2,Europe -Bosnia,0,0,0,0,4,Counter-Strike 2,Europe -Poland,0,0,0,0,4,Valorant,Europe -Ireland,0,0,0,0,4,Rennsport,Europe -Germany,0,0,0,0,4,Rennsport,Europe -Austria,0,0,0,0,4,Rennsport,Europe -Czech Republic,0,0,0,0,8,Rennsport,Europe -Hungary,0,0,0,0,4,Rennsport,Europe -India,0,0,0,0,4,Battlegrounds Mobile India,Asia -Chile,0,0,0,0,4,Valorant,South America diff --git a/data/09_EWC2025_Point_System.csv b/data/09_EWC2025_Point_System.csv deleted file mode 100644 index dd8ea95..0000000 --- a/data/09_EWC2025_Point_System.csv +++ /dev/null @@ -1,17 +0,0 @@ -Placement,Points,System_Type,Description -1,1000,Standard,Winner -2,600,Standard,Runner-up -3,350,Standard,Third place -4,200,Standard,Fourth place -5,110,Standard,Fifth place -6,110,Standard,Sixth place -7,110,Standard,Seventh place -8,110,Standard,Eighth place -1,1000,Co-Placement,Winner (shared) -2,600,Co-Placement,Runner-up (shared) -3,350,Co-Placement,Third place (shared) -4,200,Co-Placement,Fourth place (shared) -5,110,Co-Placement,Fifth place (shared) -6,110,Co-Placement,Sixth place (shared) -7,110,Co-Placement,Seventh place (shared) -8,110,Co-Placement,Eighth place (shared) diff --git a/data/10_EWC2025_Game_by_Game_Results.csv b/data/10_EWC2025_Game_by_Game_Results.csv deleted file mode 100644 index 540cb51..0000000 --- a/data/10_EWC2025_Game_by_Game_Results.csv +++ /dev/null @@ -1,51 +0,0 @@ -Game,Match_Type,Team_1,Team_2,Winner,Score,Map,Duration_Minutes,MVP -Apex Legends,Finals,VK Gaming,ROC Esports,VK Gaming,N/A,Multiple,180,Kasssa -Apex Legends,Third Place,Ninjas in Pyjamas,FaZe Clan,Ninjas in Pyjamas,N/A,Multiple,120,Vein -Call of Duty: Black Ops 6,Grand Final,OpTic Gaming,Vancouver Surge,OpTic Gaming,4-1,Multiple,150,Dashy -Call of Duty: Black Ops 6,Third Place,Movistar KOI,100 Thieves,Movistar KOI,3-2,Multiple,120,CleanX -Chess,Final,Magnus Carlsen,Alireza Firouzja,Magnus Carlsen,2.5-1.5,N/A,240,Magnus Carlsen -Chess,Third Place,Hikaru Nakamura,Fabiano Caruana,Hikaru Nakamura,2-1,N/A,180,Hikaru Nakamura -Counter-Strike 2,Grand Final,The MongolZ,Aurora Gaming,The MongolZ,2-0,"Dust2, Mirage",90,mzinho -Counter-Strike 2,Third Place,Team Falcons,Natus Vincere,Team Falcons,2-1,"Inferno, Nuke, Ancient",120,NiKo -Dota 2,Grand Final,Team Spirit,Team Falcons,Team Spirit,3-1,Multiple,210,Yatoro -Dota 2,Third Place,Parivision,Gaimin Gladiators,Parivision,2-0,Multiple,90,No[o]ne- -League of Legends,Grand Final,Gen.G,AG.AL,Gen.G,3-1,Multiple,180,Chovy -League of Legends,Third Place,T1,Bilibili Gaming,T1,2-1,Multiple,150,Faker -Valorant,Grand Final,Team Heretics,Fnatic,Team Heretics,3-1,"Ascent, Bind, Haven, Split",150,benjyfishy -Valorant,Third Place,Gen.G,Sentinels,Gen.G,2-1,Multiple,120,Munchkin -Overwatch 2,Grand Final,Team Falcons,Al Qadsiah,Team Falcons,4-1,Multiple,120,Proper -Overwatch 2,Third Place,Twisted Minds,Team Vitality,Twisted Minds,3-2,Multiple,150,FunnyAstro -StarCraft II,Final,Serral,Classic,Serral,4-1,Multiple,180,Serral -StarCraft II,Third Place,Cure,Maru,Cure,2-1,Multiple,120,Cure -Street Fighter 6,Final,Xiaohai,Blaz,Xiaohai,5-2,N/A,45,Xiaohai -Street Fighter 6,Third Place,Leshar,AngryBird,Leshar,3-2,N/A,30,Leshar -Tekken 8,Final,ULSAN,LOWHIGH,ULSAN,3-1,N/A,30,ULSAN -Tekken 8,Third Place,CBM,Arslan Ash,CBM,2-1,N/A,25,CBM -EA Sports FC 25,Final,ManuBachoore,Brice,ManuBachoore,3-1,N/A,30,ManuBachoore -EA Sports FC 25,Third Place,Levi de Weerd,Tekkz,Levi de Weerd,2-1,N/A,25,Levi de Weerd -Fatal Fury: City of the Wolves,Final,GO1,Xiaohai,GO1,3-2,N/A,30,GO1 -Fatal Fury: City of the Wolves,Third Place,DarkAngel,MenaRD,DarkAngel,2-1,N/A,25,DarkAngel -Rocket League,Grand Final,Karmine Corp,Geekay Esports,Karmine Corp,4-2,Multiple,60,Vatira -Rocket League,Third Place,Team Falcons,Team BDS,Team Falcons,3-2,Multiple,50,Trk511 -Call of Duty: Warzone,Final,Twisted Minds,Gentle Mates,Twisted Minds,N/A,Multiple,180,Aydan -Call of Duty: Warzone,Third Place,Virtus.pro,Team Liquid,Virtus.pro,N/A,Multiple,120,Newbz -CrossFire,Grand Final,AG.AL,BaiSha Gaming,AG.AL,3-1,Multiple,120,ZY -CrossFire,Third Place,Evolution Power,EDward Gaming,Evolution Power,2-1,Multiple,90,ZAY -Free Fire,Final,EVOS Esports,Rex Regum Qeon,EVOS Esports,N/A,Multiple,180,Rasyah -Free Fire,Third Place,Team Vitality,ONIC Esports,Team Vitality,N/A,Multiple,120,JUMP -Honor of Kings,Grand Final,AG.AL,ThunderTalk Global,AG.AL,4-1,Multiple,150,Ran -Honor of Kings,Third Place,Nova Esports,Wolves Esports,Nova Esports,3-2,Multiple,120,Xuan -Mobile Legends: Bang Bang - Men,Grand Final,Team Liquid PH,SRG.OG,Team Liquid PH,4-2,Multiple,180,KarlTzy -Mobile Legends: Bang Bang - Men,Third Place,Onic Philippines,EVOS Esports,Onic Philippines,3-1,Multiple,120,Kelra -Mobile Legends: Bang Bang - Women,Grand Final,Team Vitality,Gaimin Gladiators,Team Vitality,3-1,Multiple,90,Fumi -Mobile Legends: Bang Bang - Women,Third Place,Terror Queens,ONIC Esports,Terror Queens,2-1,Multiple,60,Hlaing -PUBG: Battlegrounds,Final,Twisted Minds,Gen.G,Twisted Minds,N/A,Multiple,180,xmpl -PUBG: Battlegrounds,Third Place,Team Falcons,FaZe Clan,Team Falcons,N/A,Multiple,120,hwinn -PUBG Mobile,Final,Yangon Galacticos,Weibo Gaming,Yangon Galacticos,N/A,Multiple,180,Smile -PUBG Mobile,Third Place,Alpha Gaming,Team Vitality,Alpha Gaming,N/A,Multiple,120,Zyol -Rainbow Six Siege X,Grand Final,Team Secret,G2 Esports,Team Secret,3-1,Multiple,150,Savage -Rainbow Six Siege X,Third Place,Furia Esports,Ninjas in Pyjamas,Furia Esports,2-1,Multiple,120,FelipeX -Rennsport,Final,BMW M Team Redline Red Bull Sim Racing,Virtus.pro,BMW M Team Redline Red Bull Sim Racing,N/A,Multiple,120,Luke Bennett -Rennsport,Third Place,Team Vitality,Team Liquid,Team Vitality,N/A,Multiple,90,Thibault Cazaubon -Teamfight Tactics,Final,Weibo Gaming,Virtus.pro,Weibo Gaming,N/A,N/A,180,Saopimi -Teamfight Tactics,Third Place,T1,AEGIS,T1,N/A,N/A,120,Binteum diff --git a/data/README.md b/data/README.md deleted file mode 100644 index fdcdc43..0000000 --- a/data/README.md +++ /dev/null @@ -1,202 +0,0 @@ -# 🎮 Esports World Cup 2025 — Complete Dataset - -> **The most comprehensive structured dataset for EWC 2025**, covering all 27 game tournaments held in Riyadh, Saudi Arabia from July 8 to August 2025. 10 interlinked CSV files spanning players, teams, results, prize pools, and more. - ---- - -## 📌 About the Dataset - -The **Esports World Cup (EWC)** is the world's largest esports event, hosted annually at Boulevard City in Riyadh. The 2025 edition featured **27 title tournaments**, a **$100M+ total prize pool**, and competitors from **36+ countries** across PC and mobile platforms. - -This dataset was compiled to support analysis of competitive esports at the highest level — team performance, player demographics, prize distribution, country dominance, and the Club Championship meta-game. - ---- - -## 📁 Files Overview - -| # | File | Rows | Cols | Description | -|---|------|------|------|-------------| -| 01 | `01_EWC2025_Event_Tournament_Summary.csv` | 27 | 12 | One row per game tournament — dates, prize pool, winner, platform | -| 02 | `02_EWC2025_Medalists.csv` | 257 | 6 | Every gold/silver/bronze medalist with country and role | -| 03 | `03_EWC2025_Club_Championship_Standings.csv` | 24 | 10 | Final Club Championship rankings with points and prize money | -| 04 | `04_EWC2025_Club_Partner_Program.csv` | 40 | 10 | All club partner orgs — region, founding year, social following | -| 05 | `05_EWC2025_Player_Roster.csv` | 272 | 13 | Full player roster with age, experience, earnings, social reach | -| 06 | `06_EWC2025_Prize_Pool_Distribution.csv` | 5 | 5 | How the $100M+ prize pool was split across categories | -| 07 | `07_EWC2025_Calendar_Schedule.csv` | 27 | 7 | Weekly schedule with venue and timezone for each tournament | -| 08 | `08_EWC2025_Country_Results.csv` | 36 | 8 | Medal tally by country with top game and player count | -| 09 | `09_EWC2025_Point_System.csv` | 16 | 4 | Club Championship point system by placement | -| 10 | `10_EWC2025_Game_by_Game_Results.csv` | 50 | 9 | Match results with scores, maps, duration, and MVP | - ---- - -## 🔑 Column Dictionary - -### 01 — Event & Tournament Summary -| Column | Type | Description | -|--------|------|-------------| -| `Game` | str | Game title | -| `Event_Name` | str | Official tournament name | -| `Start_Date` | date | Tournament start date | -| `End_Date` | date | Tournament end date | -| `Prize_Pool_USD` | int | Total prize pool in USD | -| `Num_Participants` | int | Number of competing teams/players | -| `Winner` | str | Tournament champion | -| `Runner_Up` | str | Runner-up | -| `Game_Type` | str | Genre (MOBA, FPS, Racing, etc.) | -| `Platform` | str | PC or Mobile | -| `Club_Championship_Points` | str | Whether points were awarded (Yes/No) | -| `Gender` | str | Mixed/Women/Men (NaN = open) | - -### 02 — Medalists -| Column | Type | Description | -|--------|------|-------------| -| `Event` | str | Game title | -| `Medal` | str | Gold / Silver / Bronze | -| `Team_Organization` | str | Organization name | -| `Player` | str | Player handle/name | -| `Country` | str | Player's country | -| `Role` | str | In-game role (IGL, Fragger, Support, etc.) | - -### 03 — Club Championship Standings -| Column | Type | Description | -|--------|------|-------------| -| `Rank` | int | Final standing | -| `Organization` | str | Club name | -| `Total_Points` | int | Total Club Championship points | -| `Prize_Money_USD` | int | Prize money earned | -| `Tournament_Wins` | int | Number of tournaments won | -| `Top_8_Finishes` | int | Top-8 finishes across events | -| `Region` | str | Organization's home region | -| `Club_Partner_Status` | str | Current / New / No | -| `Eligible_to_Win` | str | Eligibility status | -| `Games_Won` | str | List of games the club won | - -### 04 — Club Partner Program -| Column | Type | Description | -|--------|------|-------------| -| `Organization` | str | Club name | -| `Region` | str | Geographic region | -| `Country` | str | Home country | -| `Club_Partner_Status` | str | Current / New | -| `Top_8_2024` | str | Did club finish top-8 in 2024? | -| `Games_Competing` | str | Games the club entered | -| `Founded` | int | Year founded | -| `HQ_Location` | str | Headquarters city/country | -| `CEO` | str | CEO or owner | -| `Social_Media_Followers_M` | float | Total social following (millions) | - -### 05 — Player Roster -| Column | Type | Description | -|--------|------|-------------| -| `Player_ID` | str | Unique player ID (EWC2025_XXX) | -| `Player_Name` | str | Player handle | -| `Country` | str | Nationality | -| `Region` | str | Continental region | -| `Team` | str | Competing team | -| `Game` | str | Game played | -| `Role` | str | In-game role | -| `Age` | int | Player age | -| `Experience_Years` | int | Years of pro experience | -| `Previous_Team` | str | Prior team (NaN if first team) | -| `Tournament_Place` | int | Final placement | -| `Prize_Earned_USD` | int | Individual prize earnings | -| `Social_Media_Followers_K` | int | Social following (thousands) | - -### 06 — Prize Pool Distribution -| Column | Type | Description | -|--------|------|-------------| -| `Category` | str | Prize category | -| `Amount_USD` | int | Total amount for category | -| `Percentage` | float | Share of total prize pool | -| `Description` | str | What the prize covers | -| `Num_Recipients` | int | Number of recipients | - -### 07 — Calendar & Schedule -| Column | Type | Description | -|--------|------|-------------| -| `Week` | int | Event week number | -| `Game` | str | Game title | -| `Start_Date` | date | Start date | -| `End_Date` | date | End date | -| `Duration_Days` | int | Tournament length in days | -| `Venue` | str | Venue name and city | -| `Time_Zone` | str | Local timezone (AST) | - -### 08 — Country Results -| Column | Type | Description | -|--------|------|-------------| -| `Country` | str | Country name | -| `Gold_Medals` | int | Gold medals won | -| `Silver_Medals` | int | Silver medals won | -| `Bronze_Medals` | int | Bronze medals won | -| `Total_Medals` | int | Total medals | -| `Total_Players` | int | Number of players from country | -| `Top_Game` | str | Game country excelled in most | -| `Region` | str | Geographic region | - -### 09 — Point System -| Column | Type | Description | -|--------|------|-------------| -| `Placement` | int | Finishing position | -| `Points` | int | Club Championship points awarded | -| `System_Type` | str | Standard / Extended / Special | -| `Description` | str | Label for the placement | - -### 10 — Game-by-Game Results -| Column | Type | Description | -|--------|------|-------------| -| `Game` | str | Game title | -| `Match_Type` | str | Finals / Grand Final / Third Place / etc. | -| `Team_1` | str | First competing team | -| `Team_2` | str | Second competing team | -| `Winner` | str | Winning team | -| `Score` | str | Match score (e.g., 4-1) | -| `Map` | str | Map or stage played | -| `Duration_Minutes` | int | Match length in minutes | -| `MVP` | str | Most Valuable Player of the match | - ---- - -## 🔗 Entity Relationships - -``` -Event_Tournament_Summary ──┬──> Game_by_Game_Results (via Game) - ├──> Medalists (via Event/Game) - └──> Calendar_Schedule (via Game) - -Club_Championship_Standings ──> Club_Partner_Program (via Organization) -Club_Championship_Standings ──> Player_Roster (via Team) - -Medalists ──> Player_Roster (via Player) -Country_Results ──> Player_Roster (via Country) -Point_System ──> Club_Championship_Standings (via Placement → Points) -Prize_Pool_Distribution ──> Event_Tournament_Summary (via Prize totals) -``` - ---- - -## 💡 Suggested Analyses - -- 🏆 **Which country dominated EWC 2025?** — Medal tally, players per medal, regional power maps -- 💰 **Prize money vs. Club Championship performance** — Is tournament breadth or depth rewarded more? -- 👤 **Player age & experience vs. earnings** — Do veterans outperform newcomers? -- 🌍 **Regional representation by game genre** — Does Asia dominate MOBAs? Does Europe lead in FPS? -- 📅 **Schedule clustering** — Which weeks had the most high-stakes matches? -- 🔁 **Club partner loyalty** — How do new vs. current partners compare in performance? -- 🎯 **MVP distribution** — Which players appeared most often as MVPs across matches? - ---- - -## 📜 License - -This dataset is released under **CC BY 4.0**. You are free to share and adapt it for any purpose with attribution. - ---- - -## 🙏 Acknowledgements - -Data compiled from publicly available Esports World Cup 2025 tournament results, official brackets, and club partnership announcements. This is a fan/researcher-compiled dataset and is not officially affiliated with EWC or its organizers. - ---- - -*If you find this dataset useful, please upvote ⬆️ — it helps others discover it!* diff --git a/docs/01_overview.md b/docs/01_overview.md deleted file mode 100644 index 6d50567..0000000 --- a/docs/01_overview.md +++ /dev/null @@ -1,83 +0,0 @@ -# Project Overview - -## What This Project Is - -This project builds a complete data warehousing pipeline for the **Esports World Cup 2025 (EWC 2025)** — the world's largest esports event, held in Riyadh, Saudi Arabia across 27 tournaments from July to August 2025 with a total prize pool exceeding $100 million. - -The goal is to take raw event data, load it into a structured transactional database, and then transform it into a Data Mart optimized for analytical reporting. The final output is a star schema in Oracle that can be connected to Power BI to answer business questions about prize distribution, country performance, club rankings, and more. - ---- - -## Technology Stack - -| Layer | Tool | -|---|---| -| Source data | Kaggle CSV dataset (10 files) | -| OLTP database | MySQL 8.4 (Docker container) | -| ETL pipeline | Apache NiFi | -| Data Mart | Oracle (university lab schema) | -| Reporting | Microsoft Power BI | -| Infrastructure | Docker / Podman | -| Seed script | .NET 10 (single-file C# script) | - ---- - -## Architecture - -``` -┌─────────────────────┐ -│ Kaggle CSV files │ 10 files, ~700 rows total -│ (./data/) │ -└────────┬────────────┘ - │ dotnet run ./scripts/seed.cs - ▼ -┌─────────────────────┐ -│ MySQL 8.4 OLTP │ Normalized relational schema -│ port 13306 │ 14 tables, 3NF -│ (Docker) │ -└────────┬────────────┘ - │ Apache NiFi ETL - │ ExecuteSQL → ConvertAvroToJSON → SplitJson - │ → EvaluateJsonPath → PutSQL - ▼ -┌─────────────────────┐ -│ Oracle Data Mart │ Star schema -│ (university lab) │ 3 fact tables, 5 dimension tables -└────────┬────────────┘ - │ Import / Live connection - ▼ -┌─────────────────────┐ -│ Power BI Reports │ OLAP analytics, 2 dashboards -└─────────────────────┘ -``` - ---- - -## Project Structure - -``` -IPZ_1/ -├── data/ Raw Kaggle CSV files (source data) -├── sql/ -│ ├── schema.sql MySQL OLTP schema DDL -│ └── datamart_schema.sql Oracle Data Mart DDL -├── scripts/ -│ └── seed.cs .NET 10 script to populate MySQL from CSVs -├── docker/ -│ ├── start.sh / stop.sh Linux (Docker or Podman) -│ └── start.ps1 / stop.ps1 Windows -├── nifi/ -│ ├── sql/extract/ MySQL queries (one per ETL pipeline) -│ ├── sql/load/ Oracle INSERT statements (one per ETL pipeline) -│ └── NIFI_SETUP.md Step-by-step NiFi configuration guide -└── docs/ This documentation -``` - ---- - -## Data Flow Summary - -1. **Raw data** lives as 10 CSV files exported from Kaggle covering EWC 2025. -2. **Seeding** — a single C# script reads all CSVs, resolves foreign key relationships, and populates the MySQL OLTP database in the correct order. -3. **ETL** — Apache NiFi runs 8 pipelines. Each reads from MySQL, extracts records, and inserts rows into Oracle dimension and fact tables. -4. **Reporting** — Power BI connects to Oracle and queries the star schema for OLAP analysis. diff --git a/docs/02_dataset.md b/docs/02_dataset.md deleted file mode 100644 index 6b6170f..0000000 --- a/docs/02_dataset.md +++ /dev/null @@ -1,50 +0,0 @@ -# Dataset - -## Source - -The data comes from a Kaggle dataset titled **"Esports World Cup 2025 — Complete Dataset"**, released under the CC BY 4.0 license. It was compiled from publicly available tournament results, official brackets, and club partnership announcements. - -The dataset covers all 27 title tournaments of EWC 2025, held at Boulevard City, Riyadh, Saudi Arabia from **July 8 to August 24, 2025**. The event featured a **$100M+ total prize pool** and competitors from **36+ countries**. - ---- - -## Files - -| File | Rows | Description | -|---|---|---| -| `01_EWC2025_Event_Tournament_Summary.csv` | 27 | One row per tournament — dates, prize pool, winner, game type | -| `02_EWC2025_Medalists.csv` | 257 | Every gold/silver/bronze medalist with country and role | -| `03_EWC2025_Club_Championship_Standings.csv` | 24 | Final Club Championship rankings — points and prize money | -| `04_EWC2025_Club_Partner_Program.csv` | 40 | Official partner organizations — region, founding year, social following | -| `05_EWC2025_Player_Roster.csv` | 272 | Full player roster — age, experience, prize earned, social followers | -| `06_EWC2025_Prize_Pool_Distribution.csv` | 5 | How the $100M+ prize pool was split across categories | -| `07_EWC2025_Calendar_Schedule.csv` | 27 | Weekly tournament schedule with venue and timezone | -| `08_EWC2025_Country_Results.csv` | 36 | Medal tally by country with player counts | -| `09_EWC2025_Point_System.csv` | 16 | Club Championship point system by placement | -| `10_EWC2025_Game_by_Game_Results.csv` | 50 | Match results — scores, map, duration, MVP | - ---- - -## Key Entities in the Data - -**Games** — 25 unique titles spanning 8 genres (MOBA, FPS, Battle Royale, Fighting, RTS, Sports, Auto Battler, Strategy) across PC, mobile, and console platforms. - -**Organizations** — 60+ esports clubs. 40 are official EWC Club Partners with full metadata (founding year, HQ, social following). The rest appear through match results and medalist records. - -**Players** — 272 players in the roster with demographics (age, country, region), performance (tournament placement, prize earned), and social media reach. - -**Tournaments** — 27 events, including two with gender divisions (Mobile Legends: Bang Bang ran separate Men and Women brackets) and two with format variants (Naraka: Bladepoint ran Solo and Trios simultaneously). - -**Club Championship** — A meta-competition running across all 27 tournaments. Clubs accumulate points based on their placements in each event. The top 24 clubs share a $27M prize pool. - ---- - -## Data Quality Notes - -A few things to be aware of when working with this data: - -- **Game name inconsistencies across files.** Files 07, 02, and 10 use expanded names like `"Mobile Legends: Bang Bang - Men"` and `"Naraka: Bladepoint - Solo"`, while file 01 uses the base game name with a separate Gender column. The seed script handles this normalization automatically. -- **Abbreviated game names in file 04.** The `Games_Competing` column uses shorthand like `"Mobile Legends"` instead of `"Mobile Legends: Bang Bang"`, and `"PUBG"` which is ambiguous. These are resolved via an alias map in the seed script. -- **Mixed winner types in file 01.** For individual-format games (Chess, StarCraft II, Street Fighter 6, Tekken 8, EA Sports FC 25), the `Winner` column contains a player name rather than a team name. This is why `winner` and `runner_up` are stored as plain text in the OLTP rather than as foreign keys. -- **`Battlegrounds Mobile India`** appears in file 04 as a game one organization competes in, but it is not present as an EWC 2025 tournament. This entry is skipped during seeding. -- **Prize earnings for players** (file 05) are all zero in the dataset, likely because individual prize splits were not publicly available at time of compilation. diff --git a/docs/03_oltp_schema.md b/docs/03_oltp_schema.md deleted file mode 100644 index bd9bd19..0000000 --- a/docs/03_oltp_schema.md +++ /dev/null @@ -1,140 +0,0 @@ -# OLTP Database - -## Overview - -The OLTP (Online Transaction Processing) database is a normalized relational schema implemented in **MySQL 8.4**. It serves as the authoritative source of record for all EWC 2025 data and as the source for the ETL pipeline that populates the Data Mart. - -The schema is in **Third Normal Form (3NF)** — no transitive dependencies, no repeating groups, every non-key attribute depends on the whole key. - -The DDL is in `sql/schema.sql`. The database runs locally in Docker on port **13306**. - ---- - -## Tables - -### Lookup Tables - -These have no foreign keys and are loaded first. - -**`game`** — The 25 unique game titles that appear at EWC 2025. - -| Column | Type | Notes | -|---|---|---| -| game_id | INT UNSIGNED | Auto-increment PK | -| name | VARCHAR(100) | Unique | -| game_type | VARCHAR(50) | MOBA, FPS, Battle Royale, Fighting, etc. | -| platform | VARCHAR(50) | PC, Mobile, Console/PC, etc. | - ---- - -**`country`** — All countries represented at the event, enriched with medal tallies from file 08. - -| Column | Type | Notes | -|---|---|---| -| country_id | INT UNSIGNED | Auto-increment PK | -| name | VARCHAR(100) | Unique | -| region | VARCHAR(50) | Asia, Europe, North America, etc. | -| gold_medals | TINYINT UNSIGNED | From file 08 (0 if not in file 08) | -| silver_medals | TINYINT UNSIGNED | | -| bronze_medals | TINYINT UNSIGNED | | -| total_medals | TINYINT UNSIGNED | | -| total_players | SMALLINT UNSIGNED | | -| top_game | VARCHAR(100) | Game the country performed best in | - ---- - -**`point_system`** — The Club Championship scoring table (16 rows covering placements 1–8 under Standard and Co-Placement rules). - -**`prize_pool_category`** — The 5 high-level prize pool categories (Game Championships, Club Championship, Qualifiers, MVP Awards, Club Partner Support). - ---- - -### Core Entities - -**`organization`** — All esports clubs and teams that appear anywhere in the data. 40 rows come from the Club Partner Program file with full metadata; the remaining organizations are inserted with NULL for partner-specific fields. - -| Column | Notes | -|---|---| -| club_partner_status | ENUM: Current / New / None | -| top_8_2024 | Whether the club finished top-8 at EWC 2024 | -| social_media_followers_m | Total following in millions | - ---- - -**`tournament`** — One row per tournament event (27 total). The `winner` and `runner_up` columns are stored as plain VARCHAR rather than foreign keys to `organization` because individual-format games (Chess, StarCraft II, etc.) list a player name as the winner, not a team. - -| Column | Notes | -|---|---| -| gender | ENUM: Open / Men / Women | -| club_championship_points | Whether this tournament awarded Club Championship points | - ---- - -**`schedule`** — A 1:1 extension of `tournament` holding the schedule metadata from file 07 (week number, venue, timezone, duration). Kept separate to avoid widening the tournament row. - ---- - -**`player`** — 272 players from the official roster. Uses the natural key from the dataset (`EWC2025_001`, etc.) as the primary key rather than an auto-increment, since the source data provides stable identifiers. - ---- - -**`medalist`** — One row per player-medal. A player who wins Gold contributes one row. A five-player team winning Gold contributes five rows. This is the most granular performance record in the OLTP. - ---- - -**`match_result`** — 50 match records from file 10. The `team_1`, `team_2`, and `winner` columns are VARCHAR for the same reason as `tournament.winner` — individual-format games list player names here. - ---- - -**`club_championship_standing`** — Final standings for the 24 clubs that earned Club Championship points. 1:1 with `organization`. - ---- - -### Junction Tables - -Two multi-valued columns from the source data are normalized into junction tables: - -**`organization_game_competing`** — Resolves the comma-separated `Games_Competing` column from the Club Partner Program (e.g. `"Dota 2, Chess, EA Sports FC 25, Counter-Strike 2"`). - -**`organization_game_won`** — Resolves the comma-separated `Games_Won` column from the Club Championship standings. - ---- - -## Entity Relationships - -``` -game ──────────────────────────────────────────────┐ - │ │ - ├──► tournament ──► schedule │ - │ │ │ - │ ├──► medalist ◄── organization ◄────────┤ - │ │ └──► country │ - │ └──► match_result │ - │ │ - └──► player ◄── organization │ - └──► country │ - │ -organization ──► club_championship_standing │ - │ │ - ├──► organization_game_competing ────────┘ - └──► organization_game_won ──────────────┘ - -point_system (standalone lookup) -prize_pool_category (standalone lookup) -``` - ---- - -## Design Decisions - -**Why is `country` a table rather than a VARCHAR column?** -Country appears in players, medalists, and organizations. Storing it as a table avoids duplicating the region attribute and allows medal stats (from file 08) to be joined in without repeating them on every player row. - -**Why does `tournament.winner` stay as VARCHAR?** -Enforcing a foreign key to `organization` would require creating dummy organization rows for individual players like "Magnus Carlsen" or "Serral". That would pollute the organization table with data that isn't an organization. The clean solution is to keep it as text and resolve it at query time when needed. - -**Why is `schedule` a separate table from `tournament`?** -A 1:1 split is justified here because the schedule data comes from a completely different source file (file 07) and is conceptually distinct — it describes the logistics of the event, not the competitive outcome. Keeping it separate makes the ETL cleaner and the tournament table less wide. - -**Why use `player_id VARCHAR(20)` instead of AUTO_INCREMENT?** -The source dataset provides stable IDs (`EWC2025_001` through `EWC2025_272`). Using the natural key preserves traceability back to the source without adding a meaningless surrogate. diff --git a/docs/04_datamart.md b/docs/04_datamart.md deleted file mode 100644 index 4843ec1..0000000 --- a/docs/04_datamart.md +++ /dev/null @@ -1,198 +0,0 @@ -# Data Mart - -## What a Data Mart Is - -A Data Mart is a database optimized for reading and analysis rather than for recording transactions. While the OLTP schema is normalized to avoid redundancy, the Data Mart is deliberately denormalized into a **star schema** — a central fact table surrounded by dimension tables — so that analytical queries are fast and simple to write. - -In a star schema: -- **Fact tables** hold measurable events with numeric metrics (prize money, medal count, points) -- **Dimension tables** hold descriptive context that you slice and filter by (game type, country, organization region) - -The Data Mart is stored in the **Oracle university lab schema** and populated by Apache NiFi reading from the MySQL OLTP. - -The DDL is in `sql/datamart_schema.sql`. - ---- - -## Dimensions - -### DIM_DATE - -A standard calendar dimension covering every date in the EWC 2025 event window (July 8 – August 24, 2025). Using a dedicated date dimension allows Power BI to filter by week, group by month, or compare by quarter with no extra calculation. - -| Column | Example | -|---|---| -| date_key | 20250708 (YYYYMMDD integer) | -| full_date | 2025-07-08 | -| year | 2025 | -| quarter | 3 | -| month / month_name | 7 / July | -| week_number | 28 | -| day_of_month / day_name | 8 / Tuesday | - ---- - -### DIM_GAME - -Describes each of the 25 game titles. Enables slicing facts by genre (MOBA vs FPS vs Battle Royale) and by platform (PC vs Mobile vs Console). - -| Column | Example | -|---|---| -| name | Counter-Strike 2 | -| game_type | FPS | -| platform | PC | - ---- - -### DIM_COUNTRY - -Countries with their geographic region. Intentionally kept lean — the medal counts that live in the OLTP `country` table are not carried into this dimension because they are derived facts, not descriptive attributes. - -| Column | Example | -|---|---| -| name | South Korea | -| region | Asia | - ---- - -### DIM_ORGANIZATION - -All esports clubs and teams. Includes partner metadata to enable analysis by partner tier (Current partner vs non-partner) and social reach. - -| Column | Example | -|---|---| -| name | Team Falcons | -| region | Middle East | -| country | Saudi Arabia | -| club_partner_status | Current | -| founded_year | 2017 | -| social_media_followers_m | 4.0 | - ---- - -### DIM_MEDAL - -A simple three-row table representing the medal types. Includes `medal_rank` (1/2/3) so reports can sort Gold → Silver → Bronze correctly without relying on alphabetical ordering. - -| medal_type | medal_rank | -|---|---| -| Gold | 1 | -| Silver | 2 | -| Bronze | 3 | - ---- - -## Fact Tables - -### FACT_TOURNAMENT - -**Grain:** one row per tournament (27 rows). - -This is the primary financial fact table. It answers questions about prize money distribution across games, genres, platforms, and time. - -| Column | Type | Description | -|---|---|---| -| game_key | FK → DIM_GAME | What game | -| start_date_key | FK → DIM_DATE | When it started | -| end_date_key | FK → DIM_DATE | When it ended | -| winner_org_key | FK → DIM_ORGANIZATION | Winning organization (NULL for individual-winner events) | -| event_name | text | Degenerate dimension | -| gender | text | Open / Men / Women | -| **prize_pool_usd** | measure | Total prize pool in USD | -| **num_participants** | measure | Number of competing teams/players | -| **duration_days** | measure | Tournament length in days | -| **has_club_points** | measure | 1 if tournament awarded Club Championship points | - -**Example questions this enables:** -- What was the total prize money awarded to MOBA tournaments vs FPS tournaments? -- Which platform (PC or Mobile) had higher average prize pools? -- How did prize pools vary across the 6-week event? - ---- - -### FACT_MEDAL_AWARD - -**Grain:** one row per player-medal (257 rows). - -This fact table captures individual competitive performance. Each medalist player contributes one row with a `medal_count` of 1 and a `medal_points` of 3/2/1. Both columns are additive — you can SUM them freely to get team medal totals, country medal totals, etc. - -| Column | Type | Description | -|---|---|---| -| game_key | FK → DIM_GAME | Game the medal was won in | -| medal_key | FK → DIM_MEDAL | Gold / Silver / Bronze | -| country_key | FK → DIM_COUNTRY | Player's nationality | -| org_key | FK → DIM_ORGANIZATION | Player's team | -| date_key | FK → DIM_DATE | Tournament start date | -| player_name | text | Degenerate dimension | -| **medal_count** | measure | Always 1 — additive for totals | -| **medal_points** | measure | Gold=3, Silver=2, Bronze=1 | - -**Example questions this enables:** -- Which country won the most medals overall? By region? -- Which game genre produced the most medals for Asian countries? -- Which organization accumulated the most medal points across all events? -- Did South Korea dominate PC games while Southeast Asia dominated mobile games? - ---- - -### FACT_CLUB_STANDING - -**Grain:** one row per club in the Club Championship (24 rows). This is a snapshot — it represents the final standings at the end of EWC 2025. - -| Column | Type | Description | -|---|---|---| -| org_key | FK → DIM_ORGANIZATION | The club | -| **final_rank** | measure | Final position (1 = best) | -| **total_points** | measure | Total Club Championship points earned | -| **prize_money_usd** | measure | Prize money from Club Championship | -| **tournament_wins** | measure | Number of tournaments the club won | -| **top_8_finishes** | measure | Total top-8 tournament finishes | -| **eligible_to_win** | measure | 1 if the club was eligible for the grand prize | - -**Example questions this enables:** -- How does prize money correlate with tournament wins vs breadth of top-8 finishes? -- Do Middle Eastern clubs outperform European clubs in the Club Championship? -- What is the average total_points for Current club partners vs non-partners? - ---- - -## Star Schema Diagram - -``` - DIM_DATE - ┌──────────┐ - │ date_key │ - └────┬─────┘ - │ start/end - │ -DIM_GAME ────────── FACT_TOURNAMENT ────────── DIM_ORGANIZATION -(game_key) (prize_pool_usd (org_key) - num_participants - duration_days - has_club_points) - - -DIM_COUNTRY ──┐ -DIM_ORGAN. ──┼── FACT_MEDAL_AWARD ──── DIM_GAME -DIM_MEDAL ──┘ (medal_count (game_key) -DIM_DATE ─────┘ medal_points) - - -DIM_ORGANIZATION ── FACT_CLUB_STANDING - (total_points - prize_money_usd - tournament_wins - top_8_finishes) -``` - ---- - -## Why Three Fact Tables - -A single fact table would require choosing one grain, which would make some analyses awkward or impossible. - -- `FACT_TOURNAMENT` is at tournament grain — you cannot get per-player medal counts from it. -- `FACT_MEDAL_AWARD` is at player-medal grain — you cannot get prize pool totals from it without denormalizing tournament data into it. -- `FACT_CLUB_STANDING` captures a snapshot that has no natural place in the other two tables. - -Keeping them separate means each fact table has a clean, single grain. Power BI can build relationships between them through the shared dimensions. diff --git a/docs/05_etl_pipeline.md b/docs/05_etl_pipeline.md deleted file mode 100644 index a44cc17..0000000 --- a/docs/05_etl_pipeline.md +++ /dev/null @@ -1,135 +0,0 @@ -# ETL Pipeline - -## Overview - -The ETL (Extract, Transform, Load) pipeline is built in **Apache NiFi** and moves data from the MySQL OLTP database into the Oracle Data Mart. It runs 8 sequential pipelines — one per target table — each following the same processor chain. - -For the detailed step-by-step NiFi configuration (which buttons to click, which properties to set), see `nifi/NIFI_SETUP.md`. - ---- - -## Two Phases Before NiFi - -### Phase 1 — Seed the OLTP (one-time) - -Before NiFi runs, the MySQL database must be populated. This is done by the C# seed script: - -```bash -./docker/start.sh # start MySQL container -dotnet run ./scripts/seed.cs -``` - -The script reads all 10 CSV files, resolves foreign key relationships (game names, country lookups, organization cross-references), and inserts everything in the correct dependency order. - -### Phase 2 — Create the Data Mart schema in Oracle (one-time) - -Run `sql/datamart_schema.sql` against your Oracle lab schema before the first NiFi run. This creates all 8 tables. Oracle SQL Developer or any SQL client works for this. - ---- - -## NiFi Processor Chain - -Every pipeline follows this identical 5-processor pattern: - -``` -ExecuteSQL ConvertAvroToJSON SplitJson -(MySQL source) ──► (Avro → JSON) ──► (array → 1 FlowFile per row) - │ - ▼ - EvaluateJsonPath - (JSON fields → FlowFile attributes) - │ - ▼ - PutSQL - (Oracle target) -``` - -| Processor | Role | -|---|---| -| **ExecuteSQL** | Runs the extract SQL on MySQL, produces Avro-encoded records | -| **ConvertAvroToJSON** | Converts the Avro binary to a JSON array | -| **SplitJson** | Splits the JSON array into one FlowFile per record | -| **EvaluateJsonPath** | Reads each field from the JSON record and stores it as a named FlowFile attribute | -| **PutSQL** | Runs the Oracle INSERT statement, substituting `${attribute}` placeholders with the FlowFile attribute values | - ---- - -## The 8 Pipelines - -Pipelines must run in this order because facts depend on all dimensions being loaded first. - -### Dimensions (run first, in any order among themselves) - -| # | Pipeline | Extract source | Rows | -|---|---|---|---| -| 1 | DIM_DATE | MySQL CTE (generates date range) | 48 | -| 2 | DIM_MEDAL | No extract — 3 static rows inserted directly to Oracle | 3 | -| 3 | DIM_GAME | `game` table | 25 | -| 4 | DIM_COUNTRY | `country` table | 36+ | -| 5 | DIM_ORGANIZATION | `organization` JOIN `country` | 60+ | - -### Facts (run after all dimensions) - -| # | Pipeline | Extract source | Rows | -|---|---|---|---| -| 6 | FACT_TOURNAMENT | `tournament` JOIN `schedule` JOIN `organization` | 27 | -| 7 | FACT_MEDAL_AWARD | `medalist` JOIN `tournament` | 257 | -| 8 | FACT_CLUB_STANDING | `club_championship_standing` | 24 | - ---- - -## How Key Resolution Works - -The OLTP stores natural keys (e.g. `game_id = 3`). The Oracle Data Mart uses surrogate keys generated by `GENERATED ALWAYS AS IDENTITY` (e.g. `game_key = 3`). These can differ if there is ever a gap or reorder. - -The fact load SQL handles this by embedding a sub-SELECT inside each `INSERT...SELECT...FROM DUAL`: - -```sql -INSERT INTO FACT_TOURNAMENT (game_key, ...) -SELECT - (SELECT game_key FROM DIM_GAME WHERE game_id = ${game_id}), - ... -FROM DUAL -``` - -This means the Oracle database itself resolves the surrogate key at insert time, using the natural key that was extracted from MySQL and carried through as a FlowFile attribute. No transformation processor is needed. - ---- - -## SQL File Layout - -``` -nifi/sql/ -├── extract/ -│ ├── 01_dim_date.sql Recursive CTE to generate calendar rows -│ ├── 02_dim_game.sql Simple SELECT from game -│ ├── 03_dim_country.sql Simple SELECT from country -│ ├── 04_dim_organization.sql SELECT with LEFT JOIN to country for country name -│ ├── 05_fact_tournament.sql JOIN with schedule and org; computes date keys -│ ├── 06_fact_medal_award.sql JOIN with tournament; computes medal_points -│ └── 07_fact_club_standing.sql -└── load/ - ├── 01_dim_date.sql INSERT with TO_DATE conversion for Oracle - ├── 02_dim_medal.sql Static 3-row INSERT, run once directly - ├── 03_dim_game.sql - ├── 04_dim_country.sql - ├── 05_dim_organization.sql NULL-safe EL expressions for optional fields - ├── 06_fact_tournament.sql Sub-SELECT key lookups via game_id, org_id - ├── 07_fact_medal_award.sql Sub-SELECT key lookups; medal_type lookup - └── 08_fact_club_standing.sql Sub-SELECT key lookup via org_id -``` - ---- - -## Transformations Performed - -Most of the "transformation" work happens in the extract SQL rather than in NiFi processors, which keeps the NiFi flow simple. - -| Transformation | Where it happens | -|---|---| -| Date → YYYYMMDD integer key | `CAST(DATE_FORMAT(..., '%Y%m%d') AS UNSIGNED)` in extract SQL | -| Medal → medal_points (Gold=3, Silver=2, Bronze=1) | `CASE` expression in extract SQL | -| Boolean → 0/1 | `CASE WHEN ... = 1 THEN 1 ELSE 0 END` in extract SQL | -| Natural key → surrogate key | Sub-SELECT in Oracle load SQL | -| Duration calculation fallback | `COALESCE(s.duration_days, DATEDIFF(...) + 1)` in extract SQL | -| NULL handling for optional fields | NiFi Expression Language `:isEmpty():ifElse(...)` in load SQL | diff --git a/docs/06_infrastructure.md b/docs/06_infrastructure.md deleted file mode 100644 index d5bbd15..0000000 --- a/docs/06_infrastructure.md +++ /dev/null @@ -1,109 +0,0 @@ -# Infrastructure - -## MySQL Container - -The MySQL 8.4 OLTP database runs in Docker (or Podman) for easy setup and teardown without requiring a local MySQL installation. - -### Starting and stopping - -**Linux (Docker):** -```bash -./docker/start.sh # start -./docker/stop.sh # stop (data is preserved) -``` - -**Linux (Podman):** -```bash -./docker/start.sh --podman -./docker/stop.sh --podman -``` - -**Windows (PowerShell):** -```powershell -./docker/start.ps1 -./docker/stop.ps1 -``` - -### Connection details - -| Property | Value | -|---|---| -| Host | 127.0.0.1 | -| Port | **13306** (non-standard to avoid conflicts with any local MySQL) | -| Database | ewc2025 | -| User | root | -| Password | ewc2025root | - -### What happens on first start - -When the container is created for the first time, MySQL automatically executes any `.sql` files found in `/docker-entrypoint-initdb.d/`. The start script mounts `sql/schema.sql` there, so the database schema is created automatically — you do not need to run the DDL manually. - -### Data persistence - -Container data is stored in a named Docker/Podman volume (`ewc2025-mysql-data`). Stopping and restarting the container does not lose any data. - -To fully reset the database (drop all data and re-create from scratch): -```bash -docker rm ewc2025-mysql -docker volume rm ewc2025-mysql-data -./docker/start.sh # fresh container, empty schema -dotnet run ./scripts/seed.cs -``` - ---- - -## Seed Script - -The seed script (`scripts/seed.cs`) is a single-file **.NET 10 C# script** — no project file or solution needed. - -### Requirements - -- .NET 10 SDK installed -- MySQL container running - -### Running it - -```bash -dotnet run ./scripts/seed.cs -``` - -The script can be run from any directory — it walks up the directory tree to find the `data/` folder automatically. - -### What it does - -Reads all 10 CSV files and inserts data into MySQL in this order: - -1. `game` — deduplicates game names from file 01 -2. `country` — from file 08; additional countries auto-inserted as encountered -3. `point_system` — from file 09 -4. `prize_pool_category` — from file 06 -5. `organization` — collects all org names across files 02–05, 10; enriches with file 04 details -6. `tournament` — from file 01 -7. `schedule` — from file 07; matched to tournaments by game name + start date -8. `player` — from file 05 -9. `medalist` — from file 02 -10. `match_result` — from file 10 -11. `club_championship_standing` — from file 03 -12. `organization_game_competing` — from file 04 (multi-value column split) -13. `organization_game_won` — from file 03 (multi-value column split) - -Expected output on a clean database: -``` -Connected to MySQL. -[1/13] game -[2/13] country -... -[13/13] organization_game_won -Done. Database seeded. -``` - -A `WARN:` line is printed for `Battlegrounds Mobile India` (not an EWC 2025 tournament — expected and harmless). - -### NuGet packages used - -| Package | Purpose | -|---|---| -| `MySqlConnector 2.3.7` | MySQL database driver | -| `CsvHelper 33.0.1` | CSV parsing (handles quoted fields with commas) | - -These are declared at the top of the script with `#:package` directives and restored automatically by `dotnet run`. diff --git a/docs/07_conclusion.md b/docs/07_conclusion.md deleted file mode 100644 index e0c2229..0000000 --- a/docs/07_conclusion.md +++ /dev/null @@ -1,97 +0,0 @@ -# Conclusion - -## What Was Built - -This project delivers a complete data warehousing pipeline from raw CSV files to an analytics-ready Data Mart: - -| Deliverable | Details | -|---|---| -| OLTP schema | 14 tables, 3NF, MySQL 8.4 | -| Seed script | .NET 10 single-file C# script, loads ~700 rows across all tables | -| Docker setup | One-command start/stop for MySQL, Linux and Windows | -| Data Mart schema | 3 fact tables, 5 dimension tables, star schema, Oracle DDL | -| NiFi ETL | 8 pipelines, extract SQL + load SQL, documented step-by-step | -| Documentation | This docs folder | - ---- - -## Analytical Potential - -The Data Mart enables a wide range of OLAP analyses. Below are the most interesting ones, mapped to the fact and dimension tables that support them. - -### Prize Money Distribution - -> *"Where did the $100M go?"* - -Using `FACT_TOURNAMENT` sliced by `DIM_GAME`: -- Total prize pool by game genre (MOBA, FPS, Battle Royale, etc.) -- Average prize pool per participant by platform (PC vs Mobile) -- Prize concentration — what percentage of total prize money went to the top 5 tournaments -- Relationship between tournament duration and prize pool size - -### Country and Regional Dominance - -> *"Which part of the world ruled EWC 2025?"* - -Using `FACT_MEDAL_AWARD` sliced by `DIM_COUNTRY` and `DIM_GAME`: -- Medal tally by country (gold/silver/bronze breakdown) -- Medal points by region (Asia vs Europe vs North America vs Middle East) -- Genre specialization — do Asian countries dominate MOBAs? Does Europe lead in FPS? -- Countries with most medals per player (efficiency metric using medal_count / total_players) - -### Club Championship Performance - -> *"Which clubs built the best all-around teams?"* - -Using `FACT_CLUB_STANDING` sliced by `DIM_ORGANIZATION`: -- Points vs prize money correlation — are points a good predictor of earnings? -- Tournament breadth vs depth — do clubs that win fewer tournaments but make more top-8 finishes rank higher? -- Performance by region — Middle Eastern clubs (Team Falcons, Twisted Minds) vs European clubs -- Club partner ROI — do Current club partners finish higher than non-partners on average? - -### Event Timeline Analysis - -> *"How did the event unfold week by week?"* - -Using `FACT_TOURNAMENT` sliced by `DIM_DATE`: -- Prize money at stake each week -- Which weeks had the most high-value tournaments running simultaneously -- Tournament density (how many events overlapped) - ---- - -## Suggested Power BI Reports - -### Report 1 — Prize & Tournament Analysis - -A financial overview dashboard with: -- **KPI cards:** Total prize pool, number of tournaments, average prize per tournament -- **Bar chart:** Prize pool by game_type (filter: platform) -- **Treemap:** Prize pool breakdown by individual game -- **Line chart:** Cumulative prize money awarded by week (using DIM_DATE.week_number) -- **Scatter plot:** Prize pool vs num_participants (are bigger tournaments better funded?) - -Slicers: Platform, Gender, Club Championship Points (Yes/No) - -### Report 2 — Performance & Medal Analysis - -A competitive performance dashboard with: -- **Map visual:** Medal points by country (filled map using country name) -- **Stacked bar chart:** Gold/Silver/Bronze medals by region -- **Matrix:** Organizations × Game genres (medal_count as values — shows which orgs are specialists vs all-rounders) -- **Bar chart:** Top 10 organizations by total medal_points -- **Table:** Club Championship standings with conditional formatting on total_points and prize_money_usd - -Slicers: Region, Game Type, Medal Type - ---- - -## Limitations - -**Dataset size** — With only 27 tournaments and 257 medalists, the dataset is small by data warehousing standards. The analyses are valid but a real production data mart would have years of historical data for trend analysis. - -**Player earnings** — The `prize_earned_usd` column in the player roster is zero for all players. Individual prize splits were not publicly available at the time the dataset was compiled, so per-player financial analysis is not possible. - -**Individual vs team events** — Games like Chess, StarCraft II, and the fighting games are individual competitions. Their medal and match data is structured the same way as team events, but the "organization" in those cases is the player's sponsoring team rather than a competing unit. This is a nuance that Power BI visuals should label clearly. - -**Static snapshot** — This is a point-in-time dataset for EWC 2025. The Data Mart has no slowly changing dimension (SCD) logic or historical tracking. It reflects the final state of the event. diff --git a/nifi/NIFI_SETUP.md b/nifi/NIFI_SETUP.md deleted file mode 100644 index 191eee5..0000000 --- a/nifi/NIFI_SETUP.md +++ /dev/null @@ -1,359 +0,0 @@ -# NiFi Data Mart Setup Guide - -This guide walks through building the ETL flow that reads from the MySQL OLTP database and loads the star schema into Oracle. - ---- - -## Prerequisites - -- Apache NiFi is running and you can open the UI in a browser -- MySQL container is up (`./docker/start.sh`) -- You have your Oracle credentials from the lab (host, port, service name, username, password) -- You have the MySQL JDBC driver JAR and Oracle JDBC driver JAR available on the NiFi machine - -> **JDBC drivers** — NiFi does not ship with database drivers. Download: -> - MySQL: `mysql-connector-j-8.x.x.jar` from [dev.mysql.com](https://dev.mysql.com/downloads/connector/j/) -> - Oracle: `ojdbc11.jar` from [oracle.com](https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html) -> -> Place both JARs in a folder NiFi can reach, e.g. `/opt/nifi/extra-jars/`. - ---- - -## Step 1 — Create the two Database Connection Pools - -Connection pools are shared resources. You create them once and all processors reuse them. - -### 1.1 Open Controller Services - -1. In the NiFi canvas, click the **≡ menu** (top right) → **Controller Settings** -2. Go to the **Controller Services** tab -3. Click the **+** button to add a new service - -### 1.2 MySQL Connection Pool - -1. Search for `DBCPConnectionPool` → Add -2. Click the **gear icon** on the new service to configure it: - -| Property | Value | -|---|---| -| Database Connection URL | `jdbc:mysql://127.0.0.1:13306/ewc2025` | -| Database Driver Class Name | `com.mysql.cj.jdbc.Driver` | -| Database Driver Location(s) | `/opt/nifi/extra-jars/mysql-connector-j-8.x.x.jar` | -| Database User | `root` | -| Password | `ewc2025root` | - -3. Click **Apply**, then click the **lightning bolt** icon to enable the service. - -### 1.3 Oracle Connection Pool - -1. Add another `DBCPConnectionPool` -2. Configure it: - -| Property | Value | -|---|---| -| Database Connection URL | `jdbc:oracle:thin:@:/` | -| Database Driver Class Name | `oracle.jdbc.OracleDriver` | -| Database Driver Location(s) | `/opt/nifi/extra-jars/ojdbc11.jar` | -| Database User | *(your lab username)* | -| Password | *(your lab password)* | - -3. Apply and enable. - ---- - -## Step 2 — Understand the Processor Chain - -Every pipeline in this flow follows the same 5-processor pattern: - -``` -ExecuteSQL ──► ConvertAvroToJSON ──► SplitJson ──► EvaluateJsonPath ──► PutSQL - (MySQL) (Oracle) -``` - -| Processor | What it does | -|---|---| -| **ExecuteSQL** | Runs the extract SQL query on MySQL, outputs Avro binary | -| **ConvertAvroToJSON** | Converts Avro to a JSON array of records | -| **SplitJson** | Splits the array into one FlowFile per record | -| **EvaluateJsonPath** | Reads each JSON field and saves it as a FlowFile attribute | -| **PutSQL** | Runs the load SQL on Oracle; NiFi fills in `${attribute}` placeholders | - -You will build this chain **8 times** — once per table. The only things that change between pipelines are the SQL files and the EvaluateJsonPath field list. - ---- - -## Step 3 — Build the First Pipeline (DIM_DATE) - -We'll build this one in detail. The others follow the same steps. - -### 3.1 Add processors to the canvas - -Right-click on an empty area → **Add Processor**. Add these five in a row: - -1. `ExecuteSQL` -2. `ConvertAvroToJSON` -3. `SplitJson` -4. `EvaluateJsonPath` -5. `PutSQL` - -### 3.2 Configure ExecuteSQL - -Double-click → **Properties**: - -| Property | Value | -|---|---| -| Database Connection Pooling Service | *(select your MySQL pool)* | -| SQL select query | *(paste content of `nifi/sql/extract/01_dim_date.sql`)* | - -In **Relationships**, auto-terminate the `failure` relationship (right-click the processor → check Failure). - -### 3.3 Configure ConvertAvroToJSON - -No changes needed from defaults. Just connect it. - -### 3.4 Configure SplitJson - -| Property | Value | -|---|---| -| JsonPath Expression | `$.*` | - -Auto-terminate `original` and `failure`. - -### 3.5 Configure EvaluateJsonPath - -| Property | Value | -|---|---| -| Destination | `flowfile-attribute` | - -Then add one property per field using the **+** button: - -| Property Name | Value | -|---|---| -| `date_key` | `$.date_key` | -| `full_date` | `$.full_date` | -| `year` | `$.year` | -| `quarter` | `$.quarter` | -| `month` | `$.month` | -| `month_name` | `$.month_name` | -| `week_number` | `$.week_number` | -| `day_of_month` | `$.day_of_month` | -| `day_name` | `$.day_name` | - -Auto-terminate `failure` and `unmatched`. - -### 3.6 Configure PutSQL - -| Property | Value | -|---|---| -| JDBC Connection Pool | *(select your Oracle pool)* | -| SQL Statement | *(paste content of `nifi/sql/load/01_dim_date.sql`)* | - -Auto-terminate `failure`, `retry`, `success`. - -### 3.7 Connect the processors - -Hover over a processor until the arrow icon appears, then drag to the next: - -``` -ExecuteSQL ──(success)──► ConvertAvroToJSON ──(success)──► SplitJson ──(splits)──► EvaluateJsonPath ──(matched)──► PutSQL -``` - -Use the `success` relationship on each connection unless noted otherwise. For SplitJson use `splits`. - ---- - -## Step 4 — Build the Remaining Pipelines - -Repeat Step 3 for each table below. The only differences are which SQL files you paste and which fields you add to EvaluateJsonPath. - -### DIM_MEDAL (pipeline 2) - -This one is different — it has **no extract step**. The 3 medal rows are inserted directly. - -1. Add a single `ExecuteSQL` processor -2. Connect it to the **Oracle** pool -3. Paste the content of `nifi/sql/load/02_dim_medal.sql` as the SQL query -4. Run it once manually (right-click → **Run Once**) - -### DIM_GAME (pipeline 3) - -**Extract:** `nifi/sql/extract/02_dim_game.sql` on MySQL - -**EvaluateJsonPath fields:** - -| Name | Path | -|---|---| -| `game_id` | `$.game_id` | -| `name` | `$.name` | -| `game_type` | `$.game_type` | -| `platform` | `$.platform` | - -**Load:** `nifi/sql/load/03_dim_game.sql` on Oracle - ---- - -### DIM_COUNTRY (pipeline 4) - -**Extract:** `nifi/sql/extract/03_dim_country.sql` on MySQL - -**EvaluateJsonPath fields:** - -| Name | Path | -|---|---| -| `country_id` | `$.country_id` | -| `name` | `$.name` | -| `region` | `$.region` | - -**Load:** `nifi/sql/load/04_dim_country.sql` on Oracle - ---- - -### DIM_ORGANIZATION (pipeline 5) - -**Extract:** `nifi/sql/extract/04_dim_organization.sql` on MySQL - -**EvaluateJsonPath fields:** - -| Name | Path | -|---|---| -| `organization_id` | `$.organization_id` | -| `name` | `$.name` | -| `region` | `$.region` | -| `country` | `$.country` | -| `club_partner_status` | `$.club_partner_status` | -| `founded_year` | `$.founded_year` | -| `social_media_followers_m` | `$.social_media_followers_m` | - -**Load:** `nifi/sql/load/05_dim_organization.sql` on Oracle - ---- - -### FACT_TOURNAMENT (pipeline 6) - -**Extract:** `nifi/sql/extract/05_fact_tournament.sql` on MySQL - -**EvaluateJsonPath fields:** - -| Name | Path | -|---|---| -| `game_id` | `$.game_id` | -| `start_date_key` | `$.start_date_key` | -| `end_date_key` | `$.end_date_key` | -| `winner_org_id` | `$.winner_org_id` | -| `event_name` | `$.event_name` | -| `gender` | `$.gender` | -| `prize_pool_usd` | `$.prize_pool_usd` | -| `num_participants` | `$.num_participants` | -| `duration_days` | `$.duration_days` | -| `has_club_points` | `$.has_club_points` | - -**Load:** `nifi/sql/load/06_fact_tournament.sql` on Oracle - ---- - -### FACT_MEDAL_AWARD (pipeline 7) - -**Extract:** `nifi/sql/extract/06_fact_medal_award.sql` on MySQL - -**EvaluateJsonPath fields:** - -| Name | Path | -|---|---| -| `game_id` | `$.game_id` | -| `country_id` | `$.country_id` | -| `organization_id` | `$.organization_id` | -| `medal_type` | `$.medal_type` | -| `date_key` | `$.date_key` | -| `player_name` | `$.player_name` | -| `medal_count` | `$.medal_count` | -| `medal_points` | `$.medal_points` | - -**Load:** `nifi/sql/load/07_fact_medal_award.sql` on Oracle - ---- - -### FACT_CLUB_STANDING (pipeline 8) - -**Extract:** `nifi/sql/extract/07_fact_club_standing.sql` on MySQL - -**EvaluateJsonPath fields:** - -| Name | Path | -|---|---| -| `organization_id` | `$.organization_id` | -| `final_rank` | `$.final_rank` | -| `total_points` | `$.total_points` | -| `prize_money_usd` | `$.prize_money_usd` | -| `tournament_wins` | `$.tournament_wins` | -| `top_8_finishes` | `$.top_8_finishes` | -| `eligible_to_win` | `$.eligible_to_win` | - -**Load:** `nifi/sql/load/08_fact_club_standing.sql` on Oracle - ---- - -## Step 5 — Run the Pipelines in Order - -**The order matters** — facts reference dimension keys, so all dims must be loaded first. - -Run each pipeline by right-clicking the **ExecuteSQL** processor → **Run Once**. Wait for all queues between processors to drain to 0 before starting the next pipeline. - -``` -1. DIM_DATE -2. DIM_MEDAL ← ExecuteSQL on Oracle directly, run once -3. DIM_GAME -4. DIM_COUNTRY -5. DIM_ORGANIZATION ← must be after DIM_COUNTRY -6. FACT_TOURNAMENT ← must be after all dims -7. FACT_MEDAL_AWARD ← must be after all dims -8. FACT_CLUB_STANDING ← must be after DIM_ORGANIZATION -``` - ---- - -## Step 6 — Verify the Load - -After all pipelines complete, run these queries in your Oracle SQL client to confirm row counts: - -```sql -SELECT 'DIM_DATE' AS tbl, COUNT(*) AS cnt FROM DIM_DATE UNION ALL -SELECT 'DIM_GAME' AS tbl, COUNT(*) AS cnt FROM DIM_GAME UNION ALL -SELECT 'DIM_COUNTRY' AS tbl, COUNT(*) AS cnt FROM DIM_COUNTRY UNION ALL -SELECT 'DIM_ORGANIZATION' AS tbl, COUNT(*) AS cnt FROM DIM_ORGANIZATION UNION ALL -SELECT 'DIM_MEDAL' AS tbl, COUNT(*) AS cnt FROM DIM_MEDAL UNION ALL -SELECT 'FACT_TOURNAMENT' AS tbl, COUNT(*) AS cnt FROM FACT_TOURNAMENT UNION ALL -SELECT 'FACT_MEDAL_AWARD' AS tbl, COUNT(*) AS cnt FROM FACT_MEDAL_AWARD UNION ALL -SELECT 'FACT_CLUB_STANDING' AS tbl, COUNT(*) AS cnt FROM FACT_CLUB_STANDING; -``` - -Expected row counts: - -| Table | Rows | -|---|---| -| DIM_DATE | 48 | -| DIM_GAME | 25 | -| DIM_COUNTRY | 36+ | -| DIM_ORGANIZATION | 60+ | -| DIM_MEDAL | 3 | -| FACT_TOURNAMENT | 27 | -| FACT_MEDAL_AWARD | 257 | -| FACT_CLUB_STANDING | 24 | - ---- - -## Troubleshooting - -**FlowFiles stuck in a queue** -Click the queue between two processors to inspect the FlowFiles. Click a FlowFile → **View** to see its content or attributes. This shows exactly what data is being passed and helps spot bad values. - -**PutSQL fails with ORA- error** -Right-click the failed FlowFile in the queue → **View** → check the `sql.error.message` attribute. Common causes: -- `ORA-00001` — duplicate key, the table already has data; truncate the Oracle table and re-run -- `ORA-01722` — invalid number, a numeric field contains an empty string; check EvaluateJsonPath matched correctly -- `ORA-00904` — invalid identifier, the column name in the SQL doesn't match the table definition - -**EvaluateJsonPath produces empty attributes** -The JSON field name from ConvertAvroToJSON must exactly match the alias used in the extract SQL. Check that the SELECT alias (e.g. `AS game_id`) matches the JsonPath property name (`game_id`). - -**ExecuteSQL on MySQL fails** -Verify the MySQL container is running (`docker ps`) and that the JDBC URL uses port `13306`. diff --git a/nifi/sql/extract/01_dim_date.sql b/nifi/sql/extract/01_dim_date.sql deleted file mode 100644 index 1481607..0000000 --- a/nifi/sql/extract/01_dim_date.sql +++ /dev/null @@ -1,18 +0,0 @@ --- Generates one row per calendar date covering the full EWC 2025 event window. --- Run on MySQL source DB. -WITH RECURSIVE dates AS ( - SELECT DATE('2025-07-08') AS d - UNION ALL - SELECT DATE_ADD(d, INTERVAL 1 DAY) FROM dates WHERE d < '2025-08-24' -) -SELECT - CAST(DATE_FORMAT(d, '%Y%m%d') AS UNSIGNED) AS date_key, - d AS full_date, - YEAR(d) AS year, - QUARTER(d) AS quarter, - MONTH(d) AS month, - MONTHNAME(d) AS month_name, - WEEK(d, 1) AS week_number, - DAYOFMONTH(d) AS day_of_month, - DAYNAME(d) AS day_name -FROM dates; diff --git a/nifi/sql/extract/02_dim_game.sql b/nifi/sql/extract/02_dim_game.sql deleted file mode 100644 index aad5a63..0000000 --- a/nifi/sql/extract/02_dim_game.sql +++ /dev/null @@ -1,2 +0,0 @@ -SELECT game_id, name, game_type, platform -FROM game; diff --git a/nifi/sql/extract/03_dim_country.sql b/nifi/sql/extract/03_dim_country.sql deleted file mode 100644 index b38abc1..0000000 --- a/nifi/sql/extract/03_dim_country.sql +++ /dev/null @@ -1,2 +0,0 @@ -SELECT country_id, name, region -FROM country; diff --git a/nifi/sql/extract/04_dim_organization.sql b/nifi/sql/extract/04_dim_organization.sql deleted file mode 100644 index 765076d..0000000 --- a/nifi/sql/extract/04_dim_organization.sql +++ /dev/null @@ -1,10 +0,0 @@ -SELECT - o.organization_id, - o.name, - o.region, - c.name AS country, - o.club_partner_status, - o.founded_year, - o.social_media_followers_m -FROM organization o -LEFT JOIN country c ON o.country_id = c.country_id; diff --git a/nifi/sql/extract/05_fact_tournament.sql b/nifi/sql/extract/05_fact_tournament.sql deleted file mode 100644 index b636c43..0000000 --- a/nifi/sql/extract/05_fact_tournament.sql +++ /dev/null @@ -1,18 +0,0 @@ --- Returns one row per tournament with all natural keys needed for Oracle DIM lookups. --- winner_org_id is NULL when the winner is an individual (Chess, StarCraft II, etc.) -SELECT - t.game_id, - CAST(DATE_FORMAT(t.start_date, '%Y%m%d') AS UNSIGNED) AS start_date_key, - CAST(DATE_FORMAT(t.end_date, '%Y%m%d') AS UNSIGNED) AS end_date_key, - o.organization_id AS winner_org_id, - t.event_name, - t.gender, - t.prize_pool_usd, - t.num_participants, - COALESCE(s.duration_days, - DATEDIFF(t.end_date, t.start_date) + 1) AS duration_days, - CASE WHEN t.club_championship_points = 1 THEN 1 ELSE 0 - END AS has_club_points -FROM tournament t -LEFT JOIN schedule s ON t.tournament_id = s.tournament_id -LEFT JOIN organization o ON o.name = t.winner; diff --git a/nifi/sql/extract/06_fact_medal_award.sql b/nifi/sql/extract/06_fact_medal_award.sql deleted file mode 100644 index 038aa48..0000000 --- a/nifi/sql/extract/06_fact_medal_award.sql +++ /dev/null @@ -1,16 +0,0 @@ --- Returns one row per player-medal with natural keys and pre-computed measures. -SELECT - t.game_id, - m.country_id, - m.organization_id, - m.medal AS medal_type, - CAST(DATE_FORMAT(t.start_date, '%Y%m%d') AS UNSIGNED) AS date_key, - m.player_name, - 1 AS medal_count, - CASE m.medal - WHEN 'Gold' THEN 3 - WHEN 'Silver' THEN 2 - ELSE 1 - END AS medal_points -FROM medalist m -JOIN tournament t ON m.tournament_id = t.tournament_id; diff --git a/nifi/sql/extract/07_fact_club_standing.sql b/nifi/sql/extract/07_fact_club_standing.sql deleted file mode 100644 index 9013032..0000000 --- a/nifi/sql/extract/07_fact_club_standing.sql +++ /dev/null @@ -1,9 +0,0 @@ -SELECT - organization_id, - `rank` AS final_rank, - total_points, - prize_money_usd, - tournament_wins, - top_8_finishes, - CASE WHEN eligible_to_win = 1 THEN 1 ELSE 0 END AS eligible_to_win -FROM club_championship_standing; diff --git a/nifi/sql/load/01_dim_date.sql b/nifi/sql/load/01_dim_date.sql deleted file mode 100644 index 0e864e7..0000000 --- a/nifi/sql/load/01_dim_date.sql +++ /dev/null @@ -1,12 +0,0 @@ -INSERT INTO DIM_DATE (date_key, full_date, year, quarter, month, month_name, week_number, day_of_month, day_name) -VALUES ( - ${date_key}, - TO_DATE('${full_date}', 'YYYY-MM-DD'), - ${year}, - ${quarter}, - ${month}, - '${month_name}', - ${week_number}, - ${day_of_month}, - '${day_name}' -) diff --git a/nifi/sql/load/02_dim_medal.sql b/nifi/sql/load/02_dim_medal.sql deleted file mode 100644 index c91085f..0000000 --- a/nifi/sql/load/02_dim_medal.sql +++ /dev/null @@ -1,4 +0,0 @@ --- Static seed — run once via ExecuteSQL on Oracle, no extract needed. -INSERT INTO DIM_MEDAL (medal_type, medal_rank) VALUES ('Gold', 1); -INSERT INTO DIM_MEDAL (medal_type, medal_rank) VALUES ('Silver', 2); -INSERT INTO DIM_MEDAL (medal_type, medal_rank) VALUES ('Bronze', 3); diff --git a/nifi/sql/load/03_dim_game.sql b/nifi/sql/load/03_dim_game.sql deleted file mode 100644 index 6e484f1..0000000 --- a/nifi/sql/load/03_dim_game.sql +++ /dev/null @@ -1,7 +0,0 @@ -INSERT INTO DIM_GAME (game_id, name, game_type, platform) -VALUES ( - ${game_id}, - '${name}', - '${game_type}', - '${platform}' -) diff --git a/nifi/sql/load/04_dim_country.sql b/nifi/sql/load/04_dim_country.sql deleted file mode 100644 index cf02b1d..0000000 --- a/nifi/sql/load/04_dim_country.sql +++ /dev/null @@ -1,6 +0,0 @@ -INSERT INTO DIM_COUNTRY (country_id, name, region) -VALUES ( - ${country_id}, - '${name}', - '${region}' -) diff --git a/nifi/sql/load/05_dim_organization.sql b/nifi/sql/load/05_dim_organization.sql deleted file mode 100644 index 746be03..0000000 --- a/nifi/sql/load/05_dim_organization.sql +++ /dev/null @@ -1,10 +0,0 @@ -INSERT INTO DIM_ORGANIZATION (org_id, name, region, country, club_partner_status, founded_year, social_media_followers_m) -VALUES ( - ${organization_id}, - '${name}', - NULLIF('${region}', ''), - NULLIF('${country}', ''), - NULLIF('${club_partner_status}', ''), - TO_NUMBER(NULLIF('${founded_year}', ''), '9999'), - TO_NUMBER(NULLIF('${social_media_followers_m}', ''), '9990.99', 'NLS_NUMERIC_CHARACTERS=''.,''') -) diff --git a/nifi/sql/load/06_fact_tournament.sql b/nifi/sql/load/06_fact_tournament.sql deleted file mode 100644 index 90eba5f..0000000 --- a/nifi/sql/load/06_fact_tournament.sql +++ /dev/null @@ -1,18 +0,0 @@ --- Sub-SELECTs resolve natural keys to surrogate keys already loaded in DIM tables. -INSERT INTO FACT_TOURNAMENT ( - game_key, start_date_key, end_date_key, winner_org_key, - event_name, gender, prize_pool_usd, num_participants, duration_days, has_club_points -) -SELECT - (SELECT game_key FROM DIM_GAME WHERE game_id = ${game_id}), - ${start_date_key}, - ${end_date_key}, - ${winner_org_id:isEmpty():ifElse('NULL', - concat('(SELECT org_key FROM DIM_ORGANIZATION WHERE org_id = ', ${winner_org_id}, ')'))}, - '${event_name}', - '${gender}', - ${prize_pool_usd}, - ${num_participants}, - ${duration_days}, - ${has_club_points} -FROM DUAL diff --git a/nifi/sql/load/07_fact_medal_award.sql b/nifi/sql/load/07_fact_medal_award.sql deleted file mode 100644 index 0d087b9..0000000 --- a/nifi/sql/load/07_fact_medal_award.sql +++ /dev/null @@ -1,16 +0,0 @@ -INSERT INTO FACT_MEDAL_AWARD ( - game_key, medal_key, country_key, org_key, date_key, - player_name, medal_count, medal_points -) -SELECT - (SELECT game_key FROM DIM_GAME WHERE game_id = ${game_id}), - (SELECT medal_key FROM DIM_MEDAL WHERE medal_type = '${medal_type}'), - ${country_id:isEmpty():ifElse('NULL', - concat('(SELECT country_key FROM DIM_COUNTRY WHERE country_id = ', ${country_id}, ')'))}, - ${organization_id:isEmpty():ifElse('NULL', - concat('(SELECT org_key FROM DIM_ORGANIZATION WHERE org_id = ', ${organization_id}, ')'))}, - ${date_key}, - '${player_name}', - ${medal_count}, - ${medal_points} -FROM DUAL diff --git a/nifi/sql/load/08_fact_club_standing.sql b/nifi/sql/load/08_fact_club_standing.sql deleted file mode 100644 index 7164ec8..0000000 --- a/nifi/sql/load/08_fact_club_standing.sql +++ /dev/null @@ -1,13 +0,0 @@ -INSERT INTO FACT_CLUB_STANDING ( - org_key, final_rank, total_points, prize_money_usd, - tournament_wins, top_8_finishes, eligible_to_win -) -SELECT - (SELECT org_key FROM DIM_ORGANIZATION WHERE org_id = ${organization_id}), - ${final_rank}, - ${total_points}, - ${prize_money_usd}, - ${tournament_wins}, - ${top_8_finishes}, - ${eligible_to_win} -FROM DUAL diff --git a/scripts/seed.cs b/scripts/seed.cs deleted file mode 100644 index 2fcdbfe..0000000 --- a/scripts/seed.cs +++ /dev/null @@ -1,489 +0,0 @@ -#:package MySqlConnector@2.3.7 -#:package CsvHelper@33.0.1 - -using System.Globalization; -using CsvHelper; -using CsvHelper.Configuration; -using MySqlConnector; - -// ── Config ──────────────────────────────────────────────────────────────────── - -const string Dsn = "Server=127.0.0.1;Port=13306;Database=ewc2025;Uid=root;Pwd=ewc2025root;"; - -static string FindDataDir() -{ - var dir = Directory.GetCurrentDirectory(); - while (dir is not null) - { - var candidate = Path.Combine(dir, "data"); - if (Directory.Exists(candidate) && - Directory.GetFiles(candidate, "01_EWC2025*").Length > 0) - return candidate; - dir = Path.GetDirectoryName(dir); - } - throw new DirectoryNotFoundException("Cannot find 'data' directory with EWC2025 CSV files."); -} - -var dataDir = FindDataDir(); - -// Games_Competing and Games_Won in the CSVs use abbreviated names that don't -// always match the canonical name stored in the game table. -var gameAliases = new Dictionary(StringComparer.OrdinalIgnoreCase) -{ - ["Mobile Legends"] = "Mobile Legends: Bang Bang", - ["PUBG"] = "PUBG: Battlegrounds", - ["Mobile Legends: Bang Bang - Men"] = "Mobile Legends: Bang Bang", - ["Mobile Legends: Bang Bang - Women"] = "Mobile Legends: Bang Bang", - ["Naraka: Bladepoint - Solo"] = "Naraka: Bladepoint", - ["Naraka: Bladepoint - Trios"] = "Naraka: Bladepoint", -}; - -// ── Helpers ─────────────────────────────────────────────────────────────────── - -await using var conn = new MySqlConnection(Dsn); -await conn.OpenAsync(); -Console.WriteLine("Connected to MySQL."); - -List> ReadCsv(string filename) -{ - using var reader = new StreamReader(Path.Combine(dataDir, filename)); - using var csv = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture) - { - MissingFieldFound = null, - HeaderValidated = null, - }); - var rows = new List>(); - csv.Read(); - csv.ReadHeader(); - while (csv.Read()) - { - var row = new Dictionary(); - foreach (var h in csv.HeaderRecord!) - row[h] = csv.GetField(h) ?? ""; - rows.Add(row); - } - return rows; -} - -async Task Insert(string sql, Dictionary p) -{ - await using var cmd = new MySqlCommand(sql, conn); - foreach (var (k, v) in p) - cmd.Parameters.AddWithValue(k, v ?? DBNull.Value); - await cmd.ExecuteNonQueryAsync(); - return cmd.LastInsertedId; -} - -static string? Nullable(string s) => string.IsNullOrWhiteSpace(s) ? null : s.Trim(); -static int? NullInt(string s) => int.TryParse(s.Trim(), out var v) ? v : null; -static decimal? NullDec(string s) => decimal.TryParse(s.Trim(), NumberStyles.Any, - CultureInfo.InvariantCulture, out var v) ? v : null; -static bool YesNo(string s) => s.Trim().Equals("Yes", StringComparison.OrdinalIgnoreCase); - -// Strip gendered/variant suffix to get the canonical game name used in file 01 -string CanonicalGame(string name) -{ - if (gameAliases.TryGetValue(name.Trim(), out var mapped)) return mapped; - return name.Trim(); -} - -// ── Load CSVs ───────────────────────────────────────────────────────────────── - -var rows01 = ReadCsv("01_EWC2025_Event_Tournament_Summary.csv"); -var rows02 = ReadCsv("02_EWC2025_Medalists.csv"); -var rows03 = ReadCsv("03_EWC2025_Club_Championship_Standings.csv"); -var rows04 = ReadCsv("04_EWC2025_Club_Partner_Program.csv"); -var rows05 = ReadCsv("05_EWC2025_Player_Roster.csv"); -var rows06 = ReadCsv("06_EWC2025_Prize_Pool_Distribution.csv"); -var rows07 = ReadCsv("07_EWC2025_Calendar_Schedule.csv"); -var rows08 = ReadCsv("08_EWC2025_Country_Results.csv"); -var rows09 = ReadCsv("09_EWC2025_Point_System.csv"); -var rows10 = ReadCsv("10_EWC2025_Game_by_Game_Results.csv"); - -// ── 1. game ─────────────────────────────────────────────────────────────────── - -Console.WriteLine("[1/13] game"); -var gameId = new Dictionary(StringComparer.OrdinalIgnoreCase); - -foreach (var r in rows01) -{ - var name = r["Game"].Trim(); - if (gameId.ContainsKey(name)) continue; - gameId[name] = await Insert( - "INSERT INTO game (name, game_type, platform) VALUES (@n, @gt, @pl)", - new() { ["@n"] = name, ["@gt"] = r["Game_Type"].Trim(), ["@pl"] = r["Platform"].Trim() }); -} - -// ── 2. country ──────────────────────────────────────────────────────────────── - -Console.WriteLine("[2/13] country"); -var countryId = new Dictionary(StringComparer.OrdinalIgnoreCase); - -foreach (var r in rows08) -{ - var name = r["Country"].Trim(); - countryId[name] = await Insert( - """ - INSERT INTO country - (name, region, gold_medals, silver_medals, bronze_medals, total_medals, total_players, top_game) - VALUES (@n, @reg, @g, @s, @b, @t, @pl, @tg) - """, - new() - { - ["@n"] = name, - ["@reg"] = r["Region"].Trim(), - ["@g"] = int.Parse(r["Gold_Medals"]), - ["@s"] = int.Parse(r["Silver_Medals"]), - ["@b"] = int.Parse(r["Bronze_Medals"]), - ["@t"] = int.Parse(r["Total_Medals"]), - ["@pl"] = int.Parse(r["Total_Players"]), - ["@tg"] = Nullable(r["Top_Game"]), - }); -} - -async Task EnsureCountry(string name) -{ - if (countryId.TryGetValue(name, out var id)) return id; - id = await Insert( - "INSERT INTO country (name, region) VALUES (@n, 'Unknown')", - new() { ["@n"] = name }); - countryId[name] = id; - return id; -} - -// ── 3. point_system ─────────────────────────────────────────────────────────── - -Console.WriteLine("[3/13] point_system"); -foreach (var r in rows09) -{ - await Insert( - "INSERT INTO point_system (placement, points, system_type, description) VALUES (@pl, @pts, @st, @desc)", - new() - { - ["@pl"] = int.Parse(r["Placement"]), - ["@pts"] = int.Parse(r["Points"]), - ["@st"] = r["System_Type"].Trim(), - ["@desc"] = Nullable(r["Description"]), - }); -} - -// ── 4. prize_pool_category ──────────────────────────────────────────────────── - -Console.WriteLine("[4/13] prize_pool_category"); -foreach (var r in rows06) -{ - await Insert( - "INSERT INTO prize_pool_category (category, amount_usd, percentage, description, num_recipients) VALUES (@c, @a, @p, @d, @n)", - new() - { - ["@c"] = r["Category"].Trim(), - ["@a"] = int.Parse(r["Amount_USD"]), - ["@p"] = decimal.Parse(r["Percentage"], CultureInfo.InvariantCulture), - ["@d"] = Nullable(r["Description"]), - ["@n"] = NullInt(r["Num_Recipients"]), - }); -} - -// ── 5. organization ─────────────────────────────────────────────────────────── - -Console.WriteLine("[5/13] organization"); -var orgId = new Dictionary(StringComparer.OrdinalIgnoreCase); - -var partnerDetails = rows04.ToDictionary(r => r["Organization"].Trim(), StringComparer.OrdinalIgnoreCase); - -var allOrgs = new HashSet(StringComparer.OrdinalIgnoreCase); -foreach (var r in rows04) allOrgs.Add(r["Organization"].Trim()); -foreach (var r in rows03) allOrgs.Add(r["Organization"].Trim()); -foreach (var r in rows02) allOrgs.Add(r["Team_Organization"].Trim()); -foreach (var r in rows05) { if (!string.IsNullOrWhiteSpace(r["Team"])) allOrgs.Add(r["Team"].Trim()); } -foreach (var r in rows10) -{ - allOrgs.Add(r["Team_1"].Trim()); - allOrgs.Add(r["Team_2"].Trim()); - if (!string.IsNullOrWhiteSpace(r["Winner"])) allOrgs.Add(r["Winner"].Trim()); -} - -foreach (var name in allOrgs.Where(n => !string.IsNullOrWhiteSpace(n))) -{ - long? cid = null; - string status = "None"; - string? region = null, hq = null, ceo = null; - bool? top8 = null; - int? founded = null; - decimal? followers = null; - - if (partnerDetails.TryGetValue(name, out var p)) - { - var cname = p["Country"].Trim(); - if (!string.IsNullOrWhiteSpace(cname)) cid = await EnsureCountry(cname); - status = p["Club_Partner_Status"].Trim(); - region = Nullable(p["Region"]); - top8 = YesNo(p["Top_8_2024"]); - founded = NullInt(p["Founded"]); - hq = Nullable(p["HQ_Location"]); - ceo = Nullable(p["CEO"]); - followers = NullDec(p["Social_Media_Followers_M"]); - } - - orgId[name] = await Insert( - """ - INSERT INTO organization - (name, region, country_id, club_partner_status, top_8_2024, - founded_year, hq_location, ceo, social_media_followers_m) - VALUES (@n, @reg, @cid, @st, @t8, @fy, @hq, @ceo, @fol) - """, - new() - { - ["@n"] = name, - ["@reg"] = region, - ["@cid"] = cid, - ["@st"] = status, - ["@t8"] = top8, - ["@fy"] = founded, - ["@hq"] = hq, - ["@ceo"] = ceo, - ["@fol"] = followers, - }); -} - -// ── 6. tournament ───────────────────────────────────────────────────────────── - -Console.WriteLine("[6/13] tournament"); - -// Key: "GameName|StartDate" — unique because MLBB Men/Women have different start dates -var tournamentKey = new Dictionary(); - -foreach (var r in rows01) -{ - var gameName = r["Game"].Trim(); - var gender = r["Gender"].Trim() switch { "Men" => "Men", "Women" => "Women", _ => "Open" }; - var id = await Insert( - """ - INSERT INTO tournament - (game_id, event_name, start_date, end_date, prize_pool_usd, - num_participants, winner, runner_up, club_championship_points, gender) - VALUES (@gid, @en, @sd, @ed, @prize, @num, @w, @ru, @ccp, @gen) - """, - new() - { - ["@gid"] = gameId[gameName], - ["@en"] = r["Event_Name"].Trim(), - ["@sd"] = r["Start_Date"].Trim(), - ["@ed"] = r["End_Date"].Trim(), - ["@prize"] = int.Parse(r["Prize_Pool_USD"]), - ["@num"] = int.Parse(r["Num_Participants"]), - ["@w"] = Nullable(r["Winner"]), - ["@ru"] = Nullable(r["Runner_Up"]), - ["@ccp"] = YesNo(r["Club_Championship_Points"]), - ["@gen"] = gender, - }); - tournamentKey[$"{gameName}|{r["Start_Date"].Trim()}"] = id; -} - -// Unified lookup: given the raw game name from files 02/07/10 (may include suffixes), -// return the matching tournament_id. -long? ResolveTournament(string rawGame) -{ - var canonical = CanonicalGame(rawGame); - // Try direct match via schedule rows (which share the same naming as files 02/10) - foreach (var r in rows07) - { - if (!r["Game"].Trim().Equals(rawGame, StringComparison.OrdinalIgnoreCase)) continue; - var key = $"{canonical}|{r["Start_Date"].Trim()}"; - if (tournamentKey.TryGetValue(key, out var tid)) return tid; - } - // Fallback: first tournament whose game name matches canonical - foreach (var (k, v) in tournamentKey) - if (k.StartsWith($"{canonical}|", StringComparison.OrdinalIgnoreCase)) return v; - return null; -} - -// ── 7. schedule ─────────────────────────────────────────────────────────────── - -Console.WriteLine("[7/13] schedule"); -foreach (var r in rows07) -{ - var tid = ResolveTournament(r["Game"].Trim()); - if (tid is null) - { - Console.WriteLine($" WARN: no tournament for schedule row '{r["Game"]}'"); - continue; - } - await Insert( - "INSERT INTO schedule (tournament_id, week_number, venue, time_zone, duration_days) VALUES (@tid, @w, @v, @tz, @dur)", - new() - { - ["@tid"] = tid.Value, - ["@w"] = int.Parse(r["Week"]), - ["@v"] = r["Venue"].Trim(), - ["@tz"] = r["Time_Zone"].Trim(), - ["@dur"] = int.Parse(r["Duration_Days"]), - }); -} - -// ── 8. player ───────────────────────────────────────────────────────────────── - -Console.WriteLine("[8/13] player"); -foreach (var r in rows05) -{ - var cname = r["Country"].Trim(); - var gname = r["Game"].Trim(); - var tname = r["Team"].Trim(); - await Insert( - """ - INSERT INTO player - (player_id, player_name, country_id, region, organization_id, game_id, - role, age, experience_years, previous_team, tournament_place, - prize_earned_usd, social_media_followers_k) - VALUES (@pid, @pn, @cid, @reg, @oid, @gid, @role, @age, @exp, @prev, @place, @prize, @soc) - """, - new() - { - ["@pid"] = r["Player_ID"].Trim(), - ["@pn"] = r["Player_Name"].Trim(), - ["@cid"] = string.IsNullOrWhiteSpace(cname) ? null : (long?)await EnsureCountry(cname), - ["@reg"] = Nullable(r["Region"]), - ["@oid"] = orgId.TryGetValue(tname, out var oid) ? oid : null, - ["@gid"] = gameId.TryGetValue(gname, out var gid) ? gid : null, - ["@role"] = Nullable(r["Role"]), - ["@age"] = NullInt(r["Age"]), - ["@exp"] = NullInt(r["Experience_Years"]), - ["@prev"] = Nullable(r["Previous_Team"]), - ["@place"] = NullInt(r["Tournament_Place"]), - ["@prize"] = NullInt(r["Prize_Earned_USD"]) ?? 0, - ["@soc"] = NullInt(r["Social_Media_Followers_K"]) ?? 0, - }); -} - -// ── 9. medalist ─────────────────────────────────────────────────────────────── - -Console.WriteLine("[9/13] medalist"); -foreach (var r in rows02) -{ - var tid = ResolveTournament(r["Event"].Trim()); - if (tid is null) - { - Console.WriteLine($" WARN: no tournament for medalist event '{r["Event"]}'"); - continue; - } - var orgName = r["Team_Organization"].Trim(); - var cname = r["Country"].Trim(); - await Insert( - "INSERT INTO medalist (tournament_id, medal, organization_id, player_name, country_id, role) VALUES (@tid, @m, @oid, @pn, @cid, @role)", - new() - { - ["@tid"] = tid.Value, - ["@m"] = r["Medal"].Trim(), - ["@oid"] = orgId.TryGetValue(orgName, out var oid) ? oid : null, - ["@pn"] = r["Player"].Trim(), - ["@cid"] = string.IsNullOrWhiteSpace(cname) ? null : (long?)await EnsureCountry(cname), - ["@role"] = Nullable(r["Role"]), - }); -} - -// ── 10. match_result ────────────────────────────────────────────────────────── - -Console.WriteLine("[10/13] match_result"); -foreach (var r in rows10) -{ - var tid = ResolveTournament(r["Game"].Trim()); - if (tid is null) - { - Console.WriteLine($" WARN: no tournament for match '{r["Game"]}'"); - continue; - } - await Insert( - """ - INSERT INTO match_result - (tournament_id, match_type, team_1, team_2, winner, score, map, duration_minutes, mvp) - VALUES (@tid, @mt, @t1, @t2, @w, @sc, @map, @dur, @mvp) - """, - new() - { - ["@tid"] = tid.Value, - ["@mt"] = r["Match_Type"].Trim(), - ["@t1"] = r["Team_1"].Trim(), - ["@t2"] = r["Team_2"].Trim(), - ["@w"] = Nullable(r["Winner"]), - ["@sc"] = Nullable(r["Score"]), - ["@map"] = Nullable(r["Map"]), - ["@dur"] = NullInt(r["Duration_Minutes"]), - ["@mvp"] = Nullable(r["MVP"]), - }); -} - -// ── 11. club_championship_standing ──────────────────────────────────────────── - -Console.WriteLine("[11/13] club_championship_standing"); -foreach (var r in rows03) -{ - var name = r["Organization"].Trim(); - if (!orgId.TryGetValue(name, out var oid)) - { - Console.WriteLine($" WARN: org not found for standing '{name}'"); - continue; - } - await Insert( - """ - INSERT INTO club_championship_standing - (organization_id, `rank`, total_points, prize_money_usd, - tournament_wins, top_8_finishes, eligible_to_win) - VALUES (@oid, @rank, @pts, @prize, @wins, @top8, @elig) - """, - new() - { - ["@oid"] = oid, - ["@rank"] = int.Parse(r["Rank"]), - ["@pts"] = int.Parse(r["Total_Points"]), - ["@prize"] = int.Parse(r["Prize_Money_USD"]), - ["@wins"] = int.Parse(r["Tournament_Wins"]), - ["@top8"] = int.Parse(r["Top_8_Finishes"]), - ["@elig"] = YesNo(r["Eligible_to_Win"]), - }); -} - -// ── 12. organization_game_competing ─────────────────────────────────────────── - -Console.WriteLine("[12/13] organization_game_competing"); -foreach (var r in rows04) -{ - var name = r["Organization"].Trim(); - if (!orgId.TryGetValue(name, out var oid)) continue; - foreach (var raw in r["Games_Competing"].Trim('"').Split(',', StringSplitOptions.RemoveEmptyEntries)) - { - var canonical = CanonicalGame(raw.Trim()); - if (!gameId.TryGetValue(canonical, out var gid)) - { - Console.WriteLine($" WARN: game '{raw.Trim()}' not found for org-competing '{name}'"); - continue; - } - await Insert( - "INSERT IGNORE INTO organization_game_competing (organization_id, game_id) VALUES (@oid, @gid)", - new() { ["@oid"] = oid, ["@gid"] = gid }); - } -} - -// ── 13. organization_game_won ───────────────────────────────────────────────── - -Console.WriteLine("[13/13] organization_game_won"); -foreach (var r in rows03) -{ - var name = r["Organization"].Trim(); - if (!orgId.TryGetValue(name, out var oid)) continue; - var gamesWon = r["Games_Won"].Trim('"').Trim(); - if (gamesWon.Equals("None", StringComparison.OrdinalIgnoreCase)) continue; - foreach (var raw in gamesWon.Split(',', StringSplitOptions.RemoveEmptyEntries)) - { - var canonical = CanonicalGame(raw.Trim()); - if (!gameId.TryGetValue(canonical, out var gid)) - { - Console.WriteLine($" WARN: game '{raw.Trim()}' not found for org-won '{name}'"); - continue; - } - await Insert( - "INSERT IGNORE INTO organization_game_won (organization_id, game_id) VALUES (@oid, @gid)", - new() { ["@oid"] = oid, ["@gid"] = gid }); - } -} - -Console.WriteLine("Done. Database seeded."); diff --git a/sql/datamart_schema.sql b/sql/datamart_schema.sql deleted file mode 100644 index 8367ed1..0000000 --- a/sql/datamart_schema.sql +++ /dev/null @@ -1,149 +0,0 @@ --- ============================================================================= --- EWC 2025 — DATA MART STAR SCHEMA --- Target: Oracle (university lab schema) --- ============================================================================= --- --- 3 Fact tables x 5 Dimension tables --- --- FACT_TOURNAMENT — one row per tournament (prize, participants, duration) --- FACT_MEDAL_AWARD — one row per player-medal (257 rows) --- FACT_CLUB_STANDING — snapshot of final Club Championship standings (24 rows) --- --- DIM_DATE --- | --- DIM_ORGANIZATION — FACT_TOURNAMENT — DIM_GAME --- --- DIM_COUNTRY ─┐ --- DIM_ORG ─┤── FACT_MEDAL_AWARD ── DIM_GAME --- DIM_MEDAL ─┘ │ --- DIM_DATE --- --- DIM_ORGANIZATION ── FACT_CLUB_STANDING --- --- ============================================================================= - --- ----------------------------------------------------------------------------- --- DIMENSION TABLES --- ----------------------------------------------------------------------------- - --- date_key is YYYYMMDD integer — avoids JOIN to a calendar table for simple --- filters and makes date range predicates cheap. -CREATE TABLE DIM_DATE ( - date_key NUMBER(8,0) NOT NULL, - full_date DATE NOT NULL, - year NUMBER(4,0) NOT NULL, - quarter NUMBER(1,0) NOT NULL, - month NUMBER(2,0) NOT NULL, - month_name VARCHAR2(10) NOT NULL, - week_number NUMBER(2,0) NOT NULL, - day_of_month NUMBER(2,0) NOT NULL, - day_name VARCHAR2(10) NOT NULL, - CONSTRAINT pk_dim_date PRIMARY KEY (date_key) -); - -CREATE TABLE DIM_GAME ( - game_key NUMBER(10,0) GENERATED ALWAYS AS IDENTITY, - game_id NUMBER(10,0) NOT NULL, - name VARCHAR2(100) NOT NULL, - game_type VARCHAR2(50) NOT NULL, - platform VARCHAR2(50) NOT NULL, - CONSTRAINT pk_dim_game PRIMARY KEY (game_key), - CONSTRAINT uq_dim_game_id UNIQUE (game_id) -); - -CREATE TABLE DIM_COUNTRY ( - country_key NUMBER(10,0) GENERATED ALWAYS AS IDENTITY, - country_id NUMBER(10,0) NOT NULL, - name VARCHAR2(100) NOT NULL, - region VARCHAR2(50) NOT NULL, - CONSTRAINT pk_dim_country PRIMARY KEY (country_key), - CONSTRAINT uq_dim_cntry_id UNIQUE (country_id) -); - -CREATE TABLE DIM_ORGANIZATION ( - org_key NUMBER(10,0) GENERATED ALWAYS AS IDENTITY, - org_id NUMBER(10,0) NOT NULL, - name VARCHAR2(150) NOT NULL, - region VARCHAR2(50), - country VARCHAR2(100), - club_partner_status VARCHAR2(10), - founded_year NUMBER(4,0), - social_media_followers_m NUMBER(6,2), - CONSTRAINT pk_dim_org PRIMARY KEY (org_key), - CONSTRAINT uq_dim_org_id UNIQUE (org_id) -); - -CREATE TABLE DIM_MEDAL ( - medal_key NUMBER(10,0) GENERATED ALWAYS AS IDENTITY, - medal_type VARCHAR2(10) NOT NULL, -- Gold / Silver / Bronze - medal_rank NUMBER(1,0) NOT NULL, -- 1 / 2 / 3 - CONSTRAINT pk_dim_medal PRIMARY KEY (medal_key), - CONSTRAINT uq_dim_medal_tp UNIQUE (medal_type) -); - --- ----------------------------------------------------------------------------- --- FACT TABLES --- ----------------------------------------------------------------------------- - --- Grain: one row per tournament --- Supports: prize analysis by game type / platform / week / gender -CREATE TABLE FACT_TOURNAMENT ( - fact_id NUMBER(10,0) GENERATED ALWAYS AS IDENTITY, - game_key NUMBER(10,0) NOT NULL, - start_date_key NUMBER(8,0) NOT NULL, - end_date_key NUMBER(8,0) NOT NULL, - winner_org_key NUMBER(10,0), -- NULL for individual-winner events - -- degenerate dimensions - event_name VARCHAR2(200) NOT NULL, - gender VARCHAR2(10) NOT NULL, -- Open / Men / Women - -- measures - prize_pool_usd NUMBER(12,0) NOT NULL, - num_participants NUMBER(5,0) NOT NULL, - duration_days NUMBER(3,0) NOT NULL, - has_club_points NUMBER(1,0) NOT NULL, - CONSTRAINT pk_fact_tourn PRIMARY KEY (fact_id), - CONSTRAINT fk_ft_game FOREIGN KEY (game_key) REFERENCES DIM_GAME (game_key), - CONSTRAINT fk_ft_sdate FOREIGN KEY (start_date_key) REFERENCES DIM_DATE (date_key), - CONSTRAINT fk_ft_edate FOREIGN KEY (end_date_key) REFERENCES DIM_DATE (date_key), - CONSTRAINT fk_ft_winner FOREIGN KEY (winner_org_key) REFERENCES DIM_ORGANIZATION (org_key), - CONSTRAINT ck_ft_pts CHECK (has_club_points IN (0, 1)) -); - --- Grain: one row per player-medal --- Supports: medal count and medal points by country / region / game / org -CREATE TABLE FACT_MEDAL_AWARD ( - fact_id NUMBER(10,0) GENERATED ALWAYS AS IDENTITY, - game_key NUMBER(10,0) NOT NULL, - medal_key NUMBER(10,0) NOT NULL, - country_key NUMBER(10,0), - org_key NUMBER(10,0), - date_key NUMBER(8,0), -- tournament start date - -- degenerate dimension - player_name VARCHAR2(100) NOT NULL, - -- measures - medal_count NUMBER(3,0) DEFAULT 1 NOT NULL, - medal_points NUMBER(3,0) NOT NULL, -- Gold=3, Silver=2, Bronze=1 - CONSTRAINT pk_fact_medal PRIMARY KEY (fact_id), - CONSTRAINT fk_fm_game FOREIGN KEY (game_key) REFERENCES DIM_GAME (game_key), - CONSTRAINT fk_fm_medal FOREIGN KEY (medal_key) REFERENCES DIM_MEDAL (medal_key), - CONSTRAINT fk_fm_country FOREIGN KEY (country_key) REFERENCES DIM_COUNTRY (country_key), - CONSTRAINT fk_fm_org FOREIGN KEY (org_key) REFERENCES DIM_ORGANIZATION (org_key), - CONSTRAINT fk_fm_date FOREIGN KEY (date_key) REFERENCES DIM_DATE (date_key) -); - --- Grain: one row per club (end-of-season snapshot) --- Supports: club performance comparison by region / partner status / eligibility -CREATE TABLE FACT_CLUB_STANDING ( - fact_id NUMBER(10,0) GENERATED ALWAYS AS IDENTITY, - org_key NUMBER(10,0) NOT NULL, - -- measures - final_rank NUMBER(3,0) NOT NULL, - total_points NUMBER(6,0) NOT NULL, - prize_money_usd NUMBER(12,0) NOT NULL, - tournament_wins NUMBER(3,0) NOT NULL, - top_8_finishes NUMBER(3,0) NOT NULL, - eligible_to_win NUMBER(1,0) NOT NULL, - CONSTRAINT pk_fact_club PRIMARY KEY (fact_id), - CONSTRAINT fk_fcs_org FOREIGN KEY (org_key) REFERENCES DIM_ORGANIZATION (org_key), - CONSTRAINT ck_fcs_elig CHECK (eligible_to_win IN (0, 1)) -); diff --git a/sql/schema.sql b/sql/schema.sql deleted file mode 100644 index bcb9086..0000000 --- a/sql/schema.sql +++ /dev/null @@ -1,186 +0,0 @@ -CREATE DATABASE IF NOT EXISTS ewc2025 - CHARACTER SET utf8mb4 - COLLATE utf8mb4_unicode_ci; - -USE ewc2025; - --- ───────────────────────────────────────────────────────────────────────────── --- LOOKUP TABLES --- ───────────────────────────────────────────────────────────────────────────── - -CREATE TABLE game ( - game_id INT UNSIGNED NOT NULL AUTO_INCREMENT, - name VARCHAR(100) NOT NULL, - game_type VARCHAR(50) NOT NULL, - platform VARCHAR(50) NOT NULL, - PRIMARY KEY (game_id), - UNIQUE KEY uq_game_name (name) -); - -CREATE TABLE country ( - country_id INT UNSIGNED NOT NULL AUTO_INCREMENT, - name VARCHAR(100) NOT NULL, - region VARCHAR(50) NOT NULL, - gold_medals TINYINT UNSIGNED NOT NULL DEFAULT 0, - silver_medals TINYINT UNSIGNED NOT NULL DEFAULT 0, - bronze_medals TINYINT UNSIGNED NOT NULL DEFAULT 0, - total_medals TINYINT UNSIGNED NOT NULL DEFAULT 0, - total_players SMALLINT UNSIGNED NOT NULL DEFAULT 0, - top_game VARCHAR(100), - PRIMARY KEY (country_id), - UNIQUE KEY uq_country_name (name) -); - -CREATE TABLE point_system ( - point_system_id INT UNSIGNED NOT NULL AUTO_INCREMENT, - placement TINYINT UNSIGNED NOT NULL, - points SMALLINT UNSIGNED NOT NULL, - system_type ENUM('Standard', 'Co-Placement', 'Extended', 'Special') NOT NULL, - description VARCHAR(50), - PRIMARY KEY (point_system_id), - UNIQUE KEY uq_placement_type (placement, system_type) -); - -CREATE TABLE prize_pool_category ( - prize_category_id INT UNSIGNED NOT NULL AUTO_INCREMENT, - category VARCHAR(100) NOT NULL, - amount_usd INT UNSIGNED NOT NULL, - percentage DECIMAL(5,2) NOT NULL, - description VARCHAR(200), - num_recipients INT UNSIGNED, - PRIMARY KEY (prize_category_id), - UNIQUE KEY uq_category (category) -); - --- ───────────────────────────────────────────────────────────────────────────── --- CORE ENTITIES --- ───────────────────────────────────────────────────────────────────────────── - -CREATE TABLE organization ( - organization_id INT UNSIGNED NOT NULL AUTO_INCREMENT, - name VARCHAR(150) NOT NULL, - region VARCHAR(50), - country_id INT UNSIGNED, - club_partner_status ENUM('Current', 'New', 'None') NOT NULL DEFAULT 'None', - top_8_2024 BOOLEAN, - founded_year SMALLINT UNSIGNED, - hq_location VARCHAR(150), - ceo VARCHAR(150), - social_media_followers_m DECIMAL(6,2), - PRIMARY KEY (organization_id), - UNIQUE KEY uq_org_name (name), - CONSTRAINT fk_org_country FOREIGN KEY (country_id) REFERENCES country (country_id) -); - -CREATE TABLE tournament ( - tournament_id INT UNSIGNED NOT NULL AUTO_INCREMENT, - game_id INT UNSIGNED NOT NULL, - event_name VARCHAR(200) NOT NULL, - start_date DATE NOT NULL, - end_date DATE NOT NULL, - prize_pool_usd INT UNSIGNED NOT NULL, - num_participants TINYINT UNSIGNED NOT NULL, - winner VARCHAR(200), - runner_up VARCHAR(200), - club_championship_points BOOLEAN NOT NULL DEFAULT FALSE, - gender ENUM('Open', 'Men', 'Women') NOT NULL DEFAULT 'Open', - PRIMARY KEY (tournament_id), - CONSTRAINT fk_tournament_game FOREIGN KEY (game_id) REFERENCES game (game_id) -); - -CREATE TABLE schedule ( - schedule_id INT UNSIGNED NOT NULL AUTO_INCREMENT, - tournament_id INT UNSIGNED NOT NULL, - week_number TINYINT UNSIGNED NOT NULL, - venue VARCHAR(200) NOT NULL, - time_zone VARCHAR(10) NOT NULL, - duration_days TINYINT UNSIGNED NOT NULL, - PRIMARY KEY (schedule_id), - UNIQUE KEY uq_schedule_tournament (tournament_id), - CONSTRAINT fk_schedule_tournament FOREIGN KEY (tournament_id) REFERENCES tournament (tournament_id) -); - -CREATE TABLE player ( - player_id VARCHAR(20) NOT NULL, - player_name VARCHAR(100) NOT NULL, - country_id INT UNSIGNED, - region VARCHAR(50), - organization_id INT UNSIGNED, - game_id INT UNSIGNED, - role VARCHAR(50), - age TINYINT UNSIGNED, - experience_years TINYINT UNSIGNED, - previous_team VARCHAR(150), - tournament_place TINYINT UNSIGNED, - prize_earned_usd INT UNSIGNED NOT NULL DEFAULT 0, - social_media_followers_k INT UNSIGNED NOT NULL DEFAULT 0, - PRIMARY KEY (player_id), - CONSTRAINT fk_player_country FOREIGN KEY (country_id) REFERENCES country (country_id), - CONSTRAINT fk_player_org FOREIGN KEY (organization_id) REFERENCES organization (organization_id), - CONSTRAINT fk_player_game FOREIGN KEY (game_id) REFERENCES game (game_id) -); - -CREATE TABLE medalist ( - medalist_id INT UNSIGNED NOT NULL AUTO_INCREMENT, - tournament_id INT UNSIGNED NOT NULL, - medal ENUM('Gold', 'Silver', 'Bronze') NOT NULL, - organization_id INT UNSIGNED, - player_name VARCHAR(100) NOT NULL, - country_id INT UNSIGNED, - role VARCHAR(50), - PRIMARY KEY (medalist_id), - CONSTRAINT fk_medalist_tournament FOREIGN KEY (tournament_id) REFERENCES tournament (tournament_id), - CONSTRAINT fk_medalist_org FOREIGN KEY (organization_id) REFERENCES organization (organization_id), - CONSTRAINT fk_medalist_country FOREIGN KEY (country_id) REFERENCES country (country_id) -); - --- team_1 / team_2 / winner are VARCHAR because individual-game matches --- (Chess, StarCraft II, fighting games) use player names instead of org names -CREATE TABLE match_result ( - match_id INT UNSIGNED NOT NULL AUTO_INCREMENT, - tournament_id INT UNSIGNED NOT NULL, - match_type VARCHAR(50) NOT NULL, - team_1 VARCHAR(200) NOT NULL, - team_2 VARCHAR(200) NOT NULL, - winner VARCHAR(200), - score VARCHAR(20), - map VARCHAR(100), - duration_minutes SMALLINT UNSIGNED, - mvp VARCHAR(100), - PRIMARY KEY (match_id), - CONSTRAINT fk_match_tournament FOREIGN KEY (tournament_id) REFERENCES tournament (tournament_id) -); - -CREATE TABLE club_championship_standing ( - standing_id INT UNSIGNED NOT NULL AUTO_INCREMENT, - organization_id INT UNSIGNED NOT NULL, - `rank` TINYINT UNSIGNED NOT NULL, - total_points SMALLINT UNSIGNED NOT NULL DEFAULT 0, - prize_money_usd INT UNSIGNED NOT NULL DEFAULT 0, - tournament_wins TINYINT UNSIGNED NOT NULL DEFAULT 0, - top_8_finishes TINYINT UNSIGNED NOT NULL DEFAULT 0, - eligible_to_win BOOLEAN NOT NULL DEFAULT FALSE, - PRIMARY KEY (standing_id), - UNIQUE KEY uq_standing_org (organization_id), - CONSTRAINT fk_standing_org FOREIGN KEY (organization_id) REFERENCES organization (organization_id) -); - --- ───────────────────────────────────────────────────────────────────────────── --- JUNCTION TABLES --- ───────────────────────────────────────────────────────────────────────────── - -CREATE TABLE organization_game_competing ( - organization_id INT UNSIGNED NOT NULL, - game_id INT UNSIGNED NOT NULL, - PRIMARY KEY (organization_id, game_id), - CONSTRAINT fk_ogc_org FOREIGN KEY (organization_id) REFERENCES organization (organization_id), - CONSTRAINT fk_ogc_game FOREIGN KEY (game_id) REFERENCES game (game_id) -); - -CREATE TABLE organization_game_won ( - organization_id INT UNSIGNED NOT NULL, - game_id INT UNSIGNED NOT NULL, - PRIMARY KEY (organization_id, game_id), - CONSTRAINT fk_ogw_org FOREIGN KEY (organization_id) REFERENCES organization (organization_id), - CONSTRAINT fk_ogw_game FOREIGN KEY (game_id) REFERENCES game (game_id) -);