Skip to content

Commit f7c0a21

Browse files
authored
Merge pull request #2214 from hexlet-codebattle/add-user-lang
Add user_lang to tournament_results
2 parents d835214 + bb0f1b9 commit f7c0a21

File tree

5 files changed

+62
-23
lines changed

5 files changed

+62
-23
lines changed

services/app/apps/codebattle/lib/codebattle/tournament/tournament_result.ex

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ defmodule Codebattle.Tournament.TournamentResult do
2727
field(:tournament_id, :integer)
2828
field(:user_id, :integer)
2929
field(:user_name, :string)
30+
field(:user_lang, :string)
3031
end
3132

3233
def get_by(tournament_id) do
@@ -85,6 +86,7 @@ defmodule Codebattle.Tournament.TournamentResult do
8586
(p.player_info->>'result_percent')::numeric AS result_percent,
8687
(p.player_info->>'id')::integer AS user_id,
8788
(p.player_info->>'name')::text AS user_name,
89+
(p.player_info->>'lang')::text AS user_lang,
8890
(p.player_info->>'clan_id')::integer AS clan_id,
8991
g.duration_sec,
9092
g.tournament_id,
@@ -121,6 +123,7 @@ defmodule Codebattle.Tournament.TournamentResult do
121123
game_id,
122124
user_id,
123125
user_name,
126+
user_lang,
124127
clan_id,
125128
task_id,
126129
score,
@@ -135,6 +138,7 @@ defmodule Codebattle.Tournament.TournamentResult do
135138
game_id,
136139
user_id,
137140
user_name,
141+
user_lang,
138142
clan_id,
139143
task_id,
140144
score,
@@ -159,6 +163,7 @@ defmodule Codebattle.Tournament.TournamentResult do
159163
(p.player_info->>'result_percent')::numeric AS result_percent,
160164
(p.player_info->>'id')::integer AS user_id,
161165
(p.player_info->>'name')::text AS user_name,
166+
(p.player_info->>'lang')::text AS user_lang,
162167
(p.player_info->>'clan_id')::integer AS clan_id,
163168
g.duration_sec,
164169
g.level,
@@ -183,6 +188,7 @@ defmodule Codebattle.Tournament.TournamentResult do
183188
game_id,
184189
user_id,
185190
user_name,
191+
user_lang,
186192
clan_id,
187193
task_id,
188194
score,
@@ -197,6 +203,7 @@ defmodule Codebattle.Tournament.TournamentResult do
197203
game_id,
198204
user_id,
199205
user_name,
206+
user_lang,
200207
clan_id,
201208
task_id,
202209
score,
@@ -229,6 +236,7 @@ defmodule Codebattle.Tournament.TournamentResult do
229236
select: %{
230237
user_id: tr.user_id,
231238
user_name: max(tr.user_name),
239+
user_lang: max(tr.user_lang),
232240
opponent_id: tr2.user_id,
233241
round_position: tr.round_position,
234242
score: coalesce(sum(tr.score), 0),
@@ -242,6 +250,7 @@ defmodule Codebattle.Tournament.TournamentResult do
242250
tr2.result_percent
243251
),
244252
opponent_name: max(tr2.user_name),
253+
opponent_lang: max(tr2.user_lang),
245254
opponent_clan_id: max(tr2.clan_id)
246255
}
247256
)
@@ -280,13 +289,14 @@ defmodule Codebattle.Tournament.TournamentResult do
280289
select: %{
281290
id: r.user_id,
282291
name: r.user_name,
292+
lang: r.user_lang,
283293
clan_id: c.id,
284294
clan: c.name,
285295
score: sum(r.score),
286296
place: over(row_number(), :overall_partition)
287297
},
288298
where: r.tournament_id == ^tournament.id,
289-
group_by: [r.user_id, r.user_name, c.id],
299+
group_by: [r.user_id, r.user_name, r.user_lang, c.id],
290300
order_by: [desc: sum(r.score), asc: sum(r.duration_sec)],
291301
windows: [overall_partition: [order_by: [desc: sum(r.score), asc: sum(r.duration_sec)]]]
292302
)
@@ -306,13 +316,14 @@ defmodule Codebattle.Tournament.TournamentResult do
306316
select: %{
307317
id: r.user_id,
308318
name: r.user_name,
319+
lang: r.user_lang,
309320
clan_id: c.id,
310321
clan: c.name,
311322
score: sum(r.score),
312323
place: over(row_number(), :overall_partition)
313324
},
314325
where: r.tournament_id == ^tournament.id,
315-
group_by: [r.user_id, r.user_name, c.id],
326+
group_by: [r.user_id, r.user_name, r.user_lang, c.id],
316327
order_by: [desc: sum(r.score), asc: sum(r.duration_sec)],
317328
windows: [overall_partition: [order_by: [desc: sum(r.score), asc: sum(r.duration_sec)]]]
318329
)
@@ -357,6 +368,7 @@ defmodule Codebattle.Tournament.TournamentResult do
357368
tr.clan_id,
358369
tr.user_id,
359370
tr.user_name,
371+
tr.user_lang,
360372
SUM(tr.score) AS total_score,
361373
SUM(tr.duration_sec) AS total_duration_sec,
362374
SUM(CASE WHEN tr.result_percent = 100.0 THEN 1 ELSE 0 END) AS wins_count
@@ -365,13 +377,14 @@ defmodule Codebattle.Tournament.TournamentResult do
365377
WHERE
366378
tr.tournament_id = #{tournament.id}
367379
GROUP BY
368-
tr.clan_id, tr.user_id, tr.user_name
380+
tr.clan_id, tr.user_id, tr.user_name, tr.user_lang
369381
),
370382
TopPlayers AS (
371383
SELECT
372384
pa.clan_id,
373385
pa.user_id,
374386
pa.user_name,
387+
pa.user_lang,
375388
pa.total_score,
376389
pa.total_duration_sec,
377390
pa.wins_count,
@@ -384,6 +397,7 @@ defmodule Codebattle.Tournament.TournamentResult do
384397
tp.clan_id,
385398
tp.user_id,
386399
tp.user_name,
400+
tp.user_lang,
387401
tp.total_score,
388402
tp.total_duration_sec,
389403
tp.wins_count
@@ -410,6 +424,7 @@ defmodule Codebattle.Tournament.TournamentResult do
410424
tp.clan_id,
411425
tp.user_id,
412426
tp.user_name,
427+
tp.user_lang,
413428
tp.total_score,
414429
tp.total_duration_sec,
415430
tp.wins_count,
@@ -425,6 +440,7 @@ defmodule Codebattle.Tournament.TournamentResult do
425440
c.long_name AS clan_long_name,
426441
t.user_id,
427442
t.user_name,
443+
t.user_lang,
428444
t.total_score,
429445
t.total_duration_sec,
430446
t.wins_count,
@@ -590,7 +606,8 @@ defmodule Codebattle.Tournament.TournamentResult do
590606
game_id: r.game_id,
591607
score: r.score,
592608
user_id: r.user_id,
593-
user_name: max(r.user_name)
609+
user_name: max(r.user_name),
610+
user_lang: max(r.user_lang)
594611
}
595612
)
596613

