diff --git a/include/updater/csv_source.hpp b/include/updater/csv_source.hpp index 8fa00941a..89d60726b 100644 --- a/include/updater/csv_source.hpp +++ b/include/updater/csv_source.hpp @@ -2,6 +2,7 @@ #define OSRM_UPDATER_CSV_SOURCE_HPP #include "updater/source.hpp" +#include "updater/updater_config.hpp" namespace osrm { @@ -9,8 +10,8 @@ namespace updater { namespace csv { -SegmentLookupTable readSegmentValues(const std::vector &paths); -TurnLookupTable readTurnValues(const std::vector &paths); +SegmentLookupTable readSegmentValues(const std::vector &paths, UpdaterConfig::SpeedAndTurnPenaltyFormat format); +TurnLookupTable readTurnValues(const std::vector &paths, UpdaterConfig::SpeedAndTurnPenaltyFormat format); } // namespace csv } // namespace updater } // namespace osrm diff --git a/include/updater/updater_config.hpp b/include/updater/updater_config.hpp index 3fc3e5b71..945aa6f5f 100644 --- a/include/updater/updater_config.hpp +++ b/include/updater/updater_config.hpp @@ -69,6 +69,12 @@ struct UpdaterConfig final : storage::IOConfig double log_edge_updates_factor = 0.0; std::time_t valid_now; + + enum class SpeedAndTurnPenaltyFormat { + CSV, + PARQUET + } speed_and_turn_penalty_format = SpeedAndTurnPenaltyFormat::CSV; + std::vector segment_speed_lookup_paths; std::vector turn_penalty_lookup_paths; std::string tz_file_path; diff --git a/src/updater/csv_source.cpp b/src/updater/csv_source.cpp index 6469c5e3f..43b5f4488 100644 --- a/src/updater/csv_source.cpp +++ b/src/updater/csv_source.cpp @@ -2,6 +2,7 @@ #include "updater/csv_file_parser.hpp" #include "updater/parquet_file_parser.hpp" +#include "updater/source.hpp" #include #include @@ -32,14 +33,43 @@ namespace updater { namespace csv { -SegmentLookupTable readSegmentValues(const std::vector &paths) + +namespace { +std::unique_ptr> makeSegmentParser(UpdaterConfig::SpeedAndTurnPenaltyFormat format) { + switch (format) { + case UpdaterConfig::SpeedAndTurnPenaltyFormat::CSV: + { + static const auto value_if_blank = std::numeric_limits::quiet_NaN(); + const qi::real_parser> unsigned_double; + return std::make_unique>(qi::ulong_long >> ',' >> qi::ulong_long, + unsigned_double >> -(',' >> (qi::double_ | qi::attr(value_if_blank)))); + } + case UpdaterConfig::SpeedAndTurnPenaltyFormat::PARQUET: + return std::make_unique>(); + } +} + +std::unique_ptr> makeTurnParser(UpdaterConfig::SpeedAndTurnPenaltyFormat format) { + switch (format) { + case UpdaterConfig::SpeedAndTurnPenaltyFormat::CSV: + { + return std::make_unique>(qi::ulong_long >> ',' >> qi::ulong_long >> ',' >> + qi::ulong_long, + qi::double_ >> -(',' >> qi::double_)); + } + case UpdaterConfig::SpeedAndTurnPenaltyFormat::PARQUET: + return std::make_unique>(); + } +} + +} // namespace + +SegmentLookupTable readSegmentValues(const std::vector &paths, UpdaterConfig::SpeedAndTurnPenaltyFormat format) { - //static const auto value_if_blank = std::numeric_limits::quiet_NaN(); - //const qi::real_parser> unsigned_double; - ParquetFilesParser parser; + auto parser = makeSegmentParser(format); // Check consistency of keys in the result lookup table - auto result = parser(paths); + auto result = (*parser)(paths); const auto found_inconsistency = std::find_if(std::begin(result.lookup), std::end(result.lookup), [](const auto &entry) { return entry.first.from == entry.first.to; @@ -53,10 +83,10 @@ SegmentLookupTable readSegmentValues(const std::vector &paths) return result; } -TurnLookupTable readTurnValues(const std::vector &paths) +TurnLookupTable readTurnValues(const std::vector &paths, UpdaterConfig::SpeedAndTurnPenaltyFormat format) { - ParquetFilesParser parser; - return parser(paths); + auto parser = makeTurnParser(format); + return (*parser)(paths); } } // namespace csv } // namespace updater diff --git a/src/updater/updater.cpp b/src/updater/updater.cpp index 2ae0354c3..bfc3df59a 100644 --- a/src/updater/updater.cpp +++ b/src/updater/updater.cpp @@ -618,7 +618,7 @@ Updater::LoadAndUpdateEdgeExpandedGraph(std::vector &e tbb::concurrent_vector updated_segments; if (update_edge_weights) { - auto segment_speed_lookup = csv::readSegmentValues(config.segment_speed_lookup_paths); + auto segment_speed_lookup = csv::readSegmentValues(config.segment_speed_lookup_paths, config.speed_and_turn_penalty_format); TIMER_START(segment); updated_segments = updateSegmentData(config, @@ -633,7 +633,7 @@ Updater::LoadAndUpdateEdgeExpandedGraph(std::vector &e util::Log() << "Updating segment data took " << TIMER_MSEC(segment) << "ms."; } - auto turn_penalty_lookup = csv::readTurnValues(config.turn_penalty_lookup_paths); + auto turn_penalty_lookup = csv::readTurnValues(config.turn_penalty_lookup_paths, config.speed_and_turn_penalty_format); if (update_turn_penalties) { auto updated_turn_penalties = updateTurnPenalties(config,