diff --git a/.sqlx/query-e19a25a597098f5d6c5f83992e6eb3a916d2256e346b93c1ad31cc26f9a705a2.json b/.sqlx/query-323d5e8a03e7c905970e1787748510402a5d36c1166f2d21cf14a100779048d6.json similarity index 79% rename from .sqlx/query-e19a25a597098f5d6c5f83992e6eb3a916d2256e346b93c1ad31cc26f9a705a2.json rename to .sqlx/query-323d5e8a03e7c905970e1787748510402a5d36c1166f2d21cf14a100779048d6.json index 40f94335..733d0a99 100644 --- a/.sqlx/query-e19a25a597098f5d6c5f83992e6eb3a916d2256e346b93c1ad31cc26f9a705a2.json +++ b/.sqlx/query-323d5e8a03e7c905970e1787748510402a5d36c1166f2d21cf14a100779048d6.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "WITH from_stations AS (\n SELECT\n s.station_cd,\n s.line_cd\n FROM stations AS s\n WHERE s.station_g_cd = $1\n AND s.e_status = 0\n )\n SELECT\n s.station_cd,\n s.station_g_cd,\n s.station_name,\n s.station_name_k,\n s.station_name_r,\n s.station_name_rn,\n s.station_name_zh,\n s.station_name_ko,\n s.station_number1,\n s.station_number2,\n s.station_number3,\n s.station_number4,\n s.three_letter_code,\n s.line_cd,\n s.pref_cd,\n s.post,\n s.address,\n s.lon,\n s.lat,\n s.open_ymd,\n s.close_ymd,\n s.e_status,\n s.e_sort,\n l.company_cd,\n COALESCE(NULLIF(COALESCE(a.line_name, l.line_name), ''), NULL) AS line_name,\n COALESCE(NULLIF(COALESCE(a.line_name_k, l.line_name_k), ''), NULL) AS line_name_k,\n COALESCE(NULLIF(COALESCE(a.line_name_h, l.line_name_h), ''), NULL) AS line_name_h,\n COALESCE(NULLIF(COALESCE(a.line_name_r, l.line_name_r), ''), NULL) AS line_name_r,\n COALESCE(NULLIF(COALESCE(a.line_name_zh, l.line_name_zh), ''), NULL) AS line_name_zh,\n COALESCE(NULLIF(COALESCE(a.line_name_ko, l.line_name_ko), ''), NULL) AS line_name_ko,\n COALESCE(NULLIF(COALESCE(a.line_color_c, l.line_color_c), ''), NULL) AS line_color_c,\n l.line_type,\n l.line_symbol1,\n l.line_symbol2,\n l.line_symbol3,\n l.line_symbol4,\n l.line_symbol1_color,\n l.line_symbol2_color,\n l.line_symbol3_color,\n l.line_symbol4_color,\n l.line_symbol1_shape,\n l.line_symbol2_shape,\n l.line_symbol3_shape,\n l.line_symbol4_shape,\n COALESCE(l.average_distance, 0.0)::DOUBLE PRECISION AS average_distance,\n NULL::int AS type_id,\n NULL::int AS sst_id,\n NULL::int AS type_cd,\n NULL::int AS line_group_cd,\n NULL::int AS pass,\n NULL::text AS type_name,\n NULL::text AS type_name_k,\n NULL::text AS type_name_r,\n NULL::text AS type_name_zh,\n NULL::text AS type_name_ko,\n NULL::text AS color,\n NULL::int AS direction,\n NULL::int AS kind\n FROM stations AS s\n LEFT JOIN from_stations AS fs\n ON fs.station_cd IS NOT NULL\n LEFT JOIN station_station_types AS from_sst\n ON from_sst.station_cd = fs.station_cd\n LEFT JOIN station_station_types AS dst_sst\n ON dst_sst.station_cd = s.station_cd\n LEFT JOIN types AS t\n ON t.type_cd = dst_sst.type_cd\n LEFT JOIN line_aliases AS la\n ON la.station_cd = s.station_cd\n LEFT JOIN aliases AS a\n ON la.alias_cd = a.id\n JOIN lines AS l\n ON l.line_cd = s.line_cd\n AND l.e_status = 0\n WHERE\n (\n s.station_name LIKE $2\n OR s.station_name_rn LIKE $3\n OR s.station_name_k LIKE $4\n OR s.station_name_zh LIKE $5\n OR s.station_name_ko LIKE $6\n )\n AND s.e_status = 0\n AND (\n (\n from_sst.id IS NOT NULL\n AND dst_sst.id IS NOT NULL\n AND from_sst.line_group_cd = dst_sst.line_group_cd\n AND dst_sst.pass <> 1\n )\n OR\n (\n (from_sst.id IS NULL OR dst_sst.id IS NULL)\n AND s.line_cd = COALESCE(fs.line_cd, s.line_cd)\n )\n )\n ORDER BY s.station_g_cd, s.station_name\n LIMIT $7", + "query": "WITH from_stations AS (\n SELECT\n s.station_cd,\n s.line_cd\n FROM stations AS s\n WHERE s.station_g_cd = $1\n AND s.e_status = 0\n )\n SELECT\n s.station_cd,\n s.station_g_cd,\n s.station_name,\n s.station_name_k,\n s.station_name_r,\n s.station_name_rn,\n s.station_name_zh,\n s.station_name_ko,\n s.station_number1,\n s.station_number2,\n s.station_number3,\n s.station_number4,\n s.three_letter_code,\n s.line_cd,\n s.pref_cd,\n s.post,\n s.address,\n s.lon,\n s.lat,\n s.open_ymd,\n s.close_ymd,\n s.e_status,\n s.e_sort,\n l.company_cd,\n COALESCE(NULLIF(COALESCE(a.line_name, l.line_name), ''), NULL) AS line_name,\n COALESCE(NULLIF(COALESCE(a.line_name_k, l.line_name_k), ''), NULL) AS line_name_k,\n COALESCE(NULLIF(COALESCE(a.line_name_h, l.line_name_h), ''), NULL) AS line_name_h,\n COALESCE(NULLIF(COALESCE(a.line_name_r, l.line_name_r), ''), NULL) AS line_name_r,\n COALESCE(NULLIF(COALESCE(a.line_name_zh, l.line_name_zh), ''), NULL) AS line_name_zh,\n COALESCE(NULLIF(COALESCE(a.line_name_ko, l.line_name_ko), ''), NULL) AS line_name_ko,\n COALESCE(NULLIF(COALESCE(a.line_color_c, l.line_color_c), ''), NULL) AS line_color_c,\n l.line_type,\n l.line_symbol1,\n l.line_symbol2,\n l.line_symbol3,\n l.line_symbol4,\n l.line_symbol1_color,\n l.line_symbol2_color,\n l.line_symbol3_color,\n l.line_symbol4_color,\n l.line_symbol1_shape,\n l.line_symbol2_shape,\n l.line_symbol3_shape,\n l.line_symbol4_shape,\n COALESCE(l.average_distance, 0.0)::DOUBLE PRECISION AS average_distance,\n COALESCE(from_sst.line_group_cd, NULL)::int AS line_group_cd, -- has_train_types用\n NULL::int AS type_id,\n NULL::int AS sst_id,\n NULL::int AS type_cd,\n NULL::int AS pass,\n NULL::text AS type_name,\n NULL::text AS type_name_k,\n NULL::text AS type_name_r,\n NULL::text AS type_name_zh,\n NULL::text AS type_name_ko,\n NULL::text AS color,\n NULL::int AS direction,\n NULL::int AS kind\n FROM stations AS s\n LEFT JOIN from_stations AS fs\n ON fs.station_cd IS NOT NULL\n LEFT JOIN station_station_types AS from_sst\n ON from_sst.station_cd = fs.station_cd\n LEFT JOIN station_station_types AS dst_sst\n ON dst_sst.station_cd = s.station_cd\n LEFT JOIN types AS t\n ON t.type_cd = dst_sst.type_cd\n LEFT JOIN line_aliases AS la\n ON la.station_cd = s.station_cd\n LEFT JOIN aliases AS a\n ON la.alias_cd = a.id\n JOIN lines AS l\n ON l.line_cd = s.line_cd\n AND l.e_status = 0\n WHERE\n (\n s.station_name LIKE $2\n OR s.station_name_rn LIKE $3\n OR s.station_name_k LIKE $4\n OR s.station_name_zh LIKE $5\n OR s.station_name_ko LIKE $6\n )\n AND s.e_status = 0\n AND (\n (\n from_sst.id IS NOT NULL\n AND dst_sst.id IS NOT NULL\n AND from_sst.line_group_cd = dst_sst.line_group_cd\n AND dst_sst.pass <> 1\n )\n OR\n (\n (from_sst.id IS NULL OR dst_sst.id IS NULL)\n AND s.line_cd = COALESCE(fs.line_cd, s.line_cd)\n )\n )\n ORDER BY s.station_g_cd, s.station_name\n LIMIT $7", "describe": { "columns": [ { @@ -230,22 +230,22 @@ }, { "ordinal": 45, - "name": "type_id", + "name": "line_group_cd", "type_info": "Int4" }, { "ordinal": 46, - "name": "sst_id", + "name": "type_id", "type_info": "Int4" }, { "ordinal": 47, - "name": "type_cd", + "name": "sst_id", "type_info": "Int4" }, { "ordinal": 48, - "name": "line_group_cd", + "name": "type_cd", "type_info": "Int4" }, { @@ -366,5 +366,5 @@ null ] }, - "hash": "e19a25a597098f5d6c5f83992e6eb3a916d2256e346b93c1ad31cc26f9a705a2" + "hash": "323d5e8a03e7c905970e1787748510402a5d36c1166f2d21cf14a100779048d6" } diff --git a/.sqlx/query-58899fb950e311e87a33db5142b914a376a60c6cd2650c3723fbdde78beaff12.json b/.sqlx/query-422bdec51028a86db49d9e2b0babd7f58066d3a2433f5b6416972dfc359540fa.json similarity index 89% rename from .sqlx/query-58899fb950e311e87a33db5142b914a376a60c6cd2650c3723fbdde78beaff12.json rename to .sqlx/query-422bdec51028a86db49d9e2b0babd7f58066d3a2433f5b6416972dfc359540fa.json index 218700c0..554e1ef0 100644 --- a/.sqlx/query-58899fb950e311e87a33db5142b914a376a60c6cd2650c3723fbdde78beaff12.json +++ b/.sqlx/query-422bdec51028a86db49d9e2b0babd7f58066d3a2433f5b6416972dfc359540fa.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "WITH\n from_cte AS (\n SELECT\n s.station_cd,\n s.line_cd\n FROM\n stations AS s\n WHERE\n s.station_g_cd = $1\n ),\n to_cte AS (\n SELECT\n s.station_cd,\n s.line_cd\n FROM\n stations AS s\n WHERE\n s.station_g_cd = $2\n ),\n common_lines AS (\n SELECT DISTINCT s1.line_cd\n FROM stations s1\n WHERE s1.station_g_cd = $3\n AND s1.e_status = 0\n AND EXISTS (\n SELECT 1\n FROM stations s2\n WHERE s2.station_g_cd = $4\n AND s2.e_status = 0\n AND s2.line_cd = s1.line_cd\n )\n ),\n sst_cte_c1 AS (\n SELECT\n sst.line_group_cd\n FROM\n station_station_types AS sst\n JOIN from_cte ON sst.station_cd = from_cte.station_cd\n WHERE\n sst.pass <> 1\n ),\n sst_cte_c2 AS (\n SELECT\n sst.line_group_cd\n FROM\n station_station_types AS sst\n JOIN to_cte ON sst.station_cd = to_cte.station_cd\n WHERE\n sst.pass <> 1\n ),\n sst_cte AS (\n SELECT\n sst.id,\n sst.station_cd,\n sst.type_cd,\n sst.line_group_cd,\n sst.pass\n FROM\n station_station_types AS sst\n JOIN sst_cte_c1 ON sst.line_group_cd = sst_cte_c1.line_group_cd\n JOIN sst_cte_c2 ON sst.line_group_cd = sst_cte_c2.line_group_cd\n )\n SELECT\n sta.station_cd,\n sta.station_g_cd,\n sta.station_name,\n sta.station_name_k,\n sta.station_name_r,\n sta.station_name_rn,\n sta.station_name_zh,\n sta.station_name_ko,\n sta.station_number1,\n sta.station_number2,\n sta.station_number3,\n sta.station_number4,\n sta.three_letter_code,\n sta.line_cd,\n sta.pref_cd,\n sta.post,\n sta.address,\n sta.lon,\n sta.lat,\n sta.open_ymd,\n sta.close_ymd,\n sta.e_status,\n sta.e_sort,\n lin.company_cd,\n COALESCE(NULLIF(COALESCE(a.line_name, lin.line_name), ''), NULL) AS line_name,\n COALESCE(NULLIF(COALESCE(a.line_name_k, lin.line_name_k), ''), NULL) AS line_name_k,\n COALESCE(NULLIF(COALESCE(a.line_name_h, lin.line_name_h), ''), NULL) AS line_name_h,\n COALESCE(NULLIF(COALESCE(a.line_name_r, lin.line_name_r), ''), NULL) AS line_name_r,\n COALESCE(NULLIF(COALESCE(a.line_name_zh, lin.line_name_zh), ''), NULL) AS line_name_zh,\n COALESCE(NULLIF(COALESCE(a.line_name_ko, lin.line_name_ko), ''), NULL) AS line_name_ko,\n COALESCE(NULLIF(COALESCE(a.line_color_c, lin.line_color_c), ''), NULL) AS line_color_c,\n lin.line_type,\n lin.line_symbol1,\n lin.line_symbol2,\n lin.line_symbol3,\n lin.line_symbol4,\n lin.line_symbol1_color,\n lin.line_symbol2_color,\n lin.line_symbol3_color,\n lin.line_symbol4_color,\n lin.line_symbol1_shape,\n lin.line_symbol2_shape,\n lin.line_symbol3_shape,\n lin.line_symbol4_shape,\n COALESCE(lin.average_distance, 0.0)::DOUBLE PRECISION AS average_distance,\n NULL::int AS type_id,\n NULL::int AS sst_id,\n NULL::int AS type_cd,\n NULL::int AS line_group_cd,\n NULL::int AS pass,\n NULL::text AS type_name,\n NULL::text AS type_name_k,\n NULL::text AS type_name_r,\n NULL::text AS type_name_zh,\n NULL::text AS type_name_ko,\n NULL::text AS color,\n NULL::int AS direction,\n NULL::int AS kind\n FROM\n stations AS sta\n\t\t\t\tJOIN common_lines AS cl ON sta.line_cd = cl.line_cd\n\t\t\t\tJOIN lines AS lin ON lin.line_cd = cl.line_cd\n LEFT JOIN sst_cte AS sst ON sst.station_cd = sta.station_cd\n LEFT JOIN types AS tt ON tt.type_cd = sst.type_cd\n LEFT JOIN line_aliases AS la ON la.station_cd = sta.station_cd\n LEFT JOIN aliases AS a ON a.id = la.alias_cd\n WHERE\n sst.line_group_cd IS NULL\n AND lin.e_status = 0\n AND sta.e_status = 0\n ORDER BY sta.e_sort, sta.station_cd", + "query": "WITH\n from_cte AS (\n SELECT\n s.station_cd,\n s.line_cd\n FROM\n stations AS s\n WHERE\n s.station_g_cd = $1\n ),\n to_cte AS (\n SELECT\n s.station_cd,\n s.line_cd\n FROM\n stations AS s\n WHERE\n s.station_g_cd = $2\n ),\n common_lines AS (\n SELECT DISTINCT s1.line_cd\n FROM stations s1\n WHERE s1.station_g_cd = $3\n AND s1.e_status = 0\n AND EXISTS (\n SELECT 1\n FROM stations s2\n WHERE s2.station_g_cd = $4\n AND s2.e_status = 0\n AND s2.line_cd = s1.line_cd\n )\n ),\n sst_cte_c1 AS (\n SELECT\n sst.line_group_cd\n FROM\n station_station_types AS sst\n JOIN from_cte ON sst.station_cd = from_cte.station_cd\n WHERE\n sst.pass <> 1\n ),\n sst_cte_c2 AS (\n SELECT\n sst.line_group_cd\n FROM\n station_station_types AS sst\n JOIN to_cte ON sst.station_cd = to_cte.station_cd\n WHERE\n sst.pass <> 1\n ),\n sst_cte AS (\n SELECT\n sst.id,\n sst.station_cd,\n sst.type_cd,\n sst.line_group_cd,\n sst.pass\n FROM\n station_station_types AS sst\n JOIN sst_cte_c1 ON sst.line_group_cd = sst_cte_c1.line_group_cd\n JOIN sst_cte_c2 ON sst.line_group_cd = sst_cte_c2.line_group_cd\n )\n SELECT\n sta.station_cd,\n sta.station_g_cd,\n sta.station_name,\n sta.station_name_k,\n sta.station_name_r,\n sta.station_name_rn,\n sta.station_name_zh,\n sta.station_name_ko,\n sta.station_number1,\n sta.station_number2,\n sta.station_number3,\n sta.station_number4,\n sta.three_letter_code,\n sta.line_cd,\n sta.pref_cd,\n sta.post,\n sta.address,\n sta.lon,\n sta.lat,\n sta.open_ymd,\n sta.close_ymd,\n sta.e_status,\n sta.e_sort,\n lin.company_cd,\n COALESCE(NULLIF(COALESCE(a.line_name, lin.line_name), ''), NULL) AS line_name,\n COALESCE(NULLIF(COALESCE(a.line_name_k, lin.line_name_k), ''), NULL) AS line_name_k,\n COALESCE(NULLIF(COALESCE(a.line_name_h, lin.line_name_h), ''), NULL) AS line_name_h,\n COALESCE(NULLIF(COALESCE(a.line_name_r, lin.line_name_r), ''), NULL) AS line_name_r,\n COALESCE(NULLIF(COALESCE(a.line_name_zh, lin.line_name_zh), ''), NULL) AS line_name_zh,\n COALESCE(NULLIF(COALESCE(a.line_name_ko, lin.line_name_ko), ''), NULL) AS line_name_ko,\n COALESCE(NULLIF(COALESCE(a.line_color_c, lin.line_color_c), ''), NULL) AS line_color_c,\n lin.line_type,\n lin.line_symbol1,\n lin.line_symbol2,\n lin.line_symbol3,\n lin.line_symbol4,\n lin.line_symbol1_color,\n lin.line_symbol2_color,\n lin.line_symbol3_color,\n lin.line_symbol4_color,\n lin.line_symbol1_shape,\n lin.line_symbol2_shape,\n lin.line_symbol3_shape,\n lin.line_symbol4_shape,\n COALESCE(lin.average_distance, 0.0)::DOUBLE PRECISION AS average_distance,\n COALESCE(sst.line_group_cd, NULL)::int AS line_group_cd, -- has_train_types用\n NULL::int AS type_id,\n NULL::int AS sst_id,\n NULL::int AS type_cd,\n NULL::int AS pass,\n NULL::text AS type_name,\n NULL::text AS type_name_k,\n NULL::text AS type_name_r,\n NULL::text AS type_name_zh,\n NULL::text AS type_name_ko,\n NULL::text AS color,\n NULL::int AS direction,\n NULL::int AS kind\n FROM\n stations AS sta\n\t\t\t\tJOIN common_lines AS cl ON sta.line_cd = cl.line_cd\n\t\t\t\tJOIN lines AS lin ON lin.line_cd = cl.line_cd\n LEFT JOIN sst_cte AS sst ON sst.station_cd = sta.station_cd\n LEFT JOIN types AS tt ON tt.type_cd = sst.type_cd\n LEFT JOIN line_aliases AS la ON la.station_cd = sta.station_cd\n LEFT JOIN aliases AS a ON a.id = la.alias_cd\n WHERE\n sst.line_group_cd IS NULL\n AND lin.e_status = 0\n AND sta.e_status = 0\n ORDER BY sta.e_sort, sta.station_cd", "describe": { "columns": [ { @@ -230,22 +230,22 @@ }, { "ordinal": 45, - "name": "type_id", + "name": "line_group_cd", "type_info": "Int4" }, { "ordinal": 46, - "name": "sst_id", + "name": "type_id", "type_info": "Int4" }, { "ordinal": 47, - "name": "type_cd", + "name": "sst_id", "type_info": "Int4" }, { "ordinal": 48, - "name": "line_group_cd", + "name": "type_cd", "type_info": "Int4" }, { @@ -363,5 +363,5 @@ null ] }, - "hash": "58899fb950e311e87a33db5142b914a376a60c6cd2650c3723fbdde78beaff12" + "hash": "422bdec51028a86db49d9e2b0babd7f58066d3a2433f5b6416972dfc359540fa" } diff --git a/stationapi/src/infrastructure/station_repository.rs b/stationapi/src/infrastructure/station_repository.rs index 57dd8aca..de94eb8e 100644 --- a/stationapi/src/infrastructure/station_repository.rs +++ b/stationapi/src/infrastructure/station_repository.rs @@ -1006,10 +1006,10 @@ impl InternalStationRepository { l.line_symbol3_shape, l.line_symbol4_shape, COALESCE(l.average_distance, 0.0)::DOUBLE PRECISION AS average_distance, + COALESCE(from_sst.line_group_cd, NULL)::int AS line_group_cd, -- has_train_types用 NULL::int AS type_id, NULL::int AS sst_id, NULL::int AS type_cd, - NULL::int AS line_group_cd, NULL::int AS pass, NULL::text AS type_name, NULL::text AS type_name_k, @@ -1276,10 +1276,10 @@ impl InternalStationRepository { lin.line_symbol3_shape, lin.line_symbol4_shape, COALESCE(lin.average_distance, 0.0)::DOUBLE PRECISION AS average_distance, + COALESCE(sst.line_group_cd, NULL)::int AS line_group_cd, -- has_train_types用 NULL::int AS type_id, NULL::int AS sst_id, NULL::int AS type_cd, - NULL::int AS line_group_cd, NULL::int AS pass, NULL::text AS type_name, NULL::text AS type_name_k, diff --git a/stationapi/src/use_case/interactor/query.rs b/stationapi/src/use_case/interactor/query.rs index cab7f1b9..e9423c9a 100644 --- a/stationapi/src/use_case/interactor/query.rs +++ b/stationapi/src/use_case/interactor/query.rs @@ -526,16 +526,6 @@ where .get_route_stops(from_station_id, to_station_id) .await?; - let line_group_id_vec = stops - .iter() - .filter_map(|row| row.line_group_cd.map(|id| id as u32)) - .collect::>(); - - let tt_lines = self - .line_repository - .get_by_line_group_id_vec_for_routes(&line_group_id_vec) - .await?; - let route_row_tree_map: BTreeMap> = stops.iter().fold( BTreeMap::new(), |mut acc: BTreeMap>, value| { @@ -548,193 +538,74 @@ where }, ); - let routes: Vec = route_row_tree_map - .iter() - .filter_map(|(id, stops)| { - let stops = stops - .iter() - .map(|row| { - let extracted_line = self.extract_line_from_station(row); - - if let Some(tt_line) = - tt_lines.iter().find(|line| line.line_cd == row.line_cd) - { - let train_type = match row.type_id.is_some() { - true => Some(Box::new(TrainType { - id: row.type_id, - station_cd: Some(row.station_cd), - type_cd: row.type_cd, - line_group_cd: row.line_group_cd, - pass: row.pass, - type_name: row.type_name.clone().unwrap_or_default(), - type_name_k: row.type_name_k.clone().unwrap_or_default(), - type_name_r: row.type_name_r.clone(), - type_name_zh: row.type_name_zh.clone(), - type_name_ko: row.type_name_ko.clone(), - color: row.color.clone().unwrap_or_default(), - direction: row.direction, - kind: row.kind, - line: Some(Box::new(tt_line.clone())), - lines: tt_lines.to_vec(), - })), - false => None, - }; - - let stop = Station { - station_cd: row.station_cd, - station_g_cd: row.station_g_cd, - station_name: row.station_name.clone(), - station_name_k: row.station_name_k.clone(), - station_name_r: row.station_name_r.clone(), - station_name_zh: row.station_name_zh.clone(), - station_name_ko: row.station_name_ko.clone(), - station_numbers: self.get_station_numbers(row), - station_number1: row.station_number1.clone(), - station_number2: row.station_number2.clone(), - station_number3: row.station_number3.clone(), - station_number4: row.station_number4.clone(), - three_letter_code: row.three_letter_code.clone(), - line_cd: row.line_cd, - line: Some(Box::new(extracted_line.clone())), - lines: vec![], - pref_cd: row.pref_cd, - post: row.post.clone(), - address: row.address.clone(), - lon: row.lon, - lat: row.lat, - open_ymd: row.open_ymd.clone(), - close_ymd: row.close_ymd.clone(), - e_status: row.e_status, - e_sort: row.e_sort, - stop_condition: row.stop_condition, - distance: row.distance, - train_type, - has_train_types: row.has_train_types, - company_cd: row.company_cd, - line_name: row.line_name.clone(), - line_name_k: row.line_name_k.clone(), - line_name_h: row.line_name_h.clone(), - line_name_r: row.line_name_r.clone(), - line_name_zh: row.line_name_zh.clone(), - line_name_ko: row.line_name_ko.clone(), - line_color_c: row.line_color_c.clone(), - line_type: row.line_type, - line_symbol1: row.line_symbol1.clone(), - line_symbol2: row.line_symbol2.clone(), - line_symbol3: row.line_symbol3.clone(), - line_symbol4: row.line_symbol4.clone(), - line_symbol1_color: row.line_symbol1_color.clone(), - line_symbol2_color: row.line_symbol2_color.clone(), - line_symbol3_color: row.line_symbol3_color.clone(), - line_symbol4_color: row.line_symbol4_color.clone(), - line_symbol1_shape: row.line_symbol1_shape.clone(), - line_symbol2_shape: row.line_symbol2_shape.clone(), - line_symbol3_shape: row.line_symbol3_shape.clone(), - line_symbol4_shape: row.line_symbol4_shape.clone(), - average_distance: row.average_distance, - type_id: row.type_id, - sst_id: row.sst_id, + let mut routes: Vec = Vec::new(); + + for (id, stops) in route_row_tree_map.iter() { + let line_group_id_vec = stops + .iter() + .filter_map(|row| row.line_group_cd.map(|id| id as u32)) + .collect::>(); + + let mut tt_lines = self + .line_repository + .get_by_line_group_id_vec_for_routes(&line_group_id_vec) + .await?; + + let stops = stops + .iter() + .map(|row| { + let extracted_line = self.extract_line_from_station(row); + + if let Some(tt_line) = + tt_lines.iter_mut().find(|line| line.line_cd == row.line_cd) + { + tt_line.line_symbols = self.get_line_symbols(tt_line); + + let train_type = match row.type_id.is_some() { + true => Some(Box::new(TrainType { + id: row.type_id, + station_cd: Some(row.station_cd), type_cd: row.type_cd, line_group_cd: row.line_group_cd, pass: row.pass, - type_name: row.type_name.clone(), - type_name_k: row.type_name_k.clone(), + type_name: row.type_name.clone().unwrap_or_default(), + type_name_k: row.type_name_k.clone().unwrap_or_default(), type_name_r: row.type_name_r.clone(), type_name_zh: row.type_name_zh.clone(), type_name_ko: row.type_name_ko.clone(), - color: row.color.clone(), + color: row.color.clone().unwrap_or_default(), direction: row.direction, kind: row.kind, - }; - - return stop.into(); - } - - let stop = Station { - station_cd: row.station_cd, - station_g_cd: row.station_g_cd, - station_name: row.station_name.clone(), - station_name_k: row.station_name_k.clone(), - station_name_r: row.station_name_r.clone(), - station_name_zh: row.station_name_zh.clone(), - station_name_ko: row.station_name_ko.clone(), - station_numbers: self.get_station_numbers(row), - station_number1: row.station_number1.clone(), - station_number2: row.station_number2.clone(), - station_number3: row.station_number3.clone(), - station_number4: row.station_number4.clone(), - three_letter_code: row.three_letter_code.clone(), - line_cd: row.line_cd, - line: Some(Box::new(extracted_line.clone())), - lines: vec![], - pref_cd: row.pref_cd, - post: row.post.clone(), - address: row.address.clone(), - lon: row.lon, - lat: row.lat, - open_ymd: row.open_ymd.clone(), - close_ymd: row.close_ymd.clone(), - e_status: row.e_status, - e_sort: row.e_sort, - stop_condition: row.stop_condition, - distance: row.distance, - train_type: None, - has_train_types: row.has_train_types, - company_cd: row.company_cd, - line_name: row.line_name.clone(), - line_name_k: row.line_name_k.clone(), - line_name_h: row.line_name_h.clone(), - line_name_r: row.line_name_r.clone(), - line_name_zh: row.line_name_zh.clone(), - line_name_ko: row.line_name_ko.clone(), - line_color_c: row.line_color_c.clone(), - line_type: row.line_type, - line_symbol1: row.line_symbol1.clone(), - line_symbol2: row.line_symbol2.clone(), - line_symbol3: row.line_symbol3.clone(), - line_symbol4: row.line_symbol4.clone(), - line_symbol1_color: row.line_symbol1_color.clone(), - line_symbol2_color: row.line_symbol2_color.clone(), - line_symbol3_color: row.line_symbol3_color.clone(), - line_symbol4_color: row.line_symbol4_color.clone(), - line_symbol1_shape: row.line_symbol1_shape.clone(), - line_symbol2_shape: row.line_symbol2_shape.clone(), - line_symbol3_shape: row.line_symbol3_shape.clone(), - line_symbol4_shape: row.line_symbol4_shape.clone(), - average_distance: row.average_distance, - type_id: row.type_id, - sst_id: row.sst_id, - type_cd: row.type_cd, - line_group_cd: row.line_group_cd, - pass: row.pass, - type_name: row.type_name.clone(), - type_name_k: row.type_name_k.clone(), - type_name_r: row.type_name_r.clone(), - type_name_zh: row.type_name_zh.clone(), - type_name_ko: row.type_name_ko.clone(), - color: row.color.clone(), - direction: row.direction, - kind: row.kind, + line: Some(Box::new(tt_line.clone())), + lines: tt_lines.to_vec(), + })), + false => None, }; - stop.into() - }) - .collect::>(); + let stop = self.build_station_from_row(row, &extracted_line, train_type); - // TODO: SQLで同等の処理を行う - let includes_requested_station = stops - .iter() - .any(|stop| stop.group_id == from_station_id || stop.group_id == to_station_id); - if !includes_requested_station { - return None; - } + return stop.into(); + } - Some(Route { - id: *id as u32, - stops, + let stop = self.build_station_from_row(row, &extracted_line, None); + + stop.into() }) - }) - .collect(); + .collect::>(); + + // TODO: SQLで同等の処理を行う + let includes_requested_station = stops + .iter() + .any(|stop| stop.group_id == from_station_id || stop.group_id == to_station_id); + if !includes_requested_station { + continue; + } + + routes.push(Route { + id: *id as u32, + stops, + }); + } Ok(routes) } @@ -848,3 +719,85 @@ where Ok(vec![]) } } + +impl QueryInteractor +where + SR: StationRepository, + LR: LineRepository, + TR: TrainTypeRepository, + CR: CompanyRepository, +{ + fn build_station_from_row( + &self, + row: &Station, + extracted_line: &Line, + train_type: Option>, + ) -> Station { + Station { + station_cd: row.station_cd, + station_g_cd: row.station_g_cd, + station_name: row.station_name.clone(), + station_name_k: row.station_name_k.clone(), + station_name_r: row.station_name_r.clone(), + station_name_zh: row.station_name_zh.clone(), + station_name_ko: row.station_name_ko.clone(), + station_numbers: self.get_station_numbers(row), + station_number1: row.station_number1.clone(), + station_number2: row.station_number2.clone(), + station_number3: row.station_number3.clone(), + station_number4: row.station_number4.clone(), + three_letter_code: row.three_letter_code.clone(), + line_cd: row.line_cd, + line: Some(Box::new(extracted_line.clone())), + lines: vec![], + pref_cd: row.pref_cd, + post: row.post.clone(), + address: row.address.clone(), + lon: row.lon, + lat: row.lat, + open_ymd: row.open_ymd.clone(), + close_ymd: row.close_ymd.clone(), + e_status: row.e_status, + e_sort: row.e_sort, + stop_condition: row.stop_condition, + distance: row.distance, + train_type, + has_train_types: row.has_train_types, + company_cd: row.company_cd, + line_name: row.line_name.clone(), + line_name_k: row.line_name_k.clone(), + line_name_h: row.line_name_h.clone(), + line_name_r: row.line_name_r.clone(), + line_name_zh: row.line_name_zh.clone(), + line_name_ko: row.line_name_ko.clone(), + line_color_c: row.line_color_c.clone(), + line_type: row.line_type, + line_symbol1: row.line_symbol1.clone(), + line_symbol2: row.line_symbol2.clone(), + line_symbol3: row.line_symbol3.clone(), + line_symbol4: row.line_symbol4.clone(), + line_symbol1_color: row.line_symbol1_color.clone(), + line_symbol2_color: row.line_symbol2_color.clone(), + line_symbol3_color: row.line_symbol3_color.clone(), + line_symbol4_color: row.line_symbol4_color.clone(), + line_symbol1_shape: row.line_symbol1_shape.clone(), + line_symbol2_shape: row.line_symbol2_shape.clone(), + line_symbol3_shape: row.line_symbol3_shape.clone(), + line_symbol4_shape: row.line_symbol4_shape.clone(), + average_distance: row.average_distance, + type_id: row.type_id, + sst_id: row.sst_id, + type_cd: row.type_cd, + line_group_cd: row.line_group_cd, + pass: row.pass, + type_name: row.type_name.clone(), + type_name_k: row.type_name_k.clone(), + type_name_r: row.type_name_r.clone(), + type_name_zh: row.type_name_zh.clone(), + type_name_ko: row.type_name_ko.clone(), + color: row.color.clone(), + direction: row.direction, + kind: row.kind, + } + } +}