問題
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) を実装してください。
Input
parts: 順不同で与えられる部品。
Output
SQL クエリ文字列を返してください。
制約
1 ≤ パーツの数 ≤ 20
from パーツが少なくとも 1 つある。各パーツは 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 つずつ開いてみましょう。
ヒント 1
まず部品をキーワードごとに保存し、文字列は最後に組み立てます。
ヒント 2
同じキーワードの部品が後から来たら、前のものを置き換えます。
ヒント 3
SELECT の各列は空白を取り除き、select 部品がなければ * を使います。
目安の計算量
時間 O(合計の長さ)、追加メモリ O(合計の長さ)
参考資料
この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。