@@ -1084,6 +1084,61 @@ void middle_pgsql_t::update_users_table()
10841084 analyze_table (m_db_connection, m_options->dbschema , table_name);
10851085}
10861086
1087+ void middle_pgsql_t::build_way_node_index ()
1088+ {
1089+ dbexec (" CREATE OR REPLACE FUNCTION"
1090+ " {schema}\" {prefix}_index_bucket\" (int8[])"
1091+ " RETURNS int8[] AS $$"
1092+ " SELECT ARRAY(SELECT DISTINCT"
1093+ " unnest($1) >> {way_node_index_id_shift})"
1094+ " $$ LANGUAGE SQL IMMUTABLE" );
1095+
1096+ auto const create_ways_index =
1097+ render_template (" CREATE INDEX \" {prefix}_ways_nodes_bucket_idx\" "
1098+ " ON {schema}\" {prefix}_ways\" "
1099+ " USING GIN ({schema}\" {prefix}_index_bucket\" (nodes))"
1100+ " WITH (fastupdate = off) {index_tablespace}" );
1101+
1102+ log_info (" Building index on middle ways table" );
1103+ m_tables.ways ().task_set (thread_pool ().submit ([&, create_ways_index]() {
1104+ pg_conn_t const db_connection{m_options->connection_params ,
1105+ " middle.index.ways" };
1106+ db_connection.exec (create_ways_index);
1107+ }));
1108+ }
1109+
1110+ void middle_pgsql_t::build_relation_member_indexes ()
1111+ {
1112+ dbexec (" CREATE OR REPLACE FUNCTION"
1113+ " {schema}\" {prefix}_member_ids\" (jsonb, char)"
1114+ " RETURNS int8[] AS $$"
1115+ " SELECT array_agg((el->>'ref')::int8)"
1116+ " FROM jsonb_array_elements($1) AS el"
1117+ " WHERE el->>'type' = $2"
1118+ " $$ LANGUAGE SQL IMMUTABLE" );
1119+
1120+ auto const create_rels_index_node_members = render_template (
1121+ " CREATE INDEX \" {prefix}_rels_node_members_idx\" "
1122+ " ON {schema}\" {prefix}_rels\" USING GIN"
1123+ " (({schema}\" {prefix}_member_ids\" (members, 'N'::char)))"
1124+ " WITH (fastupdate = off) {index_tablespace}" );
1125+
1126+ auto const create_rels_index_way_members = render_template (
1127+ " CREATE INDEX \" {prefix}_rels_way_members_idx\" "
1128+ " ON {schema}\" {prefix}_rels\" USING GIN"
1129+ " (({schema}\" {prefix}_member_ids\" (members, 'W'::char)))"
1130+ " WITH (fastupdate = off) {index_tablespace}" );
1131+
1132+ log_info (" Building indexes on middle rels table" );
1133+ m_tables.relations ().task_set (thread_pool ().submit (
1134+ [&, create_rels_index_node_members, create_rels_index_way_members]() {
1135+ pg_conn_t const db_connection{m_options->connection_params ,
1136+ " middle.index.rels" };
1137+ db_connection.exec (create_rels_index_node_members);
1138+ db_connection.exec (create_rels_index_way_members);
1139+ }));
1140+ }
1141+
10871142void middle_pgsql_t::stop ()
10881143{
10891144 assert (m_middle_state == middle_state::done);
@@ -1098,55 +1153,8 @@ void middle_pgsql_t::stop()
10981153 table.drop_table (m_db_connection);
10991154 }
11001155 } else if (!m_options->append ) {
1101- dbexec (" CREATE OR REPLACE FUNCTION"
1102- " {schema}\" {prefix}_index_bucket\" (int8[])"
1103- " RETURNS int8[] AS $$"
1104- " SELECT ARRAY(SELECT DISTINCT"
1105- " unnest($1) >> {way_node_index_id_shift})"
1106- " $$ LANGUAGE SQL IMMUTABLE" );
1107-
1108- auto const create_ways_index = render_template (
1109- " CREATE INDEX \" {prefix}_ways_nodes_bucket_idx\" "
1110- " ON {schema}\" {prefix}_ways\" "
1111- " USING GIN ({schema}\" {prefix}_index_bucket\" (nodes))"
1112- " WITH (fastupdate = off) {index_tablespace}" );
1113-
1114- log_info (" Building index on middle ways table" );
1115- m_tables.ways ().task_set (thread_pool ().submit ([&, create_ways_index]() {
1116- pg_conn_t const db_connection{m_options->connection_params ,
1117- " middle.index.ways" };
1118- db_connection.exec (create_ways_index);
1119- }));
1120-
1121- dbexec (" CREATE OR REPLACE FUNCTION"
1122- " {schema}\" {prefix}_member_ids\" (jsonb, char)"
1123- " RETURNS int8[] AS $$"
1124- " SELECT array_agg((el->>'ref')::int8)"
1125- " FROM jsonb_array_elements($1) AS el"
1126- " WHERE el->>'type' = $2"
1127- " $$ LANGUAGE SQL IMMUTABLE" );
1128-
1129- auto const create_rels_index_node_members = render_template (
1130- " CREATE INDEX \" {prefix}_rels_node_members_idx\" "
1131- " ON {schema}\" {prefix}_rels\" USING GIN"
1132- " (({schema}\" {prefix}_member_ids\" (members, 'N'::char)))"
1133- " WITH (fastupdate = off) {index_tablespace}" );
1134-
1135- auto const create_rels_index_way_members = render_template (
1136- " CREATE INDEX \" {prefix}_rels_way_members_idx\" "
1137- " ON {schema}\" {prefix}_rels\" USING GIN"
1138- " (({schema}\" {prefix}_member_ids\" (members, 'W'::char)))"
1139- " WITH (fastupdate = off) {index_tablespace}" );
1140-
1141- log_info (" Building indexes on middle rels table" );
1142- m_tables.relations ().task_set (
1143- thread_pool ().submit ([&, create_rels_index_node_members,
1144- create_rels_index_way_members]() {
1145- pg_conn_t const db_connection{m_options->connection_params ,
1146- " middle.index.rels" };
1147- db_connection.exec (create_rels_index_node_members);
1148- db_connection.exec (create_rels_index_way_members);
1149- }));
1156+ build_way_node_index ();
1157+ build_relation_member_indexes ();
11501158 }
11511159}
11521160
0 commit comments