/home/martin/workspace/OpenStreetNav/src/test/osmdb.cpp
Go to the documentation of this file.
00001 /*
00002  * osmdb.cpp
00003  *
00004  *  Created on: Nov 6, 2011
00005  *      Author: martin
00006  */
00007 
00008 #include <boost/test/unit_test.hpp>
00009 #include <boost/filesystem.hpp>
00010 #include <boost/property_tree/xml_parser.hpp>
00011 #include "../osmdb/osmdb.h"
00012 #include "../sqllib/sqllib.h"
00013 #include <test_config.h>
00014 #include <algorithm>
00015 
00016 class OsmDBFixture
00017 {
00018 public:
00019     OsmDBFixture():
00020         pdb("")
00021     {
00022 
00023         psql::execute_sql(pdb, "CREATE SCHEMA testing");
00024         psql::execute_sql(pdb, "SET search_path TO testing, public");
00025     }
00026     ~OsmDBFixture()
00027     {
00028         if (pdb.in_transaction() || pdb.in_failed_transaction())
00029             pdb.rollback_transaction();
00030         psql::execute_sql(pdb, "DROP SCHEMA testing CASCADE");
00031     }
00032     psql::Database pdb;
00033 };
00034 
00035 BOOST_FIXTURE_TEST_SUITE(OsmDBCreateTests, OsmDBFixture)
00036 
00037 BOOST_AUTO_TEST_CASE(create)
00038 {
00039     osmdb::OsmDatabase db(pdb);
00040     db.create_tables();
00041 }
00042 
00043 BOOST_AUTO_TEST_CASE(indexes)
00044 {
00045     osmdb::OsmDatabase db(pdb);
00046     db.create_tables();
00047     db.create_indexes_and_keys();
00048     db.drop_indexes_and_keys();
00049     db.create_indexes_and_keys();
00050     db.drop_indexes_and_keys();
00051 }
00052 
00053 BOOST_AUTO_TEST_CASE(insert)
00054 {
00055 
00056     osmdb::OsmDatabase db(pdb);
00057     db.create_tables();
00058     db.create_indexes_and_keys();
00059     osmdb::ElementInsertion ins(db);
00060     osm::Node n(123, 1, 2);
00061     n.tags.insert(osm::Tag("nkey", "nval"));
00062     ins.insert_node(n);
00063     n.tags.clear();
00064     n.id = 124;
00065     ins.insert_node(n);
00066     osm::Way w(341);
00067     w.nodes.push_back(123);
00068     w.nodes.push_back(124);
00069     w.tags.insert(osm::Tag("wkey", "wval"));
00070     ins.insert_way(w);
00071     osm::Relation r(432);
00072     r.tags.insert(osm::Tag("rkey", "rval"));
00073     ins.insert_relation(r);
00074     r.tags.clear();
00075     r.id = 433;
00076     r.add_node("rnode", osm::Node(124));
00077     r.add_way("rway", osm::Way(341));
00078     r.add_rel("rrel", osm::Relation(432));
00079     ins.insert_relation(r);
00080     std::vector<std::tuple<int64_t, double, double> > nodes {std::make_tuple(123, 2, 1), std::make_tuple(124, 2, 1)};
00081     std::vector<std::tuple<int64_t> > ways {std::make_tuple(341)};
00082     std::vector<std::tuple<int64_t, int64_t, int64_t> > edges {std::make_tuple(341, 123, 124)};
00083     std::vector<std::tuple<int64_t, int64_t, int> > waynodes
00084     {
00085         std::make_tuple(341, 123, 0),
00086         std::make_tuple(341, 124, 1)
00087     };
00088     std::sort(waynodes.begin(), waynodes.end());
00089     std::vector<std::tuple<int64_t, std::string, std::string> > ndattrs {std::make_tuple(123, "nkey", "nval")};
00090     std::vector<std::tuple<int64_t, std::string, std::string> > wattrs {std::make_tuple(341, "wkey", "wval")};
00091     std::vector<std::tuple<int64_t> > rels {std::make_tuple(432), std::make_tuple(433)};
00092     std::vector<std::tuple<int64_t, std::string, std::string> > rattrs {std::make_tuple(432, "rkey", "rval")};
00093     std::vector<std::tuple<int64_t, std::string, int64_t> > nmembers {std::make_tuple(433, "rnode", 124)};
00094     std::vector<std::tuple<int64_t, std::string, int64_t> > wmembers {std::make_tuple(433, "rway", 341)};
00095     std::vector<std::tuple<int64_t, std::string, int64_t> > rmembers {std::make_tuple(433, "rrel", 432)};
00096     auto nodes2 = psql::query_sql<int64_t, double, double>(db.get_db(), "SELECT ID, ST_X(Location::geometry), ST_Y(Location::geometry) FROM Nodes");
00097     auto ways2 = psql::query_sql<int64_t>(db.get_db(), "SELECT ID FROM Ways");
00098     auto waynodes2 = psql::query_sql<int64_t, int64_t, int>(db.get_db(), "SELECT WayID, NodeID, SequenceNo FROM WayNodes");
00099     auto edges2 = psql::query_sql<int64_t, int64_t, int64_t>(db.get_db(), "SELECT WayID, StartNodeID, EndNodeID FROM Edges");
00100     std::sort(waynodes2.begin(), waynodes2.end());
00101     auto ndattrs2 = psql::query_sql<int64_t, std::string, std::string>(db.get_db(), "SELECT NodeID, Key, Value FROM NodeAttributes");
00102     auto wattrs2 = psql::query_sql<int64_t, std::string, std::string>(db.get_db(), "SELECT WayID, Key, Value FROM WayAttributes");
00103     auto rels2 = psql::query_sql<int64_t> (db.get_db(), "SELECT ID FROM Relations");
00104     auto rattrs2 = psql::query_sql<int64_t, std::string, std::string>(db.get_db(), "SELECT RelationID, Key, Value FROM RelationAttributes");
00105     auto nmembers2 = psql::query_sql<int64_t, std::string, int64_t>(db.get_db(), "SELECT RelationID, Role, NodeID FROM MemberNodes");
00106     auto wmembers2 = psql::query_sql<int64_t, std::string, int64_t>(db.get_db(), "SELECT RelationID, Role, WayID FROM MemberWays");
00107     auto rmembers2 = psql::query_sql<int64_t, std::string, int64_t>(db.get_db(), "SELECT ParentID, Role, ChildID FROM MemberRelations");
00108     BOOST_CHECK(nodes == nodes2);
00109     BOOST_CHECK(ways == ways2);
00110     BOOST_CHECK(edges == edges2);
00111     BOOST_CHECK(waynodes == waynodes2);
00112     BOOST_CHECK(ndattrs == ndattrs2);
00113     BOOST_CHECK(wattrs == wattrs2);
00114     BOOST_CHECK(rmembers == rmembers2);
00115     BOOST_CHECK(wmembers == wmembers2);
00116     BOOST_CHECK(nmembers == nmembers2);
00117     BOOST_CHECK(rattrs == rattrs2);
00118     BOOST_CHECK(rels == rels2);
00119 
00120 }
00121 
00122 BOOST_AUTO_TEST_CASE(new_import)
00123 {
00124 
00125     osmdb::OsmDatabase db(pdb);
00126     db.create_tables();
00127     db.create_indexes_and_keys();
00128     osmdb::ElementCopy ins(db);
00129     ins.start_copy();
00130     osm::Node n(123, 1, 2);
00131     n.tags.insert(osm::Tag("nkey", "nval"));
00132     ins.insert_node(n);
00133     n.tags.clear();
00134     n.id = 124;
00135     ins.insert_node(n);
00136     osm::Way w(341);
00137     w.nodes.push_back(123);
00138     w.nodes.push_back(124);
00139     w.tags.insert(osm::Tag("\r\n\twkey", "wval"));
00140     ins.insert_way(w);
00141     osm::Relation r(432);
00142     r.tags.insert(osm::Tag("rkey", "rval"));
00143     ins.insert_relation(r);
00144     r.tags.clear();
00145     r.id = 433;
00146     r.add_node("rnode", osm::Node(124));
00147     r.add_way("rway", osm::Way(341));
00148     r.add_rel("rrel", osm::Relation(432));
00149     ins.insert_relation(r);
00150     ins.end_copy();
00151     osmdb::ImportTableProcessor proc(db);
00152     proc.process();
00153     std::vector<std::tuple<int64_t, double, double> > nodes {std::make_tuple(123, 2, 1), std::make_tuple(124, 2, 1)};
00154     std::vector<std::tuple<int64_t> > ways {std::make_tuple(341)};
00155     std::vector<std::tuple<int64_t, int64_t, int64_t> > edges {std::make_tuple(341, 123, 124)};
00156     std::vector<std::tuple<int64_t, int64_t, int> > waynodes
00157     {
00158         std::make_tuple(341, 123, 0),
00159         std::make_tuple(341, 124, 1)
00160     };
00161     std::sort(waynodes.begin(), waynodes.end());
00162     std::vector<std::tuple<int64_t, std::string, std::string> > ndattrs {std::make_tuple(123, "nkey", "nval")};
00163     std::vector<std::tuple<int64_t, std::string, std::string> > wattrs {std::make_tuple(341, "\r\n\twkey", "wval")};
00164     std::vector<std::tuple<int64_t> > rels {std::make_tuple(432), std::make_tuple(433)};
00165     std::vector<std::tuple<int64_t, std::string, std::string> > rattrs {std::make_tuple(432, "rkey", "rval")};
00166     std::vector<std::tuple<int64_t, std::string, int64_t> > nmembers {std::make_tuple(433, "rnode", 124)};
00167     std::vector<std::tuple<int64_t, std::string, int64_t> > wmembers {std::make_tuple(433, "rway", 341)};
00168     std::vector<std::tuple<int64_t, std::string, int64_t> > rmembers {std::make_tuple(433, "rrel", 432)};
00169     auto nodes2 = psql::query_sql<int64_t, double, double>(db.get_db(), "SELECT ID, ST_X(Location::geometry), ST_Y(Location::geometry) FROM Nodes");
00170     auto ways2 = psql::query_sql<int64_t>(db.get_db(), "SELECT ID FROM Ways");
00171     auto waynodes2 = psql::query_sql<int64_t, int64_t, int>(db.get_db(), "SELECT WayID, NodeID, SequenceNo FROM WayNodes");
00172     auto edges2 = psql::query_sql<int64_t, int64_t, int64_t>(db.get_db(), "SELECT WayID, StartNodeID, EndNodeID FROM Edges");
00173     std::sort(waynodes2.begin(), waynodes2.end());
00174     auto ndattrs2 = psql::query_sql<int64_t, std::string, std::string>(db.get_db(), "SELECT NodeID, Key, Value FROM NodeAttributes");
00175     auto wattrs2 = psql::query_sql<int64_t, std::string, std::string>(db.get_db(), "SELECT WayID, Key, Value FROM WayAttributes");
00176     auto rels2 = psql::query_sql<int64_t> (db.get_db(), "SELECT ID FROM Relations");
00177     auto rattrs2 = psql::query_sql<int64_t, std::string, std::string>(db.get_db(), "SELECT RelationID, Key, Value FROM RelationAttributes");
00178     auto nmembers2 = psql::query_sql<int64_t, std::string, int64_t>(db.get_db(), "SELECT RelationID, Role, NodeID FROM MemberNodes");
00179     auto wmembers2 = psql::query_sql<int64_t, std::string, int64_t>(db.get_db(), "SELECT RelationID, Role, WayID FROM MemberWays");
00180     auto rmembers2 = psql::query_sql<int64_t, std::string, int64_t>(db.get_db(), "SELECT ParentID, Role, ChildID FROM MemberRelations");
00181     BOOST_CHECK(nodes == nodes2);
00182     BOOST_CHECK(ways == ways2);
00183     BOOST_CHECK(edges == edges2);
00184     BOOST_CHECK(waynodes == waynodes2);
00185     BOOST_CHECK(ndattrs == ndattrs2);
00186     BOOST_CHECK(wattrs == wattrs2);
00187     BOOST_CHECK(rmembers == rmembers2);
00188     BOOST_CHECK(wmembers == wmembers2);
00189     BOOST_CHECK(nmembers == nmembers2);
00190     BOOST_CHECK(rattrs == rattrs2);
00191     BOOST_CHECK(rels == rels2);
00192 }
00193 
00194 BOOST_AUTO_TEST_CASE(import_proc_dis)
00195 {
00196     osmdb::OsmDatabase db(pdb);
00197     osmdb::ImportTableProcessor proc(db);
00198     proc.disable_all();
00199     proc.action_signal.connect(
00200         [&](osmdb::ImportTableAction, int64_t)
00201     {
00202         BOOST_CHECK(false);
00203     });
00204 
00205 }
00206 
00207 BOOST_AUTO_TEST_CASE(empty_displaydb)
00208 {
00209     osmdb::OsmDatabase odb(pdb);
00210     odb.create_tables();
00211     odb.create_indexes_and_keys();
00212     osmdb::DisplayDB db(odb, TEST_TO_SHOW_EDGES, 1, 1);
00213     db.set_bounds(geo::Point(0, 0), geo::Point(1, 1), 1);
00214 }
00215 
00216 BOOST_AUTO_TEST_CASE(simple)
00217 {
00218     osmdb::OsmDatabase odb(pdb);
00219     odb.create_tables();
00220     odb.create_indexes_and_keys();
00221     osmdb::DisplayDB db(odb, TEST_TO_SHOW_EDGES, 1, 1);
00222     osmdb::ElementInsertion ins(db.get_db());
00223     pdb.begin_transaction();
00224     osm::Node nd(1, 0.5, 0.5);
00225     nd.tags.insert(osm::Tag("key", "val"));
00226     ins.insert_node(nd);
00227     ins.insert_node(osm::Node(2, 0.4, 0.4));
00228     ins.insert_node(osm::Node(3, 0.4, 0.8));
00229     osm::Way w(1);
00230     w.nodes.push_back(2);
00231     w.nodes.push_back(3);
00232     w.tags.insert(osm::Tag("key", "val"));
00233     ins.insert_way(w);
00234     nd.id = 4;
00235     nd.position.lat = 1.5;
00236     nd.position.lon = 0.5;
00237     ins.insert_node(nd);
00238     ins.insert_node(osm::Node(5, 0.6, 0.4));
00239     pdb.commit_transaction();
00240     db.set_bounds(geo::Point(1, 0), geo::Point(0, 1), 1);
00241     BOOST_CHECK(db.get_display_elements().size() == 1);
00242     auto elems = db.get_selected(geo::Point(1, 0), geo::Point(0, 1), 1);
00243     BOOST_CHECK(elems.size() == 1);
00244     BOOST_CHECK(elems[0]->get_description().front().first == "way");
00245 }
00246 
00247 BOOST_AUTO_TEST_CASE(wayred_cursor)
00248 {
00249     osmdb::OsmDatabase odb(pdb);
00250     odb.create_tables();
00251     odb.create_indexes_and_keys();
00252     osmdb::ElementInsertion ins(odb);
00253     pdb.begin_transaction();
00254     osm::Node nd(1, 0.5, 0.5);
00255     nd.tags.insert(osm::Tag("key", "val"));
00256     ins.insert_node(nd);
00257     ins.insert_node(osm::Node(2, 0.4, 0.4));
00258     ins.insert_node(osm::Node(3, 0.4, 0.8));
00259     osm::Way w(1);
00260     w.nodes.push_back(2);
00261     w.nodes.push_back(3);
00262     w.tags.insert(osm::Tag("key", "val"));
00263     ins.insert_way(w);
00264     w = osm::Way(2);
00265     nd.id = 4;
00266     nd.position.lat = 1.5;
00267     nd.position.lon = 0.5;
00268     ins.insert_node(nd);
00269     ins.insert_node(osm::Node(5, 0.6, 0.4));
00270     pdb.commit_transaction();
00271     boost::property_tree::ptree entries;
00272     boost::property_tree::ptree kv;
00273     kv.put("key", "key");
00274     kv.put("value", "val");
00275     entries.put_child("entries.entry.elements.el", kv);
00276     auto st(sqllib::get_decl_wayred_crs(entries, pdb));
00277     auto crs(psql::make_cursor(pdb, "wayred_crs", st));
00278     pdb.begin_transaction();
00279     crs.open();
00280     crs.fetch(10);
00281     auto vect(crs.get_buffer());
00282     BOOST_CHECK(vect.size() == 2);
00283     crs.close();
00284     pdb.rollback_transaction();
00285 }
00286 
00287 BOOST_AUTO_TEST_CASE(properties)
00288 {
00289     osmdb::OsmDatabase odb(pdb);
00290     odb.create_tables();
00291     osmdb::ElementInsertion ins(odb);
00292     osm::Node n(123, 1, 2);
00293     n.tags.insert(osm::Tag("nkey", "nval"));
00294     ins.insert_node(n);
00295     n.tags.clear();
00296     n.id = 124;
00297     ins.insert_node(n);
00298     osm::Way w(341);
00299     w.nodes.push_back(123);
00300     w.nodes.push_back(124);
00301     w.tags.insert(osm::Tag("wkey", "wval"));
00302     ins.insert_way(w);
00303     osm::Relation r(432);
00304     r.tags.insert(osm::Tag("rkey", "rval"));
00305     r.add_node("rnode", osm::Node(124));
00306     r.add_way("rway", osm::Way(341));
00307     r.add_rel("rrel", osm::Relation(433));
00308     ins.insert_relation(r);
00309     osmdb::PropertiesSelection db(odb);
00310     BOOST_CHECK(db.get_node_tags(123).count(osm::Tag("nkey", "nval")) == 1);
00311     geo::Point p(1, 2);
00312     BOOST_CHECK(db.get_position(123).close(p, 0.0001));
00313     BOOST_CHECK(db.get_way_tags(341).count(osm::Tag("wkey", "wval")) == 1);
00314     BOOST_CHECK(db.get_waynodes(341).size() == 2);
00315     BOOST_CHECK(db.get_waynodes(341)[0] == 123);
00316     BOOST_CHECK(db.get_relation_tags(432).count(osm::Tag("rkey", "rval")) == 1);
00317     BOOST_CHECK(db.get_node_members(432).count("rnode") == 1);
00318     BOOST_CHECK(db.get_way_members(432).count("rway") == 1);
00319     BOOST_CHECK(db.get_relation_members(432).count("rrel") == 1);
00320     osm::Node n2(123);
00321     n2.fill(db);
00322     n.id = 123;
00323     n.tags.insert(osm::Tag("nkey", "nval"));
00324     BOOST_CHECK(n == n2);
00325     osm::Way w2(341);
00326     w2.fill(db);
00327     w.nodes[0].fill(db);
00328     w.nodes[1].fill(db);
00329     BOOST_CHECK(w == w2);
00330     osm::Relation r2(432);
00331     r2.fill(db);
00332     for (auto it = r.members.begin(); it != r.members.end(); ++it)
00333         it->second->fill(db);
00334     BOOST_CHECK(r == r2);
00335 }
00336 
00337 BOOST_AUTO_TEST_CASE(waylister)
00338 {
00339     osmdb::OsmDatabase odb(pdb);
00340     odb.create_tables();
00341     odb.create_indexes_and_keys();
00342     osmdb::ElementInsertion ins(odb);
00343     pdb.begin_transaction();
00344     ins.insert_node(osm::Node(2, 0.4, 0.4));
00345     ins.insert_node(osm::Node(3, 0.4, 0.8));
00346     ins.insert_node(osm::Node(4, 0.4, 0.8));
00347     ins.insert_node(osm::Node(5, 0.4, 0.8));
00348     ins.insert_node(osm::Node(6, 0.4, 0.8));
00349     ins.insert_node(osm::Node(7, 0.4, 0.8));
00350     ins.insert_node(osm::Node(8, 0.4, 0.8));
00351     osm::Way w(1);
00352     w.nodes.push_back(osm::Node(2, 0.4, 0.4));
00353     w.nodes.push_back(osm::Node(3, 0.4, 0.8));
00354     w.nodes.push_back(osm::Node(4, 0.4, 0.8));
00355     w.tags.insert(osm::Tag("key", "val"));
00356     ins.insert_way(w);
00357     osm::Way w2(2);
00358     w2.nodes.push_back(3);
00359     w2.nodes.push_back(5);
00360     w2.tags.insert(osm::Tag("asdf", "bsdf"));
00361     w2.tags.insert(osm::Tag("fcda", "gas"));
00362     ins.insert_way(w2);
00363     osm::Way w3(3);
00364     w3.tags.insert(osm::Tag("key", "val"));
00365     w3.nodes.push_back(osm::Node(4, 0.4, 0.8));
00366     w3.nodes.push_back(osm::Node(5, 0.4, 0.8));
00367     w3.nodes.push_back(osm::Node(6, 0.4, 0.8));
00368     ins.insert_way(w3);
00369     osm::Way w4(4);
00370     w4.nodes.push_back(5);
00371     w4.nodes.push_back(7);
00372     ins.insert_way(w4);
00373     osm::Way w5(5);
00374     w5.nodes.push_back(6);
00375     w5.nodes.push_back(8);
00376     ins.insert_way(w5);
00377     std::map<osm::Way, std::multimap<osm::Node, osm::Way, osm::LtByID>, osm::LtByID> exp;
00378     std::multimap<osm::Node, osm::Way, osm::LtByID> mp;
00379     mp.insert(std::make_pair(osm::Node(3, 0.4, 0.8), w2));
00380     mp.insert(std::make_pair(osm::Node(4, 0.4, 0.8), w3));
00381     exp[w] = mp;
00382     mp.clear();
00383     mp.insert(std::make_pair(osm::Node(4, 0.4, 0.8), w));
00384     mp.insert(std::make_pair(osm::Node(5, 0.4, 0.8), w4));
00385     mp.insert(std::make_pair(osm::Node(5, 0.4, 0.8), w2));
00386     mp.insert(std::make_pair(osm::Node(6, 0.4, 0.8), w5));
00387     exp[w3] = mp;
00388     pdb.commit_transaction();
00389     pdb.begin_transaction();
00390     std::map<osm::Way, std::multimap<osm::Node, osm::Way, osm::LtByID>, osm::LtByID> got;
00391     osmdb::WayLister wl(odb, std::multimap<std::string, std::string> {std::make_pair("key", "val")}, 2);
00392     while (!wl.end())
00393     {
00394         wl.next();
00395         for (auto it = wl.get_current_connected_ways().begin(); it != wl.get_current_connected_ways().end(); ++it)
00396         {
00397             got.insert(*it);
00398         }
00399     }
00400     pdb.commit_transaction();
00401     class WayCmpIgnNd
00402     {
00403     public:
00404         bool operator()(osm::Way const& w1, osm::Way const& w2)
00405         {
00406             return w1.id == w2.id && w1.tags == w2.tags;
00407         }
00408     };
00409     class Comp
00410     {
00411     public:
00412         bool operator()(decltype(*got.begin()) p1, decltype(*got.begin()) p2)
00413         {
00414             return osm::EqByID()(p1.first, p2.first) && util::multimap_eq<WayCmpIgnNd>(p1.second, p2.second);
00415         }
00416     } cmp;
00417     bool b = std::equal(got.begin(), got.end(), exp.begin(), cmp);
00418     BOOST_CHECK(b);
00419 }
00420 
00421 BOOST_AUTO_TEST_SUITE_END()
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines