Bài tổng kết: xây một query engine nhỏ thực hiện đầy đủ pipeline backend: filter (AND nhiều điều kiện) → sort (nhiều trường, ổn định) → paginate, kèm metadata.
Cho danh sách bản ghi và query object:
filters: mảng { "field", "op", "value" } (op ∈ { "eq","gt","gte","lt","lte","contains" }), AND tất cả. contains so khớp chuỗi không phân biệt hoa thường.sort: mảng { "field", "dir" } (áp dụng lần lượt, ổn định). Có thể rỗng.page, perPage.In object JSON { "total": <sau filter>, "totalPages": <số>, "page": <page>, "data": [...] }.
Lọc active eq true AND name contains "a", sort score desc, lấy trang 1.
Dòng 1: JSON mảng bản ghi.
Dòng 2: JSON object query { "filters", "sort", "page", "perPage" }.
0 ≤ số bản ghi ≤ 1000; 0 ≤ số filters ≤ 10; 0 ≤ số sort ≤ 5; 1 ≤ page; 1 ≤ perPage ≤ 1000.
In object JSON { "total", "totalPages", "page", "data" } theo đúng thứ tự khóa.
Ví dụ:
Đầu vào:
[{"name":"alpha","active":true,"score":80},{"name":"beta","active":true,"score":90},{"name":"gamma","active":false,"score":70},{"name":"area","active":true,"score":60}]
{"filters":[{"field":"active","op":"eq","value":true},{"field":"name","op":"contains","value":"a"}],"sort":[{"field":"score","dir":"desc"}],"page":1,"perPage":2}
Đầu ra:
{"total":3,"totalPages":2,"page":1,"data":[{"name":"beta","active":true,"score":90},{"name":"alpha","active":true,"score":80}]}Giải thích:
Đang tải editor...