К списку задач
Средне Решено: 0 Процент решений: 0%

Построитель SQL-запросов

Соберите SQL-запрос из частей, заданных в любом порядке, как объект-построитель по шагам собирает настройки.

Чему вы научитесь

  • Собирать части в любом порядке перед построением
  • Подставлять значения по умолчанию для недостающих частей
  • Собирать результат в фиксированном формате

Условие

Паттерн builder собирает сложный объект шаг за шагом и выдаёт итоговый результат в конце, поэтому части можно задавать в любом порядке.

Каждая часть — это ключевое слово, пробел и его текст:

  • select <columns>: имена столбцов через запятую (пробелы вокруг запятых могут быть любыми). Необязательная; по умолчанию *.
  • from <table>: обязательная.
  • where <condition>, order <columns>, limit <n>: необязательные.

Если ключевое слово встречается несколько раз, побеждает последнее. Соберите запрос в фиксированном порядке, через одиночные пробелы:

SELECT <columns> FROM <table>[ WHERE <condition>][ ORDER BY <columns>][ LIMIT <n>]

В списке SELECT обрежьте пробелы у каждого столбца и соедините их через , . Остальные тексты копируются без изменений.

Реализуйте query_builder(parts).

Входные данные

parts: части в любом порядке.

Выходные данные

Верните строку SQL-запроса.

Ограничения

1 ≤ число частей ≤ 20

Есть хотя бы одна часть from; в каждой части не больше 100 символов

Примеры

Пример 1
Ввод:
parts = ["where age \u003e 18", "from users", "select name,age"]

Ожидаемый вывод:
expected = "SELECT name, age FROM users WHERE age \u003e 18"
Ввод:
std::vector<std::string> parts = {"where age \u003e 18", "from users", "select name,age"};

Ожидаемый вывод:
std::string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Ввод:
string[] parts = new string[] {"where age \u003e 18", "from users", "select name,age"};

Ожидаемый вывод:
string expected = "SELECT name, age FROM users WHERE age \u003e 18";

Пояснение

Части приходят в другом порядке, но запрос всегда строится как SELECT … FROM … WHERE …: "SELECT name, age FROM users WHERE age > 18".

Пример 2
Ввод:
parts = ["from orders", "limit 10", "order total DESC"]

Ожидаемый вывод:
expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10"
Ввод:
std::vector<std::string> parts = {"from orders", "limit 10", "order total DESC"};

Ожидаемый вывод:
std::string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Ввод:
string[] parts = new string[] {"from orders", "limit 10", "order total DESC"};

Ожидаемый вывод:
string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";

Пояснение

Без части select столбцы по умолчанию равны *: "SELECT * FROM orders ORDER BY total DESC LIMIT 10".

Как подступиться

Сначала попробуйте сами, затем открывайте подсказки по одной.

Подсказка 1

Сначала сохраните каждую часть по её ключевому слову; текст стройте только в конце.

Подсказка 2

Более поздняя часть с тем же ключевым словом заменяет предыдущую.

Подсказка 3

Обрежьте пробелы у каждого столбца в списке SELECT и используйте *, если части select нет.

Ожидаемая сложность

время O(общая длина), доп. память O(общая длина)

Ссылки

Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.

Учитесь у других

Решения сообщества

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