Przejdź do zawartości

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

Z Encyklopedia Poznanskiego Sportu
Utworzono nową stronę "local p = {} -- ========================================================= -- MODUŁ: STATYSTYKIHISTORYCZNE -- -- Łączne statystyki wszystkich zawodników Enea Basket Poznań -- ze wszystkich sezonów znajdujących się w Cargo. -- -- Rankingi: -- MECZE -- PUNKTY -- MINUTY -- ASYSTY -- ZBIÓRKI -- BLOKI -- -- Dane: -- UdzialZawodnika -- -- Uwzględniani są WYŁĄCZNIE zawodnicy, -- dla których: -- -- druzyna = "Enea Basket Poznań" -- -- =======…"
 
Nie podano opisu zmian
Linia 2: Linia 2:


-- =========================================================
-- =========================================================
-- MODUŁ: STATYSTYKIHISTORYCZNE
-- MODUŁ: STATYSTYKISTORYCZNE
--
--
-- Łączne statystyki wszystkich zawodników Enea Basket Poznań
-- Łączne statystyki zawodników drużyny koszykarskiej
-- ze wszystkich sezonów znajdujących się w Cargo.
-- ze wszystkich wprowadzonych sezonów.
--
--
-- Rankingi:
-- Tabele:
--   MECZE
-- 1. Mecze
--   PUNKTY
-- 2. Punkty
--   MINUTY
-- 3. Asysty
--   ASYSTY
-- 4. Zbiórki
--   ZBIÓRKI
-- 5. Bloki
--   BLOKI
-- 6. Minuty
--
--
-- Dane:
-- Użycie:
--  UdzialZawodnika
--
--
-- Uwzględniani są WYŁĄCZNIE zawodnicy,
-- {{#invoke:StatystykiHistoryczne|main
-- dla których:
-- |druzyna=Enea Basket Poznań
--
-- }}
--  druzyna = "Enea Basket Poznań"
--
--
-- Moduł jest uniwersalny dla drużyn koszykarskich.
-- =========================================================
-- =========================================================




-- =========================================================
-- =========================================================
-- USTAWIENIA
-- GŁÓWNA FUNKCJA
-- =========================================================
-- =========================================================


local NAZWA_DRUZYNY = "Enea Basket Poznań"
function p.main(frame)
 
    -- -----------------------------------------------------
    -- DRUŻYNA
    -- -----------------------------------------------------


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


-- =========================================================
-- FUNKCJA BEZPIECZNEJ KONWERSJI NA LICZBĘ
-- =========================================================


local function liczba(value)
    if druzyna == "" then


    local n = tonumber(value)
        return
            "''Nie podano drużyny.''"


    if n then
        return n
     end
     end


    return 0


end
    -- -----------------------------------------------------
    -- BEZPIECZNE PRZYGOTOWANIE NAZWY DRUŻYNY
    -- -----------------------------------------------------


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


-- =========================================================
-- FORMATOWANIE MINUT
--
-- Cargo przechowuje minuty jako liczbę całkowitą.
--
-- Przykład:
--
-- 65  -> 1:05
-- 125 -> 2:05
-- =========================================================


local function formatujMinuty(minuty)
    -- =====================================================
    -- POLA CARGO
    -- =====================================================


     minuty = liczba(minuty)
     local fields = table.concat({


    local godziny =
         "UdzialZawodnika.zawodnik=zawodnik",
         math.floor(minuty / 60)


    local min =
        "UdzialZawodnika.druzyna=druzyna",
        minuty % 60


    return string.format(
         "UdzialZawodnika.mecz=mecz",
         "%d:%02d",
        godziny,
        min
    )


end
        "UdzialZawodnika.minuty=minuty",


        "UdzialZawodnika.minuty_format=minuty_format",


-- =========================================================
        "UdzialZawodnika.gol=gol",
-- POBIERANIE DANYCH
-- =========================================================


function p.main(frame)
        "UdzialZawodnika.asysta=asysta",


        "UdzialZawodnika.zbiorka=zbiorka",


    -- =====================================================
         "UdzialZawodnika.blok=blok"
    -- POLA CARGO
    -- =====================================================
 
    local fields = table.concat({
 
        "zawodnik=zawodnik",
        "mecz=mecz",
        "minuty=minuty",
        "gol=gol",
        "asysta=asysta",
        "zbiorka=zbiorka",
         "blok=blok"


     }, ",")
     }, ",")
Linia 105: Linia 89:


     -- =====================================================
     -- =====================================================
     -- ZAPYTANIE
     -- ZAPYTANIE CARGO
    --
    -- TYLKO ENEA BASKET POZNAŃ
    --
    -- Nie ma tutaj filtra sezonu.
    -- Dzięki temu pobierane są WSZYSTKIE
    -- wprowadzone sezony.
     -- =====================================================
     -- =====================================================


Linia 117: Linia 95:


         where =
         where =
             "druzyna='"
             "UdzialZawodnika.druzyna='"
             .. NAZWA_DRUZYNY
             .. druzynaSQL
             .. "'",
             .. "'",


         limit = 50000
         limit = 5000


     }
     }
Linia 141: Linia 119:


         return
         return
             "''Brak danych statystycznych "
             "''Brak statystyk dla drużyny "
             .. "dla Enea Basket Poznań w bazie.''"
            .. druzyna
             .. " w bazie.''"


     end
     end
Linia 148: Linia 127:


     -- =====================================================
     -- =====================================================
     -- TABLICA ZAWODNIKÓW
     -- STRUKTURA ZAWODNIKA
     -- =====================================================
     -- =====================================================


