Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#80 Read data from CSV #84

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
63,691 changes: 63,691 additions & 0 deletions kgstatsSrv/src/test/resources/ru/klavogonki/data/blocked20240416.csv

Large diffs are not rendered by default.

Binary file not shown.
501 changes: 501 additions & 0 deletions kgstatsSrv/src/test/resources/ru/klavogonki/data/cars20241101.csv

Large diffs are not rendered by default.

Binary file not shown.
160 changes: 160 additions & 0 deletions kgstatsSrv/src/test/resources/ru/klavogonki/data/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
# Получение данных через CSV-файлы

Данные в формате CSV выгружены Переборычем запросами напрямую из базы Клавогонок в 2024 году.

Плюс такого подхода в том, что не нужно делать долгие и нестабильные запросы к API.

В идеале было бы использовать полный read-only дамп базы (можно скрывать поля вроде хэшей пароля, данных об оплате итд),
чтобы избегать промежуточных преобразований.

Но пока пробуем распарсить CSV и преобразовать в формат аналогичный тому, что мы получали из API-запросов.

Заметная разница по текущим данным — отсутствую джойны между таблицами, как для API.

Например, названия словарей находятся в отдельной таблице `vocs`, а в таблице `userinfo` есть только `id` словаря.


:exclamation: Возможны проблемы с кодировкой в CSV-файлах — похоже, что они выгружены в кириллической кодировке
`Windows-1251`, а не в `UTF-8`.

# userinfo20240416.zip

```sql
select * from klavogonki.userinfo where (num_races > 49);
```

Результаты юзеров по словарям. Названия словаря нет, оно находится в таблице `vocs`.

Выборка только для тех словарных результатов, где у игрока хотя бы 50 заездов.

Это, в принципе, ок. Таким образом, количество записей будет разумным, не в несколько миллионов.

## Поля

```csv
"id";"user_id";"mode";"texttype";"num_races";"avg_speed";"best_speed";"avg_error";"haul";"qual";"dirty";"updated"
```

Поля должны достаточно хорошо мапиться на результат API запроса, который описан классом
`GetStatsOverviewGameTypeInfo` (генерируемым из OpenAPI спеки).

Но надо хорошо подумать и сравнить.

Метаданные словаря из `GetStatsOverviewGameType` находятся в таблице `vocs`.

# vocs20241101.zip

```sql
select id, name from klavogonki.voc where (deleted = 0);
```

## Поля

Пока здесь только `id` и `name`, так что всех данных для `**GetStatsOverviewGameType**` нет.

# voc20241105utf-8!.csv

Здесь, наконец, удалось сделать выгрузку в кодировке `UTF-8`, а не `Windows-1251`.

Условие `deleted = 0` исключает из выборки историю словарей.

```sql
select * from klavogonki.voc where (deleted = 0);
```

## Поля

```csv
"id";"created";"first_created";"name";"description";"user_id";"deleted";"rating";"rating_cnt";"url";"rows";"symbols";"type";"edit_for";"import";"difficulty";"public";"popularity";"info"
```

:exclamation: Внутри поля `description` могут быть переносы строк.

Пример словаря с переносами — https://klavogonki.ru/vocs/206105

В поле `info` похоже, что сохраняется формат html (видимо, некое Rich-поле при редактуре поля),
переносы выполнены через тэг `<br />`.

Эти данные должны замапиться на все поля из `GetStatsOverviewGameType`

:question: Однако непонятно, как заполняется поле `GetStatsOverviewGameType#book_done`.
Может быть, сравнивается число отрезков в книге (`vocs.rows`) и пробег юзера по словарю?

Но пробег может быть больше, чем длина словаря.

Для учёта каждого из отрывков словаря есть отдельная таблица, которая содержит пройденные игроком отрезки
книжного словаря. Именно из неё выбираются данные для показа прогресса юзера по книге,
они возвращаются по запросу вида https://klavogonki.ru/api/profile/get-book-parts?userId=242585&vocId=30149.

Её поля — `user_id`, `voc_id`, `part_id`.

**TODO:** Каково имя этой таблицы?


# user20241101.csv

НЕ заблокированные пользователи.

```sql
select id, login from klavogonki.user where (blocked = 0);
```

## Поля
Только `id` и `login`.

Если для статистики нужны другие поля, нужно запрашивать их отдельно.

Всех полей из `GetIndexDataSuccess` здесь, естественно, нет.

# blocked20240416.csv

Заблокированные пользователи.
Многие из них имеют нецензурные никнеймы.

```sql
select id, login from klavogonki.user where (blocked != 0);
```

## Поля
Только `id` и `login`.


# cars20241101.csv

Топ-500 игроков по числу машин в гараже.

Бонусные машины тоже должны учитываться здесь.

Теоретически максимально возможное число машин — 44, но у заблокированного уникума [pashkan](https://klavogonki.ru/u/#/155280/car/)
было 46 машин (видимо, две уникальные кастомные).

```sql
select
user_id,
count(1) count
from klavogonki.user_scores
where (type = 'car')
group by user_id
order by count desc
limit 500;
```

## Поля
Только `playerId` и `carsCount`.


# sumraces20240416.csv

По сути является просто суммой всех пробегов по всем словарям из `userinfo`, сгруппированным по игрокам.

Выбраны только игроки с ненулевым суммарным пробегом.

```sql
select
user_id,
sum(num_races) as sum_races
from klavogonki.userinfo
group by user_id
having (sum_races > 0);
```

Loading
Loading