Moduł:KontrolaWystepow
Wygląd
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