From ed90c5449ad0400316e4745a6eb2c5e743f6580c Mon Sep 17 00:00:00 2001 From: Rob Savoye Date: Mon, 20 May 2024 12:07:44 -0600 Subject: [PATCH] fix: Methods return data, not modiying a parameter. Queries are now a list instead of a huge string --- src/validate/queryvalidate.cc | 83 ++++++++++++++++++----------------- src/validate/queryvalidate.hh | 33 +++++++++----- 2 files changed, 66 insertions(+), 50 deletions(-) diff --git a/src/validate/queryvalidate.cc b/src/validate/queryvalidate.cc index dc1c20f6..b12fac85 100644 --- a/src/validate/queryvalidate.cc +++ b/src/validate/queryvalidate.cc @@ -87,48 +87,52 @@ QueryValidate::QueryValidate(std::shared_ptr db) { dbconn = db; } -std::string +std::shared_ptr QueryValidate::updateValidation(std::shared_ptr> removals) { #ifdef TIMING_DEBUG_X boost::timer::auto_cpu_timer timer("updateValidation: took %w seconds\n"); #endif - std::string query = ""; + auto query = std::make_shared(); if (removals->size() > 0) { - query = "DELETE FROM validation WHERE osm_id IN("; + *query = "DELETE FROM validation WHERE osm_id IN("; for (const auto &osm_id : *removals) { - query += std::to_string(osm_id) + ","; + query->append(std::to_string(osm_id) + ","); }; - query.erase(query.size() - 1); - query += ");"; + query->erase(query->size() - 1); + query->append(");"); } return query; } -std::string -QueryValidate::updateValidation(long osm_id, const valerror_t &status, const std::string &source) const +std::shared_ptr +QueryValidate::updateValidation(long osm_id, + const valerror_t &status, + const std::string &source) const { + auto query = std::make_shared(); std::string format = "DELETE FROM validation WHERE osm_id = %d and source = '%s' and status = '%s';"; boost::format fmt(format); fmt % osm_id; fmt % source; fmt % status_list[status]; - std::string query = fmt.str(); + *query = fmt.str(); return query; } -std::string +std::shared_ptr QueryValidate::updateValidation(long osm_id, const valerror_t &status) const { + auto query = std::make_shared(); std::string format = "DELETE FROM validation WHERE osm_id = %d and status = '%s';"; boost::format fmt(format); fmt % osm_id; fmt % status_list[status]; - std::string query = fmt.str(); + *query = fmt.str(); return query; } -std::string +std::shared_ptr QueryValidate::applyChange(const ValidateStatus &validation, const valerror_t &status) const { #ifdef TIMING_DEBUG_X @@ -137,13 +141,13 @@ QueryValidate::applyChange(const ValidateStatus &validation, const valerror_t &s // log_debug("Applying Validation data"); std::string format; - std::string query; + auto query = std::make_shared(); if (validation.values.size() > 0) { - query = "INSERT INTO validation as v (osm_id, changeset, uid, type, status, values, timestamp, location, source, version) VALUES("; + *query = "INSERT INTO validation as v (osm_id, changeset, uid, type, status, values, timestamp, location, source, version) VALUES("; format = "%d, %d, %g, \'%s\', \'%s\', ARRAY[%s], \'%s\', ST_GeomFromText(\'%s\', 4326), \'%s\', %s) "; } else { - query = "INSERT INTO validation as v (osm_id, changeset, uid, type, status, timestamp, location, source, version) VALUES("; + *query = "INSERT INTO validation as v (osm_id, changeset, uid, type, status, timestamp, location, source, version) VALUES("; format = "%d, %d, %g, \'%s\', \'%s\', \'%s\', ST_GeomFromText(\'%s\', 4326), \'%s\', %s) "; } format += "ON CONFLICT (osm_id, status, source) DO UPDATE SET version = %d, timestamp = \'%s\' WHERE v.version < %d;"; @@ -177,87 +181,86 @@ QueryValidate::applyChange(const ValidateStatus &validation, const valerror_t &s fmt % validation.version; fmt % to_simple_string(validation.timestamp); fmt % validation.version; - query += fmt.str(); + query->append(fmt.str()); return query; } - -void -QueryValidate::ways( - std::shared_ptr>> wayval, - std::string &task_query -) { +std::shared_ptr> +QueryValidate::ways(std::shared_ptr>> wayval) { + auto query = std::make_shared>(); for (auto it = wayval->begin(); it != wayval->end(); ++it) { if (it->get()->status.size() > 0) { for (auto status_it = it->get()->status.begin(); status_it != it->get()->status.end(); ++status_it) { - task_query += applyChange(*it->get(), *status_it); + query->push_back(*applyChange(*it->get(), *status_it)); } } } + return query; } -void +std::shared_ptr> QueryValidate::ways( std::shared_ptr>> wayval, - std::string &task_query, std::shared_ptr> validation_removals ) { + auto query = std::make_shared>(); for (auto it = wayval->begin(); it != wayval->end(); ++it) { if (it->get()->status.size() > 0) { for (auto status_it = it->get()->status.begin(); status_it != it->get()->status.end(); ++status_it) { - task_query += applyChange(*it->get(), *status_it); + query->push_back(*applyChange(*it->get(), *status_it)); } if (!it->get()->hasStatus(overlapping)) { - task_query += updateValidation(it->get()->osm_id, overlapping, "building"); + query->push_back(*updateValidation(it->get()->osm_id, overlapping, "building")); } if (!it->get()->hasStatus(duplicate)) { - task_query += updateValidation(it->get()->osm_id, duplicate, "building"); + query->push_back(*updateValidation(it->get()->osm_id, duplicate, "building")); } if (!it->get()->hasStatus(badgeom)) { - task_query += updateValidation(it->get()->osm_id, badgeom, "building"); + query->push_back(*updateValidation(it->get()->osm_id, badgeom, "building")); } if (!it->get()->hasStatus(badvalue)) { - task_query += updateValidation(it->get()->osm_id, badvalue); + query->push_back(*updateValidation(it->get()->osm_id, badvalue)); } } else { validation_removals->push_back(it->get()->osm_id); } } + return query; } -void -QueryValidate::nodes( - std::shared_ptr>> nodeval, - std::string &task_query -) { +std::shared_ptr> +QueryValidate::nodes(std::shared_ptr>> nodeval) { + auto query = std::make_shared>(); for (auto it = nodeval->begin(); it != nodeval->end(); ++it) { if (it->get()->status.size() > 0) { for (auto status_it = it->get()->status.begin(); status_it != it->get()->status.end(); ++status_it) { - task_query += applyChange(*it->get(), *status_it); + query->push_back(*applyChange(*it->get(), *status_it)); } } } + return query; } -void +std::shared_ptr> QueryValidate::nodes( std::shared_ptr>> nodeval, - std::string &task_query, std::shared_ptr> validation_removals ) { + auto query = std::make_shared>(); for (auto it = nodeval->begin(); it != nodeval->end(); ++it) { if (it->get()->status.size() > 0) { for (auto status_it = it->get()->status.begin(); status_it != it->get()->status.end(); ++status_it) { - task_query += applyChange(*it->get(), *status_it); + query->push_back(*applyChange(*it->get(), *status_it)); } if (!it->get()->hasStatus(badvalue)) { - task_query += updateValidation(it->get()->osm_id, badvalue); + query->push_back(*updateValidation(it->get()->osm_id, badvalue)); } } else { validation_removals->push_back(it->get()->osm_id); } } + return query; } } // namespace queryvalidate diff --git a/src/validate/queryvalidate.hh b/src/validate/queryvalidate.hh index f3c3536f..01b81acf 100644 --- a/src/validate/queryvalidate.hh +++ b/src/validate/queryvalidate.hh @@ -74,17 +74,30 @@ class QueryValidate { QueryValidate(std::shared_ptr db); /// Apply data validation to the database - std::string applyChange(const ValidateStatus &validation, const valerror_t &status) const; + std::shared_ptr applyChange(const ValidateStatus &validation, + const valerror_t &status) const; /// Update the validation table, delete any feature that has been fixed. - std::string updateValidation(std::shared_ptr> removals); - std::string updateValidation(long osm_id, const valerror_t &status, const std::string &source) const; - std::string updateValidation(long osm_id, const valerror_t &status) const; - void ways(std::shared_ptr>> wayval, std::string &task_query); - void nodes(std::shared_ptr>> nodeval, std::string &task_query); - void rels(std::shared_ptr>> relval, std::string &task_query); - void ways(std::shared_ptr>> wayval, std::string &task_query, std::shared_ptr> validation_removals); - void nodes(std::shared_ptr>> nodeval, std::string &task_query, std::shared_ptr> validation_removals); - void rels(std::shared_ptr>> relval, std::string &task_query, std::shared_ptr> validation_removals); + std::shared_ptr updateValidation( + std::shared_ptr> removals); + std::shared_ptr updateValidation( + long osm_id, const valerror_t &status, const std::string &source) const; + std::shared_ptr updateValidation( + long osm_id, const valerror_t &status) const; + std::shared_ptr> ways( + std::shared_ptr>> wayval); + std::shared_ptr> ways( + std::shared_ptr>> wayval, + std::shared_ptr> validation_removals); + std::shared_ptr> nodes( + std::shared_ptr>> nodeval); + std::shared_ptr> nodes( + std::shared_ptr>> nodeval, + std::shared_ptr> validation_removals); + std::shared_ptr> rels( + std::shared_ptr>> relval); + std::shared_ptr> rels( + std::shared_ptr>> relval, + std::shared_ptr> validation_removals); // Database connection, used for escape strings std::shared_ptr dbconn; };