Przejdź do zawartości

Moduł:StatystykiHistoryczne: Różnice pomiędzy wersjami

Z Encyklopedia Poznanskiego Sportu
Nie podano opisu zmian
Nie podano opisu zmian
 
(Nie pokazano 2 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 24: Linia 24:
-- }}
-- }}
--
--
-- Zawodnicy występujący w ostatnim wprowadzonym
-- Zawodnicy występujący w wybranym sezonie
-- sezonie są wyróżniani pogrubieniem.
-- są wyróżniani pogrubieniem.
--
-- Jeżeli podany sezon bieżący nie ma jeszcze danych,
-- automatycznie używany jest ostatni sezon obecny
-- w bazie.
-- =========================================================
-- =========================================================


Linia 102: Linia 98:


     -- =====================================================
     -- =====================================================
     -- USTALENIE SEZONU REFERENCYJNEGO
     -- USTALENIE SEZONU WYRÓŻNIENIA
    --
    -- 1. Jeżeli podany sezon ma jakiekolwiek wpisy
    --    dla drużyny, używamy tego sezonu.
    --
    -- 2. Jeżeli nie ma w nim żadnych wpisów,
    --    szukamy ostatniego sezonu obecnego w bazie.
    --
    -- UWAGA:
    -- Nie sprawdzamy tutaj minuty > 0.
    -- Sam fakt istnienia wpisu w UdzialZawodnika
    -- oznacza, że zawodnik jest wpisany do danego sezonu.
     -- =====================================================
     -- =====================================================


Linia 120: Linia 105:




     -- =====================================================
     -- -----------------------------------------------------
     -- SPRAWDZENIE PODANEGO SEZONU
     -- Najpierw sprawdzamy sezon podany przez użytkownika
     -- =====================================================
     -- -----------------------------------------------------


     if sezonSQL ~= "" then
     if sezonSQL ~= "" then
Linia 142: Linia 127:
                         .. " AND Mecze.sezon='"
                         .. " AND Mecze.sezon='"
                         .. sezonSQL
                         .. sezonSQL
                         .. "'",
                         .. "'"
                        .. " AND UdzialZawodnika.minuty > 0",


                     groupBy =
                     groupBy =
Linia 164: Linia 150:


     -- =====================================================
     -- =====================================================
     -- JEŻELI BRAK DANYCH DLA PODANEGO SEZONU
     -- JEŻELI NIE MA DANYCH DLA PODANEGO SEZONU
     -- SZUKAMY OSTATNIEGO WPROWADZONEGO SEZONU
     -- SZUKAMY OSTATNIEGO SEZONU
     -- =====================================================
     -- =====================================================


Linia 183: Linia 169:
                         "UdzialZawodnika.druzyna='"
                         "UdzialZawodnika.druzyna='"
                         .. druzynaSQL
                         .. druzynaSQL
                         .. "'",
                         .. "'"
                        .. " AND UdzialZawodnika.minuty > 0",


                     groupBy =
                     groupBy =
Linia 235: Linia 222:
     -- =====================================================
     -- =====================================================


    local where =
local where =
        "UdzialZawodnika.druzyna='"
    "UdzialZawodnika.druzyna='"
        .. druzynaSQL
    .. druzynaSQL
        .. "'"
    .. "'"
    .. " AND UdzialZawodnika.minuty > 0"




Linia 275: Linia 263:


     -- =====================================================
     -- =====================================================
     -- AKTUALNI / OSTATNI ZAWODNICY
     -- AKTUALNI ZAWODNICY
    --
    -- Zawodnik jest wyróżniony, jeżeli ma wpis
    -- w sezonie referencyjnym.
    --
    -- Nie wymagamy minuty > 0.
     -- =====================================================
     -- =====================================================


Linia 312: Linia 295:
                         .. " AND Mecze.sezon='"
                         .. " AND Mecze.sezon='"
                         .. sezonAktualnySQL
                         .. sezonAktualnySQL
                         .. "'",
                         .. "'"
                        .. " AND UdzialZawodnika.minuty > 0",


                     groupBy =
                     groupBy =
Linia 374: Linia 358:
                         liczba(row.punkty),
                         liczba(row.punkty),


                    -- Cargo przechowuje minuty jako SEKUNDY
                     minuty =
                     minuty =
                         liczba(row.minuty),
                         liczba(row.minuty),
Linia 400: Linia 385:
     -- FORMATOWANIE MINUT
     -- FORMATOWANIE MINUT
     --
     --
     -- Cargo przechowuje wartość jako SEKUNDY.
     -- WAŻNE:
    -- Pole UdzialZawodnika.minuty jest zapisane w SEKUNDACH.
     --
     --
     -- Przykład:
     -- Przykład:
    -- 103775 sekund = 1729 minut 35 sekund
     --
     --
     -- 103775 sekund
     -- Wynik:
    -- = 1729 minut i 35 sekund
     -- 1729:35
     -- = 1729:35
    --
    -- Format:
    -- MM:SS
    --
    -- Pierwsza część NIE jest ograniczona do 59.
     -- =====================================================
     -- =====================================================


Linia 465: Linia 446:


         -- -------------------------------------------------
         -- -------------------------------------------------
         -- ZAWODNIK Z SEZONU REFERENCYJNEGO
         -- AKTUALNY ZAWODNIK = POGRUBIENIE
         -- -------------------------------------------------
         -- -------------------------------------------------


Linia 680: Linia 661:


         -- -------------------------------------------------
         -- -------------------------------------------------
         -- POCZĄTEK TABELI
         -- TABELA
         -- -------------------------------------------------
         -- -------------------------------------------------


Linia 690: Linia 671:


         -- -------------------------------------------------
         -- -------------------------------------------------
         -- TYTUŁ
         -- NAGŁÓWEK
         -- -------------------------------------------------
         -- -------------------------------------------------


Linia 701: Linia 682:




         -- -------------------------------------------------
         table.insert(
         -- NAGŁÓWKI
            wynik,
         -- -------------------------------------------------
            "! Miejsce"
         )
 
 
         table.insert(
            wynik,
            "! Zawodnik"
        )
 


         table.insert(
         table.insert(
             wynik,
             wynik,
             "! Miejsce !! Zawodnik !! "
             "! "
             .. definicja.nazwa
             .. definicja.nazwa
         )
         )
Linia 723: Linia 712:
             )
             )


            -- miejsce


             table.insert(
             table.insert(
Linia 728: Linia 719:
                 "| "
                 "| "
                 .. i
                 .. i
                 .. " || "
            )
                 .. linkZawodnika(zawodnik)
 
                 .. " || '''"
 
            -- zawodnik
 
            table.insert(
                wynik,
                 "| "
                 .. linkZawodnika(
                    zawodnik
                )
            )
 
 
            -- wartość
 
            table.insert(
                wynik,
                 "| '''"
                 .. definicja.format(
                 .. definicja.format(
                     zawodnik[
                     zawodnik[
Linia 741: Linia 748:
         end
         end


        -- -------------------------------------------------
        -- KONIEC TABELI
        -- -------------------------------------------------


         table.insert(
         table.insert(
Linia 782: Linia 785:


     -- =====================================================
     -- =====================================================
     -- INFORMACJA O SEZONIE REFERENCYJNYM
     -- INFORMACJA O AKTUALNYCH ZAWODNIKACH
     -- =====================================================
     -- =====================================================


Linia 789: Linia 792:
         table.insert(
         table.insert(
             wynik,
             wynik,
             "''Pogrubieniem wyróżniono zawodników "
             "'''''Pogrubieniem wyróżniono zawodników "
             .. "występujących w sezonie "
             .. "występujących w sezonie "
            .. "'''"
             .. sezonWyroznienia
             .. sezonWyroznienia
             .. "'''.''"
             .. ".'''''"
         )
         )


Linia 800: Linia 802:
             wynik,
             wynik,
             ""
             ""
         )
         )


     end
     end
    -- =====================================================
    -- UKŁAD 3 KOLUMNY
    --
    -- WAŻNE:
    -- Każda tabela zaczyna się od początku linii.
    -- Dzięki temu MediaWiki poprawnie rozpoznaje
    -- składnię {| ... |}.
    -- =====================================================
    table.insert(
        wynik,
        '<div style="display:flex; flex-wrap:wrap; gap:12px; align-items:flex-start;">'
    )




Linia 808: Linia 826:
     -- TABELA 1 – MECZE
     -- TABELA 1 – MECZE
     -- =====================================================
     -- =====================================================
    table.insert(
        wynik,
        '<div style="flex:1 1 calc(33.333% - 12px); min-width:280px;">'
    )


     table.insert(
     table.insert(
Linia 815: Linia 838:
         )
         )
     )
     )


     table.insert(
     table.insert(
         wynik,
         wynik,
         ""
         "</div>"
     )
     )


Linia 826: Linia 848:
     -- TABELA 2 – PUNKTY
     -- TABELA 2 – PUNKTY
     -- =====================================================
     -- =====================================================
    table.insert(
        wynik,
        '<div style="flex:1 1 calc(33.333% - 12px); min-width:280px;">'
    )


     table.insert(
     table.insert(
Linia 833: Linia 860:
         )
         )
     )
     )


     table.insert(
     table.insert(
         wynik,
         wynik,
         ""
         "</div>"
     )
     )


Linia 844: Linia 870:
     -- TABELA 3 – MINUTY
     -- TABELA 3 – MINUTY
     -- =====================================================
     -- =====================================================
    table.insert(
        wynik,
        '<div style="flex:1 1 calc(33.333% - 12px); min-width:280px;">'
    )


     table.insert(
     table.insert(
Linia 851: Linia 882:
         )
         )
     )
     )


     table.insert(
     table.insert(
         wynik,
         wynik,
         ""
         "</div>"
     )
     )


