Skip to content

Commit 0a120f3

Browse files
committed
Refactor middle: Put index creation into their own functions
1 parent 8063f60 commit 0a120f3

File tree

2 files changed

+60
-49
lines changed

2 files changed

+60
-49
lines changed

src/middle-pgsql.cpp

Lines changed: 57 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
10871142
void 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

src/middle-pgsql.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,9 @@ struct middle_pgsql_t : public middle_t
176176
std::string render_template(std::string_view templ) const;
177177
void dbexec(std::string_view templ) const;
178178

179+
void build_way_node_index();
180+
void build_relation_member_indexes();
181+
179182
std::map<osmium::user_id_type, std::string> m_users;
180183
osmium::nwr_array<table_desc> m_tables;
181184

0 commit comments

Comments
 (0)