Merge: Mock Github API tests
[nit.git] / contrib / nitrpg / src / statistics.nit
index e8afccc..764616f 100644 (file)
@@ -34,11 +34,6 @@ redef class Game
 
        redef var stats is lazy do return new GameStatsManager(game, self)
 
-       redef fun save do
-               super
-               stats.save_in(self.key)
-       end
-
        redef fun pretty do
                var res = new FlatBuffer
                res.append super
@@ -46,17 +41,17 @@ redef class Game
                res.append stats.pretty
                return res.write_to_string
        end
+
+       redef fun save do
+               super
+               stats.save
+       end
 end
 
 redef class Player
 
        redef var stats is lazy do return new GameStatsManager(game, self)
 
-       redef fun save do
-               super
-               stats.save_in(self.key)
-       end
-
        redef fun nitcoins do return stats["nitcoins"]
        redef fun nitcoins=(nc) do stats["nitcoins"] = nc
 
@@ -67,6 +62,11 @@ redef class Player
                res.append stats.pretty
                return res.write_to_string
        end
+
+       redef fun save do
+               super
+               stats.save
+       end
 end
 
 # Store game stats for defined period.
@@ -79,49 +79,35 @@ class GameStatsManager
        # The GameEntity monitored by these statistics.
        var owner: GameEntity
 
-       redef var key = "stats"
+       # Current date to extract stats
+       private var date = new Tm.gmtime
 
        # Returns the `GameStats` instance for the overall statistics.
-       var overall: GameStats is lazy do
-               return load_stats_for("all")
-       end
+       var overall: GameStats = load_stats_for("all") is lazy
 
        # Returns the `GameStats` instance for the current year statistics.
-       var yearly: GameStats is lazy do
-               var date = new Tm.gmtime
-               var key = date.strftime("%Y")
-               return load_stats_for(key)
-       end
+       var yearly: GameStats = load_stats_for(date.strftime("%Y")) is lazy
 
        # Returns the `GameStats` instance for the current month statistics.
-       var monthly: GameStats is lazy do
-               var date = new Tm.gmtime
-               var key = date.strftime("%Y-%m")
-               return load_stats_for(key)
-       end
+       var monthly: GameStats = load_stats_for(date.strftime("%Y-%m")) is lazy
 
        # Returns the `GameStats` instance for the current day statistics.
-       var daily: GameStats is lazy do
-               var date = new Tm.gmtime
-               var key = date.strftime("%Y-%m-%d")
-               return load_stats_for(key)
-       end
+       var daily: GameStats = load_stats_for(date.strftime("%Y-%m-%d")) is lazy
 
        # Returns the `GameStats` instance for the current week statistics.
-       var weekly: GameStats is lazy do
-               var date = new Tm.gmtime
-               var key = date.strftime("%Y-W%U")
-               return load_stats_for(key)
-       end
+       var weekly: GameStats = load_stats_for(date.strftime("%Y-W%U")) is lazy
 
        # Load statistics for a `period` key.
        fun load_stats_for(period: String): GameStats do
-               var key = owner.key / self.key / period
-               if not game.store.has_key(key) then
-                       return new GameStats(game, period)
+               var req = new JsonObject
+               req["period"] = period
+               req["owner"] = owner.key
+               var obj = game.db.collection("statistics").find(req)
+               if obj isa JsonObject then
+                       return new GameStats.from_json(game, period, owner, obj)
+               else
+                       return new GameStats(game, period, owner)
                end
-               var json = game.store.load_object(key)
-               return new GameStats.from_json(game, period, json)
        end
 
        redef fun [](key) do return overall[key]
@@ -150,12 +136,12 @@ class GameStatsManager
                weekly.dec(e)
        end
 
-       redef fun save_in(key) do
-               overall.save_in(key / self.key)
-               yearly.save_in(key / self.key)
-               monthly.save_in(key / self.key)
-               daily.save_in(key / self.key)
-               weekly.save_in(key / self.key)
+       redef fun save do
+               overall.save
+               yearly.save
+               monthly.save
+               daily.save
+               weekly.save
        end
 
        redef fun pretty do return overall.pretty
@@ -168,19 +154,31 @@ class GameStats
 
        redef var game
 
-       # The pedriod these stats are about.
+       redef var collection_name = "statistics"
+
+       # The period these stats are about.
        var period: String
 
-       redef fun key do return period
+       # The game entity these stats are about.
+       var owner: GameEntity
+
+       redef var key = "{owner.key}-{period}" is lazy
 
        # Load `self` from saved data.
-       init from_json(game: Game, period: String, json: JsonObject) do
-               for k, v in json do self[k] = v.as(Int)
+       init from_json(game: Game, period: String, owner: GameEntity, json: JsonObject) do
+               init(game, period, owner)
+               var values = json.get_or_null("values")
+               if not values isa JsonObject then return
+               for k, v in values do self[k] = v.as(Int)
        end
 
-       redef fun to_json do
-               var obj = new JsonObject
-               for k, v in self do obj[k] = v
+       redef fun to_json_object do
+               var obj = super
+               obj["period"] = period
+               obj["owner"] = owner.key
+               var values = new JsonObject
+               values.add_all(self)
+               obj["values"] = values
                return obj
        end
 
@@ -273,7 +271,7 @@ redef class IssueCommentEvent
                        game.stats.inc("comments")
                        player.stats.inc("comments")
                        # FIXME use a more precise way to locate reviews
-                       if comment.has_ok_review then
+                       if comment.is_ack then
                                game.stats.inc("reviews")
                                player.stats.inc("reviews")
                        end
@@ -282,8 +280,3 @@ redef class IssueCommentEvent
                end
        end
 end
-
-redef class IssueComment
-       # Does this comment contain a "+1"?
-       fun has_ok_review: Bool do return body.has("\\+1\\b".to_re)
-end