diff options
Diffstat (limited to 'patton-imp.sql')
-rw-r--r-- | patton-imp.sql | 124 |
1 files changed, 62 insertions, 62 deletions
diff --git a/patton-imp.sql b/patton-imp.sql index 1cea450..46529c6 100644 --- a/patton-imp.sql +++ b/patton-imp.sql @@ -1,81 +1,81 @@ -- ----------------------------------------------------------------------------------------------- -- --- Skrypt rozszerzający funkcjonalność Teamów o możliwość liczenia wyników turnieju metodą Pattona -- +-- Skrypt rozszerzajÄ…cy funkcjonalność TeamĂłw o moĹĽliwość liczenia wynikĂłw turnieju metodÄ… Pattona -- -- Autor: mkl -- -- ----------------------------------------------------------------------------------------------- -- -- Wersja dla turnieju liczonego na IMP->VP -- -- Ta wersja jest fajna, bo: -- --- * działa -- +-- * dziaĹ‚a -- -- Ta wersja jest niefajna, bo: -- --- * wymaga wgrania zdegnerowanej tabeli VP (skrypt ją nadpisuje, ale strzyżonego i tak dalej) -- --- z ustawionym wiecznym remisem (przykładowe tabele - dołączone) -- --- * dla rund 3-rozdaniowych wgranie właściwego remisu (4.5:4.5) przez Teamy jest niemożliwe -- --- * wszystkie zapisy są oznaczane jako "nie do liczenia w meczu", -- --- więc każdy mecz jest liczony jako remis (a wynik końcowy ustawiany tylko wyrównaniem) -- +-- * wymaga wgrania zdegnerowanej tabeli VP (skrypt jÄ… nadpisuje, ale strzyĹĽonego i tak dalej) -- +-- z ustawionym wiecznym remisem (przykĹ‚adowe tabele - doĹ‚Ä…czone) -- +-- * dla rund 3-rozdaniowych wgranie wĹ‚aĹ›ciwego remisu (4.5:4.5) przez Teamy jest niemoĹĽliwe -- +-- * wszystkie zapisy sÄ… oznaczane jako "nie do liczenia w meczu", -- +-- wiÄ™c kaĹĽdy mecz jest liczony jako remis (a wynik koĹ„cowy ustawiany tylko wyrĂłwnaniem) -- -- ----------------------------------------------------------------------------------------------- -- --- Instrukcja obsługi: -- --- * uruchomić w bazie turnieju skrypt co najmniej raz po założeniu turnieju, -- --- a przed wpisaniem pierwszego wyrównania "właściwego" (tj. faktycznej kary/wyrównania -- +-- Instrukcja obsĹ‚ugi: -- +-- * uruchomić w bazie turnieju skrypt co najmniej raz po zaĹ‚oĹĽeniu turnieju, -- +-- a przed wpisaniem pierwszego wyrĂłwnania "wĹ‚aĹ›ciwego" (tj. faktycznej kary/wyrĂłwnania -- -- z turnieju) -- --- * uruchomić kazdorazowo celem przeliczenia wyników -- +-- * uruchomić kazdorazowo celem przeliczenia wynikĂłw -- -- Potencjalne problemy: -- --- * wyrównania wklepywane z Teamów mogą sprawiać problemy (nie są dostatecznie przetestowane) -- --- * nie mam zielonego pojęcia, czy i jak powinny obchodzić mnie wyniki niezapisowe w rozdaniach -- --- Szczególne wymagania dla bazy danych: -- +-- * wyrĂłwnania wklepywane z TeamĂłw mogÄ… sprawiać problemy (nie sÄ… dostatecznie przetestowane) -- +-- * nie mam zielonego pojÄ™cia, czy i jak powinny obchodzić mnie wyniki niezapisowe w rozdaniach -- +-- SzczegĂłlne wymagania dla bazy danych: -- -- * uprawnienia do tworzenia tabel -- --- * uprawnienia do tworzenia widoków -- +-- * uprawnienia do tworzenia widokĂłw -- -- * uprawnienia do tworzenia i uruchamiania wyzwalaczy -- --- Kontrolnie tworzone są tabele/widoki z przedrostkiem patton_, pozwalające w razie czego ogarnąć,-- --- co się dzieje. -- +-- Kontrolnie tworzone sÄ… tabele/widoki z przedrostkiem patton_, pozwalajÄ…ce w razie czego ogarnąć,-- +-- co siÄ™ dzieje. -- -- ----------------------------------------------------------------------------------------------- -- --- Widok trzymający rozdania, w których są już oba zapisy - tylko te rozdania są dalej brane pod uwagę. +-- Widok trzymajÄ…cy rozdania, w ktĂłrych sÄ… juĹĽ oba zapisy - tylko te rozdania sÄ… dalej brane pod uwagÄ™. DROP VIEW IF EXISTS patton_boards; CREATE VIEW patton_boards AS SELECT rnd, segment, tabl, board FROM scores WHERE score IS NOT NULL GROUP BY rnd, segment, tabl, board HAVING COUNT(*) = 2; --- Tabela kompilująca wyniki rozdań, zestawiająca zapisy z obu stołów oraz wyniki części BAMowej Pattona +-- Tabela kompilujÄ…ca wyniki rozdaĹ„, zestawiajÄ…ca zapisy z obu stoĹ‚Ăłw oraz wyniki części BAMowej Pattona DROP TABLE IF EXISTS patton_scores; CREATE TABLE patton_scores ( - rnd INT, -- z bazy Teamów - segment INT, -- z bazy Teamów - tabl INT, -- z bazy Teamów - board INT, -- z bazy Teamów + rnd INT, -- z bazy TeamĂłw + segment INT, -- z bazy TeamĂłw + tabl INT, -- z bazy TeamĂłw + board INT, -- z bazy TeamĂłw open_score INT, -- score ze scores dla pokoju otwartego - closed_score INT, -- score ze scores dla pokoju zamkniętego + closed_score INT, -- score ze scores dla pokoju zamkniÄ™tego h_bam FLOAT, -- punkty BAMowe dla gospodarzy - v_bam FLOAT -- punkty BAMowe dla gości + v_bam FLOAT -- punkty BAMowe dla goĹ›ci ); --- Tabela kompilująca saldo druzyn w meczu +-- Tabela kompilujÄ…ca saldo druzyn w meczu DROP TABLE IF EXISTS patton_sums; CREATE TABLE patton_sums ( - rnd INT, -- z bazy Teamów - segment INT, -- z bazy Teamów - tabl INT, -- z bazy Teamów + rnd INT, -- z bazy TeamĂłw + segment INT, -- z bazy TeamĂłw + tabl INT, -- z bazy TeamĂłw h_saldo INT, -- saldo gospodarzy - v_saldo INT, -- saldo gości - max_saldo INT, -- większa z 2 powyższych wartości (maksymalne saldo) + v_saldo INT, -- saldo goĹ›ci + max_saldo INT, -- wiÄ™ksza z 2 powyĹĽszych wartoĹ›ci (maksymalne saldo) h_points FLOAT, -- punkty za saldo dla gospodarzy - v_points FLOAT -- punkty za saldo dla gości + v_points FLOAT -- punkty za saldo dla goĹ›ci ); --- Tabela kompilująca wyrównania (takie, by wynik meczu w VP był równy wynikowi wynikającemu z Pattona) +-- Tabela kompilujÄ…ca wyrĂłwnania (takie, by wynik meczu w VP byĹ‚ rĂłwny wynikowi wynikajÄ…cemu z Pattona) DROP TABLE IF EXISTS patton_adjustments; CREATE TABLE patton_adjustments ( - rnd INT, -- z bazy Teamów - segment INT, -- z bazy Teamów - tabl INT, -- z bazy Teamów - h_total FLOAT, -- wyrównanie dla gospodarzy - v_total FLOAT -- wyrównanie dla gości + rnd INT, -- z bazy TeamĂłw + segment INT, -- z bazy TeamĂłw + tabl INT, -- z bazy TeamĂłw + h_total FLOAT, -- wyrĂłwnanie dla gospodarzy + v_total FLOAT -- wyrĂłwnanie dla goĹ›ci ); --- Tabela zapamiętująca wszelkie "ręczne" zmiany na kolumnach corrv i corrh tabeli matches - więc zwykłe turniejowe wyrównania. --- Zapamiętujemy celem nałożenia na wyrównania wynikające z wyniku meczu Pattonem. +-- Tabela zapamiÄ™tujÄ…ca wszelkie "rÄ™czne" zmiany na kolumnach corrv i corrh tabeli matches - wiÄ™c zwykĹ‚e turniejowe wyrĂłwnania. +-- ZapamiÄ™tujemy celem naĹ‚oĹĽenia na wyrĂłwnania wynikajÄ…ce z wyniku meczu Pattonem. CREATE TABLE IF NOT EXISTS patton_external_adjustments ( - rnd INT, -- z bazy Teamów - tabl INT, -- z bazy Teamów - h_adj FLOAT, -- wyrównanie dla gospodarzy - v_adj FLOAT, -- wyrównanie dla gości + rnd INT, -- z bazy TeamĂłw + tabl INT, -- z bazy TeamĂłw + h_adj FLOAT, -- wyrĂłwnanie dla gospodarzy + v_adj FLOAT, -- wyrĂłwnanie dla goĹ›ci PRIMARY KEY (rnd, tabl) ); @@ -84,7 +84,7 @@ SET @v_adj = 0; DROP TRIGGER IF EXISTS patton_trigger_adjustment; DELIMITER // --- Wyzwalacz zapamiętrujący wszelkie "zewnętrzne" zmiany na tabeli matches, w kolumnach corrv i corrh - a więc wyrównania. +-- Wyzwalacz zapamiÄ™trujÄ…cy wszelkie "zewnÄ™trzne" zmiany na tabeli matches, w kolumnach corrv i corrh - a wiÄ™c wyrĂłwnania. CREATE TRIGGER patton_trigger_adjustment BEFORE UPDATE ON matches FOR EACH ROW BEGIN IF @patton_disable_trigger <> 1 OR @patton_disable_trigger IS NULL THEN IF OLD.corrh <> NEW.corrh THEN @@ -93,7 +93,7 @@ CREATE TRIGGER patton_trigger_adjustment BEFORE UPDATE ON matches FOR EACH ROW B IF OLD.corrv <> NEW.corrv THEN SET @v_adj = NEW.corrv - OLD.corrv; END IF; - -- Zapamiętujemy do patton_external_adjustements, wstawiając rekordy, jeśli trzeba. + -- ZapamiÄ™tujemy do patton_external_adjustements, wstawiajÄ…c rekordy, jeĹ›li trzeba. IF (SELECT COUNT(*) FROM patton_external_adjustments WHERE rnd = NEW.rnd AND tabl = NEW.tabl) THEN UPDATE patton_external_adjustments SET h_adj = h_adj + @h_adj, v_adj = v_adj + @v_adj @@ -108,19 +108,19 @@ CREATE TRIGGER patton_trigger_adjustment BEFORE UPDATE ON matches FOR EACH ROW B END // DELIMITER ; --- Na czas wykonywania skryptu wyłączamy powyższy wyzwalacz (skrypt równiez edytuje matches, w końcu) +-- Na czas wykonywania skryptu wyĹ‚Ä…czamy powyĹĽszy wyzwalacz (skrypt rĂłwniez edytuje matches, w koĹ„cu) SET @patton_disable_trigger = 1; --- Oznaczamy wszystkie rozdania jako nieliczone do wyniku meczu - każdy mecz powinien wygenerować remis. +-- Oznaczamy wszystkie rozdania jako nieliczone do wyniku meczu - kaĹĽdy mecz powinien wygenerować remis. UPDATE scores SET mecz = 0; --- Kompilujemy tabelę wyników rozdań i BAMy dla rozdań. +-- Kompilujemy tabelÄ™ wynikĂłw rozdaĹ„ i BAMy dla rozdaĹ„. DELETE FROM patton_scores; INSERT INTO patton_scores SELECT pb.*, s1.score AS open_score, s2.score AS closed_score, - -- W Pattonie różnica +/- 10 to jeszcze remis. + -- W Pattonie różnica +/- 10 to jeszcze remis. IF(ABS(s1.score - s2.score) > 10, ROUND((s1.score - s2.score) / ABS(s1.score - s2.score)), 0) AS h_bam, 0 AS v_bam FROM patton_boards pb @@ -128,15 +128,15 @@ INSERT INTO patton_scores JOIN scores s2 ON pb.rnd = s2.rnd AND pb.segment = s2.segment AND pb.tabl = s2.tabl AND pb.board = s2.board AND s2.room = 2; UPDATE patton_scores SET v_bam = -h_bam; --- Zmienna pomocnicza do wyliczenia punktów za saldo w zależności od liczby rozdań w rundzie. -SET @boards_per_segment = IF ((SELECT boardspersegment FROM admin) = 4, 1, 0.5); -- Dla 4 rozdań: = 1.0, dla 3 rozdań: = 0.5 --- Nadpisujemy tabelę VP na wiecznie remisową (6:6 dla 4 rozdań, 4.5:4.5 dla 3 rozdań) +-- Zmienna pomocnicza do wyliczenia punktĂłw za saldo w zaleĹĽnoĹ›ci od liczby rozdaĹ„ w rundzie. +SET @boards_per_segment = IF ((SELECT boardspersegment FROM admin) = 4, 1, 0.5); -- Dla 4 rozdaĹ„: = 1.0, dla 3 rozdaĹ„: = 0.5 +-- Nadpisujemy tabelÄ™ VP na wiecznie remisowÄ… (6:6 dla 4 rozdaĹ„, 4.5:4.5 dla 3 rozdaĹ„) UPDATE tabvp SET vpew = 3 + 3 * @boards_per_segment WHERE dimp = 0; UPDATE tabvp SET vpns = vpew WHERE dimp = 0; UPDATE matches SET vph = 3 + 3 * @boards_per_segment; UPDATE matches SET vpv = vph; --- Wypełniamy tabelę salda. +-- WypeĹ‚niamy tabelÄ™ salda. DELETE FROM patton_sums; INSERT INTO patton_sums SELECT @@ -151,30 +151,30 @@ INSERT INTO patton_sums -- Wybieramy maksymalne saldo UPDATE patton_sums SET max_saldo = IF (h_saldo > v_saldo, h_saldo, v_saldo); --- Jeśli róznica salda > 1/3 maksymalnego, to gospodarze zdobywają: +-- JeĹ›li rĂłznica salda > 1/3 maksymalnego, to gospodarze zdobywajÄ…: -- * 2 punkty przy 4 rozdaniach -- * 1 punkt przy 3 rozdaniach UPDATE patton_sums SET h_points = 2 * @boards_per_segment WHERE (max_saldo - v_saldo) / max_saldo > 1/3; --- Jeśli róznica salda > 1/10 maksymalnego, ale < 1/3, to gospodarze zdobywają: +-- JeĹ›li rĂłznica salda > 1/10 maksymalnego, ale < 1/3, to gospodarze zdobywajÄ…: -- * 2 punkty przy 4 rozdaniach -- * 1 punkt przy 3 rozdaniach UPDATE patton_sums SET h_points = 1 * @boards_per_segment WHERE (max_saldo - v_saldo) / max_saldo BETWEEN 1/10 AND 1/3; --- Jeśli róznica salda > 1/10 maksymalnego, ale < 1/3, to goście zdobywają: +-- JeĹ›li rĂłznica salda > 1/10 maksymalnego, ale < 1/3, to goĹ›cie zdobywajÄ…: -- * 2 punkty przy 4 rozdaniach -- * 1 punkt przy 3 rozdaniach UPDATE patton_sums SET h_points = -2 * @boards_per_segment WHERE (max_saldo - h_saldo) / max_saldo > 1/3; --- Jeśli róznica salda > 1/10 maksymalnego, ale < 1/3, to goście zdobywają: +-- JeĹ›li rĂłznica salda > 1/10 maksymalnego, ale < 1/3, to goĹ›cie zdobywajÄ…: -- * 1 punkt przy 4 rozdaniach -- * 0.5 punktu przy 3 rozdaniach UPDATE patton_sums SET h_points = -1 * @boards_per_segment WHERE (max_saldo - h_saldo) / max_saldo BETWEEN 1/10 AND 1/3; --- Druga drużyna zdobywa dopełnienie do zera. +-- Druga druĹĽyna zdobywa dopeĹ‚nienie do zera. UPDATE patton_sums SET v_points = -h_points; --- Kompilujemy wyrównania Pattonowe, jako sumę BAMów i punktów za saldo +-- Kompilujemy wyrĂłwnania Pattonowe, jako sumÄ™ BAMĂłw i punktĂłw za saldo DELETE FROM patton_adjustments; INSERT INTO patton_adjustments SELECT patton_sums.rnd, patton_sums.segment, patton_sums.tabl, @@ -184,12 +184,12 @@ INSERT INTO patton_adjustments JOIN patton_scores ON patton_sums.rnd = patton_scores.rnd AND patton_sums.segment = patton_scores.segment AND patton_sums.tabl = patton_scores.tabl GROUP BY patton_scores.rnd, patton_scores.segment, patton_scores.tabl; --- Ustawiamy wyrównania w matches, nanosząc na nie zapamiętane "zewnętrzne" wyrównania +-- Ustawiamy wyrĂłwnania w matches, nanoszÄ…c na nie zapamiÄ™tane "zewnÄ™trzne" wyrĂłwnania UPDATE matches SET corrh = COALESCE((SELECT h_total FROM patton_adjustments WHERE matches.rnd = patton_adjustments.rnd AND matches.tabl = patton_adjustments.tabl AND patton_adjustments.segment = 1), 0) + COALESCE((SELECT h_adj FROM patton_external_adjustments WHERE matches.rnd = patton_external_adjustments.rnd AND matches.tabl = patton_external_adjustments.tabl), 0), corrv = COALESCE((SELECT v_total FROM patton_adjustments WHERE matches.rnd = patton_adjustments.rnd AND matches.tabl = patton_adjustments.tabl AND patton_adjustments.segment = 1), 0) + COALESCE((SELECT v_adj FROM patton_external_adjustments WHERE matches.rnd = patton_external_adjustments.rnd AND matches.tabl = patton_external_adjustments.tabl), 0); --- Oblokowujemy obsługę wyzwalacza, na wypadek gdybyśmy chcieli coś jeszcze robić na tym samym połączeniu do bazy. +-- Oblokowujemy obsĹ‚ugÄ™ wyzwalacza, na wypadek gdybyĹ›my chcieli coĹ› jeszcze robić na tym samym poĹ‚Ä…czeniu do bazy. SET @patton_disable_trigger = 0; |