Przejdź do zawartości

Moduł:KontrolaWystepow

Z Encyklopedia Poznanskiego Sportu

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

local p = {}

-- =========================================================
-- MODUŁ: KontrolaWystepow
--
-- Automatyczna kontrola danych:
--
-- 1. UdzialZawodnika -> Mecze
-- 2. zgodność zawodnik / drużyna / mecz
-- 3. duplikaty udziałów
-- 4. brakujące powiązania z meczami
-- 5. kontrola statystyk
-- 6. SztabMeczu -> Mecze
-- 7. podsumowanie wyników kontroli
--
-- Moduł nie wymaga podawania zawodnika.
-- =========================================================


function p.main(frame)

    local wynik = {}

    -- =====================================================
    -- FUNKCJE POMOCNICZE
    -- =====================================================

    local function liczba(v)

        if v == nil or v == "" then
            return 0
        end

        v = tostring(v)

        v = mw.ustring.gsub(
            v,
            "%s+",
            ""
        )

        return tonumber(v) or 0

    end


    local function dodaj(t, tekst)

        table.insert(
            t,
            tekst
        )

    end


    local function bezpieczny(v)

        if v == nil then
            return ""
        end

        return tostring(v)

    end


    -- =====================================================
    -- LICZNIKI
    -- =====================================================

    local kontrola = {

        udzialy = 0,

        poprawne = 0,

        brakMeczu = 0,

        zlaDruzyna = 0,

        duplikaty = 0,

        statystyki = 0,

        sztab = 0,

        sztabBrakMeczu = 0,

        sztabZlaDruzyna = 0

    }


    -- =====================================================
    -- TABLICE BŁĘDÓW
    -- =====================================================

    local brakMeczu = {}

    local zlaDruzyna = {}

    local duplikaty = {}

    local bledneStatystyki = {}

    local sztabBrakMeczu = {}

    local sztabZlaDruzyna = {}


    -- =====================================================
    -- POBRANIE UDZIAŁÓW ZAWODNIKÓW
    -- =====================================================

    local fields = table.concat({

        "UdzialZawodnika.mecz=mecz",

        "UdzialZawodnika.zawodnik=zawodnik",

        "UdzialZawodnika.druzyna=druzyna",

        "UdzialZawodnika.numer=numer",

        "UdzialZawodnika.minuty=minuty",

        "UdzialZawodnika.minuty_format=minuty_format",

        "UdzialZawodnika.gol=gol",

        "UdzialZawodnika.asysta=asysta",

        "UdzialZawodnika.zbiorka=zbiorka",

        "UdzialZawodnika.eval=eval",

        "UdzialZawodnika.plusminus=plusminus",

        "Mecze.id=id_meczu",

        "Mecze.data=data",

        "Mecze.sezon=sezon",

        "Mecze.druzyna1=druzyna1",

        "Mecze.druzyna2=druzyna2",

        "Mecze.wynik=wynik"

    }, ",")


    local rows = mw.ext.cargo.query(

        "UdzialZawodnika,Mecze",

        fields,

        {

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

            orderBy =
                "Mecze.data ASC",

            limit = 50000

        }

    )


    -- =====================================================
    -- MAPA WSZYSTKICH UDZIAŁÓW
    --
    -- potrzebna do wykrywania duplikatów
    -- =====================================================

    local mapaUdzialow = {}


    -- =====================================================
    -- PRZETWARZANIE UDZIAŁÓW
    -- =====================================================

    if rows then

        for _, row in ipairs(rows) do

            kontrola.udzialy =
                kontrola.udzialy + 1


            local mecz =
                bezpieczny(row.mecz)

            local zawodnik =
                bezpieczny(row.zawodnik)

            local druzyna =
                bezpieczny(row.druzyna)


            -- =============================================
            -- DUPLIKAT
            -- =============================================

            local klucz =
                zawodnik
                .. "|"
                .. druzyna
                .. "|"
                .. mecz


            mapaUdzialow[klucz] =
                (mapaUdzialow[klucz] or 0) + 1


            -- =============================================
            -- KONTROLA POWIĄZANIA Z MECZEM
            -- =============================================

            local idMeczu =
                bezpieczny(row.id_meczu)


            if idMeczu == "" then

                kontrola.brakMeczu =
                    kontrola.brakMeczu + 1


                table.insert(
                    brakMeczu,
                    row
                )

            else

                -- =========================================
                -- KONTROLA DRUŻYNY
                -- =========================================

                local d1 =
                    bezpieczny(row.druzyna1)

                local d2 =
                    bezpieczny(row.druzyna2)


                if druzyna ~= d1
                    and druzyna ~= d2 then

                    kontrola.zlaDruzyna =
                        kontrola.zlaDruzyna + 1


                    table.insert(
                        zlaDruzyna,
                        row
                    )

                else

                    kontrola.poprawne =
                        kontrola.poprawne + 1

                end


                -- =========================================
                -- KONTROLA STATYSTYK
                -- =========================================

                local minuty =
                    liczba(row.minuty)

                local punkty =
                    liczba(row.gol)

                local asysty =
                    liczba(row.asysta)

                local zbiorki =
                    liczba(row.zbiorka)

                local eval =
                    liczba(row.eval)


                local problem = false


                if minuty < 0 then
                    problem = true
                end

                if punkty < 0 then
                    problem = true
                end

                if asysty < 0 then
                    problem = true
                end

                if zbiorki < 0 then
                    problem = true
                end


                if problem then

                    kontrola.statystyki =
                        kontrola.statystyki + 1


                    table.insert(
                        bledneStatystyki,
                        row
                    )

                end

            end

        end

    end


    -- =====================================================
    -- WYKRYWANIE DUPLIKATÓW
    -- =====================================================

    for klucz, ile in pairs(mapaUdzialow) do

        if ile > 1 then

            kontrola.duplikaty =
                kontrola.duplikaty + 1


            table.insert(
                duplikaty,
                {
                    klucz = klucz,
                    ile = ile
                }
            )

        end

    end


    -- =====================================================
    -- KONTROLA SZTABU
    -- =====================================================

    local fieldsSztab = table.concat({

        "SztabMeczu.mecz=mecz",

        "SztabMeczu.osoba=osoba",

        "SztabMeczu.druzyna=druzyna",

        "SztabMeczu.rola=rola",

        "Mecze.id=id_meczu",

        "Mecze.data=data",

        "Mecze.sezon=sezon",

        "Mecze.druzyna1=druzyna1",

        "Mecze.druzyna2=druzyna2"

    }, ",")


    local sztab = mw.ext.cargo.query(

        "SztabMeczu,Mecze",

        fieldsSztab,

        {

            join =
                "SztabMeczu.mecz=Mecze.id",

            orderBy =
                "Mecze.data ASC",

            limit = 50000

        }

    )


    if sztab then

        for _, row in ipairs(sztab) do

            kontrola.sztab =
                kontrola.sztab + 1


            local idMeczu =
                bezpieczny(row.id_meczu)


            local druzyna =
                bezpieczny(row.druzyna)


            if idMeczu == "" then

                kontrola.sztabBrakMeczu =
                    kontrola.sztabBrakMeczu + 1


                table.insert(
                    sztabBrakMeczu,
                    row
                )

            else

                local d1 =
                    bezpieczny(row.druzyna1)

                local d2 =
                    bezpieczny(row.druzyna2)


                if druzyna ~= d1
                    and druzyna ~= d2 then

                    kontrola.sztabZlaDruzyna =
                        kontrola.sztabZlaDruzyna + 1


                    table.insert(
                        sztabZlaDruzyna,
                        row
                    )

                end

            end

        end

    end


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

    dodaj(
        wynik,
        "== Kontrola bazy danych =="
    )

    dodaj(
        wynik,
        ""
    )

    dodaj(
        wynik,
        "''Automatyczna kontrola danych zawodników i sztabu. "
        .. "Strona techniczna — nie przeznaczona do wyświetlania "
        .. "w artykułach.''"
    )

    dodaj(
        wynik,
        ""
    )


    -- =====================================================
    -- PODSUMOWANIE
    -- =====================================================

    dodaj(
        wynik,
        "=== Podsumowanie ==="
    )

    dodaj(
        wynik,
        ""
    )

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

    dodaj(
        wynik,
        "! Kontrola !! Liczba"
    )


    dodaj(wynik, "|-")
    dodaj(
        wynik,
        "! Wszystkie wpisy UdzialZawodnika"
    )
    dodaj(
        wynik,
        "| '''" ..
        kontrola.udzialy ..
        "'''"
    )


    dodaj(wynik, "|-")
    dodaj(
        wynik,
        "! Poprawne powiązania z meczem"
    )
    dodaj(
        wynik,
        "| '''" ..
        kontrola.poprawne ..
        "'''"
    )


    dodaj(wynik, "|-")
    dodaj(
        wynik,
        "! 🔴 Brak powiązania z meczem"
    )
    dodaj(
        wynik,
        "| '''" ..
        kontrola.brakMeczu ..
        "'''"
    )


    dodaj(wynik, "|-")
    dodaj(
        wynik,
        "! 🔴 Niezgodna drużyna"
    )
    dodaj(
        wynik,
        "| '''" ..
        kontrola.zlaDruzyna ..
        "'''"
    )


    dodaj(wynik, "|-")
    dodaj(
        wynik,
        "! 🔴 Duplikaty"
    )
    dodaj(
        wynik,
        "| '''" ..
        kontrola.duplikaty ..
        "'''"
    )


    dodaj(wynik, "|-")
    dodaj(
        wynik,
        "! 🔴 Błędy wartości statystycznych"
    )
    dodaj(
        wynik,
        "| '''" ..
        kontrola.statystyki ..
        "'''"
    )


    dodaj(wynik, "|-")
    dodaj(
        wynik,
        "! Wszystkie wpisy SztabMeczu"
    )
    dodaj(
        wynik,
        "| '''" ..
        kontrola.sztab ..
        "'''"
    )


    dodaj(wynik, "|-")
    dodaj(
        wynik,
        "! 🔴 Sztab — brak meczu"
    )
    dodaj(
        wynik,
        "| '''" ..
        kontrola.sztabBrakMeczu ..
        "'''"
    )


    dodaj(wynik, "|-")
    dodaj(
        wynik,
        "! 🔴 Sztab — niezgodna drużyna"
    )
    dodaj(
        wynik,
        "| '''" ..
        kontrola.sztabZlaDruzyna ..
        "'''"
    )


    dodaj(
        wynik,
        "|}"
    )

    dodaj(
        wynik,
        ""
    )


    -- =====================================================
    -- BRAKUJĄCE MECZE
    -- =====================================================

    if #brakMeczu > 0 then

        dodaj(
            wynik,
            "=== 🔴 Wpisy zawodników bez meczu ==="
        )

        dodaj(
            wynik,
            ""
        )

        dodaj(
            wynik,
            '{| class="wikitable sortable" style="width:100%;"'
        )

        dodaj(
            wynik,
            "! Zawodnik !! Drużyna !! Mecz"
        )


        for _, row in ipairs(brakMeczu) do

            dodaj(
                wynik,
                "|-"
            )

            dodaj(
                wynik,
                "| [[" ..
                bezpieczny(row.zawodnik) ..
                "]]"
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.druzyna)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.mecz)
            )

        end


        dodaj(
            wynik,
            "|}"
        )

        dodaj(
            wynik,
            ""
        )

    end


    -- =====================================================
    -- NIEZGODNA DRUŻYNA
    -- =====================================================

    if #zlaDruzyna > 0 then

        dodaj(
            wynik,
            "=== 🔴 Niezgodna drużyna zawodnika ==="
        )

        dodaj(
            wynik,
            ""
        )

        dodaj(
            wynik,
            '{| class="wikitable sortable" style="width:100%;"'
        )

        dodaj(
            wynik,
            "! Zawodnik !! Wpisana drużyna !! Gospodarz !! Gość !! Mecz"
        )


        for _, row in ipairs(zlaDruzyna) do

            dodaj(
                wynik,
                "|-"
            )

            dodaj(
                wynik,
                "| [[" ..
                bezpieczny(row.zawodnik) ..
                "]]"
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.druzyna)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.druzyna1)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.druzyna2)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.mecz)
            )

        end


        dodaj(
            wynik,
            "|}"
        )

        dodaj(
            wynik,
            ""
        )

    end


    -- =====================================================
    -- DUPLIKATY
    -- =====================================================

    if #duplikaty > 0 then

        dodaj(
            wynik,
            "=== 🔴 Duplikaty UdzialZawodnika ==="
        )

        dodaj(
            wynik,
            ""
        )

        dodaj(
            wynik,
            '{| class="wikitable sortable" style="width:100%;"'
        )

        dodaj(
            wynik,
            "! Zawodnik / drużyna / mecz !! Liczba wpisów"
        )


        for _, item in ipairs(duplikaty) do

            dodaj(
                wynik,
                "|-"
            )

            dodaj(
                wynik,
                "| " ..
                item.klucz
            )

            dodaj(
                wynik,
                "| '''" ..
                item.ile ..
                "'''"
            )

        end


        dodaj(
            wynik,
            "|}"
        )

        dodaj(
            wynik,
            ""
        )

    end


    -- =====================================================
    -- BŁĘDNE STATYSTYKI
    -- =====================================================

    if #bledneStatystyki > 0 then

        dodaj(
            wynik,
            "=== 🔴 Podejrzane wartości statystyczne ==="
        )

        dodaj(
            wynik,
            ""
        )

        dodaj(
            wynik,
            '{| class="wikitable sortable" style="width:100%;"'
        )

        dodaj(
            wynik,
            "! Zawodnik !! Drużyna !! Mecz !! Min. !! Pkt !! As. !! Zb. !! EVAL"
        )


        for _, row in ipairs(bledneStatystyki) do

            dodaj(
                wynik,
                "|-"
            )

            dodaj(
                wynik,
                "| [[" ..
                bezpieczny(row.zawodnik) ..
                "]]"
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.druzyna)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.mecz)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.minuty_format)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.gol)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.asysta)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.zbiorka)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.eval)
            )

        end


        dodaj(
            wynik,
            "|}"
        )

        dodaj(
            wynik,
            ""
        )

    end


    -- =====================================================
    -- KONTROLA SZTABU
    -- =====================================================

    if #sztabBrakMeczu > 0 then

        dodaj(
            wynik,
            "=== 🔴 Sztab bez meczu ==="
        )

        dodaj(
            wynik,
            ""
        )

        dodaj(
            wynik,
            '{| class="wikitable sortable" style="width:100%;"'
        )

        dodaj(
            wynik,
            "! Osoba !! Drużyna !! Rola !! Mecz"
        )


        for _, row in ipairs(sztabBrakMeczu) do

            dodaj(
                wynik,
                "|-"
            )

            dodaj(
                wynik,
                "| [[" ..
                bezpieczny(row.osoba) ..
                "]]"
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.druzyna)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.rola)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.mecz)
            )

        end


        dodaj(
            wynik,
            "|}"
        )

        dodaj(
            wynik,
            ""
        )

    end


    -- =====================================================
    -- SZTAB — ZŁA DRUŻYNA
    -- =====================================================

    if #sztabZlaDruzyna > 0 then

        dodaj(
            wynik,
            "=== 🔴 Niezgodna drużyna sztabu ==="
        )

        dodaj(
            wynik,
            ""
        )

        dodaj(
            wynik,
            '{| class="wikitable sortable" style="width:100%;"'
        )

        dodaj(
            wynik,
            "! Osoba !! Wpisana drużyna !! Gospodarz !! Gość !! Rola !! Mecz"
        )


        for _, row in ipairs(sztabZlaDruzyna) do

            dodaj(
                wynik,
                "|-"
            )

            dodaj(
                wynik,
                "| [[" ..
                bezpieczny(row.osoba) ..
                "]]"
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.druzyna)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.druzyna1)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.druzyna2)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.rola)
            )

            dodaj(
                wynik,
                "| " ..
                bezpieczny(row.mecz)
            )

        end


        dodaj(
            wynik,
            "|}"
        )

        dodaj(
            wynik,
            ""
        )

    end


    -- =====================================================
    -- JEŚLI NIE MA BŁĘDÓW
    -- =====================================================

    if kontrola.brakMeczu == 0
        and kontrola.zlaDruzyna == 0
        and kontrola.duplikaty == 0
        and kontrola.statystyki == 0
        and kontrola.sztabBrakMeczu == 0
        and kontrola.sztabZlaDruzyna == 0 then

        dodaj(
            wynik,
            "=== 🟢 Wynik kontroli ==="
        )

        dodaj(
            wynik,
            ""
        )

        dodaj(
            wynik,
            "'''Nie wykryto nieprawidłowości w kontrolowanych danych.'''"
        )

    end


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

end


return p