Moduł:StatystykiHistoryczne: Różnice pomiędzy wersjami
Wygląd
Nie podano opisu zmian |
Nie podano opisu zmian |
||
| Linia 24: | Linia 24: | ||
-- }} | -- }} | ||
-- | -- | ||
-- Zawodnicy występujący w | -- Zawodnicy występujący w ostatnim wprowadzonym | ||
-- są wyróżniani pogrubieniem. | -- sezonie są wyróżniani pogrubieniem. | ||
-- | |||
-- Jeżeli podany sezon bieżący nie ma jeszcze danych, | |||
-- automatycznie używany jest ostatni sezon obecny | |||
-- w bazie. | |||
-- ========================================================= | -- ========================================================= | ||
| Linia 98: | Linia 102: | ||
-- ===================================================== | -- ===================================================== | ||
-- USTALENIE | -- USTALENIE SEZONU REFERENCYJNEGO | ||
-- | -- | ||
-- Jeżeli podany sezon | -- 1. Jeżeli podany sezon ma jakiekolwiek wpisy | ||
-- | -- dla drużyny, używamy tego sezonu. | ||
-- | -- | ||
-- Jeżeli nie ma w nim | -- 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 111: | Linia 120: | ||
-- | -- ===================================================== | ||
-- | -- SPRAWDZENIE PODANEGO SEZONU | ||
-- | -- ===================================================== | ||
if sezonSQL ~= "" then | if sezonSQL ~= "" then | ||
| Linia 133: | Linia 142: | ||
.. " AND Mecze.sezon='" | .. " AND Mecze.sezon='" | ||
.. sezonSQL | .. sezonSQL | ||
.. "' | .. "'", | ||
groupBy = | groupBy = | ||
| Linia 156: | Linia 164: | ||
-- ===================================================== | -- ===================================================== | ||
-- JEŻELI | -- JEŻELI BRAK DANYCH DLA PODANEGO SEZONU | ||
-- SZUKAMY OSTATNIEGO SEZONU | -- SZUKAMY OSTATNIEGO WPROWADZONEGO SEZONU | ||
-- ===================================================== | -- ===================================================== | ||
| Linia 175: | Linia 183: | ||
"UdzialZawodnika.druzyna='" | "UdzialZawodnika.druzyna='" | ||
.. druzynaSQL | .. druzynaSQL | ||
.. "' | .. "'", | ||
groupBy = | groupBy = | ||
| Linia 268: | Linia 275: | ||
-- ===================================================== | -- ===================================================== | ||
-- AKTUALNI ZAWODNICY | -- AKTUALNI / OSTATNI ZAWODNICY | ||
-- | -- | ||
-- Zawodnik jest | -- Zawodnik jest wyróżniony, jeżeli ma wpis | ||
-- | -- w sezonie referencyjnym. | ||
-- | -- | ||
-- Nie wymagamy minuty > 0. | |||
-- ===================================================== | -- ===================================================== | ||
| Linia 304: | Linia 312: | ||
.. " AND Mecze.sezon='" | .. " AND Mecze.sezon='" | ||
.. sezonAktualnySQL | .. sezonAktualnySQL | ||
.. "' | .. "'", | ||
groupBy = | groupBy = | ||
| Linia 393: | Linia 400: | ||
-- FORMATOWANIE MINUT | -- FORMATOWANIE MINUT | ||
-- | -- | ||
-- | -- Cargo przechowuje wartość jako SEKUNDY. | ||
-- | -- | ||
-- | -- Przykład: | ||
-- | |||
-- 103775 sekund | |||
-- = 1729 minut i 35 sekund | |||
-- = 1729:35 | |||
-- | |||
-- Format: | |||
-- MM:SS | |||
-- | |||
-- Pierwsza część NIE jest ograniczona do 59. | |||
-- ===================================================== | -- ===================================================== | ||
local function formatujMinuty( | local function formatujMinuty(sekundy) | ||
local wartosc = | local wartosc = | ||
tonumber( | tonumber(sekundy or 0) | ||
or 0 | or 0 | ||
wartosc = | |||
math.floor(wartosc) | math.floor( | ||
wartosc + 0.5 | |||
) | |||
local | local caleMinuty = | ||
math.floor( | math.floor( | ||
wartosc / 60 | |||
) | ) | ||
local pozostaleSekundy = | |||
wartosc % 60 | |||
| Linia 431: | Linia 440: | ||
"%d:%02d", | "%d:%02d", | ||
caleMinuty, | caleMinuty, | ||
pozostaleSekundy | |||
) | ) | ||
| Linia 456: | Linia 465: | ||
-- ------------------------------------------------- | -- ------------------------------------------------- | ||
-- | -- ZAWODNIK Z SEZONU REFERENCYJNEGO | ||
-- ------------------------------------------------- | -- ------------------------------------------------- | ||
| Linia 671: | Linia 680: | ||
-- ------------------------------------------------- | -- ------------------------------------------------- | ||
-- | -- POCZĄTEK TABELI | ||
-- ------------------------------------------------- | -- ------------------------------------------------- | ||
| Linia 681: | Linia 690: | ||
-- ------------------------------------------------- | -- ------------------------------------------------- | ||
-- | -- TYTUŁ | ||
-- ------------------------------------------------- | -- ------------------------------------------------- | ||
| Linia 692: | Linia 701: | ||
-- ------------------------------------------------- | |||
-- NAGŁÓWKI | |||
-- ------------------------------------------------- | |||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
"! Zawodnik | "! Miejsce !! Zawodnik !! " | ||
.. definicja.nazwa | .. definicja.nazwa | ||
) | ) | ||
| Linia 725: | Linia 723: | ||
) | ) | ||
table.insert( | table.insert( | ||
| Linia 732: | Linia 728: | ||
"| " | "| " | ||
.. i | .. i | ||
.. " || " | |||
.. linkZawodnika(zawodnik) | |||
.. " || '''" | |||
.. linkZawodnika( | |||
.. definicja.format( | .. definicja.format( | ||
zawodnik[ | zawodnik[ | ||
| Linia 761: | Linia 741: | ||
end | end | ||
-- ------------------------------------------------- | |||
-- KONIEC TABELI | |||
-- ------------------------------------------------- | |||
table.insert( | table.insert( | ||
| Linia 798: | Linia 782: | ||
-- ===================================================== | -- ===================================================== | ||
-- INFORMACJA O | -- INFORMACJA O SEZONIE REFERENCYJNYM | ||
-- ===================================================== | -- ===================================================== | ||
| Linia 805: | Linia 789: | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
" | "''Pogrubieniem wyróżniono zawodników " | ||
.. "występujących w sezonie " | .. "występujących w sezonie " | ||
.. "'''" | |||
.. sezonWyroznienia | .. sezonWyroznienia | ||
.. " | .. "'''.''" | ||
) | ) | ||
| Linia 821: | Linia 806: | ||
-- ===================================================== | -- ===================================================== | ||
-- | -- TABELA 1 – MECZE | ||
-- ===================================================== | -- ===================================================== | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
zbudujTabele( | |||
tabele[1] | |||
) | |||
) | ) | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
"" | |||
) | ) | ||
| Linia 850: | Linia 829: | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
zbudujTabele( | |||
tabele[2] | tabele[2] | ||
) | ) | ||
) | |||
table.insert( | |||
wynik, | |||
"" | |||
) | ) | ||
| Linia 864: | Linia 847: | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
zbudujTabele( | |||
tabele[3] | tabele[3] | ||
) | ) | ||
) | |||
table.insert( | |||
wynik, | |||
"" | |||
) | ) | ||
| Linia 878: | Linia 865: | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
zbudujTabele( | |||
tabele[4] | tabele[4] | ||
) | ) | ||
) | |||
table.insert( | |||
wynik, | |||
"" | |||
) | ) | ||
| Linia 892: | Linia 883: | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
zbudujTabele( | |||
tabele[5] | tabele[5] | ||
) | ) | ||
) | ) | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
"" | |||
) | ) | ||
-- ===================================================== | -- ===================================================== | ||
-- | -- TABELA 6 – BLOKI | ||
-- ===================================================== | -- ===================================================== | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
zbudujTabele( | |||
tabele[6] | |||
) | |||
) | ) | ||
Wersja z 10:01, 30 sie 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 ostatnim wprowadzonym
-- sezonie są wyróżniani pogrubieniem.
--
-- Jeżeli podany sezon bieżący nie ma jeszcze danych,
-- automatycznie używany jest ostatni sezon obecny
-- w bazie.
-- =========================================================
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 REFERENCYJNEGO
--
-- 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.
-- =====================================================
local sezonWyroznienia = ""
local znalezionoBiezacy = false
-- =====================================================
-- SPRAWDZENIE PODANEGO SEZONU
-- =====================================================
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
.. "'",
groupBy =
"UdzialZawodnika.zawodnik",
limit = 5000
}
)
if sprawdzenieSezonu
and #sprawdzenieSezonu > 0 then
sezonWyroznienia = sezonBiezacy
znalezionoBiezacy = true
end
end
-- =====================================================
-- JEŻELI BRAK DANYCH DLA PODANEGO SEZONU
-- SZUKAMY OSTATNIEGO WPROWADZONEGO 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
.. "'",
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
.. "'"
-- =====================================================
-- 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 / OSTATNI ZAWODNICY
--
-- Zawodnik jest wyróżniony, jeżeli ma wpis
-- w sezonie referencyjnym.
--
-- Nie wymagamy minuty > 0.
-- =====================================================
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
.. "'",
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),
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
--
-- Cargo przechowuje wartość jako SEKUNDY.
--
-- Przykład:
--
-- 103775 sekund
-- = 1729 minut i 35 sekund
-- = 1729:35
--
-- Format:
-- MM:SS
--
-- Pierwsza część NIE jest ograniczona do 59.
-- =====================================================
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
.. "]]"
-- -------------------------------------------------
-- ZAWODNIK Z SEZONU REFERENCYJNEGO
-- -------------------------------------------------
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 = {}
-- -------------------------------------------------
-- POCZĄTEK TABELI
-- -------------------------------------------------
table.insert(
wynik,
'{| class="wikitable" style="width:100%; text-align:center;"'
)
-- -------------------------------------------------
-- TYTUŁ
-- -------------------------------------------------
table.insert(
wynik,
"|+ '''"
.. definicja.nazwa
.. "'''"
)
-- -------------------------------------------------
-- NAGŁÓWKI
-- -------------------------------------------------
table.insert(
wynik,
"! Miejsce !! Zawodnik !! "
.. definicja.nazwa
)
-- -------------------------------------------------
-- WIERSZE
-- -------------------------------------------------
for i, zawodnik in ipairs(lista) do
table.insert(
wynik,
"|-"
)
table.insert(
wynik,
"| "
.. i