Browse Source

Updated score output. Only care about scores.

Let SQLite sort them for me, and SUM() them
up.
Steve Thielemann 4 years ago
parent
commit
091b01331e
3 changed files with 30 additions and 31 deletions
  1. 18 11
      db.cpp
  2. 8 1
      db.h
  3. 4 19
      main.cpp

+ 18 - 11
db.cpp

@@ -164,8 +164,16 @@ int DBData::handsPlayedOnDay(time_t day) {
   return 0;
 }
 
-std::vector<scores_data> DBData::getScoresOnDay(time_t date) {
-  std::vector<scores_data> scores;
+/*
+ * If you're looking at scores, you're not really looking for all the details.
+ * I think using the group/SUM would be better, and it sorts scores from highest
+ * to lowest.  Let SQL do the work for me.
+ */
+// select date,username,SUM(score),SUM(won) FROM scores group by date,username
+// ORDER BY SUM(score) DESC;
+
+std::vector<scores_details> DBData::getScoresOnDay(time_t date) {
+  std::vector<scores_details> scores;
   try {
     // \"when\",
     SQLite::Statement stmt(db, "SELECT \"username\", \"date\", \"hand\", "
@@ -173,7 +181,7 @@ std::vector<scores_data> DBData::getScoresOnDay(time_t date) {
                                "\"date\"=? ORDER BY \"username\", \"hand\";");
     stmt.bind(1, date);
     while (stmt.executeStep()) {
-      scores_data sd;
+      scores_details sd;
       sd.user = (const char *)stmt.getColumn(0);
       sd.date = stmt.getColumn(1);
       sd.hand = stmt.getColumn(2);
@@ -194,14 +202,14 @@ std::vector<scores_data> DBData::getScoresOnDay(time_t date) {
 std::map<time_t, std::vector<scores_data>> DBData::getScores(void) {
   std::map<time_t, std::vector<scores_data>> scores;
   try {
-    SQLite::Statement stmt(db, "SELECT \"username\", \"date\", \"hand\", "
-                               "\"won\", \"score\" FROM SCORES "
-                               "ORDER BY \"date\", \"username\", \"hand\";");
+    SQLite::Statement stmt(
+        db, "SELECT \"date\",\"username\",SUM(score),SUM(won) FROM scores "
+            "GROUP BY \"date\",username ORDER BY SUM(score) DESC;");
     time_t current = 0;
     std::vector<scores_data> vsd;
 
     while (stmt.executeStep()) {
-      time_t the_date = stmt.getColumn(1);
+      time_t the_date = stmt.getColumn(0);
 
       if (current == 0) {
         // ok, we've got the first one!
@@ -215,11 +223,10 @@ std::map<time_t, std::vector<scores_data>> DBData::getScores(void) {
         }
       }
       scores_data sd;
-      sd.user = (const char *)stmt.getColumn(0);
-      sd.date = the_date; // stmt.getColumn(1);
-      sd.hand = stmt.getColumn(2);
+      sd.user = (const char *)stmt.getColumn(1);
+      sd.date = the_date;
+      sd.score = stmt.getColumn(2);
       sd.won = stmt.getColumn(3);
-      sd.score = stmt.getColumn(4);
       vsd.push_back(sd);
     }
     if (!vsd.empty()) {

+ 8 - 1
db.h

@@ -13,6 +13,13 @@ typedef struct {
   int hand;
   int score;
   int won;
+} scores_details;
+
+typedef struct {
+  time_t date;
+  std::string user;
+  int score;
+  int won;
 } scores_data;
 
 class DBData {
@@ -38,7 +45,7 @@ public:
   void setSetting(const std::string &setting, const std::string &value);
   void saveScore(time_t when, time_t date, int hand, int won, int score);
 
-  std::vector<scores_data> getScoresOnDay(time_t date);
+  std::vector<scores_details> getScoresOnDay(time_t date);
   std::map<time_t, std::vector<scores_data>> getScores(void);
   void expireScores(void);
 

+ 4 - 19
main.cpp

@@ -819,30 +819,15 @@ int main(int argc, char *argv[]) {
         time_t on_this_date = it.first;
         std::string nice_date = convertDateToDateScoreFormat(on_this_date);
         door << "  *** " << nice_date << " ***" << door::nl;
-        scores_data merge;
 
         for (auto sd : it.second) {
-          if (merge.user.empty())
-            merge = sd;
-          else {
-            if (merge.user == sd.user) {
-              // merge in the information
-              merge.hand = sd.hand;
-              merge.won += sd.won;
-              merge.score += sd.score;
-            } else {
-              // Ok, output the merged data and reset
-              door << setw(15) << merge.user << " " << merge.hand << " "
-                   << merge.won << " " << sd.score << door::nl;
-              merge = sd;
-            }
-          }
+          door << setw(15) << sd.user << " " << sd.won << " " << sd.score
+               << door::nl;
         }
-        door << setw(15) << merge.user << " " << merge.hand << " " << merge.won
-             << " " << merge.score << door::nl;
       }
       door << "====================" << door::nl;
     }
+
       r = press_a_key(door);
       break;
 
@@ -918,7 +903,7 @@ int main(int argc, char *argv[]) {
   if (x == 60)
     goto TIMEOUT;
 
-*/
+  */
 
 #ifdef NNY