Модуль:Тест
Список баз данных
- База данных финального турнира ЧТМ (Data)
2006 • 2010 • 2014 • 2018 • 2022 • 2026 • 2030 • 2034 • 2038 • 2042 • 2046
- База данных результатов всех турниров (Data/Tournaments)
2006 • 2009 • 2010 • 2013 • 2014 • 2015 • 2017 • 2018 • 2019 • 2020 • 2021 • 2022 • 2023 • 2024 • 2025 • 2026 • 2027 • 2028 • 2029 • 2030 • 2031 • 2032 • 2033 • 2034 • 2035 • 2036 • 2037 • 2038 • 2039 • 2040 • 2041 • 2042 • 2043 • 2044 • 2045 • 2046 • 2047 • 2048
- Прочие базы данных
- Data/Teams — словарь команд.
- Data/RatingCalc — единое хранилище словарей очков, рангов и ручных переопределений для движка подсчёта рейтинга.
- Технические страницы
- Cron/GenerateStats — служебный скрипт, предназначенный для агрегации, расчёта и кэширования полной базы данных финального турнира ЧТМ.
- Data/GrandStats.json (править) — огромная бандура для хранения генерируемого
Cron/GenerateStatsмашинного кода.
Обновление баз данных
Пока актуально только для финального турнира ЧТМ, но планируется расширить.
- Обновление
- Обновите или исправьте статистику на нужной подстранице, убедитесь, что нет ошибок синтаксиса.
- Откройте служебную страницу Развёртка шаблонов и вставьте следующий код:
{{#invoke:Cron/GenerateStats|main}} - Целиком скопируйте json-массив, перейдите на страницу Модуль:Data/GrandStats.json, удалите всё её содержимое и замените на только что скопированный код.
JSON-массивы занимают несколько мегабайт и хранить в SQL горы устаревшего нечитаемого кода абсолютно бессмысленно. Поэтому необходимо периодически чистить кэш от старых расчётов следующим образом:
Шаг 1. Находим old_id этих гигантских правок
Выполните следующий SQL-запрос:
SELECT old_id, LENGTH(old_text) AS size, old_flags
FROM text
ORDER BY size DESC
LIMIT 10;
Поскольку обычные статьи весят килобайты, этот запрос мгновенно выведет вам топ самых тяжелых правок за всю историю вашей вики. На первых строчках вы увидите ваши три правки размером ~2800000 байт.
Запишите их old_id.
Шаг 2. Обнуляем их вес (Освобождаем БД) Теперь мы просто превращаем этот машинный код в пустой, но валидный JSON-объект, чтобы не сломать парсер MediaWiki, если кто-то случайно откроет эту правку в истории. Выполните:
UPDATE text
SET old_text = '{"info": "Любой текст."}',
old_flags = 'utf-8'
WHERE old_id IN (НОМЕР, НОМЕР, НОМЕР);
(Замените цифры в скобках на те old_id, которые вы нашли на первом шаге).
Почему old_flags = 'utf-8'?
Иногда MediaWiki сжимает старые тяжелые правки и ставит флаг gzip или utf-8,gzip. Если мы заменяем сжатый бинарник на обычный текст, флаг gzip нужно обязательно убрать, иначе вики попытается «разархивировать» наш новый текст и выдаст ошибку. Флага utf-8 или вообще пустой строки '' будет достаточно.
Пожалуйста, добавляйте категории на страницу документации.
local p = {}
function p.showGoalsByYear(frame)
local cargo = mw.ext.cargo
-- 1. Получаем список всех уникальных годов из MatchID
local years_data = cargo.query(
'TWC_Goals',
'SUBSTR(MatchID, 1, 4)=Year', -- SUBSTR вместо SUBSTRING для совместимости с SQLite
{
groupBy = 'SUBSTR(MatchID, 1, 4)',
orderBy = 'SUBSTR(MatchID, 1, 4) ASC',
where = 'MatchID IS NOT NULL AND MatchID != ""'
}
)
local years = {}
for _, row in ipairs(years_data) do
if row.Year and row.Year ~= "" then
table.insert(years, row.Year)
end
end
-- 2. Динамически формируем поля для основного SQL-запроса
local fields = { "Scorer" }
for _, year in ipairs(years) do
local field_query = string.format("COUNT(CASE WHEN SUBSTRING(MatchID, 1, 4) = '%s' THEN 1 END)=%s", year, year)
table.insert(fields, field_query)
end
table.insert(fields, "COUNT(*)=Total") -- Столбец общего итога в конце
local fields = { "Scorer" }
for _, year in ipairs(years) do
-- Генерируем "COUNT(CASE WHEN MatchID LIKE 'YYYY-%' THEN 1 END)=yYYYY"
local field_query = string.format("COUNT(CASE WHEN MatchID LIKE '%s-%%' THEN 1 END)=y%s", year, year)
table.insert(fields, field_query)
end
table.insert(fields, "COUNT(*)=Total")
-- 3. Запрос к Cargo
local goals_data = cargo.query(
'TWC_Goals',
table.concat(fields, ", "),
{
where = 'Scorer IS NOT NULL AND Scorer != ""',
groupBy = 'Scorer',
orderBy = 'COUNT(*) DESC',
limit = 300
}
)
-- 4. Строим HTML-таблицу для вывода в вики
local tbl = mw.html.create('table')
:addClass('wikitable sortable')
-- Шапка таблицы
local header_tr = tbl:tag('tr')
header_tr:tag('th'):wikitext('Игрок')
for _, year in ipairs(years) do
header_tr:tag('th'):wikitext(year)
end
header_tr:tag('th'):wikitext('Всего')
-- Содержимое таблицы
-- При выводе строк таблицы обращаемся к полям через y-алиас:
for _, row in ipairs(goals_data) do
local tr = tbl:tag('tr')
tr:tag('td'):wikitext(row.Scorer)
for _, year in ipairs(years) do
local alias = "y" .. year -- собираем ключ y2022, y2023 и т.д.
local goals_count = tonumber(row[alias]) or 0
tr:tag('td')
:css('text-align', 'center')
:wikitext(goals_count > 0 and goals_count or "-")
end
tr:tag('td')
:css('text-align', 'center')
:css('font-weight', 'bold')
:wikitext(row.Total or 0)
end
return tostring(tbl)
end
return p