@@ -26,67 +26,6 @@ def show
2626 render_success ( build_champion_data ( player , champion_stats ) )
2727 end
2828
29- private
30-
31- def fetch_champion_stats ( player )
32- PlayerMatchStat . where ( player : player )
33- . group ( :champion )
34- . select (
35- 'champion' ,
36- 'COUNT(*) as games_played' ,
37- 'SUM(CASE WHEN matches.victory THEN 1 ELSE 0 END) as wins' ,
38- 'AVG((kills + assists)::float / NULLIF(deaths, 0)) as avg_kda' ,
39- 'AVG(cs_per_min) as avg_cs_per_min' ,
40- 'AVG(damage_dealt_total) as avg_damage_dealt' ,
41- 'AVG(damage_taken) as avg_damage_taken' ,
42- 'AVG(gold_per_min) as avg_gold_per_min' ,
43- 'AVG(vision_score) as avg_vision_score'
44- )
45- . joins ( :match )
46- . order ( 'games_played DESC' )
47- end
48-
49- def build_champion_stats ( stats )
50- riot_service = RiotCdnService . new
51- stats . map { |stat | build_champion_stat_hash ( stat , riot_service ) }
52- end
53-
54- def build_champion_stat_hash ( stat , riot_service )
55- win_rate = stat . games_played . zero? ? 0 : ( stat . wins . to_f / stat . games_played )
56- {
57- champion : stat . champion ,
58- games_played : stat . games_played ,
59- win_rate : win_rate ,
60- avg_kda : stat . avg_kda &.round ( 2 ) || 0 ,
61- avg_cs_per_min : stat . avg_cs_per_min &.round ( 1 ) || 0.0 ,
62- avg_damage_dealt : stat . avg_damage_dealt &.round ( 0 ) || 0 ,
63- avg_damage_taken : stat . avg_damage_taken &.round ( 0 ) || 0 ,
64- avg_gold_per_min : stat . avg_gold_per_min &.round ( 0 ) || 0 ,
65- avg_vision_score : stat . avg_vision_score &.round ( 1 ) || 0.0 ,
66- mastery_grade : calculate_mastery_grade ( win_rate , stat . avg_kda ) ,
67- icon_url : riot_service . champion_icon_url ( stat . champion )
68- }
69- end
70-
71- def build_champion_data ( player , champion_stats )
72- {
73- player : PlayerSerializer . render_as_hash ( player ) ,
74- champion_stats : champion_stats ,
75- top_champions : champion_stats . take ( 5 ) ,
76- champion_diversity : {
77- total_champions : champion_stats . count ,
78- highly_played : champion_stats . count { |c | c [ :games_played ] >= 10 } ,
79- average_games : if champion_stats . empty?
80- 0
81- else
82- ( champion_stats . sum do |c |
83- c [ :games_played ]
84- end / champion_stats . count . to_f ) . round ( 1 )
85- end
86- }
87- }
88- end
89-
9029 def details
9130 player = organization_scoped ( Player ) . find ( params [ :player_id ] )
9231 champion = params [ :champion ]
@@ -212,6 +151,67 @@ def details
212151
213152 private
214153
154+ def fetch_champion_stats ( player )
155+ PlayerMatchStat . where ( player : player )
156+ . group ( :champion )
157+ . select (
158+ 'champion' ,
159+ 'COUNT(*) as games_played' ,
160+ 'SUM(CASE WHEN matches.victory THEN 1 ELSE 0 END) as wins' ,
161+ 'AVG((kills + assists)::float / NULLIF(deaths, 0)) as avg_kda' ,
162+ 'AVG(cs_per_min) as avg_cs_per_min' ,
163+ 'AVG(damage_dealt_total) as avg_damage_dealt' ,
164+ 'AVG(damage_taken) as avg_damage_taken' ,
165+ 'AVG(gold_per_min) as avg_gold_per_min' ,
166+ 'AVG(vision_score) as avg_vision_score'
167+ )
168+ . joins ( :match )
169+ . order ( 'games_played DESC' )
170+ end
171+
172+ def build_champion_stats ( stats )
173+ riot_service = RiotCdnService . new
174+ stats . map { |stat | build_champion_stat_hash ( stat , riot_service ) }
175+ end
176+
177+ def build_champion_stat_hash ( stat , riot_service )
178+ win_rate = stat . games_played . zero? ? 0 : ( stat . wins . to_f / stat . games_played )
179+ {
180+ champion : stat . champion ,
181+ games_played : stat . games_played ,
182+ win_rate : win_rate ,
183+ avg_kda : stat . avg_kda &.round ( 2 ) || 0 ,
184+ avg_cs_per_min : stat . avg_cs_per_min &.round ( 1 ) || 0.0 ,
185+ avg_damage_dealt : stat . avg_damage_dealt &.round ( 0 ) || 0 ,
186+ avg_damage_taken : stat . avg_damage_taken &.round ( 0 ) || 0 ,
187+ avg_gold_per_min : stat . avg_gold_per_min &.round ( 0 ) || 0 ,
188+ avg_vision_score : stat . avg_vision_score &.round ( 1 ) || 0.0 ,
189+ mastery_grade : calculate_mastery_grade ( win_rate , stat . avg_kda ) ,
190+ icon_url : riot_service . champion_icon_url ( stat . champion )
191+ }
192+ end
193+
194+ def build_champion_data ( player , champion_stats )
195+ {
196+ player : PlayerSerializer . render_as_hash ( player ) ,
197+ champion_stats : champion_stats ,
198+ top_champions : champion_stats . take ( 5 ) ,
199+ champion_diversity : {
200+ total_champions : champion_stats . count ,
201+ highly_played : champion_stats . count { |c | c [ :games_played ] >= 10 } ,
202+ average_games : if champion_stats . empty?
203+ 0
204+ else
205+ ( champion_stats . sum do |c |
206+ c [ :games_played ]
207+ end / champion_stats . count . to_f ) . round ( 1 )
208+ end
209+ }
210+ }
211+ end
212+
213+ private
214+
215215 def calculate_mastery_grade ( win_rate , avg_kda )
216216 score = ( win_rate * 100 * 0.6 ) + ( ( avg_kda || 0 ) * 10 * 0.4 )
217217
0 commit comments