diff --git a/src/data/pq.cc b/src/data/pq.cc index ec5a3782..ea7af0ad 100644 --- a/src/data/pq.cc +++ b/src/data/pq.cc @@ -152,16 +152,15 @@ Pq::query(const std::string &query) { std::scoped_lock write_lock{pqxx_mutex}; pqxx::work worker(*sdb); + pqxx::result result; try { - auto result = worker.exec(query); + result = worker.exec(query); worker.commit(); } catch (std::exception &e) { log_error("ERROR executing query %1%", e.what()); // Return an empty result so higher level code can handle the error - pqxx::result result; return result; } - return result; } diff --git a/src/raw/queryraw.cc b/src/raw/queryraw.cc index 399110c7..d7e30a4e 100644 --- a/src/raw/queryraw.cc +++ b/src/raw/queryraw.cc @@ -447,13 +447,6 @@ QueryRaw::applyChange(const OsmRelation &relation) const query.append(fmt.str()); queries->push_back(query); - // Refresh all refs stored into the rel_refs table - queries->push_back("DELETE FROM rel_refs WHERE rel_id=" + std::to_string(relation.id) + ";"); - - for (auto mit = relation.members.begin(); mit != relation.members.end(); ++mit) { - queries->push_back("INSERT INTO rel_refs (rel_id, way_id) VALUES (" + std::to_string(relation.id) + "," + std::to_string(mit->ref) + ");"); - } - } else { // Update only the Relation's geometry. This is the case when a Relation was indirectly @@ -518,7 +511,7 @@ QueryRaw::getRelationsByWaysRefs(std::string &wayIds) const std::list> rels; // Query for getting Relations - std::string relsQuery = "SELECT distinct(osm_id), refs, version, tags, uid, changeset from rel_refs join relations r on r.osm_id = rel_id where way_id = any(ARRAY[" + wayIds + "])"; + std::string relsQuery = "SELECT distinct(osm_id), refs, version, tags, uid, changeset FROM relations WHERE EXISTS (SELECT 1 FROM jsonb_array_elements(refs) AS ref WHERE (ref->>'ref')::bigint IN (" + wayIds + "));"; auto rels_result = dbconn->query(relsQuery); // Fill vector with OsmRelation objects @@ -871,7 +864,7 @@ QueryRaw::getWaysByNodesRefs(std::string &nodeIds) const // std::string waysQuery = "SELECT distinct(osm_id), refs, version, tags, uid, changeset from way_refs join ways_poly wp on wp.osm_id = way_id where node_id = any(ARRAY[" + nodeIds + "])"; queries.push_back("SELECT distinct(osm_id), refs, version, tags, uid, changeset from ways_poly where refs @> '{" + nodeIds + "}'"); - queries.push_back("SELECT distinct(osm_id), refs, version, tags, uid, changeset from ways_lines where refs @> '{" + nodeIds + "}'"); + queries.push_back("SELECT distinct(osm_id), refs, version, tags, uid, changeset from ways_line where refs @> '{" + nodeIds + "}'"); // waysQuery += " UNION SELECT distinct(osm_id), refs, version, tags, uid, changeset from way_refs join ways_line wl on wl.osm_id = way_id where node_id = any(ARRAY[" + nodeIds + "]);"; for (auto it = queries.begin(); it != queries.end(); ++it) { diff --git a/src/testsuite/libunderpass.all/raw-test.cc b/src/testsuite/libunderpass.all/raw-test.cc index ff758d2a..4890b841 100644 --- a/src/testsuite/libunderpass.all/raw-test.cc +++ b/src/testsuite/libunderpass.all/raw-test.cc @@ -83,27 +83,39 @@ bool processFile(const std::string &filename, std::shared_ptr &db) { osmchanges->readChanges(destdir_base + "/testsuite/testdata/raw/" + filename); queryraw->buildGeometries(osmchanges, poly); osmchanges->areaFilter(poly); - std::string rawquery; + auto rawquery = std::make_shared>(); for (auto it = std::begin(osmchanges->changes); it != std::end(osmchanges->changes); ++it) { osmchange::OsmChange *change = it->get(); // Nodes for (auto nit = std::begin(change->nodes); nit != std::end(change->nodes); ++nit) { osmobjects::OsmNode *node = nit->get(); - rawquery += queryraw->applyChange(*node); + auto changes = *queryraw->applyChange(*node); + for (auto it = changes.begin(); it != changes.end(); ++it) { + rawquery->push_back(*it); + } } // Ways for (auto wit = std::begin(change->ways); wit != std::end(change->ways); ++wit) { osmobjects::OsmWay *way = wit->get(); - rawquery += queryraw->applyChange(*way); + auto changes = *queryraw->applyChange(*way); + for (auto it = changes.begin(); it != changes.end(); ++it) { + rawquery->push_back(*it); + } } // Relations for (auto rit = std::begin(change->relations); rit != std::end(change->relations); ++rit) { osmobjects::OsmRelation *relation = rit->get(); - rawquery += queryraw->applyChange(*relation); + auto changes = *queryraw->applyChange(*relation); + for (auto it = changes.begin(); it != changes.end(); ++it) { + rawquery->push_back(*it); + } } } - db->query(rawquery); + + for (auto rit = std::begin(*rawquery); rit != std::end(*rawquery); ++rit) { + db->query(*rit); + } } const std::vector expectedGeometries = {