X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=events.cpp;h=e6ed5796340ff3521ab051512f25920d1d04c022;hb=415442b56355392b207551b2cc84e663d8d7f914;hp=24fd649e7f3adfeaea19f41a27e393858ba1df99;hpb=d9795989980dddf5213e1e1293002e5192ad9c54;p=pkanalytics diff --git a/events.cpp b/events.cpp index 24fd649..e6ed579 100644 --- a/events.cpp +++ b/events.cpp @@ -10,7 +10,7 @@ using namespace std; string format_timestamp(uint64_t pos); -EventsModel::EventsModel(sqlite3 *db) : db(db) +EventsModel::EventsModel(sqlite3 *db, int match_id) : db(db), match_id(match_id) { load_data(); } @@ -60,13 +60,14 @@ void EventsModel::load_data() players.clear(); events.clear(); - // Read the players. + // Read the players. (The ordering is used to build the order map.) sqlite3_stmt *stmt; - int ret = sqlite3_prepare_v2(db, "SELECT player, number, name FROM player", -1, &stmt, 0); + int ret = sqlite3_prepare_v2(db, "SELECT player, number, name FROM player ORDER BY gender, (number+0), number", -1, &stmt, 0); if (ret != SQLITE_OK) { fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db)); abort(); } + int order = 0; for ( ;; ) { ret = sqlite3_step(stmt); if (ret == SQLITE_ROW) { @@ -75,6 +76,7 @@ void EventsModel::load_data() p.number = (const char *)sqlite3_column_text(stmt, 1); p.name = (const char *) sqlite3_column_text(stmt, 2); players[p.player_id] = std::move(p); + player_ordering[p.player_id] = order++; } else if (ret == SQLITE_DONE) { break; } else { @@ -89,11 +91,12 @@ void EventsModel::load_data() } // Read the events. - ret = sqlite3_prepare_v2(db, "SELECT event, t, player, type FROM event ORDER BY t", -1, &stmt, 0); + ret = sqlite3_prepare_v2(db, "SELECT event, t, player, type FROM event WHERE match=? ORDER BY t", -1, &stmt, 0); if (ret != SQLITE_OK) { fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db)); abort(); } + sqlite3_bind_int64(stmt, 1, match_id); for ( ;; ) { ret = sqlite3_step(stmt); if (ret == SQLITE_ROW) { @@ -136,19 +139,20 @@ unsigned EventsModel::insert_event(uint64_t t, optional player_id, const st // Insert the new row into the database. sqlite3_stmt *stmt; - int ret = sqlite3_prepare_v2(db, "INSERT INTO event (t, player, type) VALUES (?, ?, ?)", -1, &stmt, 0); + int ret = sqlite3_prepare_v2(db, "INSERT INTO event (match, t, player, type) VALUES (?, ?, ?, ?)", -1, &stmt, 0); if (ret != SQLITE_OK) { fprintf(stderr, "INSERT prepare: %s\n", sqlite3_errmsg(db)); abort(); } - sqlite3_bind_int64(stmt, 1, t); + sqlite3_bind_int64(stmt, 1, match_id); + sqlite3_bind_int64(stmt, 2, t); if (player_id) { - sqlite3_bind_int64(stmt, 2, *player_id); + sqlite3_bind_int64(stmt, 3, *player_id); } else { - sqlite3_bind_null(stmt, 2); + sqlite3_bind_null(stmt, 3); } - sqlite3_bind_text(stmt, 3, type.data(), type.size(), SQLITE_STATIC); + sqlite3_bind_text(stmt, 4, type.data(), type.size(), SQLITE_STATIC); ret = sqlite3_step(stmt); if (ret == SQLITE_ROW) { @@ -357,7 +361,7 @@ void EventsModel::set_team_at(uint64_t t, const set &new_team) if (e.t > t) { break; } - if (e.type == "goal" || e.type == "their_goal" || e.type == "stoppage" || e.type == "reset") { + if (e.type == "goal" || e.type == "their_goal" || e.type == "stoppage" || e.type == "reset" || e.type == "set_offense" || e.type == "set_defense") { backdate_point = e.t + 1; } if (e.player_id.has_value() && !new_team.count(*e.player_id)) { @@ -390,3 +394,12 @@ void EventsModel::set_team_at(uint64_t t, const set &new_team) } } } + +vector EventsModel::sort_team(const set &team) const +{ + vector ret(team.begin(), team.end()); + std::sort(ret.begin(), ret.end(), [this](int a, int b) { + return player_ordering.find(a)->second < player_ordering.find(b)->second; + }); + return ret; +}