diff --git a/.sqlx/query-1c9e1cc1e5326aca618ac1093c97eb9d50290537c93baa76a70285559b96e351.json b/.sqlx/query-1c9e1cc1e5326aca618ac1093c97eb9d50290537c93baa76a70285559b96e351.json new file mode 100644 index 0000000..78a1898 --- /dev/null +++ b/.sqlx/query-1c9e1cc1e5326aca618ac1093c97eb9d50290537c93baa76a70285559b96e351.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "select name as \"region!\", sum(quantity) as \"total!\"\n from orders join regions on orders.region_id = regions.id\n group by name order by name", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "region!", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "total!", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + true, + null + ] + }, + "hash": "1c9e1cc1e5326aca618ac1093c97eb9d50290537c93baa76a70285559b96e351" +} diff --git a/.sqlx/query-2a21722026139ab89b4f8131d12d47b1da5471d984bd015ece9051dfaccd0eaa.json b/.sqlx/query-2a21722026139ab89b4f8131d12d47b1da5471d984bd015ece9051dfaccd0eaa.json new file mode 100644 index 0000000..03f3201 --- /dev/null +++ b/.sqlx/query-2a21722026139ab89b4f8131d12d47b1da5471d984bd015ece9051dfaccd0eaa.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "insert into regions values ($1, $2)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "2a21722026139ab89b4f8131d12d47b1da5471d984bd015ece9051dfaccd0eaa" +} diff --git a/.sqlx/query-37b00daca64bf079e94b5d091990c4ad3e3eef03e850641d4d4de956b1f076ae.json b/.sqlx/query-37b00daca64bf079e94b5d091990c4ad3e3eef03e850641d4d4de956b1f076ae.json new file mode 100644 index 0000000..187f927 --- /dev/null +++ b/.sqlx/query-37b00daca64bf079e94b5d091990c4ad3e3eef03e850641d4d4de956b1f076ae.json @@ -0,0 +1,12 @@ +{ + "db_name": "PostgreSQL", + "query": "drop table if exists regions", + "describe": { + "columns": [], + "parameters": { + "Left": [] + }, + "nullable": [] + }, + "hash": "37b00daca64bf079e94b5d091990c4ad3e3eef03e850641d4d4de956b1f076ae" +} diff --git a/.sqlx/query-a85986b4dd4eb8c6e86b01ad38d0b9558d5519d218ee25a6a3bb64d0c6f49c61.json b/.sqlx/query-a85986b4dd4eb8c6e86b01ad38d0b9558d5519d218ee25a6a3bb64d0c6f49c61.json new file mode 100644 index 0000000..a04838d --- /dev/null +++ b/.sqlx/query-a85986b4dd4eb8c6e86b01ad38d0b9558d5519d218ee25a6a3bb64d0c6f49c61.json @@ -0,0 +1,12 @@ +{ + "db_name": "PostgreSQL", + "query": "create table orders (\n id INT PRIMARY KEY,\n region_id INT,\n gift_name VARCHAR(50),\n quantity INT\n )", + "describe": { + "columns": [], + "parameters": { + "Left": [] + }, + "nullable": [] + }, + "hash": "a85986b4dd4eb8c6e86b01ad38d0b9558d5519d218ee25a6a3bb64d0c6f49c61" +} diff --git a/.sqlx/query-bdd47285c5aec94ebd89c91f2ba2b82c1f2f8f78665f4fce65daa4ad7d2b1e0e.json b/.sqlx/query-bdd47285c5aec94ebd89c91f2ba2b82c1f2f8f78665f4fce65daa4ad7d2b1e0e.json new file mode 100644 index 0000000..fe36590 --- /dev/null +++ b/.sqlx/query-bdd47285c5aec94ebd89c91f2ba2b82c1f2f8f78665f4fce65daa4ad7d2b1e0e.json @@ -0,0 +1,12 @@ +{ + "db_name": "PostgreSQL", + "query": "create table regions (\n id INT PRIMARY KEY,\n name VARCHAR(50)\n )", + "describe": { + "columns": [], + "parameters": { + "Left": [] + }, + "nullable": [] + }, + "hash": "bdd47285c5aec94ebd89c91f2ba2b82c1f2f8f78665f4fce65daa4ad7d2b1e0e" +} diff --git a/.sqlx/query-fa0b25c2c2e00f619c9bbdeed70e090e1a6e3aee1bd438d2cda81332af564a9d.json b/.sqlx/query-fa0b25c2c2e00f619c9bbdeed70e090e1a6e3aee1bd438d2cda81332af564a9d.json new file mode 100644 index 0000000..4cb309a --- /dev/null +++ b/.sqlx/query-fa0b25c2c2e00f619c9bbdeed70e090e1a6e3aee1bd438d2cda81332af564a9d.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "select r.name as \"region!\", (array_remove(array_agg(o.g), null))[1:$1] as \"top_gifts!\" from regions as r left join lateral (select gift_name as g, region_id as r from orders group by r, g order by sum(quantity) desc, g) as o on r.id = o.r group by r.name order by r.name", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "region!", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "top_gifts!", + "type_info": "VarcharArray" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + true, + null + ] + }, + "hash": "fa0b25c2c2e00f619c9bbdeed70e090e1a6e3aee1bd438d2cda81332af564a9d" +} diff --git a/src/cal/day18.rs b/src/cal/day18.rs index c888864..9c7af0d 100644 --- a/src/cal/day18.rs +++ b/src/cal/day18.rs @@ -125,43 +125,32 @@ async fn total(State(state): State) -> Result, } async fn top_list( - Path(limit): Path, + Path(limit): Path, State(state): State, -) -> Result>, (StatusCode, String)> { - let mut top_list = vec![]; - - let regions = sqlx::query_as!( - Region, - "select id, name as \"name!\" from regions order by name" +) -> Result>, (StatusCode, String)> { + let top_lists = sqlx::query_as!( + TopList, + "select r.name as \"region!\", (array_remove(array_agg(o.g), null))[1:$1] as \"top_gifts!\" \ + from regions as r \ + left join lateral (\ + select gift_name as g, region_id as r \ + from orders \ + group by r, g \ + order by sum(quantity) desc, g) as o \ + on r.id = o.r \ + group by r.name \ + order by r.name", + limit ) .fetch_all(&state.pool) .await .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))?; - for region in regions { - let top_gifts = sqlx::query!( - "select gift_name as \"gift_name!\" from orders where region_id = $1 group by gift_name order by sum(quantity) desc limit $2", - region.id, - limit - ) - .fetch_all(&state.pool) - .await - .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))? - .into_iter() - .map(|r| r.gift_name) - .collect(); - - top_list.push(TopGifts { - region: region.name, - top_gifts, - }); - } - - Ok(Json(top_list)) + Ok(Json(top_lists)) }