Linia 862: Linia 892:
     -- TABELA 4 – ASYSTY
     -- TABELA 4 – ASYSTY
     -- =====================================================
     -- =====================================================
    table.insert(
        wynik,
        '<div style="flex:1 1 calc(33.333% - 12px); min-width:280px;">'
    )


     table.insert(
     table.insert(
Linia 869: Linia 904:
         )
         )
     )
     )


     table.insert(
     table.insert(
         wynik,
         wynik,
         ""
         "</div>"
     )
     )


Linia 880: Linia 914:
     -- TABELA 5 – ZBIÓRKI
     -- TABELA 5 – ZBIÓRKI
     -- =====================================================
     -- =====================================================
    table.insert(
        wynik,
        '<div style="flex:1 1 calc(33.333% - 12px); min-width:280px;">'
    )


     table.insert(
     table.insert(
Linia 887: Linia 926:
         )
         )
     )
     )


     table.insert(
     table.insert(
         wynik,
         wynik,
         ""
         "</div>"
     )
     )


Linia 898: Linia 936:
     -- TABELA 6 – BLOKI
     -- TABELA 6 – BLOKI
     -- =====================================================
     -- =====================================================
    table.insert(
        wynik,
        '<div style="flex:1 1 calc(33.333% - 12px); min-width:280px;">'
    )


     table.insert(
     table.insert(
Linia 904: Linia 947:
             tabele[6]
             tabele[6]
         )
         )
    )
    table.insert(
        wynik,
        "</div>"
    )
    -- =====================================================
    -- KONIEC UKŁADU
    -- =====================================================
    table.insert(
        wynik,
        "</div>"
     )
     )



Aktualna wersja na dzień 00:56, 1 wrz 2026

Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:StatystykiHistoryczne/opis

local p = {}

-- =========================================================
-- MODUŁ: STATYSTYKIHISTORYCZNE
--
-- Łączne statystyki zawodników ze wszystkich
-- wprowadzonych sezonów.
--
-- KOSZYKÓWKA
--
-- Tabele:
-- 1. Mecze
-- 2. Punkty
-- 3. Minuty
-- 4. Asysty
-- 5. Zbiórki
-- 6. Bloki
--
-- Użycie:
--
-- {{#invoke:StatystykiHistoryczne|main
-- |druzyna=Enea Basket Poznań
-- |sezon_biezacy=2025/2026
-- }}
--
-- Zawodnicy występujący w wybranym sezonie
-- są wyróżniani pogrubieniem.
-- =========================================================


