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+
661771middle_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
735790std::shared_ptr<middle_query_t >
0 commit comments