diff options
author | Rutger Broekhoff | 2024-05-02 20:27:40 +0200 |
---|---|---|
committer | Rutger Broekhoff | 2024-05-02 20:27:40 +0200 |
commit | 17a3ea880402338420699e03bcb24181e4ff3924 (patch) | |
tree | da666ef91e0b60d20aa0b01529644c136fd1f4ab /src/querykv1/schedule.cpp | |
download | oeuf-17a3ea880402338420699e03bcb24181e4ff3924.tar.gz oeuf-17a3ea880402338420699e03bcb24181e4ff3924.zip |
Initial commit
Based on dc4ba6a
Diffstat (limited to 'src/querykv1/schedule.cpp')
-rw-r--r-- | src/querykv1/schedule.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/querykv1/schedule.cpp b/src/querykv1/schedule.cpp new file mode 100644 index 0000000..2bcfe0a --- /dev/null +++ b/src/querykv1/schedule.cpp | |||
@@ -0,0 +1,63 @@ | |||
1 | // vim:set sw=2 ts=2 sts et: | ||
2 | |||
3 | #include <iostream> | ||
4 | #include <string_view> | ||
5 | #include <unordered_map> | ||
6 | #include <vector> | ||
7 | |||
8 | #include "daterange.hpp" | ||
9 | #include "schedule.hpp" | ||
10 | |||
11 | using namespace std::string_view_literals; | ||
12 | |||
13 | void schedule(const Options &options, Kv1Records &records, Kv1Index &index) { | ||
14 | FILE *out = stdout; | ||
15 | if (options.output_file_path != "-"sv) | ||
16 | out = fopen(options.output_file_path, "wb"); | ||
17 | if (!out) { | ||
18 | fprintf(stderr, "Open %s: %s\n", options.output_file_path, strerrordesc_np(errno)); | ||
19 | exit(EXIT_FAILURE); | ||
20 | } | ||
21 | |||
22 | std::cerr << "Generating schedule for " << options.line_planning_number << std::endl; | ||
23 | |||
24 | std::unordered_multimap<std::string, Kv1PeriodGroupValidity> period_group_validities; | ||
25 | for (const auto &pegr : records.period_group_validities) | ||
26 | period_group_validities.insert({ pegr.key.period_group_code, pegr }); | ||
27 | std::unordered_multimap<std::string, Kv1PublicJourney> public_journeys; | ||
28 | for (const auto &pujo : records.public_journeys) | ||
29 | public_journeys.insert({ pujo.key.timetable_version_code, pujo }); | ||
30 | |||
31 | std::cout << "line_planning_number,journey_number,date,departure_time" << std::endl; | ||
32 | for (const auto &tive : records.timetable_versions) { | ||
33 | std::vector<DateRange> tive_pegrval_ranges; | ||
34 | |||
35 | auto pegrval_range = period_group_validities.equal_range(tive.key.period_group_code); | ||
36 | for (auto it = pegrval_range.first; it != pegrval_range.second; it++) { | ||
37 | const auto &[_, pegrval] = *it; | ||
38 | tive_pegrval_ranges.emplace_back(pegrval.key.valid_from, pegrval.valid_thru); | ||
39 | } | ||
40 | |||
41 | DateRangeSeq seq(tive_pegrval_ranges.begin(), tive_pegrval_ranges.end()); | ||
42 | seq = seq.clampFrom(tive.valid_from); | ||
43 | if (tive.valid_thru) | ||
44 | seq = seq.clampThru(*tive.valid_thru); | ||
45 | |||
46 | for (const auto &range : seq) for (auto date : range) { | ||
47 | auto weekday = std::chrono::year_month_weekday(std::chrono::sys_days(date)).weekday(); | ||
48 | |||
49 | auto pujo_range = public_journeys.equal_range(tive.key.timetable_version_code); | ||
50 | for (auto itt = pujo_range.first; itt != pujo_range.second; itt++) { | ||
51 | const auto &[_, pujo] = *itt; | ||
52 | |||
53 | if (pujo.key.line_planning_number == options.line_planning_number && pujo.key.day_type.size() == 7 | ||
54 | && pujo.key.day_type[weekday.iso_encoding() - 1] == static_cast<char>('0' + weekday.iso_encoding())) { | ||
55 | std::cout << pujo.key.line_planning_number << "," << pujo.key.journey_number << "," | ||
56 | << date << "," << pujo.departure_time << std::endl; | ||
57 | } | ||
58 | } | ||
59 | } | ||
60 | } | ||
61 | |||
62 | if (options.output_file_path != "-"sv) fclose(out); | ||
63 | } | ||