function p.main(frame)

    -- =====================================================
    -- PARAMETRY
    -- =====================================================

    local druzyna =
        mw.text.trim(
            frame.args.druzyna or ""
        )

    local sezonBiezacy =
        mw.text.trim(
            frame.args.sezon_biezacy or ""
        )


    -- =====================================================
    -- SPRAWDZENIE DRUŻYNY
    -- =====================================================

    if druzyna == "" then

        return
            "'''Błąd:''' nie podano parametru <code>druzyna</code>."

    end


    -- =====================================================
    -- BEZPIECZNE PRZYGOTOWANIE NAZW
    -- =====================================================

    local druzynaSQL =
        mw.ustring.gsub(
            druzyna,
            "'",
            "''"
        )


    local sezonSQL = ""

    if sezonBiezacy ~= "" then

        sezonSQL =
            mw.ustring.gsub(
                sezonBiezacy,
                "'",
                "''"
            )

    end


    -- =====================================================
    -- FUNKCJA LICZBOWA
    -- =====================================================

    local function liczba(value)

        return
            tonumber(value or 0)
            or 0

    end


    -- =====================================================
    -- USTALENIE SEZONU WYRÓŻNIENIA
    -- =====================================================

    local sezonWyroznienia = ""
    local znalezionoBiezacy = false


    -- -----------------------------------------------------
    -- Najpierw sprawdzamy sezon podany przez użytkownika
    -- -----------------------------------------------------

    if sezonSQL ~= "" then

        local sprawdzenieSezonu =
            mw.ext.cargo.query(
                "UdzialZawodnika,Mecze",

                "UdzialZawodnika.zawodnik=zawodnik",

                {
                    join =
                        "UdzialZawodnika.mecz=Mecze.id",

                    where =
                        "UdzialZawodnika.druzyna='"
                        .. druzynaSQL
                        .. "'"
                        .. " AND Mecze.sezon='"
                        .. sezonSQL
                        .. "'"
                        .. " AND UdzialZawodnika.minuty > 0",

                    groupBy =
                        "UdzialZawodnika.zawodnik",

                    limit = 5000
                }
            )


        if sprawdzenieSezonu
            and #sprawdzenieSezonu > 0 then

            sezonWyroznienia = sezonBiezacy
            znalezionoBiezacy = true

        end

    end


    -- =====================================================
    -- JEŻELI NIE MA DANYCH DLA PODANEGO SEZONU
    -- SZUKAMY OSTATNIEGO SEZONU
    -- =====================================================

    if not znalezionoBiezacy then

        local sezony =
            mw.ext.cargo.query(
                "UdzialZawodnika,Mecze",

                "Mecze.sezon=sezon",

                {
                    join =
                        "UdzialZawodnika.mecz=Mecze.id",

                    where =
                        "UdzialZawodnika.druzyna='"
                        .. druzynaSQL
                        .. "'"
                        .. " AND UdzialZawodnika.minuty > 0",

                    groupBy =
                        "Mecze.sezon",

                    orderBy =
                        "Mecze.sezon DESC",

                    limit = 100
                }
            )


        if sezony and #sezony > 0 then

            sezonWyroznienia =
                mw.text.trim(
                    sezony[1].sezon or ""
                )

        end

    end


    -- =====================================================
    -- POBRANIE ŁĄCZNYCH DANYCH STATYSTYCZNYCH
    -- =====================================================

    local fields = table.concat({

        "UdzialZawodnika.zawodnik=zawodnik",

        "COUNT(UdzialZawodnika.mecz)=mecze",

        "SUM(UdzialZawodnika.gol)=punkty",

        "SUM(UdzialZawodnika.minuty)=minuty",

        "SUM(UdzialZawodnika.asysta)=asysty",

        "SUM(UdzialZawodnika.zbiorka)=zbiorki",

        "SUM(UdzialZawodnika.blok)=bloki"

    }, ",")


    -- =====================================================
    -- WARUNEK
    -- =====================================================

