Wyszukiwanie uczestników
Pole Wyszukaj uczestników — w oknie zajęć, przy dodawaniu gracza do gry i w filtrach — szuka po imieniu, nazwisku, adresie e-mail i numerze telefonu opiekuna.
👤 Instrukcja dla recepcji i biura
Wpisz co najmniej dwa znaki. Kolejność nie ma znaczenia — sójka aleksandra znajdzie
to samo co aleksandra sójka.
Polskie znaki i wielkość liter są ignorowane. Klient zapisany w bazie jako
ALEKSANDRA SÓJKA zostanie znaleziony po wpisaniu sojka, Sójka czy SÓJKA —
ogonki możesz pominąć.
Numer telefonu można wpisać w dowolnym formacie: +48 664 468 401, 664468401
i 664-468-401 trafiają w ten sam rekord.
Jeżeli mimo to nikogo nie widzisz, sprawdź miasto w belce u góry. Lista jest zawężona do wybranej lokalizacji, a uczestnik jest przypisany do miasta, w którym zakładał konto — klient z innego miasta nie pojawi się w wynikach, dopóki nie poprawisz miasta na jego profilu.
🛠 Dokumentacja techniczna
Wyszukiwanie realizuje getPlayersByName w lib/actions/players.ts.
SQLite (a więc i D1) składa wielkość liter wyłącznie dla ASCII:
SELECT LOWER('SÓJKA'); -- 'sÓjka'
SELECT 'SÓJKA' LIKE '%sójka%'; -- 0
SELECT 'SÓJKA' LIKE '%Sójka%'; -- 0
Rekord z wielką polską literą był przez to nieosiągalny z pola wyszukiwania.
Dlatego obie strony porównania sprowadzane są do małych liter ASCII, przez parę
z lib/utils/text-search.ts:
| Funkcja | Strona | Działanie |
|---|---|---|
foldForSearch(term) | wpisana fraza | NFD + usunięcie znaków diakrytycznych + Łł → l |
foldedColumnSql(kolumna) | kolumna w SQL | zagnieżdżone REPLACE dla 18 polskich liter, potem LOWER |
Zapytanie porównuje frazę z imieniem, nazwiskiem, obiema kolejnościami imię nazwisko,
adresem e-mail i telefonem — sześć warunków LIKE z jednym parametrem. Cyfry z frazy
trafiają dodatkowo do porównania z numerem telefonu pozbawionym separatorów.
Skan jest pełny — LIKE '%…%' na wyrażeniu nie użyje indeksu — ale tabela player
ma rząd wielkości tysięcy wierszy i zapytanie schodzi poniżej 10 ms. Wynik ogranicza
PLAYER_SEARCH_MAX_LIMIT, a fraza krótsza niż PLAYER_SEARCH_MIN_LENGTH nie uruchamia
zapytania w ogóle.
Filtr miasta (AND (city = ? OR city = '')) działa na player.city, które jest
niezależne od user.preferredCity i ustalane przy rejestracji. Rozjazd tych dwóch
pól ukrywa uczestnika w wyszukiwarce i zabiera mu listę dostępnych terminów
(patrz lib/regular-enrollment.ts, COALESCE(p.city, …)).