Паттерн 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 символов
Примеры
Ввод:
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".
Ввод:
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. Следуйте условию и ограничениям выше.