local where =
    "UdzialZawodnika.druzyna='"
    .. druzynaSQL
    .. "'"
    .. " AND UdzialZawodnika.minuty > 0"


    -- =====================================================
    -- ZAPYTANIE
    -- =====================================================

    local rows =
        mw.ext.cargo.query(
            "UdzialZawodnika",
            fields,
            {
                where = where,

                groupBy =
                    "UdzialZawodnika.zawodnik",

                limit = 5000
            }
        )


    -- =====================================================
    -- BRAK DANYCH
    -- =====================================================

    if not rows or #rows == 0 then

        return
            "''Brak danych statystycznych dla drużyny "
            .. druzyna
            .. ".''"

    end


    -- =====================================================
    -- AKTUALNI ZAWODNICY
    -- =====================================================

    local aktualni = {}


    if sezonWyroznienia ~= "" then

        local sezonAktualnySQL =
            mw.ustring.gsub(
                sezonWyroznienia,
                "'",
                "''"
            )


        local currentRows =
            mw.ext.cargo.query(
                "UdzialZawodnika,Mecze",

                "UdzialZawodnika.zawodnik=zawodnik",

                {
                    join =
                        "UdzialZawodnika.mecz=Mecze.id",

                    where =
                        "UdzialZawodnika.druzyna='"
                        .. druzynaSQL
                        .. "'"
                        .. " AND Mecze.sezon='"
                        .. sezonAktualnySQL
                        .. "'"
                        .. " AND UdzialZawodnika.minuty > 0",

                    groupBy =
                        "UdzialZawodnika.zawodnik",

                    limit = 5000
                }
            )


        if currentRows then

            for _, row in ipairs(currentRows) do

                local zawodnik =
                    mw.text.trim(
                        row.zawodnik or ""
                    )


                if zawodnik ~= "" then

                    aktualni[zawodnik] = true

                end

            end

        end

    end


    -- =====================================================
    -- PRZYGOTOWANIE DANYCH
    -- =====================================================

    local zawodnicy = {}


    for _, row in ipairs(rows) do

        local zawodnik =
            mw.text.trim(
                row.zawodnik or ""
            )


        if zawodnik ~= "" then

            table.insert(
                zawodnicy,
                {

                    zawodnik = zawodnik,

                    mecze =
                        liczba(row.mecze),

                    punkty =
                        liczba(row.punkty),

                    -- Cargo przechowuje minuty jako SEKUNDY
                    minuty =
                        liczba(row.minuty),

                    asysty =
                        liczba(row.asysty),

                    zbiorki =
                        liczba(row.zbiorki),

                    bloki =
                        liczba(row.bloki),

                    aktualny =
                        aktualni[zawodnik] or false

                }
            )

        end

    end


    -- =====================================================
    -- FORMATOWANIE MINUT
    --
    -- WAŻNE:
    -- Pole UdzialZawodnika.minuty jest zapisane w SEKUNDACH.
    --
    -- Przykład:
    -- 103775 sekund = 1729 minut 35 sekund
    --
    -- Wynik:
    -- 1729:35
    -- =====================================================

    local function formatujMinuty(sekundy)

        local wartosc =
            tonumber(sekundy or 0)
            or 0


        wartosc =
            math.floor(
                wartosc + 0.5
            )


        local caleMinuty =
            math.floor(
                wartosc / 60
            )


        local pozostaleSekundy =
            wartosc % 60


        return string.format(
            "%d:%02d",
            caleMinuty,
            pozostaleSekundy
        )

    end


    -- =====================================================
    -- LINK DO ZAWODNIKA
    -- =====================================================

    local function linkZawodnika(row)

        local nazwa =
            row.zawodnik


        local tekst =
            "[["
            .. nazwa
            .. "|"
            .. nazwa
            .. "]]"


        -- -------------------------------------------------
        -- AKTUALNY ZAWODNIK = POGRUBIENIE
        -- -------------------------------------------------

        if row.aktualny then

            tekst =
                "'''"
                .. tekst
                .. "'''"

        end


        return tekst

    end


    -- =====================================================
    -- SORTOWANIE
    -- =====================================================

    local funkcjeSortowania = {

        mecze = function(a, b)

            if a.mecze ~= b.mecze then

                return a.mecze > b.mecze

            end

            return a.zawodnik < b.zawodnik

        end,


        punkty = function(a, b)

            if a.punkty ~= b.punkty then

                return a.punkty > b.punkty

            end

            return a.zawodnik < b.zawodnik

        end,


        minuty = function(a, b)

            if a.minuty ~= b.minuty then

                return a.minuty > b.minuty

            end

            return a.zawodnik < b.zawodnik

        end,


        asysty = function(a, b)

            if a.asysty ~= b.asysty then

                return a.asysty > b.asysty

            end

            return a.zawodnik < b.zawodnik

        end,


        zbiorki = function(a, b)

            if a.zbiorki ~= b.zbiorki then

                return a.zbiorki > b.zbiorki

            end

            return a.zawodnik < b.zawodnik

        end,


        bloki = function(a, b)

            if a.bloki ~= b.bloki then

                return a.bloki > b.bloki

            end

            return a.zawodnik < b.zawodnik

        end

    }


    -- =====================================================
    -- DEFINICJA TABEL
    -- =====================================================

    local tabele = {

        {
            nazwa = "MECZE",
            pole = "mecze",

            format = function(v)

                return tostring(v)

            end
        },


        {
            nazwa = "PUNKTY",
            pole = "punkty",

            format = function(v)

                return tostring(v)

            end
        },


        {
            nazwa = "MINUTY",
            pole = "minuty",

            format = function(v)

                return formatujMinuty(v)

            end
        },


        {
            nazwa = "ASYSTY",
            pole = "asysty",

            format = function(v)

                return tostring(v)

            end
        },


        {
            nazwa = "ZBIÓRKI",
            pole = "zbiorki",

            format = function(v)

                return tostring(v)

            end
        },


        {
            nazwa = "BLOKI",
            pole = "bloki",

            format = function(v)

                return tostring(v)

            end
        }

    }


    -- =====================================================
    -- BUDOWANIE POJEDYNCZEJ TABELI
    -- =====================================================

    local function zbudujTabele(definicja)

        local lista = {}


        for _, zawodnik in ipairs(zawodnicy) do

            table.insert(
                lista,
                zawodnik
            )

        end


        table.sort(
            lista,
            funkcjeSortowania[
                definicja.pole
            ]
        )


        local wynik = {}


        -- -------------------------------------------------
        -- TABELA
        -- -------------------------------------------------

        table.insert(
            wynik,
            '{| class="wikitable" style="width:100%; text-align:center;"'
        )


        -- -------------------------------------------------
        -- NAGŁÓWEK
        -- -------------------------------------------------

        table.insert(
            wynik,
            "|+ '''"
            .. definicja.nazwa
            .. "'''"
        )


        table.insert(
            wynik,
            "! Miejsce"
        )


        table.insert(
            wynik,
            "! Zawodnik"
        )


        table.insert(
            wynik,
            "! "
            .. definicja.nazwa
        )


        -- -------------------------------------------------
        -- WIERSZE
        -- -------------------------------------------------

        for i, zawodnik in ipairs(lista) do

            table.insert(
                wynik,
                "|-"
            )


            -- miejsce

            table.insert(
                wynik,
                "| "
                .. i
            )


            -- zawodnik

            table.insert(
                wynik,
                "| "
                .. linkZawodnika(
                    zawodnik
                )
            )


            -- wartość

            table.insert(
                wynik,
                "| '''"
                .. definicja.format(
                    zawodnik[
                        definicja.pole
                    ]
                )
                .. "'''"
            )

        end


        table.insert(
            wynik,
            "|}"
        )


        return table.concat(
            wynik,
            "\n"
        )

    end


    -- =====================================================
    -- WYNIK
    -- =====================================================

    local wynik = {}


    table.insert(
        wynik,
        "== Statystyki historyczne – "
        .. druzyna
        .. " =="
    )


    table.insert(
        wynik