Код 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
  1. Возвращай this с типом this: так цепочка работает и у наследников.
  2. Значения только в values, в текст попадают плейсхолдеры.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.