Код Middle Классы и интерфейсы обновлено
Fluent builder SQL-запроса с ключами таблицы
Условие
Напиши класс Select<Row> (fluent builder): from(table) создаёт его, методы where(column, value), orderBy(column, dir), limit(n) возвращают this, toSQL() возвращает { text, values }. Колонки ограничены keyof Row & string, значение where должно иметь тип Row[K].
Формат: SELECT * FROM "users" WHERE "role" = $1 AND "age" = $2 ORDER BY "name" DESC LIMIT 10. Без условий части нет. limit вне диапазона 1..1000 зажимается в него.
build(filters, order, limit) в заготовке собирает запрос из параметров HTTP-запроса.
Примеры
build({"role":"admin","age":30}, "name", 10) // {"text":"SELECT * FROM \"users\" WHERE \"role\" = $1 AND \"age\" = $2 ORDER BY \"name\" DESC LIMIT 10","values":["admin",30]}
build({}, "age", 50) // {"text":"SELECT * FROM \"users\" ORDER BY \"age\" DESC LIMIT 50","values":[]}
build({"age":0}, "name", 100000) // {"text":"SELECT * FROM \"users\" WHERE \"age\" = $1 ORDER BY \"name\" DESC LIMIT 1000","values":[0]}
Как подойти
Подсказки: 2
- Возвращай
thisс типомthis: так цепочка работает и у наследников. - Значения только в
values, в текст попадают плейсхолдеры.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.