LogQL - kompletna lista testow funkcjonalnych
Data: 2026-03-29

============================================================
1) Zalozenia testowe
============================================================
A. Zakladany logFormatRegex (zawiera wszystkie pola z jezyka):
^\[(?<TIME>[^\]]+)\]\s\[(?<LEVEL>[^\]]+)\]\s\[(?<MODULE>[^\]]+)\]\sstatus=(?<STATUS>\d+)\sip=(?<IP>[^\s]+)\suser=(?<USER>[^\s]+)\srequest="(?<REQUEST>[^"]+)"\ssize=(?<SIZE>\d+)\shost=(?<HOST>[^\s]+)\sidentity=(?<IDENTITY>[^\s]+)\smsg="(?<MESSAGE>.*)"$

B. Zestaw logow wejsciowych (L1-L10):
L1: [2026-03-29T10:00:00Z] [INFO] [Auth] status=200 ip=10.0.0.1 user=alice request="GET /login" size=512 host=web-01 identity=service-a msg="Login ok"
L2: [2026-03-29T10:05:00Z] [WARN] [Payment] status=302 ip=10.0.0.2 user=bob request="GET /pay" size=256 host=web-02 identity=service-b msg="Redirect payment"
L3: [2026-03-29T10:10:00Z] [ERROR] [Auth] status=401 ip=10.0.0.3 user=carol request="POST /login" size=128 host=web-01 identity=service-a msg="Unauthorized"
L4: [2026-03-29T10:15:00Z] [ERROR] [Gateway] status=500 ip=10.0.0.2 user=dave request="GET /api/orders" size=1024 host=api-01 identity=service-c msg="Upstream timeout"
L5: [2026-03-29T10:20:00Z] [ERROR] [Gateway] status=500 ip=10.0.0.2 user=eve request="GET /api/orders" size=1024 host=api-01 identity=service-c msg="Upstream timeout"
L6: [2026-03-29T10:25:00Z] [INFO] [Report] status=200 ip=10.0.0.4 user=frank request="GET /report" size=2048 host=batch-01 identity=service-d msg="Report generated"
L7: [2026-03-29T10:30:00Z] [DEBUG] [Auth] status=200 ip=10.0.0.5 user=grace request="GET /session" size=64 host=web-01 identity=service-a msg="Session check"
L8: [2026-03-29T10:35:00Z] [WARN] [Gateway] status=429 ip=10.0.0.6 user=heidi request="GET /api/orders" size=96 host=api-01 identity=service-c msg="Rate limited"
L9: [2026-03-29T10:40:00Z] [ERROR] [Gateway] status=503 ip=10.0.0.7 user=ivan request="GET /api/orders" size=1536 host=api-02 identity=service-c msg="Service unavailable"
L10:[2026-03-29T10:45:00Z] [INFO] [Audit] status=204 ip=10.0.0.8 user=judy request="DELETE /session" size=32 host=web-03 identity=service-e msg="Session deleted"

Uwaga: 
- Przy target="*" silnik zwraca cale linie logow (pelne Lx).
- Przy target z polami, wynik to pola laczone separatorem " | ".

============================================================
2) Akcja, target, DISTINCT, zapytanie bez warunku
============================================================
Q1
Zapytanie:
FIND * WHERE
Wynik:
L1, L2, L3, L4, L5, L6, L7, L8, L9, L10

Q2
Zapytanie:
FIND IP WHERE STATUS EQUALS "500"
Wynik:
10.0.0.2
10.0.0.2

Q3
Zapytanie:
FIND IP,STATUS WHERE STATUS EQUALS "404"
Wynik:
(brak wynikow)

Q4
Zapytanie:
REJECT * WHERE LEVEL EQUALS "DEBUG"
Wynik:
L1, L2, L3, L4, L5, L6, L8, L9, L10

Q5
Zapytanie:
FIND DIST IP WHERE STATUS GREATER_OR_EQUAL "500"
Wynik:
10.0.0.2
10.0.0.7

Q6
Zapytanie:
FIND DIST LEVEL WHERE
Wynik:
INFO
WARN
ERROR
DEBUG

Q7
Zapytanie:
REJECT DIST IP WHERE STATUS EQUALS "500"
Wynik:
BLAD: Operator DIST jest obslugiwany tylko dla FIND.

============================================================
3) Operatory porownan (pelny przekroj aliasow)
============================================================
A. EQUALS / = / ==

Q8
Zapytanie:
FIND USER WHERE STATUS EQUALS "401"
Wynik:
carol

Q9
Zapytanie:
FIND USER WHERE STATUS = "401"
Wynik:
carol

Q10
Zapytanie:
FIND USER WHERE STATUS == "401"
Wynik:
carol

B. CONTAINS / ~=

Q11
Zapytanie:
FIND MODULE,REQUEST WHERE REQUEST CONTAINS "api/orders"
Wynik:
Gateway | GET /api/orders
Gateway | GET /api/orders
Gateway | GET /api/orders
Gateway | GET /api/orders

Q12
Zapytanie:
FIND MODULE,REQUEST WHERE REQUEST ~= "api/orders"
Wynik:
Gateway | GET /api/orders
Gateway | GET /api/orders
Gateway | GET /api/orders
Gateway | GET /api/orders

C. GREATER_THAN / >

Q13
Zapytanie:
FIND STATUS WHERE SIZE GREATER_THAN "1000"
Wynik:
500
500
200
503

Q14
Zapytanie:
FIND STATUS WHERE SIZE > "1000"
Wynik:
500
500
200
503

D. LESS_THAN / <

Q15
Zapytanie:
FIND STATUS WHERE SIZE LESS_THAN "100"
Wynik:
200
429
204

