Skip to main content

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:

FunkcjaStronaDziałanie
foldForSearch(term)wpisana frazaNFD + usunięcie znaków diakrytycznych + Łł → l
foldedColumnSql(kolumna)kolumna w SQLzagnież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, …)).