Linia 155: Linia 134:


     -- =====================================================
     -- =====================================================
     -- GRUPOWANIE DANYCH
     -- FUNKCJA NOWEGO REKORDU
     -- =====================================================
     -- =====================================================


     for _, row in ipairs(rows) do
     local function nowyZawodnik()
 
        return {
 
            mecze = 0,
 
            punkty = 0,
 
            asysty = 0,
 
            zbiorki = 0,
 
            bloki = 0,
 
            minuty = 0


        }


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




        if zawodnik ~= "" then
    -- =====================================================
    -- POMOCNICZA FUNKCJA LICZBOWA
    -- =====================================================


    local function liczba(wartosc)


            -- ---------------------------------------------
        return
             -- UTWORZENIE REKORDU ZAWODNIKA
             tonumber(wartosc or 0)
             -- ---------------------------------------------
             or 0


            if not zawodnicy[zawodnik] then
    end


                zawodnicy[zawodnik] = {


                    mecze = 0,
    -- =====================================================
    -- ZLICZANIE STATYSTYK
    -- =====================================================


                    punkty = 0,
    for _, row in ipairs(rows) do


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


                    asysty = 0,


                    zbiorki = 0,
        if zawodnik ~= "" then


                    bloki = 0
            if not zawodnicy[zawodnik] then


                 }
                 zawodnicy[zawodnik] =
                    nowyZawodnik()


             end
             end
Linia 201: Linia 199:
             -- ---------------------------------------------
             -- ---------------------------------------------
             -- MECZ
             -- MECZ
            --
            -- Każdy rekord UdzialZawodnika odpowiada
            -- jednemu występowi w meczu.
             -- ---------------------------------------------
             -- ---------------------------------------------


Linia 217: Linia 212:
                 stat.punkty
                 stat.punkty
                 + liczba(row.gol)
                 + liczba(row.gol)
            -- ---------------------------------------------
            -- MINUTY
            -- ---------------------------------------------
            stat.minuty =
                stat.minuty
                + liczba(row.minuty)




Linia 253: Linia 239:
                 stat.bloki
                 stat.bloki
                 + liczba(row.blok)
                 + liczba(row.blok)
            -- ---------------------------------------------
            -- MINUTY
            --
            -- Cargo przechowuje minuty jako Integer.
            -- Przyjmujemy, że jest to liczba minut.
            -- ---------------------------------------------
            stat.minuty =
                stat.minuty
                + liczba(row.minuty)


         end
         end
Linia 263: Linia 261:
     -- =====================================================
     -- =====================================================


     local listaZawodnikow = {}
     local lista = {}




Linia 269: Linia 267:


         table.insert(
         table.insert(
             listaZawodnikow,
             lista,
             {
             {
                 zawodnik = zawodnik,
                 zawodnik = zawodnik,
Linia 280: Linia 278:


     -- =====================================================
     -- =====================================================
     -- FUNKCJA TWORZĄCA RANKING
     -- FORMATOWANIE MINUT
    -- =====================================================
    --
    -- sortowane malejąco według wybranej statystyki.
    --
    -- Przy takiej samej wartości:
    -- alfabetycznie według nazwiska.
    --
    -- Miejsce jest liczone jako ranking konkursowy:
    --
    -- 1.
    -- 2.
    -- 2.
    -- 4.
    --
     -- =====================================================
     -- =====================================================


     local function ranking(pole)
     local function formatujMinuty(minuty)


        minuty =
            tonumber(minuty)
            or 0


        local lista = {}


 
         local godziny =
         for _, rekord in ipairs(listaZawodnikow) do
             math.floor(
 
                 minuty / 60
             table.insert(
                 lista,
                {
                    zawodnik = rekord.zawodnik,
                    wartosc = rekord.stat[pole]
                }
             )
             )


        end


        local min =
            minuty % 60


        table.sort(
            lista,
            function(a, b)


                if a.wartosc ~= b.wartosc then
        return string.format(
            "%d:%02d",
            godziny,
            min
        )


                    return a.wartosc > b.wartosc
    end


                end


    -- =====================================================
    -- LINK DO ZAWODNIKA
    --
    -- Zakładamy, że strona zawodnika ma nazwę identyczną
    -- z polem "zawodnik" w Cargo.
    -- =====================================================


                return
    local function linkZawodnika(nazwa)
                    a.zawodnik < b.zawodnik


             end
        return
        )
             "[["
 
            .. nazwa
 
            .. "|"
        return lista
            .. nazwa
            .. "]]"


     end
     end
Linia 340: Linia 327:


     -- =====================================================
     -- =====================================================
     -- GENEROWANIE POJEDYNCZEJ TABELI
     -- GENEROWANIE JEDNEJ TABELI
     -- =====================================================
     -- =====================================================


     local function generujTabele(
     local function generujTabele(
         tytul,
         tytul,
         pole,
         pole,
         formatWartosci,
         formatWartosci,
         ikona
         ikona
    )
        -- ---------------------------------------------
        -- SORTOWANIE
        -- ---------------------------------------------
        table.sort(
            lista,
            function(a, b)


    )
                local wartoscA =
                    a.stat[pole]
                    or 0




        local lista =
                local wartoscB =
            ranking(pole)
                    b.stat[pole]
                    or 0




        local wynik = {}
                if wartoscA ~= wartoscB then


                    return wartoscA > wartoscB


        -- -----------------------------------------------
                end
        -- KONTENER
        -- -----------------------------------------------


        table.insert(


            wynik,
                -- Przy remisie alfabetycznie