Модуль:Тест

Материал из ЧТМ
Версия от 03:58, 28 мая 2026; Lord (обсуждение | вклад) (Новая страница: «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',...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску
Документация Документация

Список баз данных

База данных финального турнира ЧТМ (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 машинного кода.

Обновление баз данных

Пока актуально только для финального турнира ЧТМ, но планируется расширить.

Обновление
  1. Обновите или исправьте статистику на нужной подстранице, убедитесь, что нет ошибок синтаксиса.
  2. Откройте служебную страницу Развёртка шаблонов и вставьте следующий код: {{#invoke:Cron/GenerateStats|main}}
  3. Целиком скопируйте json-массив, перейдите на страницу Модуль:Data/GrandStats.json, удалите всё её содержимое и замените на только что скопированный код.

Пожалуйста, добавляйте категории на страницу документации.

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