services/app/apps/codebattle/lib/codebattle/tournament/tournament_user_result.ex

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,19 @@ defmodule Codebattle.Tournament.TournamentUserResult do
1111
@type t :: %__MODULE__{}
1212

1313
schema "tournament_user_results" do
14-
field(:user_id, :integer)
14+
field(:avg_result_percent, :decimal)
1515
field(:clan_id, :integer)
16-
field(:user_name, :string)
16+
field(:games_count, :integer, default: 0)
17+
field(:is_cheater, :boolean, default: false)
18+
field(:place, :integer, default: 0)
19+
field(:points, :integer, default: 0)
1720
field(:score, :integer, default: 0)
21+
field(:total_time, :integer, default: 0)
1822
field(:tournament_id, :integer)
19-
field(:points, :integer, default: 0)
20-
field(:place, :integer, default: 0)
21-
field(:games_count, :integer, default: 0)
23+
field(:user_id, :integer)
24+
field(:user_name, :string)
25+
field(:user_lang, :string)
2226
field(:wins_count, :integer, default: 0)
23-
field(:total_time, :integer, default: 0)
24-
field(:is_cheater, :boolean, default: false)
25-
field(:avg_result_percent, :decimal)
2627

2728
timestamps(updated_at: false)
2829
end
@@ -58,6 +59,7 @@ defmodule Codebattle.Tournament.TournamentUserResult do
5859
tr.user_id,
5960
tr.clan_id,
6061
tr.user_name,
62+
tr.user_lang,
6163
SUM(tr.score)::integer AS score,
6264
COUNT(*)::integer AS games_count,
6365
SUM(CASE WHEN tr.result_percent = 100.0 THEN 1 ELSE 0 END)::integer AS wins_count,
@@ -66,14 +68,15 @@ defmodule Codebattle.Tournament.TournamentUserResult do
6668
AVG(tr.result_percent)::numeric(5,1) AS avg_result_percent
6769
FROM tournament_results tr
6870
WHERE tr.tournament_id = #{tournament.id}
69-
GROUP BY tr.tournament_id, tr.user_id, tr.clan_id, tr.user_name
71+
GROUP BY tr.tournament_id, tr.user_id, tr.clan_id, tr.user_name, tr.user_lang
7072
),
7173
ranked_results AS (
7274
SELECT
7375
ar.tournament_id,
7476
ar.user_id,
7577
ar.clan_id,
7678
ar.user_name,
79+
ar.user_lang,
7780
ar.score,
7881
ar.games_count,
7982
ar.wins_count,
@@ -91,6 +94,7 @@ defmodule Codebattle.Tournament.TournamentUserResult do
9194
rr.user_id,
9295
rr.clan_id,
9396
rr.user_name,
97+
rr.user_lang,
9498
rr.score,
9599
rr.place,
96100
rr.games_count,
@@ -107,6 +111,7 @@ defmodule Codebattle.Tournament.TournamentUserResult do
107111
user_id,
108112
clan_id,
109113
user_name,
114+
user_lang,
110115
score,
111116
points,
112117
place,
@@ -122,6 +127,7 @@ defmodule Codebattle.Tournament.TournamentUserResult do
122127
user_id,
123128
clan_id,
124129
user_name,
130+
user_lang,
125131
score,
126132
points,
127133
place,
@@ -135,6 +141,7 @@ defmodule Codebattle.Tournament.TournamentUserResult do
135141
ON CONFLICT (tournament_id, user_id)
136142
DO UPDATE SET
137143
user_name = EXCLUDED.user_name,
144+
user_lang = EXCLUDED.user_lang,
138145
score = EXCLUDED.score,
139146
points = EXCLUDED.points,
140147
place = EXCLUDED.place,

services/app/apps/codebattle/lib/codebattle/users_points_and_rank_update_server.ex

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ defmodule Codebattle.UsersPointsAndRankUpdateServer do
1818

1919
# SERVER
2020
def init(_) do
21-
Process.send_after(self(), :subscribe, to_timeout(second: 15))
21+
Process.send_after(self(), :subscribe, 0)
2222
Process.send_after(self(), :work, to_timeout(minute: 5))
2323

2424
Logger.debug("Start UsersPointsServer")
@@ -32,12 +32,7 @@ defmodule Codebattle.UsersPointsAndRankUpdateServer do
3232
end
3333

3434
def handle_info(:subscribe, state) do
35-
if FunWithFlags.enabled?(:skip_user_points_server) do
36-
:noop
37-
else
38-
Codebattle.PubSub.subscribe("tournaments")
39-
end
40-
35+
Codebattle.PubSub.subscribe("tournaments")
4136
{:noreply, state}
4237
end
4338

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
defmodule Codebattle.Repo.Migrations.AddUserLangToTournamentResults do
2+
use Ecto.Migration
3+
4+
def change do
5+
alter table(:tournament_user_results) do
6+
add(:user_lang, :string)
7+
end
8+
9+
alter table(:tournament_results) do
10+
add(:user_lang, :string)
11+
end
12+
end
13+
end

services/app/apps/codebattle/test/codebattle/tournament/entire/swiss_grand_slam_test.exs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ defmodule Codebattle.Tournament.Entire.SwissGrandSlamTest do
1313
@decimal100 Decimal.new("100.0")
1414
@decimal0 Decimal.new("0.0")
1515

16-
@tag :skip
1716
test "works with player who solved all tasks" do
1817
[%{id: t1_id}, %{id: t2_id}, %{id: t3_id}] = insert_list(3, :task, level: "easy")
1918
insert(:task_pack, name: "tp", task_ids: [t1_id, t2_id, t3_id])
@@ -290,7 +289,11 @@ defmodule Codebattle.Tournament.Entire.SwissGrandSlamTest do
290289

291290
assert Process.info(self(), :message_queue_len) == {:message_queue_len, 0}
292291

292+
:timer.sleep(100)
293293
tournament = %{id: tournament_id} = Tournament.Context.get(tournament.id)
294+
295+
assert tournament.state == "finished"
296+
294297
matches = get_matches(tournament)
295298

296299
assert Enum.count(matches) == 3
@@ -309,6 +312,7 @@ defmodule Codebattle.Tournament.Entire.SwissGrandSlamTest do
309312
task_id: ^t1_id,
310313
tournament_id: ^tournament_id,
311314
user_id: ^u1_id,
315+
user_lang: "js",
312316
user_name: "1"
313317
},
314318
%{
@@ -374,7 +378,8 @@ defmodule Codebattle.Tournament.Entire.SwissGrandSlamTest do
374378
task_id: ^t3_id,
375379
tournament_id: ^tournament_id,
376380
user_id: ^u2_id,
377-
user_name: "2"
381+
user_name: "2",
382+
user_lang: "js"
378383
}
379384
] = TournamentResult |> Repo.all() |> Enum.sort_by(&{&1.user_id, &1.task_id})
380385

@@ -392,6 +397,7 @@ defmodule Codebattle.Tournament.Entire.SwissGrandSlamTest do
392397
tournament_id: ^tournament_id,
393398
user_id: ^u1_id,
394399
user_name: "1",
400+
user_lang: "js",
395401
wins_count: 3
396402
},
397403
%{
@@ -407,11 +413,12 @@ defmodule Codebattle.Tournament.Entire.SwissGrandSlamTest do
407413
tournament_id: ^tournament_id,
408414
user_id: ^u2_id,
409415
user_name: "2",
416+
user_lang: "js",
410417
wins_count: 0
411418
}
412419
] = TournamentUserResult |> Repo.all() |> Enum.sort_by(& &1.user_id)
413420

414-
:timer.sleep(to_timeout(second: 2))
421+
:timer.sleep(to_timeout(second: 5))
415422
assert %{rating: 1023, rank: 1, points: 2048} = Repo.get(User, u1_id)
416423
assert %{rating: 977, rank: 2, points: 1024} = Repo.get(User, u2_id)
417424
end

0 commit comments

Comments
 (0)