Problema
El patrón builder construye un objeto complejo paso a paso y produce el resultado final al final, de modo que quienes lo usan pueden establecer las partes en cualquier orden.
Cada parte es una palabra clave, un espacio y su texto:
select <columns>: nombres de columnas separados por comas (los espacios alrededor de las comas pueden variar). Opcional; el valor predeterminado es*.from <table>: obligatorio.where <condition>,order <columns>,limit <n>: opcionales.
Si una palabra clave aparece más de una vez, gana la última. Construye la consulta en este orden fijo, con espacios simples:
SELECT <columns> FROM <table>[ WHERE <condition>][ ORDER BY <columns>][ LIMIT <n>]
En la lista SELECT, recorta cada columna y únelas con , . Todos los demás textos se copian sin cambios.
Implementa query_builder(parts).
Entrada
parts: Las partes, en cualquier orden.
Salida
Devuelve la cadena de la consulta SQL.
Restricciones
1 ≤ número de partes ≤ 20
Al menos una parte from; cada parte tiene como máximo 100 caracteres
Ejemplos
Entrada:
parts = ["where age \u003e 18", "from users", "select name,age"]
Salida 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"};
Salida 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"};
Salida esperada:
string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Explicación
Las partes llegan desordenadas, pero la consulta siempre se construye como SELECT … FROM … WHERE …: "SELECT name, age FROM users WHERE age > 18".
Entrada:
parts = ["from orders", "limit 10", "order total DESC"]
Salida esperada:
expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10"
Entrada:
std::vector<std::string> parts = {"from orders", "limit 10", "order total DESC"};
Salida 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"};
Salida esperada:
string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Explicación
Sin parte select, las columnas son * por defecto: "SELECT * FROM orders ORDER BY total DESC LIMIT 10".
Cómo abordarlo
Inténtalo primero por tu cuenta y luego abre las pistas una a una.
Pista 1
Guarda primero cada parte por su palabra clave; construye el texto solo al final.
Pista 2
Una parte posterior con la misma palabra clave reemplaza a la anterior.
Pista 3
Quita espacios a cada columna de la lista SELECT y usa * si no hay parte select.
Complejidad esperada
tiempo O(longitud total), espacio extra O(longitud total)
Referencias
Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.