Q16
Zapytanie:
FIND STATUS WHERE SIZE < "100"
Wynik:
200
429
204

E. GREATER_OR_EQUAL / >=

Q17
Zapytanie:
FIND STATUS WHERE STATUS GREATER_OR_EQUAL "500"
Wynik:
500
500
503

Q18
Zapytanie:
FIND STATUS WHERE STATUS >= "500"
Wynik:
500
500
503

F. LESS_OR_EQUAL / <=

Q19
Zapytanie:
FIND STATUS WHERE STATUS LESS_OR_EQUAL "204"
Wynik:
200
200
200
204

Q20
Zapytanie:
FIND STATUS WHERE STATUS <= "204"
Wynik:
200
200
200
204

============================================================
4) Logika: AND/OR/NOT, aliasy &&/||/!, grupowanie
============================================================
Q21
Zapytanie:
FIND IP WHERE LEVEL EQUALS "ERROR" AND STATUS GREATER_OR_EQUAL "500"
Wynik:
10.0.0.2
10.0.0.2
10.0.0.7

Q22
Zapytanie:
FIND IP WHERE LEVEL EQUALS "ERROR" && STATUS EQUALS "500"
Wynik:
10.0.0.2
10.0.0.2

Q23
Zapytanie:
FIND IP WHERE LEVEL EQUALS "WARN" OR STATUS EQUALS "503"
Wynik:
10.0.0.2
10.0.0.6
10.0.0.7

Q24
Zapytanie:
FIND IP WHERE LEVEL EQUALS "WARN" || STATUS EQUALS "503"
Wynik:
10.0.0.2
10.0.0.6
10.0.0.7

Q25
Zapytanie:
FIND IP WHERE NOT LEVEL EQUALS "ERROR"
Wynik:
10.0.0.1
10.0.0.2
10.0.0.4
10.0.0.5
10.0.0.6
10.0.0.8

Q26
Zapytanie:
FIND IP WHERE ! STATUS EQUALS "200"
Wynik:
10.0.0.2
10.0.0.3
10.0.0.2
10.0.0.2
10.0.0.6
10.0.0.7
10.0.0.8

Q27
Zapytanie:
FIND IP WHERE (LEVEL EQUALS "ERROR" OR LEVEL EQUALS "WARN") AND STATUS GREATER_OR_EQUAL "500"
Wynik:
10.0.0.2
10.0.0.2
10.0.0.7

Q28
Zapytanie:
FIND IP WHERE LEVEL EQUALS "ERROR" OR (LEVEL EQUALS "WARN" AND STATUS EQUALS "302")
Wynik:
10.0.0.3
10.0.0.2
10.0.0.2
10.0.0.7
10.0.0.2

============================================================
5) Daty i pokrycie pozostalych pol
============================================================
Q29
Zapytanie:
FIND TIME WHERE TIME GREATER_THAN 2026-03-29T10:20:00Z
Wynik:
2026-03-29T10:25:00Z
2026-03-29T10:30:00Z
2026-03-29T10:35:00Z
2026-03-29T10:40:00Z
2026-03-29T10:45:00Z

Q30
Zapytanie:
FIND TIME WHERE TIME LESS_OR_EQUAL 2026-03-29T10:10:00Z
Wynik:
2026-03-29T10:00:00Z
2026-03-29T10:05:00Z
2026-03-29T10:10:00Z

Q31
Zapytanie: źle - już działa
FIND HOST,IDENTITY WHERE HOST EQUALS "api-01"
Wynik:
api-01 | service-c
api-01 | service-c
api-01 | service-c

Q32
Zapytanie:
FIND MODULE,MESSAGE WHERE MESSAGE CONTAINS "timeout"
Wynik:
Gateway | Upstream timeout
Gateway | Upstream timeout

Q33
Zapytanie:
FIND LEVEL WHERE MODULE EQUALS "Auth"
Wynik:
INFO
ERROR
DEBUG

============================================================
6) Subquery IN (nowa funkcjonalnosc)
============================================================
Q34
Zapytanie:
FIND * WHERE IP IN (FIND DIST IP WHERE STATUS EQUALS "500")
Wynik:
L2, L4, L5

Q35
Zapytanie:
FIND USER,IP WHERE IP IN (FIND DIST IP WHERE STATUS GREATER_OR_EQUAL "500")
Wynik:
bob | 10.0.0.2
dave | 10.0.0.2
eve | 10.0.0.2
ivan | 10.0.0.7

Q36
Zapytanie:
FIND * WHERE IP IN (FIND DIST IP WHERE STATUS EQUALS "500") AND LEVEL EQUALS "ERROR"
Wynik:
L4, L5

Q37
Zapytanie:
FIND IP WHERE IP IN (FIND DIST IP WHERE IP IN (FIND DIST IP WHERE STATUS EQUALS "503"))
Wynik:
10.0.0.7

Q38 (przypadek brzegowy wazny dla obecnej implementacji)
Zapytanie:
FIND * WHERE IP IN (FIND IP,STATUS WHERE STATUS EQUALS "500")
Wynik:
(brak wynikow)
Wyjasnienie:
Subquery zwraca rekordy jako "IP | STATUS", a warunek IN porownuje pojedyncze IP, wiec wartosci sie nie zgadzaja.

============================================================
7) Dodatkowe uwagi implementacyjne
============================================================
- Wartosci liczbowe sa parsowane z STRING, np. "500".
- Daty mozna podawac jako DATE bez cudzyslowow, np. 2026-03-29T10:20:00Z.
- Aby subquery IN dzialalo przewidywalnie, subquery powinno zwracac jedna kolumne zgodna z polem po lewej stronie IN.
