Skip to content

Commit ba8e800

Browse files
authored
Merge pull request #1127 from joto/make-sql-templates-more-readable
Make sql templates more readable
2 parents 5c67636 + 55a61c6 commit ba8e800

File tree

2 files changed

+130
-70
lines changed

2 files changed

+130
-70
lines changed

src/middle-pgsql.cpp

Lines changed: 121 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,30 @@
3030
#include "output-pgsql.hpp"
3131
#include "util.hpp"
3232

33-
middle_pgsql_t::table_desc::table_desc(std::string const &name,
34-
std::string const &create,
35-
std::string const &prepare_query,
36-
std::string const &prepare_intarray,
37-
std::string const &array_indexes)
38-
: m_create(create), m_prepare_query(prepare_query),
39-
m_prepare_intarray(prepare_intarray), m_array_indexes(array_indexes),
33+
static std::string build_sql(options_t const &options, char const *templ)
34+
{
35+
std::string const using_tablespace{options.tblsslim_index.empty()
36+
? ""
37+
: "USING INDEX TABLESPACE " +
38+
options.tblsslim_index};
39+
return fmt::format(
40+
templ, fmt::arg("prefix", options.prefix),
41+
fmt::arg("unlogged", options.droptemp ? "UNLOGGED" : ""),
42+
fmt::arg("using_tablespace", using_tablespace),
43+
fmt::arg("data_tablespace", tablespace_clause(options.tblsslim_data)),
44+
fmt::arg("index_tablespace",
45+
tablespace_clause(options.tblsslim_index)));
46+
}
47+
48+
middle_pgsql_t::table_desc::table_desc(options_t const &options,
49+
table_sql const &ts)
50+
: m_create(build_sql(options, ts.create_table)),
51+
m_prepare_query(build_sql(options, ts.prepare_query)),
52+
m_prepare_intarray(build_sql(options, ts.prepare_mark)),
53+
m_array_indexes(build_sql(options, ts.create_index)),
4054
m_copy_target(std::make_shared<db_target_descr_t>())
4155
{
42-
m_copy_target->name = name;
56+
m_copy_target->name = build_sql(options, ts.name);
4357
m_copy_target->id = "id"; // XXX hardcoded column name
4458
}
4559

@@ -658,6 +672,102 @@ void middle_pgsql_t::stop(osmium::thread::Pool &pool)
658672
}
659673
}
660674

