Problem
Das builder-Muster konstruiert Schritt für Schritt ein komplexes Objekt und liefert am Ende das Ergebnis, sodass Aufrufer die Teile in beliebiger Reihenfolge setzen können.
Jeder Teil ist ein Schlüsselwort, ein Leerzeichen und sein Text:
select <columns>: durch Kommas getrennte Spaltennamen (Leerzeichen um die Kommas können variieren). Optional; der Standard ist*.from <table>: erforderlich.where <condition>,order <columns>,limit <n>: optional.
Wenn ein Schlüsselwort mehr als einmal vorkommt, zählt das letzte. Baue die Abfrage in dieser festen Reihenfolge mit einzelnen Leerzeichen:
SELECT <columns> FROM <table>[ WHERE <condition>][ ORDER BY <columns>][ LIMIT <n>]
In der SELECT-Liste trimme jede Spalte und verbinde sie mit , . Alle anderen Texte werden unverändert kopiert.
Implementiere query_builder(parts).
Eingabe
parts: Die Teile, in beliebiger Reihenfolge.
Ausgabe
Gib den SQL-Abfragestring zurück.
Einschränkungen
1 ≤ Anzahl der Teile ≤ 20
Mindestens ein from-Teil; jeder Teil hat höchstens 100 Zeichen
Beispiele
Eingabe:
parts = ["where age \u003e 18", "from users", "select name,age"]
Erwartete Ausgabe:
expected = "SELECT name, age FROM users WHERE age \u003e 18"
Eingabe:
std::vector<std::string> parts = {"where age \u003e 18", "from users", "select name,age"};
Erwartete Ausgabe:
std::string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Eingabe:
string[] parts = new string[] {"where age \u003e 18", "from users", "select name,age"};
Erwartete Ausgabe:
string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Erläuterung
Die Teile kommen in anderer Reihenfolge an, aber die Abfrage wird immer als SELECT … FROM … WHERE … aufgebaut: "SELECT name, age FROM users WHERE age > 18".
Eingabe:
parts = ["from orders", "limit 10", "order total DESC"]
Erwartete Ausgabe:
expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10"
Eingabe:
std::vector<std::string> parts = {"from orders", "limit 10", "order total DESC"};
Erwartete Ausgabe:
std::string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Eingabe:
string[] parts = new string[] {"from orders", "limit 10", "order total DESC"};
Erwartete Ausgabe:
string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Erläuterung
Ohne einen select-Teil sind die Spalten standardmäßig *: "SELECT * FROM orders ORDER BY total DESC LIMIT 10".
So gehst du vor
Versuch es zuerst allein und öffne dann einen Hinweis nach dem anderen.
Hinweis 1
Speichere jeden Teil zuerst unter seinem Schlüsselwort; baue den Text erst am Ende.
Hinweis 2
Ein späterer Teil mit demselben Schlüsselwort ersetzt den früheren.
Hinweis 3
Trimme jede Spalte in der SELECT-Liste und nimm *, wenn es keinen select-Teil gibt.
Erwartete Komplexität
Zeit O(Gesamtlänge), zusätzlicher Speicher O(Gesamtlänge)
Referenzen
Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.