Problema
Il pattern builder costruisce un oggetto complesso passo dopo passo e produce il risultato finale alla fine, così chi chiama può impostare le parti in qualsiasi ordine.
Ogni parte è una parola chiave, uno spazio e il suo testo:
select <columns>: nomi di colonna separati da virgole (gli spazi attorno alle virgole possono variare). Facoltativo; il valore predefinito è*.from <table>: obbligatorio.where <condition>,order <columns>,limit <n>: facoltativi.
Se una parola chiave appare più di una volta, vince l’ultima. Costruisci la query in questo ordine fisso, con spazi singoli:
SELECT <columns> FROM <table>[ WHERE <condition>][ ORDER BY <columns>][ LIMIT <n>]
Nella lista SELECT, rimuovi gli spazi iniziali e finali da ogni colonna e uniscile con , . Tutti gli altri testi vengono copiati senza modifiche.
Implementa query_builder(parts).
Input
parts: Le parti, in qualsiasi ordine.
Output
Restituisci la stringa della query SQL.
Vincoli
1 ≤ numero di parti ≤ 20
Almeno una parte from; ogni parte ha al massimo 100 caratteri
Esempi
Input:
parts = ["where age \u003e 18", "from users", "select name,age"]
Output atteso:
expected = "SELECT name, age FROM users WHERE age \u003e 18"
Input:
std::vector<std::string> parts = {"where age \u003e 18", "from users", "select name,age"};
Output atteso:
std::string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Input:
string[] parts = new string[] {"where age \u003e 18", "from users", "select name,age"};
Output atteso:
string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Spiegazione
Le parti arrivano fuori ordine, ma la query viene sempre costruita come SELECT … FROM … WHERE …: "SELECT name, age FROM users WHERE age > 18".
Input:
parts = ["from orders", "limit 10", "order total DESC"]
Output atteso:
expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10"
Input:
std::vector<std::string> parts = {"from orders", "limit 10", "order total DESC"};
Output atteso:
std::string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Input:
string[] parts = new string[] {"from orders", "limit 10", "order total DESC"};
Output atteso:
string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Spiegazione
Senza una parte select, le colonne predefinite sono *: "SELECT * FROM orders ORDER BY total DESC LIMIT 10".
Come affrontarlo
Prova prima da solo, poi apri un suggerimento alla volta.
Suggerimento 1
Salva prima ogni parte in base alla sua parola chiave; costruisci il testo solo alla fine.
Suggerimento 2
Una parte successiva con la stessa parola chiave sostituisce quella precedente.
Suggerimento 3
Togli gli spazi da ogni colonna della lista SELECT e usa * se non c'è la parte select.
Complessità attesa
tempo O(lunghezza totale), spazio aggiuntivo O(lunghezza totale)
Riferimenti
Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.