675+
static table_sql sql_for_nodes() noexcept
676+
{
677+
table_sql sql{};
678+
679+
sql.name = "{prefix}_nodes";
680+
681+
sql.create_table = "CREATE {unlogged} TABLE {prefix}_nodes ("
682+
" id int8 PRIMARY KEY {using_tablespace},"
683+
" lat int4 NOT NULL,"
684+
" lon int4 NOT NULL"
685+
") {data_tablespace};\n";
686+
687+
sql.prepare_query = "PREPARE get_node_list(int8[]) AS"
688+
" SELECT id, lat, lon FROM {prefix}_nodes"
689+
" WHERE id = ANY($1::int8[]);\n";
690+
691+
return sql;
692+
}
693+
694+
static table_sql sql_for_ways() noexcept
695+
{
696+
table_sql sql{};
697+
698+
sql.name = "{prefix}_ways";
699+
700+
sql.create_table = "CREATE {unlogged} TABLE {prefix}_ways ("
701+
" id int8 PRIMARY KEY {using_tablespace},"
702+
" nodes int8[] NOT NULL,"
703+
" tags text[]"
704+
") {data_tablespace};\n";
705+
706+
sql.prepare_query = "PREPARE get_way(int8) AS"
707+
" SELECT nodes, tags, array_upper(nodes, 1)"
708+
" FROM {prefix}_ways WHERE id = $1;\n"
709+
"PREPARE get_way_list(int8[]) AS"
710+
" SELECT id, nodes, tags, array_upper(nodes, 1)"
711+
" FROM {prefix}_ways WHERE id = ANY($1::int8[]);\n";
712+
713+
sql.prepare_mark = "PREPARE mark_ways_by_node(int8) AS"
714+
" SELECT id FROM {prefix}_ways"
715+
" WHERE nodes && ARRAY[$1];\n"
716+
"PREPARE mark_ways_by_rel(int8) AS"
717+
" SELECT id FROM {prefix}_ways"
718+
" WHERE id IN ("
719+
" SELECT unnest(parts[way_off+1:rel_off])"
720+
" FROM {prefix}_rels WHERE id = $1"
721+
" );\n";
722+
723+
sql.create_index = "CREATE INDEX ON {prefix}_ways USING GIN (nodes)"
724+
" WITH (fastupdate = off) {index_tablespace};\n";
725+
726+
return sql;
727+
}
728+
729+
static table_sql sql_for_relations() noexcept
730+
{
731+
table_sql sql{};
732+
733+
sql.name = "{prefix}_rels";
734+
735+
sql.create_table = "CREATE {unlogged} TABLE {prefix}_rels ("
736+
" id int8 PRIMARY KEY {using_tablespace},"
737+
" way_off int2,"
738+
" rel_off int2,"
739+
" parts int8[],"
740+
" members text[],"
741+
" tags text[]"
742+
") {data_tablespace};\n";
743+
744+
sql.prepare_query = "PREPARE get_rel(int8) AS"
745+
" SELECT members, tags, array_upper(members, 1) / 2"
746+
" FROM {prefix}_rels WHERE id = $1;\n"
747+
"PREPARE rels_using_way(int8) AS"
748+
" SELECT id FROM {prefix}_rels"
749+
" WHERE parts && ARRAY[$1]"
750+
" AND parts[way_off+1:rel_off] && ARRAY[$1];\n";
751+
752+
sql.prepare_mark = "PREPARE mark_rels_by_node(int8) AS"
753+
" SELECT id FROM {prefix}_ways"
754+
" WHERE nodes && ARRAY[$1];\n"
755+
"PREPARE mark_rels_by_way(int8) AS"
756+
" SELECT id FROM {prefix}_rels"
757+
" WHERE parts && ARRAY[$1]"
758+
" AND parts[way_off+1:rel_off] && ARRAY[$1];\n"
759+
"PREPARE mark_rels(int8) AS"
760+
" SELECT id FROM {prefix}_rels"
761+
" WHERE parts && ARRAY[$1]"
762+
" AND parts[rel_off+1:array_length(parts,1)]"
763+
" && ARRAY[$1];\n";
764+
765+
sql.create_index = "CREATE INDEX ON {prefix}_rels USING GIN (parts)"
766+
" WITH (fastupdate = off) {index_tablespace};\n";
767+
768+
return sql;
769+
}
770+
661771
middle_pgsql_t::middle_pgsql_t(options_t const *options)
662772
: m_append(options->append), m_mark_pending(true), m_out_options(options),
663773
m_cache(new node_ram_cache{options->alloc_chunkwise | ALLOC_LOSSY,
@@ -672,64 +782,9 @@ middle_pgsql_t::middle_pgsql_t(options_t const *options)
672782

673783
fmt::print(stderr, "Mid: pgsql, cache={}\n", options->cache);
674784

675-
std::string const index_tablespace{options->tblsslim_index.empty()
676-
? ""
677-
: "USING INDEX TABLESPACE " +
678-
options->tblsslim_index};
679-
680-
std::string const unlogged{options->droptemp ? "UNLOGGED" : ""};
681-
682-
m_tables[NODE_TABLE] = table_desc{
683-
/*name*/ "{}_nodes"_format(options->prefix),
684-
/*create*/
685-
"CREATE {} TABLE {}_nodes (id int8 PRIMARY KEY {}, lat int4 NOT NULL, lon int4 NOT NULL) {};\n"_format(
686-
unlogged, options->prefix, index_tablespace,
687-
tablespace_clause(options->tblsslim_data)),
688-
/*prepare_query */
689-
"PREPARE get_node_list(int8[]) AS SELECT id, lat, lon FROM {}_nodes WHERE id = ANY($1::int8[]);\n"_format(
690-
options->prefix)};
691-
692-
m_tables[WAY_TABLE] = table_desc{
693-
/*name*/ "{}_ways"_format(options->prefix),
694-
/*create*/
695-
"CREATE {} TABLE {}_ways (id int8 PRIMARY KEY {}, nodes int8[] NOT NULL, tags text[]) {};\n"_format(
696-
unlogged, options->prefix, index_tablespace,
697-
tablespace_clause(options->tblsslim_data)),
698-
/*prepare_query */
699-
"PREPARE get_way(int8) AS SELECT nodes, tags, array_upper(nodes,1) "
700-
"FROM {0}_ways WHERE id = $1;\n"
701-
"PREPARE get_way_list(int8[]) AS SELECT id, nodes, tags, array_upper(nodes,1) FROM {0}_ways WHERE id = ANY($1::int8[]);\n"_format(
702-
options->prefix),
703-
/*prepare_intarray*/
704-
"PREPARE mark_ways_by_node(int8) AS SELECT id FROM {0}_ways WHERE "
705-
"nodes && ARRAY[$1];\n"
706-
"PREPARE mark_ways_by_rel(int8) AS SELECT id FROM {0}_ways WHERE id IN (SELECT unnest(parts[way_off+1:rel_off]) FROM {0}_rels WHERE id = $1);\n"_format(
707-
options->prefix),
708-
/*array_indexes*/
709-
"CREATE INDEX {0}_ways_nodes ON {0}_ways USING GIN (nodes) WITH (fastupdate = off) {1};\n"_format(
710-
options->prefix, tablespace_clause(options->tblsslim_index))};
711-
712-
m_tables[REL_TABLE] = table_desc{
713-
/*name*/ "{}_rels"_format(options->prefix),
714-
/*create*/
715-
"CREATE {} TABLE {}_rels(id int8 PRIMARY KEY {}, way_off int2, rel_off int2, parts int8[], members text[], tags text[]) {};\n"_format(
716-
unlogged, options->prefix, index_tablespace,
717-
tablespace_clause(options->tblsslim_data)),
718-
/*prepare_query */
719-
"PREPARE get_rel(int8) AS SELECT members, tags, "
720-
"array_upper(members,1)/2 FROM {0}_rels WHERE id = $1;\n"
721-
"PREPARE rels_using_way(int8) AS SELECT id FROM {0}_rels WHERE parts && ARRAY[$1] AND parts[way_off+1:rel_off] && ARRAY[$1];\n"_format(
722-
options->prefix),
723-
/*prepare_intarray*/
724-
"PREPARE mark_rels_by_node(int8) AS SELECT id FROM {0}_ways WHERE "
725-
"nodes && ARRAY[$1];\n"
726-
"PREPARE mark_rels_by_way(int8) AS SELECT id FROM {0}_rels WHERE parts "
727-
"&& ARRAY[$1] AND parts[way_off+1:rel_off] && ARRAY[$1];\n"
728-
"PREPARE mark_rels(int8) AS SELECT id FROM {0}_rels WHERE parts && ARRAY[$1] AND parts[rel_off+1:array_length(parts,1)] && ARRAY[$1];\n"_format(
729-
options->prefix),
730-
/*array_indexes*/
731-
"CREATE INDEX {0}_rels_parts ON {0}_rels USING GIN (parts) WITH (fastupdate = off) {1};\n"_format(
732-
options->prefix, tablespace_clause(options->tblsslim_index))};
785+
m_tables[NODE_TABLE] = table_desc{*options, sql_for_nodes()};
786+
m_tables[WAY_TABLE] = table_desc{*options, sql_for_ways()};
787+
m_tables[REL_TABLE] = table_desc{*options, sql_for_relations()};
733788
}
734789

735790
std::shared_ptr<middle_query_t>

src/middle-pgsql.hpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@ class middle_query_pgsql_t : public middle_query_t
4949
std::shared_ptr<node_persistent_cache> m_persistent_cache;
5050
};
5151

52+
struct table_sql {
53+
char const *name = "";
54+
char const *create_table = "";
55+
char const *prepare_query = "";
56+
char const *prepare_mark = "";
57+
char const *create_index = "";
58+
};
59+
5260
struct middle_pgsql_t : public slim_middle_t
5361
{
5462
middle_pgsql_t(options_t const *options);
@@ -81,10 +89,7 @@ struct middle_pgsql_t : public slim_middle_t
8189
{
8290
public:
8391
table_desc() {}
84-
table_desc(std::string const &name, std::string const &create,
85-
std::string const &prepare_query,
86-
std::string const &prepare_intarray = "",
87-
std::string const &array_indexes = "");
92+
table_desc(options_t const &options, table_sql const &ts);
8893

8994
char const *name() const { return m_copy_target->name.c_str(); }
9095
void clear_array_indexes() { m_array_indexes.clear(); }

0 commit comments

Comments
 (0)