Problema
O padrão builder constrói um objeto complexo passo a passo e produz o resultado final no fim, para que quem chama possa definir as partes em qualquer ordem.
Cada parte é uma palavra-chave, um espaço e seu texto:
select <columns>: nomes de colunas separados por vírgula (os espaços ao redor das vírgulas podem variar). Opcional; o padrão é*.from <table>: obrigatório.where <condition>,order <columns>,limit <n>: opcionais.
Se uma palavra-chave aparecer mais de uma vez, a última vence. Monte a consulta nesta ordem fixa, com espaços simples:
SELECT <columns> FROM <table>[ WHERE <condition>][ ORDER BY <columns>][ LIMIT <n>]
Na lista SELECT, remova os espaços de cada coluna e junte-as com , . Todos os outros textos são copiados sem שינוי.
Implemente query_builder(parts).
Input
parts: As partes, em qualquer ordem.
Output
Retorne a string da consulta SQL.
Restrições
1 ≤ número de partes ≤ 20
Pelo menos uma parte from; cada parte tem no máximo 100 caracteres
Exemplos
Entrada:
parts = ["where age \u003e 18", "from users", "select name,age"]
Saída esperada:
expected = "SELECT name, age FROM users WHERE age \u003e 18"
Entrada:
std::vector<std::string> parts = {"where age \u003e 18", "from users", "select name,age"};
Saída esperada:
std::string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Entrada:
string[] parts = new string[] {"where age \u003e 18", "from users", "select name,age"};
Saída esperada:
string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Explicação
As partes chegam fora de ordem, mas a consulta é sempre montada como SELECT … FROM … WHERE …: "SELECT name, age FROM users WHERE age > 18".
Entrada:
parts = ["from orders", "limit 10", "order total DESC"]
Saída esperada:
expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10"
Entrada:
std::vector<std::string> parts = {"from orders", "limit 10", "order total DESC"};
Saída esperada:
std::string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Entrada:
string[] parts = new string[] {"from orders", "limit 10", "order total DESC"};
Saída esperada:
string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Explicação
Sem uma parte select, as colunas têm padrão *: "SELECT * FROM orders ORDER BY total DESC LIMIT 10".
Como abordar
Tente sozinho primeiro e depois abra uma dica de cada vez.
Dica 1
Guarde primeiro cada parte pela palavra-chave; monte o texto só no final.
Dica 2
Uma parte posterior com a mesma palavra-chave substitui a anterior.
Dica 3
Remova os espaços de cada coluna da lista SELECT e use * se não houver parte select.
Complexidade esperada
tempo O(comprimento total), espaço extra O(comprimento total)
Referências
Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.